Linuxiptables命令
iptables是Linux管理员用来设置IPv4数据包过滤条件和NAT的命令行工具。iptables工具运行在用户态,主要是设置各种规则。而netfilter则运行在内核态,执行那些设置好的规则。
查看iptables的链和规则
查看规则的命令格式为:
iptables[-ttables][-L][-nv]
-t:后面接table,例如nat或filter,若省略此项目,则使用默认的filter
-L:列出某个table的所有链或某个链的规则
-n:直接显示IP,速度会快很多
-v:列出更多的信息,包括通过该规则的数据包总位数、相关的网络接口等
列出filtertableINPUT链的规则:
$sudoiptables-LINPUT
列出nattable三条链的规则:
$sudoiptables-tnat-L-n
列出filtertable三条链的规则:
$sudoiptables-L
红框中的内容为链的名称及其默认策略,filter表中所有链的默认策略都是ACCEPT。红框下面的行代表什么呢?
target:代表进行的动作,ACCEPT是放行,REJECT是拒绝,DROP则是丢弃数据包。
port:代表使用的协议,主要有tcp、udp和icmp三种。
opt:额外的选项说明。
source:规则针对的来源IP。
destination:规则针对的目标IP。
因为默认情况下没有添加自定义的规则,所以上图中这些行下面都是空的。
清除本机防火墙规则
清除规则的命令格式如下:
iptables[-ttables][-FXZ]
-F:清除所有已制定的规则
-X:删除所有使用者自定义的chain(其是tables)
-Z:将所有的chain的计数与流量统计都清零
如果我们要制订一套防火墙规则,一般会先清除现有的规则,然后从头开始创建新的规则。下面让我们清除本机filter表中的所有规则:
$sudoiptables-F$sudoiptables-X$sudoiptables-Z
定义默认策略(policy)
如果一个数据包没有匹配到一个链中的任何一个规则,那么将对该数据包执行这个链的默认策略(defaultpolicy),默认策略可以是ACCEPT或DROP。
链中默认策略的存在使得我们在设计防火墙时可以有两种选择:
- 设置默认策略DROP所有的数据包,然后添加规则接受(ACCEPT)来自可信IP地址的数据包,或访问我们的服务监听的端口的数据包,比如bittorrent、FTP服务器、Web服务器、Samba文件服务器等等。
- 设置默认策略ACCEPT所有的数据包,然后添加规则丢弃(DROP)特定的数据包。比如来自一些恶意IP的数据包,或访问某些端口的数据包,在这些端口上我们并没有提供公开的服务。
一般情况下,上面的第一个选项用于INPUT链,因为我们希望对访问的资源进行权限控制。而第二个选项常用于OUTPUT链,因为我们通常信任离开机器的数据包(该数据包来自本机)。
设置默认策略的命令格式如下:
iptables[-ttable]-P[INPUT,OUTPUT,FORWARD][ACCEPT,DROP]
-P选项用来定义默认策略(Policy)。注意,这是大写字母P。ACCEPT表示接受数据包,DROP表示丢弃数据包。
一般情况下,我们会把filter表的INPUT链的默认策略制订的严格一些,比如设为DROP。而FORWARD和OUTPUT可以宽松些,设为ACCEPT。比如我们可以通过下面的命令把filter表的INPUT链的默认策略设置为DROP:
$sudoiptables-PINPUTDROP
添加规则
我们可以通过规则来匹配数据包,具体的匹配条件包括IP、网段、网络接口(interface)和传输协议(tcp、udp等)。
添加规则的命令格式如下:
iptables[-AIchain][-iointerface][-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:
$sudoiptables-AINPUT-ilo-jACCEPT
上面的命令假设lo接口是可以信任的设备,所有进出该接口的数据包都会被接受。
注意,上面的命令中并没有设置-s、-d等参数,其实没有指定的参数表示该参数是任何值都可以被接受。
完全放开某个接口
和lo接口类似,如果你完全信任某个接口,可以像设置lo一样设置它:
$sudoiptables-AINPUT-ieth1-jACCEPT
只接受来自内网中某个网段的数据包:
$sudoiptables-AINPUT-ieth2-s192.168.10.0/24-jACCEPT
接受/丢弃来自指定IP的数据包:
$sudoiptables-AINPUT-ieth3-s192.168.100.5-jACCEPT$sudoiptables-AINPUT-ieth3-s192.168.100.6-jDROP
然后看看filter表的规则:
$sudoiptables-L-v
iptables-save命令提供了另外一种风格的输出:
$sudoiptables-tnat-L-n1
在规则中使用端口号
在我们添加的规则中,很多时候需要指定网络协议(tcp、udp等)及相关的端口号,其基本命令格式如下:
iptables[-AIchain][-iointerface][-ptcp,udp][-s来源IP][--sport端口范围][-d目标IP][--dport端口范围]-j[ACCEPT,DROP,REJECT]
--sport:限制来源的端口号,可以是单个端口,也可以是一个范围,如1024:1050
--dport:限制目标的端口号。
注意,因为只有tcp协议和udp协议使用了端口号,所以在使用--sport和--dport时,一定要指定协议的类型(-ptcp或-pudp)。
下面来看几个例子。
丢弃所有通过tcp协议访问本机21端口的数据包:
$sudoiptables-tnat-L-n2
丢弃来自192.168.1.0/24的1024:65535端口的访问本机ssh端口的数据包:
$sudoiptables-tnat-L-n3
常见的插件模块
在linuxkernel2.2以前使用ipchains管理防火墙时,必须针对数据包的进、出方向进行控制。
比如要连接到远程主机的22端口时,必须设置两条规则:
- 本机的1024:65535端口到远程的22端口必须放行(OUTPUTchain);
- 远程主机22端口到本机的1024:65535端口必须放行(INPUTchain);
这是很麻烦的,比如你要连接10台远程主机的22端口,即便你本机的OUTPUT设置为ACCEPT,
你依然需要添加10条INPUTACCEPT规则接受来自这10台远程主机的22端口的数据包(INPUT的默认策略为DROP)。
iptables则解决了这个问题,它会通过一个状态模块来分析:这个想要进入的数据包是不是对自己已发送请求的响应?如果判断是对自己请求的响应,就放行这个数据包。
使用状态模块的基本命令格式如下:
iptables-AINPUT[-mstate][--stateINVALID,ESTABLISHED,NEW,RELATED]
-m:指定iptables的插件模块,常见的模块有:
state:状态模块
mac:处理网卡硬件地址(hardwareaddress)的模块
--state:指定数据包的状态,常见的状态有:
INVALID:无效的数据包状态
ESTABLISHED:已经连接成功的数据包状态
NEW:想要新建立连接的数据包状态
RELATED:这个最常用,它表示该数据包与我们主机发送出去的数据包有关
下面来看几个例子。
只要是已建立连接或相关的数据包接受:
$sudoiptables-tnat-L-n4
只要是不合法的数据包就丢弃:
$sudoiptables-tnat-L-n5
保存iptables的配置
注意,我们通过iptables命令设置的规则都保存在内存中,也就是说系统重启的话所有的配置都会丢失。
我们可以通过iptables-save命令把iptables的配置保存到文件中:
$sudotouch/etc/iptables.conf$sudochmod666/etc/iptables.conf$sudoiptables-tnat-L-n1>/etc/iptables.conf
在需要时再通过iptables-restore命令把文件中的配置信息导入:
$sudoiptables-tnat-L-n7
总结
iptables是一个比较复杂的命令,本文只是介绍了一些最基本的用法。接下来我们会介绍如何通过iptables构建基本的防火墙配置以及NAT服务器。