什么是iptables
iptables是用于监控进/出服务器流量的一个工具,iptables使用一个叫做table的结构,而这些tables包含了一系列规则(set of rules),我们称这些规则为chain,chain会过滤进/出服务器的数据包(data packets)。
当一个数据包与一个chain相匹配时,会被赋予一个target,而这个target可能是另一个chain,或者可能是以下几种特殊值:
- ACCEPT:允许数据包通过
- DROP:不允许数据包通过
- RETURN:停止数据包在chain链中传输,并告知返回至前一个chain
而在iptables中有一个默认的table,我们称之为filter,它包含了以下3个chain:
- INPUT:控制发送至服务器的数据包
- FORWARD:过滤发送至服务器的数据包,用于转发至其他地方
- OUTPUT:过滤由服务器发出去的数据包
安装iptables
注意:iptables执行时均在root用户下进行。
一般来说,iptables是默认安装在linux系统中的,当然也可以手动安装:
# sudo apt-get update
# sudo apt-get install iptables
检查iptables的版本:
# sudo iptables -V
iptables v1.4.21
查看当前iptables的信息:
# sudo iptables -L -v
在这里,-L
用于列出所有的规则,而-v
用于显示详细的信息。
如何自定义iptables规则
自定义一个新的规则,相当于是向其中添加一个chain,为此,我们需要使用-A
这个选项(其表示append)。此外,还有一些其他选项参数,介绍如下:
-i
:interface,后面添加想要过滤的网卡名称,比如eth0
,lo
,docker0
等等;-p
:protocol,后面添加想要过滤的网络协议名称,比如tcp
,udp
,icmp
等等,此外还可以使用关键词all
表示选择所有的协议;-s
:source,表示数据流量的源地址,可以在其后面hostname或ip地址;-dport
:destination port,目标地址的端口号,比如https对应的是443等;-j
:target,后面跟着target的名字(即ACCEPT
,DROP
,RETURN
);
因此,添加一条新的规则,使用如下命令:
# sudo iptables -A <chain> -i <interface> -p <protocol(tcp/udp)> -s <source> --dport <port> -j <target>
比如说,我们想要阻挡指定ip地址的访问,则可以通过如下命令简历规则:
# sudo iptables -A INPUT -s 192.168.1.3 -j DROP
设置后,由IP地址为192.168.1.3发送过来的数据包就会被丢弃掉。
此外,我们还可以指定一个IP地址范围,比如,对于192.168.1.100-192.168.1.200这个范围内的IP地址,我们都要将其过滤掉,则可以使用如下命令进行创建:
# sudo iptables -A INPUT -m iprange --src-range 192.168.1.100-192.168.1.200 -j DROP
注意,这里必须指定-m
选项以及iprange
模式,并使用--src-range
参数,后面跟着IP地址范围,并且两个IP地址间必须用-
连着。
如果想要删除一条规则呢?
首先,我们需要查看当前可用的规则,命令如下:
# sudo iptables -L --line-numbers
然后,我们将会看到:
接着,就可以执行删除操作了。为了删除一个规则,需要指定对应的chain和标号(即num),比如,我们要删除INPUT
链的第3条规则,则可以执行如下命令:
# sudo iptables -D INPUT 3
持久化自定义的iptables规则
新建的iptables规则是保留在内存中的,重新启动机器后数据就消失了,因此,我们要对其进行持久化。只要执行如下命令即可:
# sudo /sbin/iptables-save
这一命令会将当前的规则保存至系统的配置文件中,当机器重启时,会去读取这份配置文件来还原iptables。
iptables进阶介绍
前面经过一些简单的操作,已经对iptables有了具象的了解。但事实上,iptables远比想象的复杂的多。前面的例子中,我们只简单介绍了Filter Table
这一种table,接下来,我们会进一步深入的介绍iptables。
我们重新认识一下iptables,这到底是个什么玩意儿呢?
简单的说,iptables是构筑Linux系统的防火墙的基础,我们可以自定义设置一些规则,用于数据包的过滤。但是,其功能可不只是过滤,事实上,iptables可以理解为:
Tables which has Chains and the Chains which contains Rules.
即Tables --> Chains --> Rules,而rules用于控制数据包的input/output。
首先,iptables包含3种table,分别是: Filter Table,NAT table和Mangle table。
- Filter table:filter是iptables默认的table,就如我们上面演示的,我们在对filter table进行操作时,不需要指定table的名称。如果对NAT table或Mangle table进行操作,则必须要指定(通过
-t
选项)。前面执行过的命令iptables -L
,相当于iptables -t filter -L
。- INPUT chain:
- FORWARD chain:
- OUTPUT chain:
- NAT table:NAT即Network address translation,网络地址转换。如果想要操作NAT table,则必须要指定名字,比如
iptables -t nat -L
- PREROUTING chain:在数据包被路由之前
- POSTROUTING chain:在数据包被路由之后
- OUTPUT chain
- Mangle table:
- PREROUTING chain
- OUTPUT chain
- FORWARD chain
- INPUT chain
- POSTROUTING chain
iptables总结如下:
参考: