词条 | IPTABLES |
释义 | § 简单介绍 iptables 是与最新的 2.4.x 版本 Linux 内核集成的 IP 信息包过滤系统。如果 Linux 系统连接到因特网或 LAN、服务器或连接 LAN 和因特网的代理服务器, 则该系统有利于在 Linux 系统上更好地控制 IP 信息包过滤和防火墙配置。 netfilter/iptables IP 信息包过滤系统是一种功能强大的工具,可用于添加、编辑和除去规则,这些规则是在做信息包过滤决定时,防火墙所遵循和组成的规则。这些规则存储在专用的信息包过滤表中,而这些表集成在 Linux 内核中。在信息包过滤表中,规则被分组放在我们所谓的链(chain)中。 § netfilter 和 iptables 虽然 netfilter/iptables IP 信息包过滤系统被称为单个实体,但它实际上由两个组件netfilter 和 iptables 组成。 netfilter 组件也称为内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。 iptables 组件是一种工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。除非您正在使用 Red Hat Linux 7.1 或更高版本,否则需要下载该工具并安装使用它。 § Netfilter框架 Netfilter对数据包的处理流程是在整个网络流程的若干个位置放置一些钩子(HOOK),且在钩子处定义一些处理函数对数据包进行处理。在IPV4中,它定义了五个钩子函数,分别是1)NF-IP-PRE-ROUTING;2)NF-IP-LOCAL-IN;3)NF-IP-FORWARD;4)NF-IP-POST-ROUTING;5)NF-IP-LOCAL-OUT。如图所示: IPTABLES 数据包从左边进入系统,进行简单的校验(如版本、IP校验)后,经过HOOK点①,由钩子函数NF-IP-PRE-ROUTING进行处理;然后进入路由代码,其决定该数据包是转发还是发给本机;若该数据包是发给本机的则在HOOK点②,则由钩子函数NF-IP-LOCAL-IN处理后传递给上层协议;若该数据包应该被转发,则它在HOOK点③由NF-IP-FORWARD钩子函数处理;经过转发的数据包在HOOK点④由NF-IP-POST-ROUTING处理后再传输到网络上。而且本地产生的数据包在HOOK点⑤经由NF-IP-LOCAL-OUT钩子函数处理后进行路由选择处理,然后经由NF-IP-POST-ROUTING处理并发送到网络上。 数据包在经过这些HOOK点时,相应的钩子函数将被调用,通过对数据包进行操作,向Netfilter返回表示接受或丢弃。 § 语法规则 建立规则和链 通过向防火墙提供有关对来自某个源、到某个目的地或具有特定协议类型的信息包要做些什么的指令,规则控制信息包的过滤。通过使用 netfilter/iptables 系统提供的特殊命令 iptables ,建立这些规则,并将其添加到内核空间的特定信息包过滤表内的链中。关于添加/除去/编辑规则的命令的一般语法如下: $ iptables [-t table] command [match] [target] 表(table) [-t table] 选项允许使用标准表之外的任何表。表是包含仅处理特定类型信息包的规则和链的信息包过滤表。有三种可用的表选项: filter 、 nat 和 mangle 。该选项不是必需的,如果未指定,则 filter 用作缺省表。 filter 表用于一般的信息包过滤,它包含 INPUT 、 OUTPUT 和 FORWARD 链。nat 表用于要转发的信息包,它包含 PREROUTING 、 OUTPUT 和 POSTROUTING 链。如果信息包及其头内进行了任何更改,则使用 mangle 表。该表包含一些规则来标记用于高级路由的信息包,该表包含 PREROUTING 和 OUTPUT 链。 注: PREROUTING 链由指定信息包一到达防火墙就改变它们的规则所组成,而 POSTROUTING 链由指定正当信息包打算离开防火墙时改变它们的规则所组成。 命令(command) 上面这条命令中具有强制性的 command 部分是 iptables 命令的最重要部分。它告诉 iptables 命令要做什么,例如,插入规则、将规则添加到链的末尾或删除规则。以下是最常用的一些命令: -A 或 --append : 该命令将一条规则附加到链的末尾。 示例: $ iptables -A INPUT -s 205.168.0.1 -j ACCEPT 该示例命令将一条规则附加到 INPUT 链的末尾,确定来自源地址 205.168.0.1 的信息包可以 ACCEPT 。 -D 或 --delete : 通过用 -D 指定要匹配的规则或者指定规则在链中的位置编号,该命令从链中删除该规则。下面的示例显示了这两种方法。 示例: $ iptables -D INPUT --dport 80 -j DROP $ iptables -D OUTPUT 3 第一条命令从 INPUT 链删除规则,它指定 DROP 前往端口 80 的信息包。第二条命令只是从 OUTPUT 链删除编号为 3 的规则。 -P 或 --policy : 该命令设置链的缺省目标,即策略。所有与链中任何规则都不匹配的信息包都将被强制使用此链的策略。 示例: $ iptables -P INPUT DROP 该命令将 INPUT 链的缺省目标指定为 DROP 。这意味着,将丢弃所有与 INPUT 链中任何规则都不匹配的信息包。 -N 或 --new-chain : 用命令中所指定的名称创建一个新链。 示例: $ iptables -N allowed-chain -F 或 --flush : 如果指定链名,该命令删除链中的所有规则,如果未指定链名,该命令删除所有链中的所有规则。此参数用于快速清除。 示例: $ iptables -F FORWARD $ iptables -F -L 或 --list : 列出指定链中的所有规则。 示例: $ iptables -L allowed-chain 匹配(match) iptables 命令的可选 match 部分指定信息包与规则匹配所应具有的特征(如源和目的地地址、协议等)。匹配分为两大类: 通用匹配和特定于协议的匹配。这里,我将研究可用于采用任何协议的信息包的通用匹配。下面是一些重要的且常用的通用匹配及其示例和说明: -p 或 --protocol : 该通用协议匹配用于检查某些特定协议。协议示例有 TCP 、 UDP 、 ICMP 、用逗号分隔的任何这三种协议的组合列表以及 ALL (用于所有协议)。 ALL 是缺省匹配。可以使用 ! 符号,它表示不与该项匹配。 示例: $ iptables -A INPUT -p TCP, UDP $ iptables -A INPUT -p ! ICMP 在上述示例中,这两条命令都执行同一任务 — 它们指定所有 TCP 和 UDP 信息包都将与该规则匹配。通过指定 ! ICMP ,我们打算允许所有其它协议(在这种情况下是 TCP 和 UDP ),而将 ICMP 排除在外。 -s 或 --source : 该源匹配用于根据信息包的源 IP 地址来与它们匹配。该匹配还允许对某一范围内的 IP 地址进行匹配,可以使用 ! 符号,表示不与该项匹配。缺省源匹配与所有 IP 地址匹配。 示例: $ iptables -A OUTPUT -s 192.168.1.1 $ iptables -A OUTPUT -s 192.168.0.0/24 $ iptables -A OUTPUT -s ! 203.16.1.89 第二条命令指定该规则与所有来自 192.168.0.0 到 192.168.0.24 的 IP 地址范围的信息包匹配。第三条命令指定该规则将与除来自源地址 203.16.1.89 外的任何信息包匹配。 -d 或 --destination : 该目的地匹配用于根据信息包的目的地 IP 地址来与它们匹配。该匹配还允许对某一范围内 IP 地址进行匹配,可以使用 ! 符号,表示不与该项匹配。 示例: $ iptables -A INPUT -d 192.168.1.1 $ iptables -A INPUT -d 192.168.0.0/24 $ iptables -A OUTPUT -d ! 203.16.1.89 目标(target) 我们已经知道,目标是由规则指定的操作,对与那些规则匹配的信息包执行这些操作。除了允许用户定义的目标之外,还有许多可用的目标选项。下面是常用的一些目标及其示例和说明: ACCEPT : 当信息包与具有 ACCEPT 目标的规则完全匹配时,会被接受(允许它前往目的地),并且它将停止遍历链(虽然该信息包可能遍历另一个表中的其它链,并且有可能在那里被丢弃)。该目标被指定为 -j ACCEPT 。 DROP : 当信息包与具有 DROP 目标的规则完全匹配时,会阻塞该信息包,并且不对它做进一步处理。该目标被指定为 -j DROP 。 REJECT : 该目标的工作方式与 DROP 目标相同,但它比 DROP 好。和 DROP 不同, REJECT 不会在服务器和客户机上留下死套接字。另外, REJECT 将错误消息发回给信息包的发送方。该目标被指定为 -j REJECT 。 示例: $ iptables -A FORWARD -p TCP --dport 22 -j REJECT RETURN : 在规则中设置的 RETURN 目标让与该规则匹配的信息包停止遍历包含该规则的链。如果链是如 INPUT 之类的主链,则使用该链的缺省策略处理信息包。它被指定为 -jump RETURN 。示例: $ iptables -A FORWARD -d 203.16.1.89 -jump RETURN 还有许多用于建立高级规则的其它目标,如 LOG 、 REDIRECT 、 MARK 、 MIRROR 和 MASQUERADE 等。 保存规则 现在,您已经学习了如何建立基本的规则和链以及如何从信息包过滤表中添加或删除它们。但是,您应该记住:用上述方法所建立的规则会被保存到内核中,当重新引导系统时,会丢失这些规则。所以,如果您将没有错误的且有效的规则集添加到信息包过滤表,同时希望在重新引导之后再次使用这些规则,那么必须将该规则集保存在文件中。可以使用 iptables-save命令来做到这一点: $ iptables-save > iptables-script 现在,信息包过滤表中的所有规则都被保存在文件 iptables-script 中。无论何时再次引导系统,都可以使用 iptables-restore命令将规则集从该脚本文件恢复到信息包过滤表,如下所示: $ iptables-restore iptables-script 如果您愿意在每次引导系统时自动恢复该规则集,则可以将上面指定的这条命令放到任何一个初始化shell脚本中。 § netfilter/iptables 系统的优点 netfilter/iptables 的最大优点是它可以配置有状态的防火墙,这是 ipfwadm 和 ipchains 等以前的工具都无法提供的一种重要功能。有状态的防火墙能够指定并记住为发送或接收信息包所建立的连接的状态。防火墙可以从信息包的连接跟踪状态获得该信息。在决定新的信息包过滤时,防火墙所使用的这些状态信息可以增加其效率和速度。这里有四种有效状态,名称分别为 ESTABLISHED 、 INVALID 、 NEW 和 RELATED 。 状态 ESTABLISHED 指出该信息包属于已建立的连接,该连接一直用于发送和接收信息包并且完全有效。 INVALID 状态指出该信息包与任何已知的流或连接都不相关联,它可能包含错误的数据或头。状态 NEW 意味着该信息包已经或将启动新的连接,或者它与尚未用于发送和接收信息包的连接相关联。最后, RELATED 表示该信息包正在启动新连接,以及它与已建立的连接相关联。 netfilter/iptables 的另一个重要优点是,它使用户可以完全控制防火墙配置和信息包过滤。您可以定制自己的规则来满足您的特定需求,从而只允许您想要的网络流量进入系统。 另外,netfilter/iptables 是免费的,这对于那些想要节省费用的人来说十分理想,它可以代替昂贵的防火墙解决方案。 iptables 可以从 www.netfilter.org 下载。 § iptables 入门 iptables 中的指令,均需区分大小写。 ipchains 和 iptables 在语法上的主要的差异,注意如下∶ 1. 在 ipchains 中,诸如 input 链,是使用小写的 chains 名,在 iptables 中,要改用大写 INPUT。 2. 在 iptables 中,要指定规则是欲作用在那一个规则表上(使用 -t 来指定,如 -t nat),若不指定,则预设 是作用在 filter 这个表。 3. 在 ipchains 中, -i 是指介面(interface),但在 iptables 中,-i 则是指进入的方向,且多了 -o,代表出去的方向。 4. 在 iptables 中,来源 port 要使用关键字 --sport 或 --source-port 5. 在 iptables 中,目的 port 要使用关键字 --dport 或 --destination-port 6. 在 iptables 中,"丢弃" 的处置动作,不再使用 DENY 这个 target,改用 DROP。 7. 在 ipchains 的记录档功能 -l,已改为目标 -j LOG,并可指定记录档的标题。 8. 在 ipchains 中的旗标 -y,在 iptables 中可用 --syn 或 --tcp-flag SYN,ACK,FIN SYN 9. 在 iptables 中,imcp messages 型态,要加上关键字 --icmp-type,如∶ iptables -A OUTPUT -o eth0 -p icmp -s $FW_IP --icmp-type 8 -d any/0 -j ACCEPT iptables 使用时的样板 观察目前的设定 作法如下∶ iptables -L -n iptablse -t nat -L -n 定义变数 FW_IP="163.26.197.8" 打开核心 forward 功能 作法如下∶ ###-----------------------------------------------------### # 打开 forward 功能 ###-----------------------------------------------------### echo "1" > /proc/sys/net/ipv4/ip_forward 清除所有的规则 一开始要先清除所有的规则,重新开始,以免旧有的规则影响新的设定。作法如下∶ ###-----------------------------------------------------### # 清除先前的设定 ###-----------------------------------------------------### # 清除预设表 filter 中,所有规则链中的规则 iptables -F # 清除预设表 filter 中,使用者自订链中的规则 iptables -X # 清除mangle表中,所有规则链中的规则 iptables -F -t mangle # 清除mangle表中,使用者自订链中的规则 iptables -t mangle -X # 清除nat表中,所有规则链中的规则 iptables -F -t nat # 清除nat表中,使用者自订链中的规则 iptables -t nat -X 选定预设的政策 接着,要选定各个不同的规则链,预设的政策为何。作法如下∶ 预设全部丢弃∶ ###-----------------------------------------------------### # 设定 filter table 的预设政策 ###-----------------------------------------------------### iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP 或者预设全部接受∶ ###-----------------------------------------------------### # 设定 filter table 的预设政策 ###-----------------------------------------------------### iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT 各个规则链的预设政策可独立自主的设定,不必受其它链的影响。 以下练习,若目标为 DROP,则 policy 请设为 ACCEPT;若目标为 ACCEPT,则 policy 请设为 DROP,如此方可看出效果。 开放某一个介面 作法如下∶ iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT 注∶IPFW 或 Netfilter 的封包流向,local process 不会经过 FORWARD Chain, 因此 lo 只在 INPUT 及 OUTPUT 二个 chain 作用。 iptables -A INPUT -i eth1 -j ACCEPT iptables -A OUTPUT -o eth1 -j ACCEPT iptables -A FORWARD -i eth1 -j ACCEPT iptables -A FORWARD -o eth1 -j ACCEPT IP 伪装 使内部网路的封包经过伪装之后,使用对外的 eth0 网卡当作代表号,对外连线。作法如下∶ ###-----------------------------------------------------### # 启动内部对外转址 ###-----------------------------------------------------### iptables -t nat -A POSTROUTING -o eth0 -s 172.16.0.0/16 -j SNAT --to-source $FW_IP 上述指令意指∶把 172.16.0.0/16 这个网段,伪装成 $FW_IP 出去。 虚拟主机 利用转址、转 port 的方式,使外部网路的封包,可以到达内部网路中的伺服主机,俗称虚拟主机。这种方式可保护伺服主机大部份的 port 不被外界存取,只开放公开服务的通道(如 Web Server port 80),因此安全性甚高。 作法如下∶ ###-----------------------------------------------------### # 启动外部对内部转址 ###-----------------------------------------------------### # 凡对 $FW_IP:80 连线者, 则转址至 172.16.255.2:80 iptables -t nat -A PREROUTING -i eth0 -p tcp -d $FW_IP --dport 80 -j DNAT --to-destination 172.16.255.2:80 开放内部主机可以 telnet 至外部的主机 开放内部网路,可以 telnet 至外部主机。 作法如下∶(预设 policy 为 DROP) ###-----------------------------------------------------### # open 外部主机 telnet port 23 ###-----------------------------------------------------### iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 23 -j ACCEPT iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 23 -d $FW_IP --dport 1024:65535 -j ACCEPT 开放邮包转递通道 开放任意的邮件主机送信包给你的 Mail Server,而你的 Mail Server 也可以送信包过去。 作法如下∶(预设 policy 为 DROP) ###-----------------------------------------------------### # open SMTP port 25 ###-----------------------------------------------------### # 以下是∶别人可以送信给你 iptables -A INPUT -i eth0 -p tcp -s any/0 --sport 1024:65535 -d $FW_IP --dport 25 -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp ! --syn -s $FW_IP --sport 25 -d any/0 --dport 1024:65535 -j ACCEPT # 以下是∶你可以送信给别人 iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 25 -j ACCEPT iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 25 -d $FW_IP --dport 1024:65525 -j ACCEPT 开放对外离线下载信件的通道 开放内部网路可以对外部网路的 POP3 server 取信件。 作法如下∶(预设 policy 为 DROP) ###-----------------------------------------------------### # open 对外部主机的 POP3 port 110 ###-----------------------------------------------------### iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 110 -j ACCEPT iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 110 -d $FW_IP --dport 1024:65535 -j ACCEPT 开放观看网页的通道 开放内部网路可以观看外部网路的网站。 作法如下∶(预设 policy 为 DROP) ###-----------------------------------------------------### # open 对外部主机的 HTTP port 80 ###-----------------------------------------------------### iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 80 -j ACCEPT iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 80 -d $FW_IP --dport 1024:65535 -j ACCEPT 开放查询外部网路的 DNS 主机 开放内部网路,可以查询外部网路任何一台 DNS 主机。 作法如下∶(预设 policy 为 DROP) ###-----------------------------------------------------### # open DNS port 53 ###-----------------------------------------------------### # 第一次会用 udp 封包来查询 iptables -A OUTPUT -o eth0 -p udp -s $FW_IP --sport 1024:65535 -d any/0 --dport 53 -j ACCEPT iptables -A INPUT -i eth0 -p udp -s any/0 --sport 53 -d $FW_IP --dport 1024:65535 -j ACCEPT # 若有错误,会改用 tcp 封包来查询 iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 53 -j ACCEPT iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 53 -d $FW_IP --dport 1024:65535 -j ACCEPT # 开放这台主机上的 DNS 和外部的 DNS 主机互动查询∶使用 udp iptables -A OUTPUT -o eth0 -p udp -s $FW_IP --sport 53 -d any/0 --dport 53 -j ACCEPT iptables -A INPUT -i eth0 -p udp -s any/0 --sport 53 -d $FW_IP --dport 53 -j ACCEPT # 开放这台主机上的 DNS 和外部的 DNS 主机互动查询∶使用 tcp iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 53 -d any/0 --dport 53 -j ACCEPT iptables -A INPUT -i eth0 -p tcp ! -y -s any/0 --sport 53 -d $FW_IP --dport 53 -j ACCEPT 开放内部主机可以 ssh 至外部的主机 开放内部网路,可以 ssh 至外部主机。 作法如下∶(预设 policy 为 DROP) ###-----------------------------------------------------### # open 外部主机 ssh port 22 ###-----------------------------------------------------### iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 22 -j ACCEPT iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 22 -d $FW_IP --dport 1024:65535 -j ACCEPT # 以下是 ssh protocol 比较不同的地方 iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1020:1023 -d any/0 --dport 22 -j ACCEPT iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 22 -d $FW_IP --dport 1020:1023 -j ACCEPT 开放内部主机可以 ftp 至外部的主机 开放内部网路,可以 ftp 至外部主机。 作法如下∶(预设 policy 为 DROP) ###-----------------------------------------------------### # open 对外部主机 ftp port 21 ###-----------------------------------------------------### # 以下是打开命令 channel 21 iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 21 -j ACCEPT iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 21 -d $FW_IP --dport 1024:65535 -j ACCEPT # 以下是打开资料 channel 20 iptables -A INPUT -i eth0 -p tcp -s any/0 --sport 20 -d $FW_IP --dport 1024:65535 -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp ! --syn -s $FW_IP --sport 1024:65535 -d any/0 --dport 20 -j ACCEPT # 以下是打开 passive mode FTP 资料通道 iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 1024:65535 -j ACCEPT iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 1024:65535 -d $FW_IP --dport 1024:65535 -j ACCEPT 开放 ping 可以对外 ping 任何一台主机。 作法如下∶(预设 policy 为 DROP) iptables -A OUTPUT -o eth0 -p icmp -s $FW_IP --icmp-type 8 -d any/0 -j ACCEPT iptables -A INPUT -i eth0 -p icm -s any/0 --icmp-type 0 -d $FW_IP -j ACCEPT § iptables 总览 Linux 内核中有一个功能强大的联网子系统 netfilter。netfilter 子系统提供了有状态的或无状态的分组过滤,还提供了 NAT 和 IP 伪装服务。netfilter 还具备为高级选路和连接状态管理而变形(mangle)IP 头信息的能力。netfilter 是通过 IPTables 工具 来控制的。 IPTables 总览 netfilter 的强大功能和灵活性是通过 IPTables 界面来实现的。这个命令行工具和它的前身 IPChains 的语法很相似;不过, IPTables 使用 netfilter 子系统来增进网络连接、检验、和处理方面的能力;IPChains 使用错综复杂的规则集合来过滤源地和目 的地路线以及两者的连接端口。IPTables 只在一个命令行界面中就包括了更先进的记录方式;选路前和选路后的行动;网络地址转 换;以及端口转发。 1. 使用 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 链的第一条规则,它允许本地环回设备上的交通。 2. 基本防火墙策略 在一开始就建立的某些基本策略为建构更详细的用户定义的规则奠定了基础。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 防火墙时可能要实现的规则。 3. 保存和恢复 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 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 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。 § iptables的应用--01 摘要:本文介绍linux2.4.x内核中的防火墙工具--iptables的原理与配置,同时还给出了实际运用的例子,在文章的最后归纳了iptables与ipchains的区别。 一、 概述 从1.1内核开始,linux就已经具有包过虑功能了,在2.0的内核中我们采用ipfwadm来操作内核包过虑规则。之后在2.2内核中,采用了大家并不陌生的ipchains来控制内核包过虑规则。现在最新linux内核版本是2.4.1,在2.4内核中我们不再使用ipchains,而是采用一个全新的内核包过虑管理工具--iptables。 这个全新的内核包过虑工具将使用户更易于理解其工作原理,更容易被使用,当然也将具有更为强大的功能。 我们说过iptables只是一个管理内核包过虑的工具,iptables 可以加入、插入或删除核心包过滤表格(链)中的规则。实际上真正来执行这些过虑规则的是netfilter(Linux 核心中一个通用架构)及其相关模块(如iptables模块和nat模块),下面我们一起来看看netfilter的工作原理。 二、 原理 netfilter是Linux 核心中一个通用架构,它提供了一系列的"表"(tables),每个表由若干"链"(chains)组成,而每条链中可以有一条或数条规则(rule)组成。我们可以这样来理解,netfilter是表的容器,表是链的容器,而链又是规则的容器(如图一所示)。 系统缺省的表为"filter",该表中包含了INPUT、FORWARD和OUTPUT 3个链。每一条链中可以有一条或数条规则,每一条规则都是这样定义的“如果数据包头符合这样的条件,就这样处理这个数据包”。当一个数据包到达一个链时,系统就会从第一条规则开始检查,看是否符合该规则所定义的条件: 如果满足,系统将根据该条规则所定义的方法处理该数据包;如果不满足则继续检查下一条规则。最后,如果该数据包不符合该链中任一条规则的话,系统就会根据该链预先定义的策略(policy)来处理该数据包。 数据包在filter表中的流程如图二所示。有数据包进入系统时,系统首先根据路由表决定将数据包发给哪一条链,则可能有三种情况: 1. 如果数据包的目的地址是本机,则系统将数据包送往INPUT链,如果通过规则检查,则该包被发给相应的本地进程处理;如果没通过规则检查,系统就会将这个包丢掉; 2. 如果数据包的目的地址不是本机,也就是说,这个包将被转发,则系统将数据包送往FORWARD链,如果通过规则检查,则该包被发给相应的本地进程处理;如果没通过规则检查,系统就会将这个包丢掉; 3. 如果数据包是由本地系统进程产生的,则系统将其送往OUTPUT链,如果通过规则检查,则该包被发给相应的本地进程处理;如果没通过规则检查,系统就会将这个包丢掉。 从以上我们可以看出,netfilter比起以前的ipfwadm和ipchains思路上清晰了好多,也好理解了好多,这对于原先对ipfwadm和ipchains总是感到一头雾水的用户来说无疑是一个福音。 三、 准备工作 1. 系统需求 netfilter要求内核版本不低于2.3.5,在编译新内核时,要求选择和netfilter相关的项目。这些项目通常都是位于“Networking options”子项下。以2.4.0内核为例,我们应该选中的项目有: [*] Kernel/User netlink socket [ ] Routing messages Netlink device emulation [*] Network packet filtering (replaces ipchains) ....... 然后,在“IP: Netfilter Configuration ---->”选中: Connection tracking (required for masq/NAT) FTP protocol support IP tables support (required for filtering/masq/NAT) limit match support MAC address match support Netfilter MARK match support Multiple port match support TOS match support Connection state match support Packet filtering REJECT target support Full NAT MASQUERADE target support REDIRECT target support Packet mangling TOS target support MARK target support LOG target support ipchains (2.2-style) support ipfwadm (2.0-style) support 其中最后两个项目可以不选,但是如果你比较怀念ipchains或者ipfwadm,你也可以将其选中,以便在2.4内核中使用ipchians或ipfwadm。但是需要注意的是,iptables是和ipchians/ipfwadm相对立的,在使用iptables的同时就不能同时使用ipchains/ipfwadm。编译成功后,这些模块文件都位于以下目录中 /lib/modules/2.4.0/kernel/net/ipv4/netfilter 编译2.4.0的新内核时还应该注意要在“Processor type and features”中选择和你的CPU相对应的正确的CPU选项,否则新内核可能无法正常工作。 2. 载入模块 要使用iptables,还必须载入相关模块。可以使用以下命令载入相关模块: #modprobe iptable_tables modprobe命令会自动载入指定模块及其相关模块。iptables_filter模块会在运行时自动载入。 三、 语法 1. 对链的操作 建立一个新链 (-N)。 删除一个空链 (-X)。 改变一个内建链的原则 (-P)。 列出一个链中的规则 (-L)。 清除一个链中的所有规则 (-F)。 归零(zero) 一个链中所有规则的封包字节(byte) 记数器 (-Z)。 2. 对规则的操作 加入(append) 一个新规则到一个链 (-A)的最后。 在链内某个位置插入(insert) 一个新规则(-I),通常是插在最前面。 在链内某个位置替换(replace) 一条规则 (-R)。 在链内某个位置删除(delete) 一条规则 (-D)。 删除(delete) 链内第一条规则 (-D)。 3. 指定源地址和目的地址 通过--source/--src/-s来指定源地址(这里的/表示或者的意思,下同),通过--destination/--dst/-s来指定目的地址。可以使用以下四中方法来指定ip地址: a. 使用完整的域名,如“www.linuxaid.com.cn”; b. 使用ip地址,如“192.168.1.1”; c. 用x.x.x.x/x.x.x.x指定一个网络地址,如“192.168.1.0/255.255.255.0”; d. 用x.x.x.x/x指定一个网络地址,如“192.168.1.0/24”这里的24表明了子网掩码的有效位数,这是 UNIX环境中通常使用的表示方法。 缺省的子网掩码数是32,也就是说指定192.168.1.1等效于192.168.1.1/32。 4. 指定协议 可以通过--protocol/-p选项来指定协议,比如-p tcp。 5. 指定网络接口将 可以使用--in-interface/-i或--out-interface/-o来指定网络接口。需要注意的是,对于INPUT链来说,只可能有-i,也即只会有进入的包;通理,对于OUTPUT链来说,只可能有-o,也即只会有出去的包。只有FORWARD链既可以有-i的网络接口,也可以有-o的网络接口。我们也可以指定一个当前并不存在的网络接口,比如ppp0,这时只有拨号成功后该规则才有效。 6. 指定ip碎片 在TCP/IP通讯过程中,每一个网络接口都有一个最大传输单元(MTU),这个参数定义了可以通过的数据包的最大尺寸。如果一个数据包大于这个参数值时,系统会将其划分成更小的数个数据包(称之为ip碎片)来传输,而接收方则对这些ip碎片再进行重组以还原整个包。 但是再进行包过滤的时候,ip碎片会导致这样一个问题:当系统将大数据包划分成ip碎片传送时,第一个碎片含有完整的包头信息,但是后续的碎片只有包头的部分信息,比如源地址,目的地址。因此假如我们有这样一条规则: iptables -A FORWARD -p tcp -s 192.168.1.0/24 -d 192.168.2.100 --dport 80 -j ACCEPT 并且这时的FORWARD的策略(policy)为DROP时,系统只会让第一个ip碎片通过,而丢掉其余的ip碎片,因为第一个碎片含有完整的包头信息,可以满足该规则的条件,而余下的碎片因为包头信息不完整而无法满足规则定义的条件,因而无法通过。 我们可以通过--fragment/-f选项来指定第二个及其以后的ip碎片,比如以上面的例子为例,我们可以再加上这样一条规则来解决这个问题: iptables -A FORWARD -f -s 192.168.1.0/24 -d 192.168.2.100 -j ACCEPT 但是需要注意的是,现在已经有好多进行ip碎片攻击的实例(比如向Win98 NT4/SP5,6 Win2K发送大量的ip碎片进行DoS攻击),因此允许ip碎片通过是有安全隐患的,对于这一点我们可以采用iptables的匹配扩展来进行限制,但是这又会影响服务质量,我们将在下面讨论这个问题。 7. 指定非 可以在某些选项前加上!来表示非指定值,比如“-s -! 192.168.1.1/32”表示除了192.168.1.1以外的ip地址,“-p -! tcp”表示除了tcp以外的协议。 8. TCP匹配扩展 通过使用--tcp-flags选项可以根据tcp包的标志位进行过滤,该选项后接两个参数:第一个参数为要检查的标志位,可以是SYN,ACK,FIN,RST,URG,PSH的组合,可以用ALL指定所有标志位;第二个参数是标志位值为1的标志。比如你要过滤掉所有SYN标志位为1的tcp包,可以使用以下规则: iptables -A FORWARD -p tcp --tcp-flags ALL SYN -j DROP 选项--syn是以上的一种特殊情况,相当于“--tcp-flags SYN,RST,ACK SYN”的简写。 9. mac匹配扩展 可以使用-m选项来扩展匹配内容。使用--match mac/-m mac匹配扩展可以用来检查ip数据包的源mac地址。只要在--mac-source后面跟上mac地址就可以了。比如: iptables -A FORWARD -m mac --mac-source 00:00:BA:A5:7D:12 -j DROP 需要注意的是一个ip包在经过路由器转发后,其源mac地址已经变成了路由器的mac地址。 10. limit匹配扩展 limit扩展是一个非常有用的匹配扩展。使用-m nat 来指定,其后可以有两个选项: --limit avg: 指定单位时间内允许通过的数据包的个数。单位时间可以是/second、/minute、/hour、/day或使用第一个字母,比如5/second和5/s是一样的,都是表示每秒可以通过5个数据包,缺省值是3/hour。 --limit-burst number:指定触发事件的阀值,缺省值是5。 看起来好像有点复杂,就让我们来看一个例子: 假设又如下的规则: iptables -A INPUT -p icmp -m limit --limit 6/m --limit-burst 5 -j ACCEPT iptables -P INPUT DROP 然后从另一部主机上ping这部主机,就会发生如下的现象: 首先我们可以看到前四个包的回应都很正常,然后从第五个包开始,我们每10秒可以收到一个正常的回应。这是因为我们设定了单位时间(在这里是每分钟)内允许通过的数据包的个数是每分钟6个,也即每10秒钟一个;其次我们又设定了事件触发阀值为5,所以我们的前四个包都是正常的,只是从第五个包开始,限制规则开始生效,故只能每10秒收到一个正常回应。 假设我们停止ping,30秒后又开始ping,这时的现象是: 前两个包是正常的,从第三个包开始丢包,这是因为在这里我的允许一个包通过的周期是10秒,如果在一个周期内系统没有收到符合条件的包,系统的触发值就会恢复1,所以假如我们30秒内没有符合条件的包通过,系统的触发值就会恢复到3,假如5个周期内都没有符合条件的包通过,系统都触发值就会完全恢复。不知道你明白了没有,欢迎你来信讨论。 11. LOG目标扩展 netfilter缺省的目标(也就是一旦满足规则所定义以后系统对数据包的处理方法)有: ACEEPT:接收并转发数据包 DORP:丢掉数据包 目标扩展模块提供了扩展的目标。LOG目标提供了记录数据包的功能。该目标扩展有以下几个参数: --log-level:指定记录信息的级别,级别有debug、info、notice、warning、err、crit、alert、emerg分别对应7到0的数字。其含义请参看syslog.conf的man手册。 --log-prefix:后接一个最长为30个字符的字符串,该字符串将出现在每一条日志的前面。 12. REJECT目标扩展 该目标扩展完全和DORP标准目标一样,除了向发送方返回一个“port unreachable”的icmp信息外。 还有其他一些扩展是常用的,如果你想了解可以参考Packet-Filtering-HOWTO。当然,最直接获得帮助的办法是查看iptables的在线帮助,比如想得到关于mac匹配扩展的帮助可以执行“iptables -m mac -help”命令,想得到LOG目标扩展的帮助可以执行“iptables -j LOG -help”命令。 用iptales实现包过虑型防火墙(二) http://LinuxAid.com.cn bye2000 本文版权由linuxAid和作者所有 四、 iptables使用实例 首先让我们看一下服务器/客户机的交互原理。服务器提供某特定功能的服务总是由特定的后台程序提供的。在TCP/IP网络中,常常把这个特定的服务绑定到特定的TCP或UDP端口。之后,该后台程序就不断地监听(listen)该端口,一旦接收到符合条件的客户端请求,该服务进行TCP握手后就同客户端建立一个连接,响应客户请求。与此同时,再产生一个该绑定的拷贝,继续监听客户端的请求。 举一个具体的例子:假设网络中有一台服务器A(IP地址为1.1.1.1)提供WWW服务,另有客户机B(2.2.2.2)、C(3.3.3.3)。首先,服务器A运行提供WWW服务的后台程序(比如Apache)并且把该服务绑定到端口80,也就是说,在端口80进行监听。当B发起一个连接请求时,B将打开一个大于1024的连接端口(1024内为已定义端口),假设为1037。A在接收到请求后,用80端口与B建立连接以响应B的请求,同时产生一个80端口绑定的拷贝,继续监听客户端的请求。假如A又接收到C的连接请求(设连接请求端口为1071),则A在与C建立连接的同时又产生一个80端口绑定的拷贝继续监听客户端的请求。如下所示,因为系统是以源地址、源端口、目的地址、目的端口来标识一个连接的,所以在这里每个连接都是唯一的。 服务器 客户端 连接1:a.b.c.1:80 a.b.c.4:1037 连接2:a.b.c.1:80 a.b.c.7:1071 每一种特定的服务都有自己特定的端口,一般说来小于1024的端口多为保留端口,或者说是已定义端口,低端口分配给众所周知的服务(如WWW、FTP等等),从512到1024的端口通常保留给特殊的UNIX TCP/IP应用程序,具体情况请参考/etc/services文件或RFC1700。 假设网络环境如下:某一单位,租用DDN专线上网,网络拓扑如下: +--------------+ | 内部网段 | eth1+--------+eth0 DDN | +------------|firewall|Internet | 198.168.80.0 | +--------+ +--------------+ eth0: 198.199.37.254 eth1: 198.168.80.254 以上的IP地址都是Internet上真实的IP,故没有用到IP欺骗。并且,我们假设在内部网中存在以下服务器: www服务器:www.yourdomain.com 198.168.80.11 ftp服务器:ftp.yourdomain.com 198.168.80.12 email服务器:mail.yourdomain.com 198.168.80.13 下面我们将用iptables一步一步地来建立我们的包过滤防火墙,需要说明的是,在这个例子中,我们主要是对内部的各种服务器提供保护。 1. 在/etc/rc.d/目录下用touch命令建立firewall文件,执行chmod u+x firewll以更改文件属性 ,编辑/etc/rc.d/rc.local文件,在末尾加上 /etc/rc.d/firewall 以确保开机时能自动执行该脚本。 2. 刷新所有的链的规则 #!/bin/sh echo "Starting iptables rules..." #Refresh all chains /sbin/iptables -F 3. 我们将首先禁止转发任何包,然后再一步步设置允许通过的包。 所以首先设置防火墙FORWARD链的策略为DROP: /sbin/iptables -P FORWARD DROP 4.设置关于服务器的包过虑规则: 在这里需要注意的是,服务器/客户机交互是有来有往的,也就是说是双向的,所以我们不仅仅要设置数据包出去的规则,还要设置数据包返回的规则,我们先建立针对来自Internet数据包的过虑规则。 WWW服务:服务端口为80,采用tcp或udp协议。规则为:eth0=>允许目的为内部网WWW服务器的包。 ###########################Define HTTP packets#################################### #Allow www request packets from Internet clients to www servers /sbin/iptables -A FORWARD -p tcp -d 198.168.80.11 --dport www -i eth0 -j ACCEPT FTP服务:FTP服务有点特别,因为需要两个端口,因为FTP有命令通道和数据通道。其中命令端口为21,数据端口为20,并且有主动和消极两种服务模式,其消极模式连接过程为:FTP客户端首先向FTP服务器发起连接请求,三步握手后建立命令通道,然后由FTP服务器请求建立数据通道,成功后开始传输数据,现在大多数FTP客户端均支持消极模式,因为这种模式可以提高安全性。FTP服务采用tcp协议。规则为:eth0=>仅允许目的为内部网ftp服务器的包。 ############################Define FTP packets##################################### #Allow ftp request packets from Internet clients to Intranet ftp server /sbin/iptables -A FORWARD -p tcp -d 198.168.80.12 --dport ftp -i eth0 -j ACCEPT EMAIL服务:包含两个协议,一是smtp,一是pop3。出于安全性考虑,通常只提供对内的pop3服务,所以在这里我们只考虑针对smtp的安全性问题。smtp端口为21,采用tcp协议。eth0=>仅允许目的为email服务器的smtp请求。 ###########################Define smtp packets#################################### /sbin/iptables -A FORWARD -p tcp -d 198.168.80.13 --dport smtp -i eth0 -j ACCEPT 5. 设置针对Intranet客户的过虑规则: 在本例中我们的防火墙位于网关的位置,所以我们主要是防止来自Internet的攻击,不能防止来自Intranet的攻击。假如我们的服务器都是基于linux的,也可以在每一部服务器上设置相关的过虑规则来防止来自Intranet的攻击。对于Internet对Intranet客户的返回包,我们定义如下规则。 #############Define packets from Internet server to Intranet####################### /sbin/iptables -A FORWARD -p tcp -s 0/0 --sport ftp-data -d 198.168.80.0/24 -i eth0 -j ACCEPT /sbin/iptables -A FORWARD -p tcp -d 198.168.80.0/24 ! -syn -i eth0 -j ACCEPT /sbin/iptables -A FORWARD -p udp -d 198.168.80.0/24 -i eth0 -j ACCEPT 说明:第一条允许Intranet客户采用消极模式访问Internet的FTP服务器;第二条接收来自Internet的非连接请求tcp包;最后一条接收所有udp包,主要是针对oicq等使用udp的服务。 § iptables的应用--02 6. 接受来自整个Intranet的数据包过虑,我们定义如下规则: #############Define packets from Internet server to Intranet server############### /sbin/iptables -A FORWARD -s 198.168.80.0/24 -i eth1 -j ACCEPT 7. 处理ip碎片 我们接受所有的ip碎片,但采用limit匹配扩展对其单位时间可以通过的ip碎片数量进行限制,以防止ip碎片攻击。 #################################Define fregment rule################################## /sbin/iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT 说明:对不管来自哪里的ip碎片都进行限制,允许每秒通过100个ip碎片,该限制触发的条件是100个ip碎片。 8. 设置icmp包过滤 icmp包通常用于网络测试等,故允许所有的icmp包通过。但是黑客常常采用icmp进行攻击,如ping of death等,所以我们采用limit匹配扩展加以限制: #################################Define icmp rule################################## /sbin/iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT 说明:对不管来自哪里的icmp包都进行限制,允许每秒通过一个包,该限制触发的条件是10个包。 通过以上个步骤,我们建立了一个相对完整的防火墙。只对外开放了有限的几个端口,同时提供了客户对Internet的无缝访问,并且对ip碎片攻击和icmp的ping of death提供了有效的防护手段。以下是完整的脚本文件内容,希望通过这个实例能是对iptables的用法有所了解: #!/bin/sh echo "Starting iptables rules..." #Refresh all chains /sbin/iptables -F ###########################Define HTTP packets#################################### #Allow www request packets from Internet clients to www servers /sbin/iptables -A FORWARD -p tcp -d 198.168.80.11 --dport www -i eth0 -j ACCEPT ############################Define FTP packets##################################### #Allow ftp request packets from Internet clients to Intranet ftp server /sbin/iptables -A FORWARD -p tcp -d 198.168.80.12 --dport ftp -i eth0 -j ACCEPT ###########################Define smtp packets#################################### /sbin/iptables -A FORWARD -p tcp -d 198.168.80.13 --dport smtp -i eth0 -j ACCEPT #############Define packets from Internet server to Intranet####################### /sbin/iptables -A FORWARD -p tcp -s 0/0 --sport ftp-data -d 198.168.80.0/24 -i eth0 -j ACCEPT /sbin/iptables -A FORWARD -p tcp -d 198.168.80.0/24 ! -syn -i eth0 -j ACCEPT /sbin/iptables -A FORWARD -p udp -d 198.168.80.0/24 -i eth0 -j ACCEPT #############Define packets from Intranet to Internet############### /sbin/iptables -A FORWARD -s 198.168.80.0/24 -i eth1 -j ACCEPT #################################Define fregment rule################################## /sbin/iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT #################################Define icmp rule################################## /sbin/iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT 五、 iptables与ipchains的区别 •iptables的缺省链的名称从小写换成大写,并且意义不再相同:INPUT和OUTPUT分别放置对目的地址是本机以及本机发出的数据包的过虑规则。 •-i选项现在只代表输入网络接口,输入网络接口则使用-o选项。 •TCP和UDP端口现在需要用--source-port或--sport(或--destination-port/--dport)选项拼写出来并且必须置于"-p tcp"或"-p udp"选项之后,因为它们分别是载入TCP和UDP扩展的。 •以前TCP的"-y"标志现在改为"--syn",并且必须置于"-p tcp"之后。 •原来的DENY目标最后改为了DROP。 •可以在列表显示单个链的同时将其清空。 •可以在清空内建链的同时将策略计数器清零。 •列表显示链时可显示计数器的当前瞬时值。 •REJECT和LOG现在变成了扩展目标,即意味着它们成为独立的内核模块。 •链名可以长达31个字符。 •MASQ现在改为MASQUERADE,并且使用不同的语法。REDIRECT保留原名称,但也改变了所使用的语法。 用iptables实现NAT 摘要 本文是“用iptales实现包过虑型防火墙”的姊妹篇,主要介绍如何使用iptbales实现linux2.4下的强大的NAT功能。关于iptables的详细语法请参考“用iptales实现包过虑型防火墙”一文。需要申明的是,本文绝对不是NAT-HOWTO的简单重复或是中文版,在整个的叙述过程中,作者都在试图用自己的语言来表达自己的理解,自己的思想。(2002-06-24 14:30:19) By 书生 1.概述 1.1 什么是NAT 在传统的标准的TCP/IP通信过程中,所有的路由器仅仅是充当一个中间人的角色,也就是通常所说的存储转发,路由器并不会对转发的数据包进行修改,更为确切的说,除了将源MAC地址换成自己的MAC地址以外,路由器不会对转发的数据包做任何修改。NAT(Network Address Translation网络地址翻译)恰恰是出于某种特殊需要而对数据包的源ip地址、目的ip地址、源端口、目的端口进行改写的操作。 1.2 为什么要进行NAT 我们来看看再什么情况下我们需要做NAT。 假设有一家ISP提供园区Internet接入服务,为了方便管理,该ISP分配给园区用户的IP地址都是伪IP,但是部分用户要求建立自己的WWW服务器对外发布信息,这时候我们就可以通过NAT来提供这种服务了。我们可以再防火墙的外部网卡上绑定多个合法IP地址,然后通过NAT技术使发给其中某一个IP地址的包转发至内部某一用户的WWW服务器上,然后再将该内部WWW服务器响应包伪装成该合法IP发出的包。 再比如使用拨号上网的网吧,因为只有一个合法的IP地址,必须采用某种手段让其他机器也可以上网,通常是采用代理服务器的方式,但是代理服务器,尤其是应用层代理服务器,只能支持有限的协议,如果过了一段时间后又有新的服务出来,则只能等待代理服务器支持该新应用的升级版本。如果采用NAT来解决这个问题, 因为只在应用层以下进行处理,不但可以获得很高的访问速度,而且可以无缝的支持任何新的服务或应用。 还有一个方面的应用就是重定向,也就是当接收到一个包后,不是转发这个包,而是将其重定向到系统上的某一个应用程序。最常见的应用就是和squid配合使用成为透明代理,在对http流量进行缓存的同时,可以提供对Internet的无缝访问。 1.3 NAT的类型 在linux2.4的NAT-HOWTO中,作者从原理的角度将NAT分成了两种类型,即源NAT(SNAT)和目的NAT(DNAT),顾名思义,所谓SNAT就是改变转发数据包的源地址,所谓DNAT就是改变转发数据包的目的地址。 2.原理 下图是linux2.4的原理图: nat原理图 在“用iptales实现包过虑型防火墙”一文中我们说过,netfilter是Linux 核心中一个通用架构,它提供了一系列的"表"(tables),每个表由若干"链"(chains)组成,而每条链中可以有一条或数条规则(rule)组成。并且系统缺省的表是"filter"。但是在使用NAT的时候,我们所使用的表不再是"filter",而是"nat"表,所以我们必须使用"-t nat"选项来显式地指明这一点。因为系统缺省的表是"filter",所以在使用filter功能时,我们没有必要显式的指明"-t filter"。 同filter表一样,nat表也有三条缺省的"链"(chains),这三条链也是规则的容器,它们分别是: * PREROUTING:可以在这里定义进行目的NAT的规则,因为路由器进行路由时只检查数据包的目的ip地址,所以为了使数据包得以正确路由,我们必须在路由之前就进行目的NAT; * POSTROUTING:可以在这里定义进行源NAT的规则,系统在决定了数据包的路由以后在执行该链中的规则。 * OUTPUT:定义对本地产生的数据包的目的NAT规则。 3.操作语法 如前所述,在使用iptables的NAT功能时,我们必须在每一条规则中使用"-t nat"显示的指明使用nat表。然后使用以下的选项: 3.1 对规则的操作 * 加入(append) 一个新规则到一个链 (-A)的最后。 * 在链内某个位置插入(insert) 一个新规则(-I),通常是插在最前面。 * 在链内某个位置替换(replace) 一条规则 (-R)。 * 在链内某个位置删除(delete) 一条规则 (-D)。 * 删除(delete) 链内第一条规则 (-D)。 3.2 指定源地址和目的地址 通过--source/--src/-s来指定源地址(这里的/表示或者的意思,下同),通过--destination/--dst/-s来指定目的地址。可以使用以下四中方法来指定ip地址: 1. 使用完整的域名,如“www.linuxaid.com.cn”; 2. 使用ip地址,如“192.168.1.1”; 3. 用x.x.x.x/x.x.x.x指定一个网络地址,如“192.168.1.0/255.255.255.0”; 4. 用x.x.x.x/x指定一个网络地址,如“192.168.1.0/24”这里的24表明了子网掩码的有效位数,这是UNIX环境中通常使用的表示方法。缺省的子网掩码数是32,也就是说指定192.168.1.1等效于192.168.1.1/32。 3.3 指定网络接口 可以使用--in-interface/-i或--out-interface/-o来指定网络接口。从NAT的原理可以看出,对于PREROUTING链,我们只能用-i指定进来的网络接口;而对于POSTROUTING和OUTPUT我们只能用-o指定出去的网络接口。 3.4 指定协议及端口 可以通过--protocol/-p选项来指定协议,如果是udp和tcp协议,还可--source-port/--sport和 --destination-port/--dport来指明端口。 4.准备工作 4.1 编译内核,编译时选中以下选项,具体可参看“用iptales实现包过虑型防火墙”一文: Full NAT MASQUERADE target support REDIRECT target support 4.2 要使用NAT表时,必须首先载入相关模块: modprobe ip_tables modprobe ip_nat_ftp iptable_nat 模块会在运行时自动载入。 5.使用实例 5.1 源NAT(SNAT) 比如,更改所有来自192.168.1.0/24的数据包的源ip地址为1.2.3.4: iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to 1.2.3.4 这里需要注意的是,系统在路由及过虑等处理直到数据包要被送出时才进行SNAT。 有一种SNAT的特殊情况是ip欺骗,也就是所谓的Masquerading,通常建议在使用拨号上网的时候使用,或者说在合法ip地址不固定的情况下使用。比如 # iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE 可以看出,这时候我们没有必要显式的指定源ip地址等信息。 5.2 目的SNAT(DNAT) 比如,更改所有来自192.168.1.0/24的数据包的目的ip地址为1.2.3.4: iptables -t nat -A PREROUTING -s 192.168.1.0/24 -i eth1 -j DNAT --to 1.2.3.4 这里需要注意的是,系统是先进行DNAT,然后才进行路由及过虑等操作。 有一种DNAT的特殊情况是重定向,也就是所谓的Redirection,这时候就相当于将符合条件的数据包的目的ip地址改为数据包进入系统时的网络接口的ip地址。通常是在与squid配置形成透明代理时使用,假设squid的监听端口是3128,我们可以通过以下语句来将来自192.168.1.0/24,目的端口为80的数据包重定向到squid监听端口: iptables -t nat -A PREROUTING -i eth1 -p tcp -s 192.168.1.0/24 --dport 80 -j REDIRECT --to-port 3128 6.综合例子 6.1 使用拨号带动局域网上网 小型企业、网吧等多使用拨号网络上网,通常可能使用代理,但是考虑到成本、对协议的支持等因素,建议使用ip欺骗方式带动区域网上网。 成功升级内核后安装iptables,然后执行以下脚本: #载入相关模块 modprobe ip_tables modprobe ip_nat_ftp #进行ip伪装 iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE 6.2 ip映射 假设有一家ISP提供园区Internet接入服务,为了方便管理,该ISP分配给园区用户的IP地址都是伪IP,但是部分用户要求建立自己的WWW服务器对外发布信息。我们可以再防火墙的外部网卡上绑定多个合法IP地址,然后通过ip映射使发给其中某一个IP地址的包转发至内部某一用户的WWW服务器上,然后再将该内部WWW服务器响应包伪装成该合法IP发出的包。 我们假设以下情景: 该ISP分配给A单位www服务器的ip为: 伪ip:192.168.1.100 真实ip:202.110.123.100 该ISP分配给B单位www服务器的ip为: 伪ip:192.168.1.200 真实ip:202.110.123.200 linux防火墙的ip地址分别为: 内网接口eth1:192.168.1.1 外网接口eth0:202.110.123.1 然后我们将分配给A、B单位的真实ip绑定到防火墙的外网接口,以root权限执行以下命令: ifconfig eth0 add 202.110.123.100 netmask 255.255.255.0 ifconfig eth0 add 202.110.123.200 netmask 255.255.255.0 成功升级内核后安装iptables,然后执行以下脚本: #载入相关模块 modprobe ip_tables modprobe ip_nat_ftp 首先,对防火墙接收到的目的ip为202.110.123.100和202.110.123.200的所有数据包进行目的NAT(DNAT): iptables -A PREROUTING -i eth0 -d 202.110.123.100 -j DNAT --to 192.168.1.100 iptables -A PREROUTING -i eth0 -d 202.110.123.200 -j DNAT --to 192.168.1.200 其次,对防火墙接收到的源ip地址为192.168.1.100和192.168.1.200的数据包进行源NAT(SNAT): iptables -A POSTROUTING -o eth0 -s 192.168.1.100 -j SNAT --to 202.110.123.100 iptables -A POSTROUTING -o eth0 -s 192.168.1.200 -j SNAT --to 202.110.123.200 这样,所有目的ip为202.110.123.100和202.110.123.200的数据包都将分别被转发给192.168.1.100和192.168.1.200;而所有来自192.168.1.100和192.168.1.200的数据包都将分别被伪装成由202.110.123.100和202.110.123.200,从而也就实现了ip映射。 § iptables配置工具比较 在过去几年中,Linux作为防火墙平台的应用显著增长。从早期1.2版内核的ipfwadm开始,Linux的防火墙代码也走过了很长一段路程了。在2.4版的Linux内核中,使用了netfilter体系。在最新的2.4版中,Linux大大加强了安全性,例如:更好的加密支持和netfilter体系的使用。netfilter具有完全的向后兼容性。 本文将对iptables的配置做一个综述并且重点介绍一些iptables的配置工具。本文的讨论将着眼于Linux内核的IP防火墙以及其各种界面的配置工具,比如:GUI或者脚本(shell、Perl或者特定的配置语言)。使用这些工具能够简化iptables的配置减少配置的错误。关于iptables的知识请参考Rusty Russell写的Linux iptables HOWTO。 使用命令行配置iptables的困难 使用iptables的命令行接口来配置iptables防火墙对一个人来说是一个挑战,用户很难指定所有IP报文的行为。用户需要对TCP/IP和应用层协议有较深的了解。象其前辈ipchains一样,iptables把IP过滤规则归并到链中,IP报文遍历规则链接受处理,还可以送到另外的链接受处理,或者最后由默认策略(ACCEPT、DROP、REJECT)处理。有些网络应用程序比其它一些程序更容易穿过防火墙,因此需要理解网络连接的建立和断开。 我们看一下POP3协议,这是最简单的协议之一。允许所有向内目标端口是110的报文通过通过无法解决所有的管理问题,因为这样只能使客户端向发出申请,而服务器却无法应答。另外,如果使用网络地址转换(NAT)和其它方式的报文转发,也存在许多问题。因为防火墙的配置将影响到整个企业的安全,所以应该特别小心。下面将大概地讨论iptables的配置,要获得更多细节请参考Linux iptables HOWTO iptables的命令行选项 在进入这时的讨论之前,我们看一下iptables命令行选项的一个总结。 规则链维护选项 1.建立新的规则链(-N) 2.删除一个空的规则链(-X) 3.改变一个内置规则链的策略(-P) 4.列出一条规则链中的规则(-L) 5.擦写一条规则链中的规则(-F) 规则维护 1.在一条规则链中加入一条新的规则(-A) 2.删除一条规则链中某个位置的规则(-D) iptables的优点 在讨论各种iptables配置工具之前,让我们看一下iptables的优点,尤其是netfilter比ipchains具有的优势。 iptables允许建立状态(stateful)防火墙,就是在内存中保存穿过防火墙的每条连接。这种模式对于有效地配置FTP和DNS以及其它网络服务是必要的。 iptables能够过滤TCP标志任意组合报文,还能够过滤MAC地址。 系统日志比ipchains更容易配置,扩展性也更好。 对于网络地址转换(Network Address Translation)和透明代理的支持,netfilter更为强大和易于使用。 iptable能够阻止某些DOS攻击,例如SYS洪泛攻击。 iptables配置工具 现在,我们看一下Linux iptables的一些配置工具。我主要关注每个工具的特征、弹性和易用性。我们将讨论以下的工具: MonMotha's Firewall 2.3.5 作者:MonMotha Firewallscript (iptables 4.4c-3 devel) 作者:Patrik Hildingsson Ferm-0.0.18 作者:Auke Kok AGT-0.83 作者:Andy Gilligan Knetfilter-1.2.4 作者:Luigi Genoni gShield-2.0.2 作者:R. Gregory MonMotha的Firewall 2.3.5 MonMotha写的Firewall 2.3.5是一个大约30K的shell脚本。目前,主要适用于基于主机的保护,因为一些基于网络的选项正在开发中。这个脚本的界面(例如:给iptables传递配置选项的方法)有点混乱。不过,它不需要配置文件而且安装容易,直接复制到任何地方都可以。默认情况下,它根本不做什么,实际上根本就不执行,也缺少文档。这个脚本对于拨号用户可能有点用处。 Firewallscript Firewallscript(IFS 4.4d)也是一个bash脚本,大约有85K。这个脚本可以用于基于主机和网络的防护。首次运行时,它会直接产生一个配置文件。不过,在默认情况下,这个文件不起什么作用,只有测试作用。这个脚本可以配置NAT和地址伪装。这个脚本非常复杂,但是缺少文档,因此最好能够仔细阅读它的代码,使用iptables -L命令哪个链已经生效,什么被允许/拒绝。这个脚本的IP报文追踪功能还可以为你提供娱乐。此外,它还会自动探测、加载iptables需要的内核模块。这个脚本和上一个脚本还具有取消(undo)功能,能够恢复iptables原来的配置文件。 Ferm Ferm是一个Perl脚本,使用一种类C语言写成的配置文件。这种语言非常容易阅读和理解。这个脚本有很好的文档和丰富的示例作为参考。 这是一个例子: ----------------------------------------------------------------------------- # simple workstation example for ferm chain input { if ppp0 # put your outside interface here { proto tcp goto fw_tcp; proto udp goto fw_udp; proto icmp goto fw_icmp; } } chain fw_tcp proto tcp { dport ssh ACCEPT; syn DENY log; dport domain ACCEPT; dport 0:1023 DENY log; } chain fw_udp proto udp { DENY log; } chain fw_icmp proto icmp { icmptype ( destination-unreachable time-exceeded ) ACCEPT; DENY log; } ----------------------------------------------------------------------------- 这个配置文件将使ferm产生iptables如下规则:允许向外的ssh和DNS报文通过;阻塞所有的UDP报文;只允许两种类型的ICMP消息通过:目的不可达和超时,并绝拒绝和日志其它类型的ICMP消息。 AGT AGT是一个使用C语言编写的程序。从它的代码来看,目前还处于开发阶段。不支持automake,需要手工编辑Makefile文件,文档也不是很丰富,但是其配置文件非常简单。下面就是一个配置文件: NEW | FROM-INT NEW | RESET || FROM-INT | icmp | ACCEPT ||||| || FROM-INT | tcp | ACCEPT ||||| pop3 || FROM-INT | tcp | ACCEPT ||||| imap || RESET | tcp | REJECT --reject-with tcp-reset ||||| 这样的文件格式,加上缺乏必要的文档,对使用者来说是一个很大的挑战。而且最好多花些时间学学iptables。 knetfilter knetfilter是一个非常棒的图形化iptables配置工具,它是基于KDE的(有KDE1和KDE2两个版本)。knetfilter非常易于上手,你可以很容易地使用它来配置基于主机保护的规则和规则列表;保存和恢复测这些规则和规则列表;测试规则和规则列表(在同一个面板上运行tcpdump网络嗅探器),这一切只要点几下鼠标就可以了。它也支持NAT和网络地址伪装的配置。但是,对于拨号工作站,knetfilter工作的不太好,因为它需要本地IP,而且只探测eth0网络接口,不进行PPP探测。这个工程的文档也很少,不过因为是基于图形界面,所以即使不用手册也可以很好地使用。 gShield gShield是一个bash shell脚本,可能是当前最成熟的一个工具。它的文档非常丰富,配置文件也比较合理直观,还能够设置NAT。它不但能够处静态IP地址,还能够处理动态IP地址(例如:PPP)。 gShield还有图形界面,目前仍然处于早期开发阶段,可以从http://members.home.com/vhodges/gshieldconf.html下载。不过,它似乎只兼容gShield的早期版本(1.x)。 下面是一个示例配置文件: FW_ROOT="/etc/firewall" IPTABLES=`which iptables` LOCALIF="eth0" DNS="24.31.195.65" LTIME="20/m" ALLOW_DHCP_LEASES="YES" ... gShield使用的默认配置非常安全,特别适合不愿意摆弄配置文件的用户,不过软件的编者建议用户最好能够通读整个配置文件。据README文件讲,gShield实现了"类tcpwrapper风格的服务访问控制功能",使用这个功能用户可以很容易地阻塞/允许某项服务,而不必考虑报文方向之类的问题,只要关心什么客户连接到服务器就可以了。 结论 虽然本文介绍了一些防火墙配置工具,但是实际上目前还没有理想的配置工具。最好的配置工具还是iptables命令,这里介绍的这些工具,只适用于对于使用iptables命令行感觉困难的用户。 § iptables模块编译及应用 相信很多人都会用iptables,我也一直用,并且天天用.特别是看完platinum的>介绍后,觉得有必要深入了解一下它的拓展功能.于是立刻下载,先查看一下它的说明, 其功能很是令人感觉很兴奋,例如:comment (备注匹配) ,string(字符串匹配,可以用做内容过滤),iprang(ip范围匹配),time(时间匹配),ipp2p(点对点匹配),connlimit(同时连接个数匹配),Nth(第n个包匹配),geoip(根据国家地区匹配). ipp2p(点对点匹配), quota(配额匹配),还有很多......之后编译,几经测试,在rh7.3 kernel2.4.18-3和rh9.0 kernel2.4.20-8下均成功实现添加扩展功能.以下是介绍其部分功能,及编译方法.环境rh9.0 kernel2.4.20-8. root身份. 一,准备原码. 1. 内核原码:为了减少复杂性,不编译所有内核和模块,建议找一个跟当前版本一样的内核原码,推荐安装时光盘的 a. [root@kindgeorge] uname -r (查看当前版本) 2.4.20-8 可以cd /usr/src 查看是否有这个目录2.4.20-8 b. 或者[root@kindgeorge]rpm -qa|grep kernel kernel-source-2.4.20-8 如果有这个说明已安装了. 如果没有安装,可以在RH第二张光盘中拷贝过来或安装 rpm -ivh kernel-source-2.4.18-3.i386.rpm. 安装后会在/usr/src/出现linux-2.4连接和linux-2.4.20-8目录. c.在http://www.kernel.org 或www.redhat.com下载一个和当前版本的内核原码. 2. 先获取最新的信息,当然要到http://www.netfilter.org 或 http://www.iptables.org (这两个网址是一样的). 网站左方download栏已经说明了最新版本的iptables-1.3.1 [root@kindgeorge src] cd /usr/src/ a. 获取最新iptables : wget http://www.netfilter.org/files/iptables-1.3.1.tar.bz2 解压:tar xjvf iptables-1.3.1.tar.bz2 b. 获取最新patch-o-matic-ng的地址:ftp://ftp.netfilter.org/pub/patch-o-matic-ng/snapshot/ [root@kindgeorge src] wget ftp://ftp.netfilter.org/pub/patch-o-matic-ng/snapshot/patch-o-matic-ng-20050331.tar.bz2 解压: tar xjvf patch-o-matic-ng-20050331.tar.bz2 二.安装说明 (一).处理内核源码. 1. [root@kindgeorge src]# cd /usr/src/linux-2.4 2. [root@kindgeorge linux-2.4]# vi Makefile, VERSION = 2 PATCHLEVEL = 4 SUBLEVEL = 20 EXTRAVERSION = -8custom 将“EXTRAVERSION = -8custom”改为“EXTRAVERSION = -8” 即: VERSION = 2 PATCHLEVEL = 4 SUBLEVEL = 20 EXTRAVERSION = -8 为何要修改呢?因为不同版本的内容是不可以使用的,当不修改时,则变成这个版本(2.4.20-8custom)了,不同时是这样出错的: /lib/modules/2.4.20-8/kernel/net/ipv4/netfilter/ipt_iprange.o: kernel-module version mismatch (版本错误) /lib/modules/2.4.20-8/kernel/net/ipv4/netfilter/ipt_iprange.o was compiled for kernel version 2.4.20-8custom while this kernel is version 2.4.20-8. /lib/modules/2.4.20-8/kernel/net/ipv4/netfilter/ipt_iprange.o: insmod /lib/modules/2.4.20-8/kernel/net/ipv4/netfilter/ipt_iprange.o failed /lib/modules/2.4.20-8/kernel/net/ipv4/netfilter/ipt_iprange.o: insmod ipt_iprange failed 3. [root@kindgeorge linux-2.4]# make mrproper 4. [root@kindgeorge linux-2.4]# make oldconfig 'make oldconfig' - 采用以前的 .config 文件 (编译时十分有用) 技巧:在make menuconfig时,我们面对众多的选项常常不知道该如何选择,此时可以把安装时的配置文件copy到/usr/src/linux-2.4中:cp /boot/config-2.4.* /usr/src/linux-2.4/.config,再用make menuconfig编译,它会读取.config中原来的配置信息. (二).给netfilter打补丁 解开tar xjvf patch-o-matic-ng-20050331.tar.bz2 包后,进入该目录,就会发现有很多目录,其实每个目录对应一个模块. 我们可以这样来选择,根据不同贮仓库submitted|pending|base|extra,例如: KERNEL_DIR=/usr/src/linux-2.4 IPTABLES_DIR=/usr/src/iptables-1.3.1 ./runme base . 或:KERNEL_DIR=/usr/src/linux-2.4 IPTABLES_DIR=/usr/src/iptables-1.3.1 ./runme extra 执行后,会测试是否已经应用和提示你是否应用该模块,但这样会遍历所有模块,有很多是用不着的,并且可能和系统版本有冲突,如果不管三七二十一全部选择的话,一般都会在编译和使用时出错.所以推荐用cat /模块目录名/info 和cat /模块目录名/help 看过后,认为适合自己,才选择. 我是针对在上面看过后,有目的的一个一个的应用的,这样做: KERNEL_DIR=/usr/src/linux-2.4 IPTABLES_DIR=/usr/src/iptables-1.3.1 ./runme string 执行后,会测试是否已经应用和提示你是否应用该模块,按"y"应用.然后继续下一个 KERNEL_DIR=/usr/src/linux-2.4 IPTABLES_DIR=/usr/src/iptables-1.3.1 ./runme comment KERNEL_DIR=/usr/src/linux-2.4 IPTABLES_DIR=/usr/src/iptables-1.3.1 ./runme connlimit KERNEL_DIR=/usr/src/linux-2.4 IPTABLES_DIR=/usr/src/iptables-1.3.1 ./runme time KERNEL_DIR=/usr/src/linux-2.4 IPTABLES_DIR=/usr/src/iptables-1.3.1 ./runme iprange KERNEL_DIR=/usr/src/linux-2.4 IPTABLES_DIR=/usr/src/iptables-1.3.1 ./runme geoip KERNEL_DIR=/usr/src/linux-2.4 IPTABLES_DIR=/usr/src/iptables-1.3.1 ./runme nth KERNEL_DIR=/usr/src/linux-2.4 IPTABLES_DIR=/usr/src/iptables-1.3.1 ./runme ipp2p KERNEL_DIR=/usr/src/linux-2.4 IPTABLES_DIR=/usr/src/iptables-1.3.1 ./runme quota 上面全部完成后, cd /usr/src/linux-2.4 make menuconfig,确认[*] Prompt for development and/or incomplete code/drivers要选中 然后进入Networking options 再进入IP:Netfilter Configuration,会看到增加很多模块,每个新增的后面都会出现"NEW",把其想要的选中为模块"M" 保存、退出,至此,给netfilter打补丁工作完成 (三).编译netfilter模块 1.这里只需要编译netfilter,不需要编译整个内核和模块.这里我只需要ipv4的,ipv6我还没用到,所以不管了 cd /usr/src/linux-2.4 make dep make modules SUBDIRS=net/ipv4/netfilter 2.建立一个新目录备份原来模块,以防万一: mkdir /usr/src/netfilter cp /lib/modules/2.4.20-8/kernel/net/ipv4/netfilter/*.o /usr/src/netfilter/ 3.应用新的模块 cp -f /usr/src/linux-2.4/net/ipv4/netfilter/*.o /lib/modules/2.4.20-8/kernel/net/ipv4/netfilter/ 4.更新你的modules.dep depmod -a 当出现这个时,可以不用理会,因为ipchains, ipfwadm模块都没用,也可以把出错的删除. depmod: *** Unresolved symbols in /lib/modules/2.4.20-8/kernel/net/ipv4/netfilter/ipchains_core.o depmod: *** Unresolved symbols in /lib/modules/2.4.20-8/kernel/net/ipv4/netfilter/ipfwadm_core.o (四).编译安装新的iptables 解压后有目录iptables-1.3.1 cd /usr/src/iptables-1.3.1 export KERNEL_DIR=/usr/src/linux-2.4 export IPTABLES_DIR=/usr/src/iptables-1.3.1 make BINDIR=/sbin LIBDIR=/lib MANDIR=/usr/share/man install 三.安装完成,测试及应用 1.内容过滤 iptables -I FORWARD -m string --string "腾讯" -j DROP iptables -I FORWARD -s 192.168.3.159 -m string --string "qq.com" -j DROP iptables -I FORWARD -d 192.168.3.0/24 -m string --string "宽频影院" -j DROP iptables -I FORWARD -s 192.168.3.0/24 -m string --string "色情" -j DROP iptables -I FORWARD -p tcp --sport 80 -m string --string "广告" -j DROP 2.备注应用 iptables -I FORWARD -s 192.168.3.159 -p tcp --dport 80 -j DROP -m comment --comment "the bad guy can not online" iptables -I FORWARD -s 192.168.3.159 -m string --string "qq.com" -j DROP -m comment --comment "denny go to qq.com" 3.并发连接应用 模块 connlimit 作用:连接限制 --connlimit-above n 限制为多少个 --connlimit-mask n 这组主机的掩码,默认是connlimit-mask 32 ,即每ip. 这个主要可以限制内网用户的网络使用,对服务器而言则可以限制每个ip发起的连接数...比较实用 例如:只允许每个ip同时5个80端口转发,超过的丢弃: iptables -I FORWARD -p tcp --syn --dport 80 -m connlimit --connlimit-above 5 -j DROP 例如:只允许每组ip同时10个80端口转发: iptables -I FORWARD -p tcp --syn --dport 80 -m connlimit --connlimit-above 10 --connlimit-mask 24 -j DROP 例如:为了防止DOS太多连接进来,那么可以允许最多15个初始连接,超过的丢弃. /sbin/iptables -A INPUT -s 192.186.1.0/24 -p tcp --syn -m connlimit --connlimit-above 15 -j DROP /sbin/iptables -A INPUT -s 192.186.1.0/24 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT 4.ip范围应用 iptables -A FORWARD -m iprange --src-range 192.168.1.5-192.168.1.124 -j ACCEPT 5.每隔N个匹配 iptables -t mangle -A PREROUTING -m nth --every 10 -j DROP 6.封杀BT类P2P软件 iptables -A FORWARD -m ipp2p --edk --kazaa --bit -j DROP iptables -A FORWARD -p tcp -m ipp2p --ares -j DROP iptables -A FORWARD -p udp -m ipp2p --kazaa -j DROP 7.配额匹配 iptables -I FORWARD -s 192.168.3.159 -p tcp --dport 80 -m quota --quota 500 -j DROP iptables -I FORWARD -s 192.168.3.159 -p tcp --dport 80 -m quota --quota 500 -j ACCEPT 以上均测试通过,只有geoip的geoipdb.bin没下载到,所以没测试 在此仅为抛个砖头,更多的应用,要根据自己的需要来组合各个规则和模块了. |
随便看 |
百科全书收录594082条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。