iptables防火墙介绍使用

原理

5链

INPUT:入站规则

OUTPUT:出站规则

FORWARD:转发规则[软路由时应用]

PREROUTING:路由前规则[软路由时应用]

POSTROUTING:路由后规则[软路由时应用]

4表

Filter过滤表[设置允许或者和拒绝规则]

Nat地址转换表[内网ip转外网ip,外网ip转内网ip]

Raw数据包跟踪表[记录每个的连接]

Mangle修改状态[修改包头]

命令的语法格式:

Iptables [-t 表名] 选项 [链名][条件][-j 目标操作]

选项:

  • A 追加规则
  • I 插入规则
  • L 查看规则
  • D 删除规则
J的目标操作:REJECT(拒绝),DROP,ACCEPT
# 如果源地址是192.168.4.100,使用tcp协议,访问我的22端口,则拒绝
iptables -t filter -I INPUT -s 192.168.4.100 -p tcp --dport 22 -j REJECT

不写表时,默认时dilter

# 如果源地址是192.168.4.100,使用tcp协议,访问我的80端口,则允许
iptables -I INPUT -s 192.168.4.100 -p tcp --dport 80 -j ACCEPT

# 如果源地址是192.168.4.100,使用icmp协议,则拒绝
iptables -t filter -I INPUT -s 192.168.4.100 -p icmp -j REJECT

注意事项/整体规律

- 可以不指定表,默认为filter表

- 可以不指定链,默认为对应表的所有链

- 有规则先匹配规则,没有规则匹配默认规则

- 选项/链名/目标操作用大写子母,其余都小写

iptables -I INPUT  -p tcp --dport 22 -j LOG
iptables -L						#查看filter所有链规则
iptables -nL						#查看filter所有链规则number
iptables -nl --line-number 		#显示行号
iptables -D INPUT 2				#删除第2条规则
iptables -D INPUT 3				#删除第3条规则
iptables -F 						#清空所有
iptables -P INPUT ACCEPT|DROP		#设置默认规则
iptables -I INPUT 2 -s 192.168.4.100 -p tcp --dport 22 -j REJECT 
# 插入规则到第2行
iptables -A INPUT -p tcp --dport 22 -j ACCEPT 
# 追加规则到末尾
iptables -F 		#清空所有(仅对filter)
仅仅把filter里面的所有链清空
iptables -t nat -F		# 清空nat表
iptables -t raw -F		# 清空raw表
iptables -t mangle -F		# 清空mangle表
Linux软路由
# 在192.168.4.5主机开启路由转发功能(路由器)
\# cat /proc/sys/net/ipv4/ip_forward
\# echo "0" > /proc/sys/net/ipv4/ip_forward
\# echo "1" > /proc/sys/net/ipv4/ip_forward
# 1是开启,0是关闭
永久开启路由转发
vim /etc/sysctl.d/99-sysctl.conf
net.ipv4.ip_forward=1
sysctl -w net.ipv4.ip_forward=1
sysctl -a 查看所有内核参数
# 给4.0网段的主机和2.0网段的主机添加网关,即可实现不同网络互通
nmcli connection modify eth0 ipv4.gateway 192.168.4.5
nmcli connection modify eth1 ipv4.gateway 192.168.2.5
Iptables的条件规则
-s 			# 匹配源IP地址
-d			# 匹配目标IP地址 	
--sprt		# 匹配源端口
--dport	# 	匹配目标端口
-i 			# 匹配进站网卡
-o 			# 匹配出站网卡
-icmp-type # 	匹配icmp类型

# Icmp-request 请求(ping)
# Icmp-reply	 响应(pong)	
# 其他主机无法ping本机,但本机也无法ping 其他主机
iptables -I INPUT -p icmp -j REJECT

# 除了192.168.4.100外,使用tcp,访问本机的1到1024都拒绝
iptables -I INPUT ! -s 192.168.4.100 -p tcp --dport 1:1024 -j REJECT
# 这条规则,不决定4.100是否可以访问本机
# 本机可以ping其他主机,其他主机不可以ping本机
iptables -F 
iptables -I INPUT -p icmp ==icmp-type echo-request -j DROP
第二步:配置允许ssh端口连接
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT  
#22为你的ssh端口, -s 192.168.1.0/24表示允许这个网段的机器来连接,其它网段的ip地址是登陆不了你的机器的。 -j ACCEPT表示接受这样的请求

iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT  
#22为你的ssh端口, -s 192.168.1.0/24表示允许这个网段的机器来连接,其它网段的ip地址是登陆不了你的机器的。 -j ACCEPT表示接受这样的请求
第三步:允许本地回环地址可以正常使用
iptables -A INPUT -i lo -j ACCEPT  
#本地圆环地址就是那个127.0.0.1,是本机上使用的,它进与出都设置为允许 iptables -A OUTPUT -o lo -j ACCEPT
第四步:设置默认的规则
# (由于在生产上,我们设置默认的入与转发都不允许,出的允许)

iptables -P INPUT DROP 
# 配置默认的不让进 iptables -P FORWARD DROP #默认的不允许转发 iptables -P OUTPUT ACCEPT #默认的可以出去
第五步:配置白名单
iptables -A INPUT -p all -s 192.168.1.0/24 -j ACCEPT  
#允许机房内网机器可以访问 iptables -A INPUT -p all -s 192.168.140.0/24 -jACCEPT 
#允许机房内网机器可以访问 iptables -A INPUT -p tcp -s 183.121.3.7 --dport 3380 -j ACCEPT #允许183.121.3.7访问本机的3380端口
第六步:开启相应的服务端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
#开启80端口,因为web对外都是这个端口 iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT #允许被ping iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #已经建立的连接得让它进来

命令

# 查看某表中的规则:
iptables  --line-number  -t  表名  -nL

# 添加新的入站规则:
iptables  -A  INPUT  -s  ip地址  -p  协议  --dport  端口  -j  处理方式

# 替换规则:
iptables  -R  INPUT  编号  -s  ip地址  -p  协议  --dport  端口  -j  处理方式

# 删除规则:
iptables  -D  INPUT  编号

# 清空规则:
iptables  -F

# 修改默认规则:
iptables  -t  表名  -P  INPUT  处理方式

# 允许路由转发(由内向外):
iptables  -t  nat  -A  POSTROUTING  -s  内网ip/网段  -j  SNAT  --to-source  外网ip

# 允许路由转发(由外向内):
iptables  -t  nat  -A  PREROUTING  -d  外网ip  -p  协议  --dport  端口  -j  DNAT  --to-destination  内网ip/网段

# 实现地址转发(反向代理,基于内网ip):
iptables  -t  nat  -A  PREROUTING  -d  外网ip  -p  协议  --dport  端口  -j  DNAT  --to-destination  内网ip/网段 iptables  -t  nat  -I  POSTROUTING  -p  协议  --dport  端口  -j  MASQUERADE

# 限制每秒钟接受到的数据包的个数(防止垃圾***)
iptables  -I  INPUT  -m  limit  --limit  个数/sec  -j  ACCEPT

# 拒绝新的连接请求:
iptables  -A  INPUT  -m  state  --state  NEW  -j  DROP

备份

iptables-save  >  文件

还原

iptables-restore  <  文件
开启22端口 (如果改了ssh的端口22,使用对应得端口)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
如果OUTPUT设置成DROP需要添加
 iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
关闭22端口
 iptables -D INPUT -p tcp --dport 22 -j ACCEPT

开启常用端口

iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT 
iptables -A OUTPUT -p tcp --sport 3306 -j ACCEPT
iptables -A INPUT -p tcp --dport 20 -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 10000 -j ACCEPT
iptables -A INPUT -p tcp --dport 25 -j ACCEPT
iptables -A INPUT -p tcp --dport 110 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -j ACCEPT
# 允许ping
iptables -A INPUT -p icmp -j ACCEPT

# 如果OUTPUT设置成DROP需要添加 
iptables -A OUTPUT -p icmp -j ACCEPT

# 允许loopback
iptables -A INPUT -i lo -p all -j ACCEPT

# 如果OUTPUT设置成DROP需要添加
iptables -A OUTPUT -o lo -p all -j ACCEPT

# 屏蔽指定ip
iptables -A INPUT -p tcp -s 192.168.10.1 -j DROP

# 减少不安全的端口连接
# iptables -A OUTPUT -p tcp --sport 31337 -j DROP
# iptables -A OUTPUT -p tcp --dport 31337 -j DROP

# 允许某个IP远程连接
# iptables -A INPUT -s 192.168.10.1 -p tcp --dport 22 -j ACCEPT

# 允许某个网段的IP远程连接
iptables -A INPUT -s 192.168.10.0/24 -p tcp --dport 22 -j ACCEPT

# 允许指定网段通过、指定网口通过SSH连接本机

# iptables -A INPUT -i eth0 -p tcp -s 192.168.10.0/24 --dport 22 -m state --state NEW,ESTABLESHED -j ACCEPT

# iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

# iptables -A INPUT -i eth0 -p tcp -s 192.168.10.0/24 --dport 22 -m state --state ESTABLESHED -j ACCEPT

# iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
开启转发功能
iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables -A FORWARD -i eth1 -o eh0 -j ACCEPT
丢弃坏的TCP包
# iptables -A FORWARD -p TCP ! --syn -m state --state NEW -j DROP

# 处理IP碎片数量,防止攻击,允许每秒100个

# iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT

# 设置ICMP包过滤,允许每秒1个包,限制触发条件是10个包

# iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT

# 丢弃非法连接
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A OUTPUT -m state --state INVALID -j DROP
iptables -A FORWARD -m state --state INVALID -j DROP
允许所有已经建立的和相关的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
设定默认规则,数据包的默认处规则
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
保存iptables文件,重启服务
# 保存iptables规则
service iptables save

# 重启iptables服务
service iptables restart

# 配置NAT表防火墙
# 查看NAT表规则
iptables -t nat -L

# 清除NAT规则
iptables -F -t nat
iptables -X -t nat
iptables -Z -t nat

# 防止外网用内网IP欺骗
# iptables -t nat -A PREROUTING -i eth0 -s 10.0.0.0/8 -j DROP
# iptables -t nat -A PREROUTING -i eth0 -s 172.16.0.0/12 -j DROP
# iptables -t nat -A PREROUTING -i eth0 -s 192.168.0.0/16 -j DROP

 
#禁止与某个IP的所有连接
# iptables -t nat -A PREROUTING -d 192.168.10.1 -j DROP
# 禁用80端口
# iptables -t nat -A PREROUTING -p tcp --dport 80 -j DROP
# 禁用某个IP的80端口
# iptables -t nat -A PREROUTING -p tcp --dport 21 -d 192.168.10.1 -j DROP
添加多个不连续的端口
iptables -A INPUT -p tcp -s 10.249.206.1 -m multiport --dport 3306,6379 -j ACCEPT
iptables -A INPUT -p tcp -s 10.249.206.2 -m multiport --dport 3306,6379 -j ACCEPT
iptables -A INPUT -p tcp -s 10.249.206.3 -m multiport --dport 3306,6379 -j ACCEPT
iptables -A INPUT -p tcp -s 127.0.0.1 -m multiport --dport 3306,6379 -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dport 3306,6379 -j DROP
iptables -A INPUT -p tcp -s 10.161.0.0/16   --dport 8080  -j ACCEPT
iptables -A INPUT -p tcp -s 10.249.255.0/24 --dport 8080  -j ACCEPT
iptables -A INPUT -p tcp -s 10.126.0.0/16   --dport 8080  -j ACCEPT
iptables -A INPUT -p tcp -s 127.0.0.1/32    --dport 8080  -j ACCEPT
iptables -A INPUT -p tcp --dport 8080 -j DROP
iptables -A INPUT -p tcp -s 10.249.206.1 -m multiport --dport 3306,6379 -j ACCEPT
iptables -A INPUT -p tcp -s 10.249.206.2 -m multiport --dport 3306,6379 -j ACCEPT
iptables -A INPUT -p tcp -s 10.249.206.3 -m multiport --dport 3306,6379 -j ACCEPT
iptables -A INPUT -p tcp -s 127.0.0.1 -m multiport --dport 3306,6379 -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dport 3306,6379 -j DROP

# 添加一个段落的ip
iptables -I INPUT  -p tcp --dport 3306 -j DROP && \
iptables -I INPUT -m iprange --src-range 172.50.49.13-172.50.49.42 -p tcp --dport 3306 -j ACCEPT  && \
iptables -I INPUT -m iprange --src-range 172.29.145.10-172.29.145.40 -p tcp --dport 3306 -j ACCEPT

iptables 网卡转发

# 安装 iptables 服务
service iptables status   # 查看是否已安装Iptables服务
yum install -y iptables
yum install -y iptables-services   # 安装iptables及iptables-services服务
systemctl stop firewalld
systemctl mask firewalld   #禁用自带的iptables服务
iptables -L -n  # 查看现有 iptables 规则
iptables -t mangle --list  # 查看 Mangle 表
iptables -t nat --list  # 查看 nat 表
service iptables save    # 保存现有 iptables 规则

#### iptables SNAT 配置 ####
## 负责转发工作的Server配置如下
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 192.168.5.0/24 -o eno1 -j SNAT --to-source 122.115.58.11
service iptables save
service iptables restart
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐