详解Linuxiptables命令
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。
ssh命令指定端口链中默认策略的存在使得我们在设计防⽕墙时可以有两种选择:
设置默认策略 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 /f
$ sudo chmod 666 /f
$ sudo iptables-save > /f
在需要时再通过 iptables-restore 命令把⽂件中的配置信息导⼊:
$ sudo iptables-restore < /f
总结
iptables 是⼀个⽐较复杂的命令,本⽂只是介绍了⼀些最基本的⽤法。接下来我们会介绍如何通过 iptables 构建基本的防⽕墙配置以及 NAT 服务器。
参考:
总结
以上所述是⼩编给⼤家介绍的Linux iptables 命令,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。在此也⾮常感谢⼤家对⽹站的⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论