iptables是编写netfilter规则的工具。
一般情况下,升级kernel可顺便升级netfilter模块。
连接追踪模块是xt_state.ko.
TCP/IP的状态有12种,而iptables关于连接的状态只有4种:Established,New,Related,Ivalid.
Established的状态定义为,只要封包能成功穿越防火墙,之后所有相关的封包就都是Established.当然,封包能成功穿越防火墙的前提是有相应的Iptables规则允许。
iptables -A INPUT -m state --state Established -j ACCEPT
New则与协议完全无关,其指每连接的第一个封包。
ICMP消息类型有type 8: request echo; type 0: echo reply; type11: Time to live exceeded
Related是指被动产生的响应包,而且这个封包不属于现有任何连接的封包,其与协议无关。
Invalid是指状态不明的包,如何区别于NEW包?
iptables -A INPUT -p all -m state --state INVALID -j DROP
修改完netfilter规则后使用service iptables save指令就可以把netfilter存储到/etc/sysconfig/iptables文件内。
另外,使用shell script管理iptables规则的好处有:
可使用变量。2.方便修改。3.规则易阅读。4.备份方便。
可将脚本放入/etc/rc.d/rc.local文件中。
变化的外网口IP怎么办?用MASQUERADE
iptables -A PREROUTING -t nat -o eth0 -s 192.168.0.0/24 -j MASQUERADE
NAT要与filter机制结合才能使服务主机得到真正的安全。
Mangle表的作用一般有:
修改IP包头的TTL值,windows默认128,linux默认64.
修改IP包头的DSCP值或对特定的封包设定特征。
iptables -t mangle -A OUTPUT -p tcp --dport 22 -j DSCP --set-dscp 43
iptables -t mangle -A FORWARD -p tcp --sport 80 -j DSCP --set-dscp 1
不管是filter, nat, mangle, raw, 它们的chain都是各自独立的。
有了netmap处理方法,无论要对应的是classC, classB, 或是classA网段,通通只要两条规则就搞定了。
iptables -t nat -A PREROUTING -i eth0 -d 10.0.0.0/24 -j NETMAP --to 192.168.1.0.24
iptables -t nat -A POSTROUTING -o eth1 -s 192.168.1.0/24 -j NETMAP --to 10.0.0.0/24
iptables-save [-c] [-t table]
iptables-restore [-c] [-n]
iptables-save > /etc/iptables-save
iptables-restore < /etc/iptables-save
PREROUTING链的作用是在包刚到达防火墙时改变它的目的地址。如果需要的话,OUTPUT链改变本地产生的包的目的地址。
POSTROUTING链在包就要离开防火墙之前改变其源地址。
MANGLE表不能做任何NAT,它只是改变数据包的TTL, TOS, 或MARK, 而不是源地址。
-Z 计数器清零
-N 用用户自定义链
-X 删除自定义链
-E rename chain
-i 参数只能用于INPUT,FORWARD,和PREROUTING这三个链,用在其他地方会提示错误信息。
请注意,protocol tcp必须在TCP匹配器(match)的左边。
iptables -p tcp --tcp-flags ALL NONE 匹配所有标记都未置1的包。一般而言,对于iptables/netfilter甚至是许多防火墙,调试或多或少都是必须的。99%的防火墙问题都是因为认为的策略造成的,我可以保证,你写规则的时候极其容易犯错误,而且很多少时候这些错误通过肉眼很难定位。
Netfilter匹配方式,内建匹配方式有 -p -i -s -d 等等
模块匹配方式:
TCP/UDP协议高级匹配。--dport和--sport一次最多可以匹配两个port,如--dport 21:22
TCP flags的匹配
连接追踪文件的位置:/proc/net/ip/contrack 模块为ip_contrack.ko
/proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_syn_sent
pkttype 数据包类型:
iptables -A FORWARD -i eth0 -p icmp -m pkttype --ptt-type broadcast -j DROP
iptables -A INPUT -p icmp --icmp-type 8 -m length --length 92 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit 6/m --limit-burst 10 -j ACCEPT
recent模块:
string是由xt_string.ko模块提供匹配,string可以在网络层提供数据内容,而无需将封包送到应用层的位置才行,但它只能局限于单一封包,无法匹配分散在不同封包的内容。
iptables -A FORWARD -p tcp -d $mail_server --dport 25 -j QUEUE(交给user space)
log 模块只记录,不匹配进行操作, 记录的日志默认放在/var/log/message内
--log-level --log-prefix --log-tcp-sequence --log-tcp-options --log-ip-options --log-uid