iptables命令介绍
1、iptables:administration tool for IPv4/IPv6 packet filtering and NAT
1)简介:Linux的2.4版内核引入了一种全新的包处理引擎Netfilter,同时还有一个管理它的命令行工具iptables。iptables用于建立、维护和检查Linux内核中IPv4包过滤规则的表。
2)结构层次:iptables - 表table - 链chain(内建或自定义) - 规则(目标target子句等)。
iptables对网络上的数据包有次序地施加规则“链”。链的集合就构成了表,用于处理特定类型的流量。
默认的iptables表为filter(过滤器)。它包含3个默认链:FORWARD、INPUT和OUTPUT,内核处理的每个包都要经过3个链中的某一个。FORWARD链里的规则用于在一个网络接口收到的、而且需要转发到另一个网络接口的所有包。INPUT和OUTPUT链里的规则分别用于目的是本地主机,或者从本地主机发出的流量。
nat表包含的规则链控制着NAT(网络地址转换)。另外,还有mangle、raw和security表,这里不详述。
构成一条链的每条规则都有一个“target(目标)”子句,它决定了如何处理匹配的包。一旦某个包匹配了一条规则,那么它的结局就确定了,不再用其他规则来检查它。虽然iptables内部定义了许多target,但还是可以指定另一条链作为规则的target。在filter表中的规则可以使用的target子句有ACCEPT(包可以继续通过)、DROP(默默地丢弃包)和REJECT(把包丢弃并返回一则ICMP错误消息)等。
3) 示例:
本例中,eth1(128.138.101.4)通往Internet,eth0(10.1.1.1)通往内部网络,两个接口的子网掩码都是255.255.255.0。IP为10.1.1.2的Web服务器受到该防火墙保护。
# -F:冲洗指定的链(删除所有规则);-P:为链设置默认的目标(建议使用DROP) iptables -F # 冲洗掉表中所有的链 iptables -P INPUT DROP # 设置INPUT链的默认目标为DROP(最安全的策略就是丢弃没有明确允许的任何包) iptables -P FORWARD DROP # 设置FORWARD链的默认目标为DROP # 规则是按照它们出现在链中的顺序来进行匹配的,所以将用得最多的规则放在最前面 # -A:在指定链上追加规则;-i:接收数据包的接口;-j:目标;-p:协议;-d:主机或网络的目的地址;--dport:目的端口 iptables -A FORWARD -i eth0 -p ANY -j ACCEPT # 让源自内部网络的任何包都能被转发 iptables -A FORWARD -d 10.1.1.2 -p tcp --dport 22 -j ACCEPT # 允许SSH/HTTP/HTTPS能够通过防火墙连到Web服务器10.1.1.2 iptables -A FORWARD -d 10.1.1.2 -p tcp --dport 80 -j ACCEPT iptables -A FORWARD -d 10.1.1.2 -p tcp --dport 443 -j ACCEPT iptables -A INPUT -i eth0 -d 10.1.1.1 -p tcp --dport 22 -j ACCEPT # 允许到防火墙主机10.1.1.1的唯一TCP流量是SSH,它用于管理防火墙 iptables -A INPUT -i lo -d 127.0.0.1 -p ANY -j ACCEPT # 允许环回流量 iptables -A INPUT -i eth0 -d 10.1.1.1 -p icmp --icmp-type 8 -j ACCEPT # 允许从内部网络来的ICMP ECHO_REQUEST包 # 为了让主机在Internet上正常工作,必须允许某些类型的ICMP包通过防火墙。以下规则就是既能送到防火墙主机,也能送到在它之后的网络的最小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 # 虽然nat表的目的并不是用作包过滤的,但它的PREROUTING链对于反IP欺骗的过滤来说特别有用 # 如果在PREROUTING链中加入DROP项,它们就不需要出现在INPUT和FORWARD链里了,因为PREROUTING链会应用到所有进入防火墙主机的数据包上 # -t:表;-s:主机或网络的源地址 iptables -t nat -A PREROUTING -i eth1 -s 10.0.0.0/8 -j DROP # eth1接收到的包的源地址不可能是内部地址、环回地址或D类地址 iptables -t nat -A PREROUTING -i eth1 -s 172.16.0.0/12 -j DROP iptables -t nat -A PREROUTING -i eth1 -s 192.168.0.0/16 -j DROP iptables -t nat -A PREROUTING -i eth1 -s 127.0.0.0/8 -j DROP iptables -t nat -A PREROUTING -i eth1 -s 224.0.0.0/4 -j DROP iptables -A INPUT -i eth1 -j LOG # 禁止所有没有得到明确许可的包。LOG目标提供一种跟踪数据包的简单途径 iptables -A FORWARD -i eth1 -j LOG
4)以下问题可能与配置了iptables有关:
(1)可以ping通,但nc提示"No route to host":ping所用的icmp流量允许通过防火墙,但nc所用的tcp流量不允许(使用tcpdump观察到一个SYN包,但它被防火墙丢弃,所以三次握手都没完成)。
参考资料:
《UNIX/Linux系统管理技术手册》
不断学习中。。。