Linux 内核中有一个功能强大的联网子系统 netfilter。netfilter 子系统提供了有状态的或无状态的分组过滤,还提供了 NAT 和 IP 伪装服务。netfilter 还具备为高级选路和连接状态管理而变形(mangle)IP 头信息的能力。netfilter 是通过 IPTables 工具来控制的。
IPTables 总览
netfilter 的强大功能和灵活性是通过 IPTables 界面来实现的。这个命令行工具和它的前身 IPChains 的语法很相似;不过,IPTables 使用 netfilter 子系统来增进网络连接、检验、和处理方面的能力;IPChains 使用错综复杂的规则集合来过滤源地和目的地路线以及两者的连接端口。IPTables 只在一个命令行界面中就包括了更先进的记录方式;选路前和选路后的行动;网络地址转换;以及端口转发。
7.2. 使用 IPTables
使用 IPTables 的第一步是启动 IPTables 服务。这可以使用以下命令进行:
service iptables start
警告
你应该使用以下命令关闭 IP6Tables 服务才能使用 IPTables 服务:
service ip6tables stop
chkconfig ip6tables off
要使 IPTables 在系统引导时默认启动,你必须使用 chkconfig 来改变服务的运行级别状态。
chkconfig --level 345 iptables on
IPTables 的语法被分成几个层次。主要层次为“链”(chain)。“链”指定处理分组的状态。其用法为:
iptables -A chain -j target
-A 在现存的规则集合内后补一条规则。chain 是规则所在“链”的名称。IPTables 中有三个内建的链(即影响每一个在网络中经过的分组的链):INPUT、OUTPUT、和 FORWARD。这些链是永久性的,不能被删除。
重要
在创建 IPTables 规则集合时,记住规则的顺序是至关重要的。例如:如果某个链指定了来自本地子网 192.168.100.0/24 的任何分组都应放弃,然后一个允许来自 192.168.100.13(在前面要放弃分组的子网范围内)的分组的链被补在这个规则后面(-A),那么这个后补的规则就会被忽略。你必须首先设置允许 192.168.100.13 的规则,然后再设置放弃规则。
要在现存规则链的任意处插入一条规则,使用 -I,随后是你想插入规则的链的名称,然后是你想放置规则的位置号码(1,2,3,...,n)。例如:
iptables -I INPUT 1 -i lo -p all -j ACCEPT
这条规则被插入为 INPUT 链的第一条规则,它允许本地环回设备上的交通。
7.2.1. 基本防火墙策略
在一开始就建立的某些基本策略为建构更详细的用户定义的规则奠定了基础。IPTables 使用策略(policy, -P)来创建默认规则。对安全敏感的管理员通常想采取放弃所有分组、只逐一允许指定分组的策略。以下规则阻塞网络上所有的出入分组。
iptables -P INPUT DROP
iptables -P OUTPUT DROP
此外,还推荐你拒绝所有转发分组(forwarded packets) — 要从防火墙被选路发送到它的目标节点的网络交通 — 以便限制内部客户对互联网的无心暴露。要达到这个目的,使用以下规则:
iptables -P FORWARD DROP
注记
在处理添加的规则时,REJECT(拒绝)目标和 DROP(放弃)目标这两种行动有所不同。REJECT 会拒绝目标分组的进入,并给企图连接服务的用户返回一个 connection refused 的错误消息。DROP 会放弃分组,而对 telnet 用户不发出任何警告;不过,为了避免导致用户由于迷惑不解而不停试图连接的情况的发生,推荐你使用 REJECT 目标。
设置了策略链后,为你的特定网络和安全需要创建新规则。以下各节概述了一些你在建构 IPTables 防火墙时可能要实现的规则。
7.2.2. 保存和恢复 IPTables 规则
防火墙规则只在计算机处于开启状态时才有效。如果系统被重新引导,这些规则就会自动被清除并重设。要保存规则以便今后载入,请使用以下命令:
/sbin/service iptables save
保存在 /etc/sysconfig/iptables 文件中的规则会在服务启动或重新启动时(包括机器被重新引导时)被应用。
常用 iptables 过滤
把远程攻击者拒之“LAN”外是网络保安的一个重要方面。LAN 的完好性应该通过使用严格的防火墙规则来抵御蓄意不良的远程用户而被保护。但是,如果默认策略被设置为阻塞所有进入、输出、和转发的分组,防火墙/网关和内部 LAN 用户之间的通信就无法进行。要允许用户执行和网络相关的功能以及使用联网应用程序,管理员必须打开某些端口进行通信。
例如:要允许到防火墙上的端口80的通信,添加以下规则:
iptables -A INPUT -p tcp -m tcp --sport 80 -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT
这会允许用户浏览通过端口80通信的网站。要允许到安全网站(如 https://www.example.com/)的访问,你还必须打开端口443。
iptables -A INPUT -p tcp -m tcp --sport 443 -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --dport 443 -j ACCEPT
有时候,你可能会需要从 LAN 之外远程地进入 LAN。SSH 和 CIPE 之类的安全服务可以用于到 LAN 服务的加密远程连接。对于拥有基于 PPP 资源(如调制解调器池或批量 ISP 帐号)的管理员来说,拨号进入可以被用来安全地避开防火墙,因为调制解调器连接是直接连接,通常位于防火墙/网关之后。 然而,对于有宽带连接的远程用户来说,你就需要制定些特殊规定。你可以配置 IPTables 接受来自远程 SSH 和 CIPE 客户的连接。例如,要允许远程 SSH 访问,你可以使用以下规则:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p udp --sport 22 -j ACCEPT
来自外部的 CIPE 连接请求可以使用以下命令来接受(把 x 替换成你的设备号码):
iptables -A INPUT -p udp -i cipcbx -j ACCEPT
7.4. FORWARD 和 NAT 规则
多数机构从它们的 ISP 处得到数量有限的可公开选路的 IP 地址。鉴于这种限额,管理员必须创建性地积极寻求分享互联网服务的方法,而又不必把稀有的 IP 地址分配给 LAN 上的每一台机器。使用专用 IP 地址是允许 LAN 上的所有机器正确使用内部和外部网络服务的常用方法。边缘路由器(如防火墙)可以接收来自互联网的进入交通,并把这些分组选路发送它们意图发送的 LAN 节点上;同时,防火墙/网关还可以把来自 LAN 节点的输出请求选路发送到远程互联网服务中。这种转发网络交通行为有时会很危险,特别是随着能够假冒内部 IP 地址、使远程攻击者的机器成为你的 LAN 上的一个节点的现代攻击工具的出现。为防止此类事件的发生,iptables 提供了选路发送和转发策略,你可以实施它们来防止对网络资源的变相利用。
FORWARD 策略允许管理员控制分组可以被选路发送到 LAN 内的哪些地方。例如:要允许整个 LAN 的转发(假定防火墙/网关在 eth1 上有一个内部 IP 地址),你可以设置以下规则:
iptables -A FORWARD -i eth1 -j ACCEPT
iptables -A FORWARD -o eth1 -j ACCEPT
注记
按照默认设置,红帽企业 Linux 内核中的 IPv4 策略禁用了对 IP 转发的支持,这会防止运行红帽企业 Linux 的机器成为专用边缘路由器。要启用 IP 转发,请运行以下命令:
sysctl -w net.ipv4.ip_forward=1
如果该命令是通过 shell 提示运行的,那么其设置在重新引导后就不会被保存。你可以通过编辑 /etc/sysctl.conf 文件来永久性地设置转发。寻找并编辑以下行,把 0 改成 1:
net.ipv4.ip_forward = 0
执行以下命令来启用 sysctl.conf 文件中的改变:
sysctl -p /etc/sysctl.conf
这会允许 LAN 节点彼此通信;不过,它们没有被允许和外界(如互联网)通信。要允许带有专用 IP 地址的 LAN 节点和外部的公共网络通信,配置防火墙的 IP 伪装(IP masquerading),这会把来自 LAN 节点的请求都伪装成防火墙的外部设备(在这个例子中是 eth0)的 IP 地址。
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
7.5. DMZ 和 iptables
你还可以设置一些把交通选路发送到某些机器(如专用 HTTP 或 FTP 服务器)的规则,这些机器最好是位于停火区域(de-militarized zone,DMZ)的和内部网络分开的机器。要设置一条把所有进入的 HTTP 请求都选路发送到 IP 地址为 10.0.4.2、端口为80(LAN 192.168.1.0/24 范围之外)的专用 HTTP 服务器的规则,网络地址转换(NAT)会调用 PREROUTING 表来把这些分组转发到恰当的目的地:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT \
--to-destination 10.0.4.2:80
使用这项命令,所有来自 LAN 以外的到端口80的 HTTP 连接都会被选路发送到和内部网络分离的另一个网络上的 HTTP 服务器上。这种网络分段会比允许到内部网络中的机器上的 HTTP 连接更安全。如果 HTTP 服务器被配置接受安全连接,那么端口443也必须被转发。
病毒和假冒 IP 地址
你可以更精心设计一些规则来控制到 LAN 内指定子网的访问,甚至到指定机器的访问。你还可以限制某些类似特洛伊木马、蠕虫、以及其它客户/服务器病毒的可疑服务联系它们的服务器。例如:有些特洛伊木马会扫描端口31337到31340(即黑客语言中的 elite 端口)上的服务。既然合法服务都不使用这些非标准端口来通信,阻塞这些端口能够有效地减少你的网络上可能被感染的机器和它们的远程主服务器进行独立通信的机会。
iptables -A OUTPUT -o eth0 -p tcp --dport 31337 --sport 31337 -j DROP
iptables -A FORWARD -o eth0 -p tcp --dport 31337 --sport 31337 -j DROP
你还可以阻塞试图假冒你所在 LAN 的专用 IP 地址混入的连接。例如:如果你的 LAN 使用 192.168.1.0/24 范围,面向互联网的网络设备(如 eth0)上就可以设置一条规则来放弃到那个设备的使用你所在 LAN 的 IP 范围的分组。因为默认策略是拒绝转发分组,所有到面向外界的设备(eth0)的假冒 IP 地址都会被自动拒绝。
iptables -A FORWARD -s 192.168.1.0/24 -i eth0 -j DROP
IP6Tables
下一代互联网协议 IPv6 的出现突破了 IPv4(或 IP)的32位地址限制。IPv6 支持128位地址,因此识别 IPv6 的载体网络就能够制定比 IPv4 更多的可选路地址。
红帽企业 Linux 支持使用 Netfilter 6 子系统和 IP6Tables 命令的 IPv6 防火墙规则。使用 IP6Tables 的第一步是启动 IP6Tables 服务。它可以使用以下命令进行:
service ip6tables start
警告
你必须关闭 IPTables 服务才能专门使用 IP6Tables 服务:
service iptables stop
chkconfig iptables off
要使 IP6Tables 在系统引导时默认启动,使用 chkconfig 来改变服务的运行级别状态。
chkconfig --level 345 ip6tables on
其语法在各方面都和 IPTables 相同,只不过 IPTables 支持128位的地址。例如:在识别 IPv6 的网络服务器器上的 SSH 连接可以使用以下规则来启用:
ip6tables -A INPUT -i eth0 -p tcp -s 3ffe:ffff:100::1/128 --dport 22 -j ACCEPT
关于 IPv6 联网的详情,请参阅 IPv6 的信息页:http://www.ipv6.org/。
iptables -A OUTPUT -p udp -o cipcbx -j ACCEPT
CIPE 使用它自己的传输数据报(UDP)分组的虚拟设备,因此这条规则允许 cipcb 接口上的进入连接,而不是规定源地端口或目标端口(虽然它们可以被用来代替设备选项)。关于使用 CIPE 的信息,请参阅第6章 。
你可能还想为其它服务定义规则。关于 IPTables 及其各类选项的完整信息,请参阅《红帽企业 Linux 参考指南》。
这些规则允许到防火墙上的常规及安全服务的访问;然而,它们并不允许防火墙之后的机器使用这些服务。要允许 LAN 使用这些服务,你可以使用带有 IPTables 过滤规则的 NAT