iptables允许配置Linux内核防火墙提供的表以及它存储的链和规则。当前用于iptables的内核模块仅适用于IPv4流量,为IPv6连接配置防火墙规则,而使用ip6tables,后者响应与iptables相同的命令结构。如果您使用的是CentOS 7,则应该考虑配置Firewalld防火墙,它结合了iptables和ip6tables的功能,尽管仍然可以使用相同的iptables。
列出当前iptables规则
在CentOS上,iptables通常带有一些预配置的规则,可使用以下命令检查当前的iptables规则。
[root@myvps ~]# iptables -L
这将打印出三个链的列表,input,forward和output,如下面的空规则表例子的输出。
Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED ACCEPT icmp -- anywhere anywhere ACCEPT all -- anywhere anywhere ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh REJECT all -- anywhere anywhere reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT) target prot opt source destination REJECT all -- anywhere anywhere reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT) target prot opt source destination
链名称表示在每个列表规则里哪些流量被允许,INPUT为任何来你服务器的连接,OUTPUT是任何离开的流量,FORWARD是任何通过的流量。每个链都有其策略设置,该策略设置确定如果流量与任何特定规则都不匹配,则如何处理流量,默认情况下将其设置为accept。
添加规则
防火墙通常可以通过以下两种方式之一进行配置:
- 将默认规则设置为接受,然后使用特定规则阻止任何不需要的流量。
- 使用规则定义允许的流量,阻止其他所有内容。
后者通常是推荐的方法,因为它允许抢先阻止流量,而不必被动地拒绝不应尝试访问你的服务器的连接。
要开始使用iptables,你应该首先添加所需服务允许的入站流量的规则。iptables可以跟踪连接状态,因此请使用以下命令允许已建立的连接继续。
[root@myvps ~]# iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
你可以使用与前面相同的iptables -L
检查是否已添加规则。
接下来,用下面语句允许到特定端口的流量启用SSH连接。
[root@myvps ~]# iptables -A INPUT -p tcp --dport ssh -j ACCEPT
命令中的ssh转换为端口号22,协议默认使用该端口号。相同的命令结构也可用于允许流量流向其他端口。要启用对HTTP Web服务器的访问,请使用以下命令。
[root@myvps ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
添加所需的所有允许规则后,把INPUT策略更改为DROP。
[root@myvps ~]# iptables -P INPUT DROP
通过输入链名称并选择DROP或ACCEPT,也可以为其他链定义相同的策略规则。
保存和还原规则
现在,如果你要重新启动服务器,则所有这些iptables配置都将被擦除。为防止这种情况,要将规则保存到文件中。
[root@myvps ~]# iptables-save > /etc/sysconfig/iptables
你可以通过读取保存的文件来简单地还原保存的规则。
# 覆盖当前规则 [root@myvps ~]# iptables-restore < /etc/sysconfig/iptables # 添加新规则,保持当前规则 [root@myvps ~]# iptables-restore -n < /etc/sysconfig/iptables
为了在重启时自动执行还原,CentOS提供了一个具有相同名称的系统服务iptables,需要启用它。
[root@myvps ~]# chkconfig iptables on
之后,你可以使用以下命令简单地保存当前规则。
[root@myvps ~]# service iptables save
这些只是你可以与iptables一起使用的一些简单命令,它具有更多功能。继续阅读以检查其他一些选项,这些选项可用于对iptable规则进行更高级的控制。
高级规则设置
按照基本的防火墙行为,将按照每个链上列出的顺序读取规则,这意味着你需要按照正确的顺序放置规则。附加新规则会将它们添加到列表的末尾。你可以使用下面命令将新规则添加到列表的特定位置。
[root@myvps ~]# iptables -I <index> -command
其中<index>
是你希望插入规则的序号。要知道要输入哪个索引号,请使用以下命令。
[root@myvps ~]# iptables -L --line-numbers
Chain INPUT (policy DROP) num target prot opt source destination 1 ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED 2 ACCEPT tcp -- anywhere anywhere tcp dpt:ssh 3 ACCEPT tcp -- anywhere anywhere tcp dpt:http
每条规则行开头的数字表示链中的位置。要在特定的现有规则之上插入新规则,只需使用该现有规则的索引号即可。例如,要将新规则插入到链的顶部,请使用以下索引号为1的命令。
[root@myvps ~]# iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT
如果要从某个链中删除现有规则,请使用带有参数-D
的delete命令。选择删除规则的最简单方法是使用上述索引号。例如,要删除输入链上的第二条规则,请使用此命令。
[root@myvps ~]# iptables -D INPUT 2
也可以使用-F -parameter
刷新特定链的所有规则,甚至刷新整个iptables 。如果你怀疑iptables干扰了你尝试的网络流量,或者只是希望从干净表中重新开始配置,这将很有用。在刷新表之前,请记住将规则保存到文件中。
# 清楚输入链 [root@myvps ~]# iptables -F INPUT # 刷新整个iptables [root@myvps ~]# iptables -F
刷新iptables后,你的服务器可能容易受到攻击。确保使用另一种方法保护系统,同时暂时禁用iptables。