iptables
Linux iptables命令示例
iptables是配置实用程序的名称,该实用程序用于配置Linux内核防火墙提供的表。Netfilter是一个内核模块,负责实际的数据包过滤。该应用程序通常由系统的root
用户运行。iptables用于在Linux内核中创建,维护和检查IPv4数据包筛选器规则表。每个表包含许多内置链,也可能包含用户定义的链。
每个链都是可以匹配一组数据包的规则列表。每个规则都指定如何处理匹配的数据包。这称为目标
,可以是到同一表中用户定义的链的跳转。
防火墙规则指定数据包和目标的条件。如果数据包不匹配,则检查链中的下一个规则;否则,检查规则。如果没有匹配项,则下一个规则由目标值指定,这可以是用户定义链的名称,也可以是特殊值ACCEPT
,DROP
,QUEUE
或RETURN
之一。
iptables的基本功能是将规则放入预定义的链中。这些链是INPUT
,OUTPUT
和FORWARD
。根据网络流量检查这些链,然后根据规则决定应采取的措施。数据包被接受或丢弃。这些动作称为目标。主要目标是接受
和拒绝
iptables中使用的三个主要链
输入input:所有发往主机的数据包。
输出output:来自主机的所有数据包。
转发forward:这些数据包不是发往主机的,也不是发自主机的。这些数据包从字面上传递。
然后,将规则添加到每个链中。然后针对这些规则中的每一个依次检查数据包。规则从顶部开始处理。如果匹配,则采取适当的措施。这可以是ACCEPT
或DROP
。一旦与规则进行了匹配并采取了行动,则该链中将不再进行进一步的处理。如果数据包不通过匹配就通过所有规则,则使用默认策略来处理该数据包。此策略将为接受
或拒绝
。
检查是否已安装iptables
大多数发行版都会默认提供安装或安装防火墙的功能。默认情况下,基于RPM的发行版(例如CentOS,Fedora和openSUSE)通常会安装iptables。基于Debian的系统通常使用ufw
替代防火墙。我们将在单独的部分中介绍该产品。
要验证您的系统上是否安装了iptables,可以执行以下rpm查询命令:
[root@rhel01 root]# rpm -q iptables iptables-1.2.5-3 [root@rhel01 root]# lsmod | grep iptab iptable_filter 2752 0 (autoclean) (unused) ip_tables 13984 1 [iptable_filter]
您还可以执行命令:iptables -L以显示当前加载的规则:
[root@rhel01 root]# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
上面的代码表明我们目前没有分配任何规则给输入链(INPUT,FORWARD和OUTPUT)。
定义规则
在下面的示例中,我们将分配一些基本规则。分配规则时请务必小心,如果远程登录服务器,则会失去连接!为了避免这种情况的发生,我们将首先将INPUT链上的默认策略设置为ACCEPT。
将INPUT链上的默认策略设置为ACCEPT
[root@rhel01 root]# iptables -P INPUT ACCEPT
清除所有现有规则
[root@rhel01 root]# iptables -F
将规则附加到INPUT链
[root@rhel01 root]# iptables -A INPUT -i lo -j ACCEPT
-A
标志用于附加规则,-i
标志指定接口。在此示例中,我们指定本地主机。发布后,我们可以看到现在有一个条目:
Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere
将状态模块添加到INPUT链
[root@rhel01 root]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
状态模块用于检查数据包的状态,并确定它是NEW
,ESTABLISHED
还是RELATED
,到目前为止,我们现在可以看到两个新规则:
Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
NEW:传入的数据包是新的,不是由主机系统启动的。
RELATED/ESTABLISHED:这些是具有已建立连接或与已建立连接相关的传入数据包。
开放端口22,允许SSH连接
[root@rhel01 root]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
上面的指令添加了一条规则,该规则允许通过tcp端口22进行连接。
到目前为止,我们的规则如下所示:
Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
修改INPUT链上的默认策略
以下规则会将默认策略设置为DROP。这意味着所有不符合上述规则的数据包都将被丢弃。首先要有ssh规则,这一点很重要,否则,如果远程连接,您可能会将自己锁定在系统之外。
[root@rhel01 root]# iptables -P INPUT DROP
现在我们的规则定义如下。(请注意,默认策略已更改为DROP):
Chain INPUT (policy DROP) target prot opt source destination ACCEPT all -- anywhere anywhere ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
定义FORWARD链的默认策略
[root@rhel01 root]# iptables -P FORWARD DROP
此策略将阻止所有通过我们系统的数据包。
现在,我们的FORWARD政策如下所示:
Chain FORWARD (policy DROP)
定义要接受的输出链的策略
这将允许所有传出流量
[root@rhel01 root]# iptables -P OUTPUT ACCEPT
查看当前规则
要查看我们的规则是否有效,我们可以执行iptables -L -v
命令。-L
将列出规则,-v
指定详细模式:
[root@rhel01 root]# iptables -L -v Chain INPUT (policy DROP 1716 packets, 141K bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT all -- lo any anywhere anywhere 889 79108 ACCEPT all -- any any anywhere anywhere state RELATED,ESTABLISHED 0 0 ACCEPT tcp -- any any anywhere anywhere tcp dpt:ssh Chain FORWARD (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 352 packets, 26164 bytes) pkts bytes target prot opt in out source destination
保存iptables规则
一旦您对自己的规则满足要求感到满意,则将需要保存这些规则。这将确保它们在重启后就位。为此,我们将保存
选项与iptables
命令结合使用:
[root@rhel01 root]# service iptables save Saving current rules to /etc/sysconfig/iptables: [ OK ]
现在,我们的规则已保存,将在下次重新启动时应用。我们可以通过查看以下文件再次验证我们的规则:
/etc/sysconfig/iptables
[root@rhel01 sysconfig]# pwd /etc/sysconfig [root@rhel01 sysconfig]# cat iptables # Generated by iptables-save v1.2.5 on Wed May 8 13:31:38 2013 *filter :INPUT DROP [2199:181749] :FORWARD DROP [0:0] :OUTPUT ACCEPT [660:49656] [0:0] -A INPUT -i lo -j ACCEPT [1141:101408] -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT [0:0] -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT COMMIT # Completed on Wed May 8 13:31:38 2013
根据IP地址进行过滤
防火墙如何限制某个ip访问。
通常,您可能希望从其原始IP地址过滤流量。为此,我们可以创建一个规则以允许特定的IP地址:
[root@rhel01 root]# iptables -A INPUT -s 192.168.0.27 -j ACCEPT
在这里,我们将一条规则附加到来自源192.168.0.27
的ACCEPT数据包的INPUT链上。
如果我们想为本地网络上IP地址为192.168.9.x的所有连接打开网络,则可以添加一条规则:
[root@rhel01 root]# iptables -A INPUT -s 192.168.0.0/24 -j ACCEPT
我们还可以使用类似的规则来丢弃数据包:
[root@rhel01 root]# iptables -A INPUT -s 10.52.231.84 -j DROP
以上规则将丢弃来自IP地址10.52.231.84的所有入站流量
[root@rhel01 root]# iptables -A INPUT -s 192.168.0.0/24 -j DROP
上面的规则将阻止来自192.168.0.0/24网络的所有流量。
按mac地址过滤
如果需要更高的访问安全性,则可以指定mac地址和IP地址。然后,这将仅允许来自具有匹配的mac地址访问权限的指定IP地址的流量:
[root@rhel01 root]# iptables -A INPUT -s 192.168.0.32 -m mac --mac-source 00:50:56:AF:1F:74 -j ACCEPT
上面的代码现在将在INPUT链中添加一条规则,以允许来自IP地址192.168.0.32的流量,其MAC地址为00:50:56:AF:1F:74。选项-m mac
用于加载模块mac
,而--mac-source
用于允许我们指定mac地址。
打开一系列端口
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 7000:7010 -j ACCEPT
上面的命令将端口7000打开到端口7010,以供入站流量使用。
iptables选项
显示带有数字行号的规则:
[root@rhel01 root]# iptables -n -L -v --line-numbers Chain INPUT (policy DROP 7871 packets, 646K bytes) num pkts bytes target prot opt in out source destination 1 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 2 2144 191K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 3 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 4 0 0 ACCEPT all -- * * 192.168.0.27 0.0.0.0/0 5 0 0 ACCEPT all -- * * 192.168.0.0/24 0.0.0.0/0 6 0 0 ACCEPT all -- * * 192.168.0.32 0.0.0.0/0 MAC 00:50:56:AF:1F:74 Chain FORWARD (policy DROP 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 1907 packets, 137K bytes) num pkts bytes target prot opt in out source destination
显示特定的链条规则
[root@rhel01 root]# iptables -L INPUT -n -v
上面的命令显示INPUT
链中的规则。
[root@rhel01 root]# iptables -L OUTPUT -n -v
上面的命令显示输出
链中的规则。
如何删除规则
删除规则的最简单方法是使用以下命令找出与其关联的行号:
iptables -n -L -v -line-numbers [root@rhel01 root]# iptables -n -L -v --line-numbers [root@rhel01 root]# iptables -n -L -v --line-numbers Chain INPUT (policy DROP 7871 packets, 646K bytes) num pkts bytes target prot opt in out source destination 1 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 2 2144 191K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 3 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 4 0 0 ACCEPT all -- * * 192.168.0.27 0.0.0.0/0 5 0 0 ACCEPT all -- * * 192.168.0.0/24 0.0.0.0/0 6 0 0 ACCEPT all -- * * 192.168.0.32 0.0.0.0/0 MAC 00:50:56:AF:1F:74
一旦确定了要删除的规则,就可以如下指定其行号(在我们的示例中,我们从INPUT链中删除了第6行):
[root@rhel01 root]# iptables -D INPUT 6 [root@rhel01 root]# iptables -n -L -v --line-numbers Chain INPUT (policy DROP 8860 packets, 727K bytes) num pkts bytes target prot opt in out source destination 1 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 2 2419 216K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 3 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 4 0 0 ACCEPT all -- * * 192.168.0.27 0.0.0.0/0 5 0 0 ACCEPT all -- * * 192.168.0.0/24 0.0.0.0/0