目录
一、四表五链
1.四表
filter # 决定数据包是否可以通行,不指定表名时为默认表。
nat # 决定数据包是否可以转发(源地址或目标地址转换)
mangle # 进行修改
raw # 进行数据包标记跟踪
2.五链
# 以下三个决定数据包是否通行
INPUT # 在进来之前的入口处进行数据包过滤
OUTPUT # 在出去之前的出口处进行数据包过滤
FORWARD # 数据包转发
# 以下两个决定数据包是否进行源地址和目标地址修改
PREROUTING # 路由转发前路径
POSTROUTING # 路由转发后
二、参数说明
1.指定规则的位置
-A|-I # 添加防火墙规则,-A在最后添加,-I在首行或指定行添加
-t 表名 # 指定规则写入到哪个表,不指定表名时,filter为默认表
2.数据包的过滤条件
-i|-o # 指定数据包的入站和出站网卡
-s|-d # 指定数据包的来源地址或目标地址
--sport | --dport # 匹配数据包的源端口或目标端口(必须指定协议类型)
-p 协议 # 协议可以独立出现,写端口必须作为辅助条件出现,而且要写在端口前面
3.数据包的处理机制
-j ACCEPT|REJECT|DROP # 放行|拒绝|丢弃
DNAT|SNAT
DNAT --to-destination # $ip:$port
SNAT --to-source # $ip
MASQUERADE # 伪装源地址,确保返回流量能正确返回容器
三、示例
1.ipset集合
#创建ipset fsipsetlist集合
ipset create fsipsetlist hash:net
#删除集合
ipset destroy fsipsetlist
#删除所有集合
ipset destroy fsi
#向fsipsetlist集合添加ip
ipset add fsipsetlist 10.88.96.66
#删除fsipsetlist集合中的IP
ipset del fsipsetlist 192.168.1.0/24
#查看fsipsetlist集合中有哪些IP
ipset list fsipsetlist
#清空集合
ipset flush fsipsetlist
#查看有哪些集合
ipset list
ipset list -n
#将集合添加为防火墙规则
#当源ip在fsipsetlist集合中,并且目的端口为80才允许进入
#当目的IP在fsipsetlist集合中,并且源端口为80的请求,才允许出。
iptables -I INPUT -p tcp --dport 80 -m set --match-set fsipsetlist src -j ACCEPT
iptables -I OUTPUT -p tcp --sport 80 -m set --match-set fsipsetlist dst -j ACCEPT
2.iptables规则
#查看防火墙规则
# filter、nat、mangle、ram
# INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING
iptables -t nat -nvL --line-number
#添加规则
iptables -t $表名 -I INPUT -s 10.88.112.0/25 -p tcp --dport 62222 -j ACCEPT
iptables -t $表名 -I OUTPUT -d 10.88.112.0/25 -p tcp --sport 62222 -j ACCEPT
#设置防火墙规则默认为拒绝
iptables -P INPUT DROP
iptables -P OUTPUT DROP
#删除规则
iptables -nvL --line-number
iptables -t nat -D PREROUTING 1
#备份iptables规则
iptables–save > /etc/iptables/iptables.rules
#恢复iptables规则
#注意:恢复时,如果原规则中有ipset集合,需要先创建集合,否则会报错失败!!!
iptables–restore < /etc/iptables/iptables.rules
3.iptables实现地址转发
#入站流量:
raw表(PREROUTING链)-->mangle表(PREROUTING链)-->nat表(PREROUTING链)-->filter表(INPUT链)
#出站流量:
raw表(OUTPUT链)-->mangle表(OUTPUT)-->nat表(OUTPUT链)-->filter表(OUTPUT表)-->nat表(POSTROUTING链)
#物理机发出47.103.9.124:1883请求,重定向到10.88.0.140:1883
iptables -t nat -I OUTPUT -p tcp --dport 1883 --destination 47.103.9.124 -j DNAT --to-destination 10.88.0.140:1883
#容器发起访问,重定向容器目的地址。
sudo iptables -t nat -A PREROUTING -p tcp --dport 1883 --destination 47.103.9.124 -j DNAT --to-destination 10.88.0.140:1883
#MASQUERADE伪装源地址,确保返回流量能正确地回送到服务器
#这条规则在启动docker后已经有了,无需手工添加
sudo iptables -t nat -A POSTROUTING -p tcp -d 10.88.0.140 --dport 1883 -j MASQUERADE