详解Linux iptables 命令

2019-10-09 17:59:08于海丽
$ 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:这个最常用,它表示该数据包与我们主机发送出去的数据包有关