iptables入门指南,Linux防火墙
iptables是为Linux操作系统构建的极其灵活的防火墙实用程序。不管我们是Linux新手还是系统管理员,iptables都可以通过某种方式很好地使用我们。如何配置功能最丰富的Linux防火墙。
关于iptables
iptables是一个命令行防火墙实用程序,它使用策略链来允许或者阻止流量。当连接尝试在系统上建立自己的连接时,iptables会在其列表中寻找一个规则来匹配它。如果找不到,则采取默认操作。
iptables几乎总是预装在任何Linux发行版上。要更新/安装它,只需获取iptables软件包:
sudo apt-get install iptables
有诸如Firestarter之类的iptables的GUI替代品,但是一旦我们掌握了一些命令,iptables并不难。我们在配置iptables规则时要格外小心,尤其是如果我们通过SSH连接到服务器时,因为一个错误的命令会永久将我们锁定,直到它被手动固定在物理机上为止。
链条类型
iptables使用三个不同的链:输入,转发和输出。
输入此链用于控制传入连接的行为。例如,如果用户尝试通过SSH进入PC /服务器,则iptables将尝试将IP地址和端口与输入链中的规则进行匹配。
转发此链用于实际不在本地传递的传入连接。想一想路由器总是向其发送数据,但实际上很少发送给路由器本身。数据只是转发到其目标。除非我们在系统上进行某种路由,NAT转换或者其他需要转发的操作,否则我们甚至都不会使用此链。
有一种确保方法可以检查系统是否使用/需要前向链。
iptables -L -v
上面的屏幕快照是运行了几周的服务器,对传入或者传出连接没有任何限制。如我们所见,输入链处理了11GB的数据包,输出链处理了17GB的数据包。另一方面,前向链不需要处理单个数据包。这是因为服务器未进行任何类型的转发或者被用作传递设备。
输出此链用于传出连接。例如,如果我们尝试ping theitroad.local,则iptables将在决定允许或者拒绝连接尝试之前检查其输出链,以了解有关ping和theitroad.local的规则。
注意事项
尽管对外部主机执行ping操作似乎只需要遍历输出链,但请记住,要返回数据,也将使用输入链。使用iptables锁定系统时,请记住许多协议将需要双向通信,因此输入和输出链都需要正确配置。 SSH是人们忘记在两个链上都允许的通用协议。
策略链默认行为
在继续并配置特定规则之前,我们将需要确定三个链的默认行为是什么。换句话说,如果连接不符合任何现有规则,我们希望iptables做什么?
要查看当前配置的策略链如何处理不匹配的流量,请运行iptables -L命令。
如我们所见,我们还使用grep命令为我们提供了更清晰的输出。在该屏幕截图中,我们的链目前被认为接受流量。
我们会希望系统默认接受更多次连接。除非我们以前更改了策略链规则,否则应该已经配置此设置。无论哪种方式,以下是默认情况下接受连接的命令:
iptables --policy INPUT ACCEPT iptables --policy OUTPUT ACCEPT iptables --policy FORWARD ACCEPT
通过默认接受规则,我们可以使用iptables拒绝特定的IP地址或者端口号,同时继续接受所有其他连接。我们将在一分钟内处理这些命令。
如果我们想拒绝所有连接并手动指定要允许连接的连接,则应更改要删除的链的默认策略。这样做可能仅对包含敏感信息并且仅具有相同IP地址的服务器有用。
iptables --policy INPUT DROP iptables --policy OUTPUT DROP iptables --policy FORWARD DROP
特定于连接的响应
配置了默认的链策略后,我们就可以开始向iptables添加规则,这样它就可以知道遇到特定IP地址或者端口的连接时该怎么做。在本指南中,我们将介绍三个最基本和最常用的响应。
接受允许连接。
删除删除连接,就像从未发生过一样。如果我们不希望源代码意识到系统存在,那么最好。
拒绝不允许连接,但发回错误。如果我们不希望特定的源连接到系统,但是我们希望他们知道防火墙阻止了它们,那么这是最好的。
展示这三个规则之间差异的最好方法是显示PC尝试使用为每个设置配置的iptables ping Linux计算机时的状态。
允许或者阻止特定连接
配置了策略链后,我们现在可以配置iptables以允许或者阻止特定的地址,地址范围和端口。在这些示例中,我们将连接设置为" DROP",但是我们可以根据需要和配置策略链的方式将其切换为" ACCEPT"或者" REJECT"。
注意:在这些示例中,我们将使用iptables -A将规则添加到现有链中。 iptables从其列表的顶部开始,遍历每条规则,直到找到匹配的规则。如果我们需要在另一个规则之上插入一条规则,则可以使用iptables -I [chain] [number]
来指定它应该在列表中的数字。
来自单个IP地址的连接
此示例显示如何阻止来自IP地址10.10.10.10的所有连接。
iptables -A INPUT -s 10.10.10.10 -j DROP
本示例说明了如何阻止10.10.10.0/24网络范围内的所有IP地址。我们可以使用网络掩码或者标准斜杠表示法来指定IP地址范围。
iptables -A INPUT -s 10.10.10.0/24 -j DROP
或者
iptables -A INPUT -s 10.10.10.0/255.255.255.0 -j DROP
本示例说明如何阻止来自10.10.10.10的SSH连接。
iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -j DROP
我们可以将ssh替换为任何协议或者端口号。代码的-p tcp部分告诉iptables协议使用哪种连接。如果我们要阻止使用UDP而不是TCP的协议,则必须使用-p udp。
本示例说明如何阻止来自任何IP地址的SSH连接。
iptables -A INPUT -p tcp --dport ssh -j DROP
连接状态
如前所述,许多协议将需要双向通信。例如,如果要允许SSH连接到系统,则输入和输出链都需要添加一条规则。但是,如果只希望允许SSH进入系统怎么办?不会将规则添加到输出链还允许传出SSH尝试吗?
这就是进入连接状态的地方,它为我们提供了允许双向通信但仅允许建立单向连接的能力。看一下此示例,其中允许从10.10.10.10进行SSH连接,但不允许从SSH连接至10.10.10.10. 但是,只要会话已经建立,系统就可以通过SSH发送回信息,这使得这两个主机之间可以进行SSH通信。
iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 22 -d 10.10.10.10 -m state --state ESTABLISHED -j ACCEPT
保存更改
下次重新启动iptables服务时,除非我们执行命令来保存更改,否则我们对iptables规则所做的更改将被废弃。此命令可能会有所不同,具体取决于分发:
Ubuntu:
sudo /sbin/iptables-save
红帽/ CentOS:
/sbin/service iptables save
或者
/etc/init.d/iptables save
其他命令
列出当前配置的iptables规则:
iptables -L
添加-v
选项将为我们提供数据包和字节信息,添加-n
将数字化列出所有内容。换句话说,主机名,协议和网络以数字形式列出。
要清除所有当前配置的规则,可以发出flush命令。
iptables -F