$ sudo iptables -L -v
iptables-save 命令提供了另外一种风格的输出:
$ sudo iptables-save

在规则中使用端口号
在我们添加的规则中,很多时候需要指定网络协议(tcp、udp 等)及相关的端口号,其基本命令格式如下:
iptables [-AI chain] [-io interface] [-p tcp,udp] [-s 来源 IP] [--sport 端口范围] [-d 目标 IP] [--dport 端口范围] -j [ACCEPT,DROP,REJECT]
--sport:限制来源的端口号,可以是单个端口,也可以是一个范围,如 1024:1050
--dport:限制目标的端口号。
注意,因为只有 tcp 协议和 udp 协议使用了端口号,所以在使用 --sport 和 --dport 时,一定要指定协议的类型(-p tcp 或 -p udp)。
下面来看几个例子。
丢弃所有通过 tcp 协议访问本机 21 端口的数据包:
$ sudo iptables -A INPUT -i eth0 -p tcp --dport 21 -j DROP
丢弃来自 192.168.1.0/24 的 1024:65535 端口的访问本机 ssh 端口的数据包:
$ sudo iptables -A INPUT -i eth0 -p tcp -s 192.168.1.0/24 --sport 1024:65535 --dport ssh -j DROP
常见的插件模块
在 linux kernel 2.2 以前使用 ipchains 管理防火墙时,必须针对数据包的进、出方向进行控制。
比如要连接到远程主机的 22 端口时,必须设置两条规则:
本机的 1024:65535 端口到远程的 22 端口必须放行(OUTPUT chain);
远程主机 22 端口到本机的 1024:65535 端口必须放行(INPUT chain);
这是很麻烦的,比如你要连接 10 台远程主机的 22 端口,即便你本机的 OUTPUT 设置为 ACCEPT,
你依然需要添加 10 条 INPUT ACCEPT 规则接受来自这 10 台远程主机的 22 端口的数据包(INPUT 的默认策略为 DROP)。
iptables 则解决了这个问题,它会通过一个状态模块来分析:这个想要进入的数据包是不是对自己已发送请求的响应?如果判断是对自己请求的响应,就放行这个数据包。
使用状态模块的基本命令格式如下:
iptables -A INPUT [-m state] [--state INVALID,ESTABLISHED,NEW,RELATED]
-m:指定 iptables 的插件模块,常见的模块有:
state:状态模块
mac:处理网卡硬件地址(hardware address)的模块
--state:指定数据包的状态,常见的状态有:
INVALID:无效的数据包状态
ESTABLISHED:已经连接成功的数据包状态
NEW:想要新建立连接的数据包状态
RELATED:这个最常用,它表示该数据包与我们主机发送出去的数据包有关








