IPTABLES命令

iptables 是 Linux 管理员用来设置 IPv4 数据包过滤条件和 NAT 的命令行工具。iptables 工具运行在用户态,主要是设置各类规则。而 netfilter 则运行在内核态,执行那些设置好的规则。linux

查看 iptables 的链和规则

查看规则的命令格式为:
iptables [-t tables] [-L] [-nv]服务器

-t :后面接 table ,例如 nat 或 filter ,若省略此项目,则使用默认的 filter
-L :列出某个 table 的全部链或某个链的规则
-n :直接显示 IP,速度会快不少
-v :列出更多的信息,包括经过该规则的数据包总位数、相关的网络接口等网络

列出 filter table INPUT 链的规则:ssh

$ sudo iptables -L INPUT

列出 nat table 三条链的规则:tcp

$ 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 表中的全部规则:rest

$ 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 链,由于咱们一般信任离开机器的数据包(该数据包来自本机)。
设置默认策略的命令格式以下:
iptables [-t table] -P [INPUT,OUTPUT,FORWARD] [ACCEPT,DROP]
-P 选项用来定义默认策略(Policy)。注意,这是大写字母 P。ACCEPT 表示接受数据包,DROP 表示丢弃数据包。
通常状况下,咱们会把 filter 表的 INPUT 链的默认策略制订的严格一些,好比设为 DROP。而 FORWARD 和 OUTPUT 能够宽松些,设为 ACCEPT。好比咱们能够经过下面的命令把 filter 表的 INPUT 链的默认策略设置为 DROP:

$ sudo iptables -P INPUT DROP

添加规则

咱们能够经过规则来匹配数据包,具体的匹配条件包括 IP、网段、网络接口(interface)和传输协议(tcp、udp 等)。
添加规则的命令格式以下:

iptables [-AI chain] [-io interface] [-p 协议] [-s 来源 IP] [-d 目标 IP] -j [ACCEPT,DROP,REJECT,LOG]

-A:针对某个规则链添加一条规则,新添加的规则排在现有规则的后面。
-I:针对某个规则链插入一条规则,能够为新插入的规则指定在链中的序号。若是不指定序号,则新的规则会变成第一条规则。
-i:指定数据包进入的那个网络接口,好比 eth0、lo 等,须要与 INPUT 链配合使用。
-o: 指定传出数据包的那个网络接口,须要与 OUTPUT 链配合使用。
-p: 指定此规则适用于那种网络协议(经常使用的协议有 tcp、udp、icmp,all 指适用于全部的协议)。
-s:指定数据包的来源 IP/网段,能够指定单个 IP,如 192.168.1.100,也能够指定一个网段,如 192.168.1.0/24。还能够经过 !表示非的意思,如 ! 192.168.1.0/24 表示除了 192.168.1.0/24 以外的数据包。
-d:指定数据包的目标 IP/网段,其它与 -s 选项相同。
-j:指定匹配成功后的行为,主要有 ACCEPT、DROP、REJECT 和 LOG。

下面咱们来看几个例子。
放开本机接口 lo:

$ sudo iptables -A INPUT -i lo -j ACCEPT

上面的命令假设 lo 接口是能够信任的设备,全部进出该接口的数据包都会被接受。
注意,上面的命令中并无设置 -s、-d 等参数,其实没有指定的参数表示该参数是任何值均可以被接受。

彻底放开某个接口
和 lo 接口相似,若是你彻底信任某个接口,能够像设置 lo 同样设置它:

$ sudo iptables -A INPUT -i eth1 -j ACCEPT

只接受来自内网中某个网段的数据包:

$ sudo iptables -A INPUT -i eth2 -s 192.168.10.0/24 -j ACCEPT

接受/丢弃来自指定 IP 的数据包:

$ sudo iptables -A INPUT -i eth3 -s 192.168.100.5 -j ACCEPT
$ sudo iptables -A INPUT -i eth3 -s 192.168.100.6 -j DROP

而后看看 filter 表的规则:

$ 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:这个最经常使用,它表示该数据包与咱们主机发送出去的数据包有关

下面来看几个例子。
只要是已创建链接或相关的数据包接受:

$ sudo iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

只要是不合法的数据包就丢弃:

$ sudo iptables -A INPUT -m state --state INVALID -j DROP

保存 iptables 的配置

注意,咱们经过 iptables 命令设置的规则都保存在内存中,也就是说系统重启的话全部的配置都会丢失。
咱们能够经过 iptables-save 命令把 iptables 的配置保存到文件中:

$ sudo touch /etc/iptables.conf
$ sudo chmod 666 /etc/iptables.conf
$ sudo iptables-save > /etc/iptables.conf

在须要时再经过 iptables-restore 命令把文件中的配置信息导入:

$ sudo iptables-restore < /etc/iptables.conf
相关文章
相关标签/搜索