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