iptables教程
这篇文章深入地探讨了Linux的防火墙iptables的使用方法。主要内容参考自An In-Depth Guide to iptables, the Linux Firewall - Boolean World。
iptables如何工作
iptabels是netfilter包过滤系统的命令行界面。本文中用iptables统称iptables及netfilter。
iptables有3种结构组成表(table)、链(chain)和目标(target)。表可以被用于指定处理包的方法,默认的表是filter,也有其他的表。
链归属于某个表,链被用于检查匹配一些包,并将它传给一个目标。目标决定了包的命运,例如接受或拒绝。
iptables会在链中逐一匹配规则,如果规则匹配了,就会跳转到对应的目标。否则,改链的默认政策(default policy)会被使用。默认政策也是一个目标。所有链的默认政策默认是接受。
表
在现代Linux中,有四张表:
filter:最常见的表,用于过滤包。mangle:用于该表包的头,如TTL信息。nat:允许通过修改包的目标和源构建NAT网络,如将内网的服务暴露给公网。raw:iptables是一个有状态的防火墙。raw表使得你能够在内核追踪状态前,处理一些包。你也可以使某些包免于状态追踪。
除此之外,一些内核有别的表。如SELinux有security表。
链
某个表由几个默认的链组成。它们可以使:
PREROUTING:应用于刚从网络上抵达的包,出现在nat、mangle和raw表中。INPUT:应用于即将抵达本地进程的包,出现在mangle和filter表中。OUTPUT:应用于本地进程产生的包,出现在raw、mangle、nat和filter表中。FORWARD:应用于略过主机的包,出现在mangle和filter表中。 -POSTROUTING:应用于即将从网络上离开的包,出现在nat和mangle表中。

目标
一些目标是终结的,也就是说它们立刻决定了包的命运。常见的有:
ACCEPT:iptables会接受该包。DROP:iptables会丢弃包,就好像系统未曾接收到包。REJECT:iptables会拒绝包,对于TCP会发送connection reset,对于UDP和ICMP会发送destination host unreachable。
另一些目标是非终结的。例如LOG目标,用于输出包的信息到内核日志。
此外你也可以创建自定义的链。
关于iptabels命令的一点说明
有两种网络协议,IPv4和IPv6。这两个协议是不同的,因而iptables为IPv4
提供了iptables命令,为IPv6提供了ip6tables命令。
这两个命令接受的参数差别不大。此外你需要以root身份运行这些命令。
屏蔽IP
屏蔽59.45.175.62发来的包可以采用下面的命令:
iptables -t filter -A INPUT -s 59.45.175.62 -j REJECT
-t参数指定规则在哪个表中,-A参数是说在哪个链的最后添加。-s是指定源IP,-j是说跳转到哪个目标。
-t filter可以省略,因为filter是默认表。
也可以采用CIDR记号指定源IP,类似-s 59.45.175.0/24。
类似地,屏蔽前往31.13.78.35的包:
iptables -A OUTPUT -d 31.13.78.35 -j DROP
列出规则
使用-L开关可以列出某个表中的所有链和规则,使用--line-numbers可以标记行号。你也可以用-t指定显示哪个表。
iptables会对IP采用DNS查询。这通常是不必要,且使命令缓慢。使用-n开关可以组织这个行为。
删除规则
将-A chain命令替换成-D chain命令就可以删除规则。此外,-D chain rulenum还可以接受第二个可选的参数,就是行号,可以用于删除指定行的规则。当你删除规则时,其后的规则行号会减少,所以一般从后往前删除规则。
使用-F [chain]后面跟链名,可以删除该链的所有规则。
插入和替换规则
使用-I chain [rulenum]命令可以插入规则到最开始或者指定的行号,行号从1开始计数。也可以使用-R chain rulenum命令替换掉某个行的规则。
协议和模块
使用-p...
剩余内容已隐藏