iptables 是 Linux 管理员用来设置 IPv4 数据包过滤条件和 NAT 的命令行工具。iptables 工具运行在用户态,主要是设置各种规则。而 netfilter 则运行在内核态,执行那些设置好的规则。
查看 iptables 的链和规则
查看规则的命令格式为:
iptables [-t tables] [-L] [-nv]
-t :后面接 table ,例如 nat 或 filter ,若省略此项目,则使用默认的 filter
-L :列出某个 table 的所有链或某个链的规则
-n :直接显示 IP,速度会快很多
-v :列出更多的信息,包括通过该规则的数据包总位数、相关的网络接口等
列出 filter table INPUT 链的规则:
$ sudo iptables -L INPUT
列出 nat table 三条链的规则:
$ sudo iptables -t nat -L -n
列出 filter table 三条链的规则:
$ sudo iptables -L

红框中的内容为链的名称及其默认策略,filter 表中所有链的默认策略都是 ACCEPT。红框下面的行代表什么呢?
target:代表进行的动作,ACCEPT 是放行,REJECT 是拒绝,DROP 则是丢弃数据包。
port:代表使用的协议,主要有 tcp、udp 和 icmp 三种。
opt:额外的选项说明。
source:规则针对的来源 IP。
destination:规则针对的目标 IP。
因为默认情况下没有添加自定义的规则,所以上图中这些行下面都是空的。
清除本机防火墙规则
清除规则的命令格式如下:
iptables [-t tables] [-FXZ]
-F:清除所有已制定的规则
-X:删除所有使用者自定义的 chain(其是 tables)
-Z:将所有的 chain 的计数与流量统计都清零
如果我们要制订一套防火墙规则,一般会先清除现有的规则,然后从头开始创建新的规则。下面让我们清除本机 filter 表中的所有规则:
$ sudo iptables -F $ sudo iptables -X $ sudo iptables -Z
定义默认策略(policy)
如果一个数据包没有匹配到一个链中的任何一个规则,那么将对该数据包执行这个链的默认策略(default policy),默认策略可以是 ACCEPT 或 DROP。
链中默认策略的存在使得我们在设计防火墙时可以有两种选择:
设置默认策略 DROP 所有的数据包,然后添加规则接受(ACCEPT)来自可信 IP 地址的数据包,或访问我们的服务监听的端口的数据包,比如 bittorrent、FTP 服务器、Web 服务器、Samba 文件服务器等等。
设置默认策略 ACCEPT 所有的数据包,然后添加规则丢弃(DROP)特定的数据包。比如来自一些恶意 IP 的数据包,或访问某些端口的数据包,在这些端口上我们并没有提供公开的服务。
一般情况下,上面的第一个选项用于 INPUT 链,因为我们希望对访问的资源进行权限控制。而第二个选项常用于 OUTPUT 链,因为我们通常信任离开机器的数据包(该数据包来自本机)。








