iptables规则是如何练成的
iptables规则就是指向标,在一条链上,对不同的连接和数据包阻塞或允许它们去向何处。插入链的每一行都是一条iptables规则。我们也会讨论基本的matche及其用法,还有各种各样的target,以及如何建立我们自己的target(比如,一个新的子链)。
我们已经解释了什么是iptables规则,在内核看来,iptables规则就是决定如何处理一个包的语句。如果一个包符合所有的条件(就是符合matche语句),我们就运行target或jump指令。书写iptables规则的语法格式是:
- iptables [-t table] command [match] [target/jump]
对于这个句法没什么可说的,但注意target指令必须在***。为了易读,我们一般用这种语法。总之,你将见到的大部分iptables规则都是按这种语法写的。因此,如果你看到别人写的iptables规则,你很可能会发现用的也是这种语法,当然就很容易理解那些iptables规则了。
如果你不想用标准的表,就要在[table]处指定表名。一般情况下没有必要指定使用的表,因为iptables 默认使用filter表来执行所有的命令。也没有必要非得在这里指定表名,实际上几乎可在iptables规则的任何地方。当然,把表名在开始处已经是约定俗成的标准。
尽管命令总是放在开头,或者是直接放在表名后面,我们也要考虑考虑到底放在哪儿易读。command告诉程序该做什么,比如:插入一个iptables规则,还是在链的末尾增加一个iptables规则,还是删除一个iptables规则,具体的可以参考iptables的手册。
match细致地描述了包的某个特点,以使这个包区别于其它所有的包。在这里,我们可以指定包的来源IP 地址,网络接口,端口,协议类型,或者其他什么。下面我们将会看到许多不同的match。
***是数据包的目标所在。若数据包符合所有的match,内核就用target来处理它,或者说把包发往 target。比如,我们可以让内核把包发送到当前表中的其他链(可能是我们自己建立的),或者只是丢弃这个包而没有什么处理,或者向发送者返回某个特殊的应答。
一个测试脚本
- Client-----------------------àserver(web server,dns)
- 192.168.10.7 192.168.55.55
- #实验环境,redhat 7.1
- #iptables v1.2.1.a
- #客户机:192.168.10.7
- #linux: 192.68.55.55 安装apache,dns
- #清除所有iptables规则
- iptables -F
- # set policy
- #设置默认策略,均为删除
- iptables -P INPUT DROP
- iptables -P OUTPUT DROP
- iptables -P FORWARD DROP
- # add chains
- #加入自定义链
- iptables -N bad_tcp_packets
- iptables -N allowed
- iptables -N tcp_packets
- iptables -N udp_packets
- # bad tcp
- #对坏包的处理为reset,和扫描等有关
- iptables -A bad_tcp_packets -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j REJECT --reject-with tcp-reset
- #一个新包,SYN不置位,因此不是一个正常的连接请求,删除
- iptables -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP
- #allow chain
- #正常的TCP包都允许,其他的都删除
- iptables -A allowed -p tcp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
- iptables -A allowed -p tcp -j DROP
- #tcp roles
- #TCP链的处理,允许WEB服务
- iptables -A tcp_packets -p tcp -s 0/0 --dport 80 -j allowed
- #udp roles
- #UDP链的处理,允许DNS
- iptables -A udp_packets -p udp -s 0/0 --dport 53 -j ACCEPT
- #所有进入的包先检查是否正常,然后转到TCP,UDP进行处理
- #192.168.10.7是网管机,允许该机的ICMP
- iptables -A INPUT -p tcp -j bad_tcp_packets
- iptables -A INPUT -p tcp -j tcp_packets
- iptables -A INPUT -p udp -j udp_packets
- #允许来自192.168.10.7发起ICMP的请求
- iptables -A INPUT -p icmp -s 192.168.10.7 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
- #本机ICMP请求包返回时,进入INPUT,所以状态是ESTABLISHED,RELATED
- #允许从本机往外发ICMP的请求包
- iptables -A OUTPUT -p icmp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
- #HTTP的请求收到后允许出去,所以状态是ESTABLISHED,RELATED
- #当然还有DNS的UDP包
- iptables -A OUTPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
- iptables -A OUTPUT -p udp -m state --state ESTABLISHED,RELATED -j ACCEPT
上一节:iptables包的转发过程 下一节:TOS优化提高防火墙性能
【编辑推荐】