iptables有多个表(table),每个表里有一系列规则链。默认的表叫filter,用来根据包来做过滤。filter表中有三个默认的链:
FORWARD链:过滤转发包的规则
INPUT链:过滤输入包规则
OUTPUT链:过滤输出包规则
iptables还有nat和mangle两个表,nat用在地址转换中,mangle可以过滤和修改filter和net之外的包,如修改IP包的TTL等。
每条链有一个target,filter表中的规则可以使用的target有ACCEPT、DROP、REJECT、LOG、MIRROR、QUEUE、REDIRECT、RETURN、ULOG。
当一条规则落在ACCEPT上的时候,匹配这个规则的包就可以通过。
DROP和REJECT会把包丢弃,DROP是默默丢弃,REJECT会返回一个ICMP错误信息。
REJECT把包分流到一个代理,而不是直接让它通过,比如引导web流量。
iptables命令形式:
iptables -F chainName
iptables -P chainName target
iptables -A chainName -i interface -j target
-F:清除链条中的所有规则。
-p:设置默认策略。
-A:给链条附加规则,可以用-t指定表名,否则默认添加到filter表中。-j指定目标。
其它参数:
-p:协议,如tcp udp icmp
-s:源IP
-d:目标IP
--sport:源端口
--dport:目标端口
--icmp-type:ICMP类型
!:否定条件
-t:指定表名,如果不指定,则默认是filter表
举例
假设一台linux服务器充当网关角色,有两个网络接口:
ppp0
通往internet
IP地址128.138.101.4
eth0
通往内网
IP地址10.1.1.1
需要iptables保护内网中10.1.1.2服务器
首先需要确保加载了iptables模块,并启用ip forwarding。
vi /etc/sysctl.conf
添加 net.ipv4.ip_forward=1
然后执行sysctl -p
(如果怕参数名写错,可以看有个文件叫/proc/sys/net/ipv4/ip_forward
把/proc/sys/去掉,然后把斜杠换成点就是net.ipv4.ip_forward。)
首先初始化filter表:
iptables -F
iptables -P INPUT DROP
iptables -P FORWARD DROP
给FORWARD链定义通过规则:
iptables -A FORWARD -i eth0 -p ANY -j ACCEPT (信任内网的一切包)
iptables -A FORWARD -d 10.1.1.2 -p tcp --dport 22 -j ACCEPT (允许外网访问10.1.1.2的SSH)
iptables -A FORWARD -d 10.1.1.2 -p tcp --dport 80 -j ACCEPT (允许外网访问10.1.1.2的80端口)
iptables -A FORWARD -d 10.1.1.2 -p tcp --dport 443 -j ACCEPT(允许外网访问10.1.1.2的https端口)
给网关自己设置规则:
iptables -A INPUT -i eth0 -d 10.1.1.1 -p tcp --dport 22 -j ACCEPT (允许来自内网的SSH连接)
iptables -A INPUT -i lo -d 10.1.1.1 -p ANY -j ACCEPT (网关通过loopback地址自己连自己)
iptables -A INPUT -i eth0 -d 10.1.1.1 -p icmp --icmp-type 8 -j ACCEPT (允许来自内网的ping)
开放各种icmp包
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 5 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 11 -j ACCEPT
iptables -A FORWARD -d 10.1.1.2 -p icmp --icmp-type 0 -j ACCEPT
iptables -A FORWARD -d 10.1.1.2 -p icmp --icmp-type 3 -j ACCEPT
iptables -A FORWARD -d 10.1.1.2 -p icmp --icmp-type 5 -j ACCEPT
iptables -A FORWARD -d 10.1.1.2 -p icmp --icmp-type 11 -j ACCEPT
为net表的PREROUTING设置策略,可以应用于所有其他链条。
iptables -t nat -A PREROUTING -i ppp0 -s 10.0.0.0/8 -j DROP
iptables -t nat -A PREROUTING -i ppp0 -s 172.16.0.0/12 -j DROP
iptables -t nat -A PREROUTING -i ppp0 -s 192.168.0.0/16 -j DROP
iptables -t nat -A PREROUTING -i ppp0 -s 127.0.0.0/8 -j DROP
iptables -t nat -A PREROUTING -i ppp0 -s 224.0.0.0/4 -j DROP
为外来的包记录日志
iptables -A INPUT -i ppp0 -j LOG
iptables -A FORWARD -i ppp0 -j LOG
查看当前规则
iptables -nL --line-numbers (还会显示行号,删除时用行号)
删除规则
iptables -D INPUT 1 (删除INPUT链条的1号规则)