iptables是一个命令行防火墙实用程序,它使用策略链来允许或阻止流量。 当连接尝试在您的系统上建立自己的连接时,iptables会在其列表中查找与之匹配的规则。 如果找不到,则采取默认操作。
iptables几乎总是预装在任何Linux发行版上。 要更新/安装它,只需获取iptables软件包:
诸如Firestarter之类的iptables可以使用GUI替代,但是一旦您掌握了一些命令,iptables并没有那么难。 您在配置iptables规则时要格外小心,尤其是如果您通过SSH连接到服务器时,因为一个错误的命令会永久将您锁定,直到将其手动固定在物理计算机上为止。
INPUT:此链用于控制传入连接的行为。 例如,如果用户尝试通过SSH进入您的PC /服务器,则iptables将尝试将IP地址和端口与输入链中的规则进行匹配。
OUTPUT:此链用于传出连接。例如,如果您尝试ping www.baidu.com,iptables将在决定允许或拒绝连接尝试之前检查其OUTPUT链,以查看有关ping和www.baidu.com的规则是什么。
FORWARD:此链用于实际不在本地传递的传入连接。 想一想路由器–数据总是被发送到路由器,但实际上很少发送给路由器本身。 数据只是转发到其目标。 除非您在系统上进行某种形式的路由,NAT或其他需要转发的操作,否则您甚至都不会使用此链。
有一种确保方法可以检查您的系统是否使用/需要FORWARD链。
iptables -L -v
Policy链默认行为
在继续并配置特定规则之前,您需要确定三个链的默认行为是什么。 换句话说,如果连接不符合任何现有规则,您希望iptables做什么?
要查看当前配置了哪些策略链以处理不匹配的流量,请运行iptables -L命令。
[root@fw yening]# sudo iptables -L | grep policy
Chain INPUT (policy ACCEPT)
Chain FORWARD (policy ACCEPT)
Chain OUTPUT (policy ACCEPT)
如您所见,我们还使用grep命令为我们提供了更清晰的输出。 在该屏幕截图中,我们的链目前被认为接受流量。
您希望系统默认接受连接的次数更多。 除非您之前更改了policy链规则,否则应该已经配置此设置。 无论哪种方式,以下都是默认情况下接受连接的命令:
iptables --policy INPUT ACCEPT
iptables --policy OUTPUT ACCEPT
iptables --policy FORWARD ACCEPT
通过默认接受规则,您可以使用iptables拒绝特定的IP地址或端口号,同时继续接受所有其他连接。 我们将在一分钟内处理这些命令。
如果您想拒绝所有连接并手动指定要允许连接的连接,则应更改要删除的链的默认策略。 这样做可能仅对包含敏感信息且仅具有相同IP地址的服务器有用。
特定连接的响应
配置了默认链策略后,您可以开始向iptables添加规则,以便它知道在遇到来自或指向特定IP地址或端口的连接时该如何操作。在本指南中,我们将回顾三个最基本、最常用的“回答”。
Accept-允许连接。
Drop 丢掉连接,就当什么都没发生过。如果您不希望源代码意识到您的系统存在,这是最好的。
Reject-不允许连接,但发回错误。如果您不想让某个特定的源连接到您的系统,但又想让他们知道您的防火墙阻止了他们,那么这是最好的。
要显示这三个规则之间的差异,最好的方法是显示当PC尝试ping Linux机器(为每个设置配置了iptables)时是什么样子。
区分流量接口
很多初入门的新手在配置防火墙时,往往无法分辨什么时候配置INPUT链,在什么情况下配置OUTPUT链,我们用一个简单的示例:DNS服务器查询的流程
这里DNS服务器的防火墙默认是禁止所有连接请求的。现在服务器需要向其他公共DNS发起连接请求,需要iptables为其开放udp的53端口。
- 既然是DNS请求是他自己发起的,那么它的数据报文请求就需要发送到外部的服务器,那么对于iptables来说,这个DNS请求需要经由OUTPUT链处理.
iptables -I OUTPUT -d 0.0.0.0/0 -p udp --dport 53 -j ACCEPT
- 当dns的查询结果返回到DNS服务器,此时返回的数据报文用到源端口53,并且是进入dns服务器的,该数据报文必须经过iptables的INPUT链处理的。
iptables -I INPUT -s 0.0.0.0/0 -p udp --sport 53 -j ACCEPT
上面的两条防火墙条目,我们不妨配置iptables后,并且执行dns查询后,使用如下命令测试
iptables -L INPUT-v
和
iptables -L OUTPUT -v
看看测试的结果是否如我们所料!,INPUT链中有数据包流量
[root@fw yening]# iptables -L INTPUT -v
Chain INPUT (policy ACCEPT 2527K packets, 3753M bytes)
pkts bytes target prot opt in out source destination
1258 261K ACCEPT udp -- any any anywhere anywhere udp spt:domain
OUTPUT链中的数据包流量
[root@fw yening]# iptables -L OUTPUT -v
Chain OUTPUT (policy ACCEPT 1918K packets, 136M bytes)
pkts bytes target prot opt in out source destination
3117 220K ACCEPT udp -- any any anywhere anywhere udp dpt:domain
这里读者,应该举一反三,如果的Linux服务器还存在应用需要开放防火墙相关端口的话,如何快速查阅端口?
请使用linux的netstat -plntu这条指令能够查阅到你当前系统后台运行的所有进程的监听端口