7.3.1 Netfilter/ iptables简介 netfilter/ tables允许为防火墙建立可定制的规则来控制数据包过滤,并且还允许配置有 状态的防火墙 netfilter/iptables还可以实现NAT(网络地址转换)和数据包的分割等功能 netfilter组件也称为内核空间。 iptables组件是一种工具,也称为用户空间,它使插入、修改和删除数据包过滤表中的 规则变得容易。 使用用户空间( iptables)构建自己定制的规则,这些规则存储在内核空间的过滤表中 这些规则中的目标告诉内核,对满足条件的数据包采取相应的措施 根据规则处理数据包的类型,将规则添加到不同的链中。 处理入站数据包的规则被添加到 INPUT链中 处理出站数据包的规则被添加到 OUTPUT链中。 处理正在转发的数据包的规则被添加到 FORWARD链中 这三个链是数据包过滤表( filter)中内置的缺省主规则链。每个链都可以有一个策略, 即要执行的缺省操作,当数据包与链中的所有规则都不匹配时,将执行此操作(理想的策略 应该丢弃该数据包)。 数据包经过 filter表的过程如图743所示 FORWARD链 出数据包 NPUT链 地处理进程 图743数据包经过Fite表的过程 7.32 iptables的语法及其使用 添加、删除和修改规则的命令语法如下: #iptables [-t table] command [match[target It table]有三种可用的表选项: filter、nat和 mangle。该选项不是必需的,如未指定 则 filter作为缺省表。 filter表用于一般的数据包过滤,包含 INPUT、 OUTPUT和 FORWARD链 at表用于要转发的数据包,包含 PREROUTING、 OUTPUT和 POSTROUTING链。 mangle表用于数据包及其头部的更改,包含 PREROUTING和 OUTPUT链。 command是 iptables命令中最重要的部分,它告诉 iptables命令要进行的操作,如插入 规则、删除规则、将规则添加到链尾等等。常用的一些命令见表7-3: 表7-3 iptables常用命令 操作命令
7.3.1 Netfilter/iptables 简介 netfilter/iptables 允许为防火墙建立可定制的规则来控制数据包过滤,并且还允许配置有 状态的防火墙。 netfilter/iptables 还可以实现 NAT(网络地址转换)和数据包的分割等功能。 netfilter 组件也称为内核空间。 iptables 组件是一种工具,也称为用户空间,它使插入、修改和删除数据包过滤表中的 规则变得容易。 使用用户空间(iptables)构建自己定制的规则,这些规则存储在内核空间的过滤表中。 这些规则中的目标告诉内核,对满足条件的数据包采取相应的措施。 根据规则处理数据包的类型,将规则添加到不同的链中。 处理入站数据包的规则被添加到 INPUT 链中。 处理出站数据包的规则被添加到 OUTPUT 链中。 处理正在转发的数据包的规则被添加到 FORWARD 链中。 这三个链是数据包过滤表(filter)中内置的缺省主规则链。每个链都可以有一个策略, 即要执行的缺省操作,当数据包与链中的所有规则都不匹配时,将执行此操作(理想的策略 应该丢弃该数据包)。 数据包经过 filter 表的过程如图 7-43 所示。 图7-43 数据包经过Filter表的过程 7.3.2 iptables 的语法及其使用 添加、删除和修改规则的命令语法如下: #iptables [-t table] command [match] [target] 1.table [-t table]有三种可用的表选项:filter、nat 和 mangle。该选项不是必需的,如未指定, 则 filter 作为缺省表。 filter 表用于一般的数据包过滤,包含 INPUT、OUTPUT 和 FORWARD 链。 nat 表用于要转发的数据包,包含 PREROUTING、OUTPUT 和 POSTROUTING 链。 mangle 表用于数据包及其头部的更改,包含 PREROUTING 和 OUTPUT 链。 2.command command 是 iptables 命令中最重要的部分,它告诉 iptables 命令要进行的操作,如插入 规则、删除规则、将规则添加到链尾等等。常用的一些命令见表 7-3: 表 7-3 iptables 常用命令 操作命令 功能
该命令将一条规则附加到链的末尾 D或- delete 通过用D指定要匹配的规则或者指定规则在链中的位置编号,该命令从链中删除 P或- policy 该命令设置链的缺省目标,即策略。所有与链中任何规则都不匹配的数据包都将 被强制使用此链的策略 用命令中所指定的名称创建一个新链 -F或-fush 如果指定链名,该命令删除链中的所有规则,如果未指定链名,该命令删除所有 链中的所有规则。此参数用于快速清除 L或-list 列出指定链中的所有规则 示例: #iptables-A INPUT-S 192168..10-j ACCEPT 该命令将一条规则附加到 INPUT链的末尾,确定来自源地址192.168010的数据包 可以 ACCePt #iptables-D INPUT--dport 80-j DROP 该命令从 INPUT链删除规则 #iptables-P INPUT DROP 该命令将 INPUT链的缺省目标指定为DROP。这将丢弃所有与 INPUT链中任何规则 都不匹配的数据包 match部分指定数据包与规则匹配所应具有的特征,比如源IP地址、目的IP地址、协 议等。常用的规则匹配器见表7-4: 示例 #iptables-A INPUT-P TCP, UDP #iptables-A INPUT-P! ICMP #iptables-A OUTPUT-S 192 168.0.10 #iptables-A OUTPUT-S! 210.43 1.100 #iptables-A INPUT-d 192.168.1.1 #iptables-A OUTPUT-d! 210.43.1.100 4. target 目标是由规则指定的操作,常用的一些目标和功能说明见表7-5: 5.保存规则 用上述方法建立的规则被保存到内核中,这些规则在系统重启时将丢失。如果希望在系 统重启后还能使用这些规则,则必须使用 iptables-save命令将规则保存到某个文件 ( iptables-script)中 #iptables-save > iptables-script 执行如上命令后,数据包过滤表中的所有规则都被保存到 iptables-script文件中。当系 统重启时,可以执行 iptables-restore iptables-script命令,将规则从文件 iptables-script中恢复 到内核空间的数据包过滤表中
-A 或 --append 该命令将一条规则附加到链的末尾 -D 或 --delete 通过用-D指定要匹配的规则或者指定规则在链中的位置编号,该命令从链中删除 该规则 -P 或 --policy 该命令设置链的缺省目标,即策略。所有与链中任何规则都不匹配的数据包都将 被强制使用此链的策略 -N 或 --new-chain 用命令中所指定的名称创建一个新链 -F 或 --flush 如果指定链名,该命令删除链中的所有规则,如果未指定链名,该命令删除所有 链中的所有规则。此参数用于快速清除 -L 或 --list 列出指定链中的所有规则 示例: #iptables -A INPUT -s 192.168.0.10 -j ACCEPT 该命令将一条规则附加到 INPUT 链的末尾,确定来自源地址 192.168.0.10 的数据包 可以 ACCEPT。 #iptables -D INPUT --dport 80 -j DROP 该命令从 INPUT 链删除规则。 #iptables -P INPUT DROP 该命令将 INPUT 链的缺省目标指定为 DROP。这将丢弃所有与 INPUT 链中任何规则 都不匹配的数据包。 3.match match 部分指定数据包与规则匹配所应具有的特征,比如源 IP 地址、目的 IP 地址、协 议等。常用的规则匹配器见表 7-4: 示例: #iptables -A INPUT -p TCP,UDP #iptables -A INPUT -p ! ICMP #iptables -A OUTPUT -s 192.168.0.10 #iptables -A OUTPUT -s ! 210.43.1.100 #iptables -A INPUT -d 192.168.1.1 #iptables -A OUTPUT -d ! 210.43.1.100 4.target 目标是由规则指定的操作,常用的一些目标和功能说明见表 7-5: 5.保存规则 用上述方法建立的规则被保存到内核中,这些规则在系统重启时将丢失。如果希望在系 统重启后还能使用这些规则,则必须使用 iptables-save 命令将规则保存到某个文件 (iptables-script)中。 #iptables-save > iptables-script 执行如上命令后,数据包过滤表中的所有规则都被保存到 iptables-script 文件中。当系 统重启时,可以执行 iptables-restore iptables-script 命令,将规则从文件 iptables-script 中恢复 到内核空间的数据包过滤表中
733防火墙的设置 妒实例72设置防火墙 在终端窗口执行 system- config- securitylevel命令,打开【安全级别设置】窗口,如图7-441 所示。可以启用或停用防火墙。 %下面是一个 iptables的脚本实例,读者要根据自己的环境需求进行相应的调整。 INET IF="ppo"#外网接口 LAN IF=eth0" 内网接口 LAN IP RANGE="192168.1.024”#内网P地址范围,用于NAT #定义变量 MODPROBE="/sbin/modprobe SMODPROBE ip tables #下面9行加载相关模块 SMOdPROBE iptable nat SMODPROBEip nat ftp SMODPROBE ip nat irc SMODPROBEipt mark SMODPROBE ip conntrack SMODPROBE ip conntrack ftp SMODPROBE ipt MASQUERADE for table in filter nat mangle;do#清除所有防火墙规则 SIPT-t STABLE -F SIPT-t STABLE -X SIPT-P INPUT DROP #下面6行设置 filter和nat表的默认策略 SIPT-POUTPUT ACCEPT SIPT-P FORWARD DROP SIPT-t nat-P PREROUTING ACCEPT SIPT-t nat-P POSTROUTING ACCEPT SIPT-t nat-P OUTPUT ACCEPT #允许内网 samba、smp和pop3连接 SIPT-AINPUT-m state -state ESTABLISHED, RELATED-jACCEPT SIPT-A INPUT-p tcp-m multiport--dports 1863, 443, 110, 80, 25-j ACCEPT SIPT-AINPUT-p tcp-S SLAN IP RANGE--dport 139-jACCEPT #允许dns连接 SIPT-A SLAN_IF-p udp-m multiport-dports 53-jACCEPT #为了防止Dos攻击,可以最多允许15个初始连接,超过的将被丢弃 SIPT-A INPUT-S SLAN IP RANGE-ptcp-m state -state ESTABLISHED, RELATED-jACCEPT SIPT-AINPUT-ISINET IF-p tcp--syn- m connlimit--connlimit-above 15-j DROP SIPT-AINPUT-S SLAN_ IP_ RANGE-ptcp-syn-m connlimit--connlimit-above 15-jDROP #设置icmp阈值,记录攻击行为 SIPT-AINPUT-p icmp-m limit--limit 3/s-j LOG--log-level INFO--log-prefix "ICMP packet IN: SIPT-A INPUT-p icmp- m limit--limit 6/m-j ACCEPT SIPT-AINPUT-P icmp-j DROP #开放的端口 SIPT-AINPUT-P TCP-i SINET_IF -dport 21 - ACCEPT FTP SIPT-A INPUT-P TCP-I SINET_IF -dport 22-jACCEPT # SSH SIPT-A INPUT-P TCP-I SINET IF-dport 25-jACCEPT SMTP SIPT-AINPUT-p UDP-iSINET IF--dport 53-jACCEPT DNS SIPT-A INPUT-p TCP-I SINET_ IF --dport 53-jACCEPT DNS
7.3.3 防火墙的设置 实例 7-2 设置防火墙 在终端窗口执行 system-config-securitylevel 命令,打开【安全级别设置】窗口,如图 7-44 所示。可以启用或停用防火墙。 下面是一个 iptables 的脚本实例,读者要根据自己的环境需求进行相应的调整。 #!/bin/bash INET_IF="ppp0" #外网接口 LAN_IF="eth0" #内网接口 LAN_IP_RANGE="192.168.1.0/24" #内网 IP 地址范围,用于 NAT IPT="/sbin/iptables" #定义变量 MODPROBE="/sbin/modprobe" $MODPROBE ip_tables #下面 9 行加载相关模块 $MODPROBE iptable_nat $MODPROBE ip_nat_ftp $MODPROBE ip_nat_irc $MODPROBE ipt_mark $MODPROBE ip_conntrack $MODPROBE ip_conntrack_ftp $MODPROBE ip_conntrack_irc $MODPROBE ipt_MASQUERADE for TABLE in filter nat mangle ; do # 清除所有防火墙规则 $IPT -t $TABLE -F $IPT -t $TABLE -X done $IPT -P INPUT DROP #下面 6 行设置 filter 和 nat 表的默认策略 $IPT -P OUTPUT ACCEPT $IPT -P FORWARD DROP $IPT -t nat -P PREROUTING ACCEPT $IPT -t nat -P POSTROUTING ACCEPT $IPT -t nat -P OUTPUT ACCEPT #允许内网 samba、smtp 和 pop3 连接 $IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT $IPT -A INPUT -p tcp -m multiport --dports 1863,443,110,80,25 -j ACCEPT $IPT -A INPUT -p tcp -s $LAN_IP_RANGE --dport 139 -j ACCEPT #允许 dns 连接 $IPT -A INPUT -i $LAN_IF -p udp -m multiport --dports 53 -j ACCEPT #为了防止 Dos 攻击,可以最多允许 15 个初始连接,超过的将被丢弃 $IPT -A INPUT -s $LAN_IP_RANGE -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT $IPT -A INPUT -i $INET_IF -p tcp --syn -m connlimit --connlimit-above 15 -j DROP $IPT -A INPUT -s $LAN_IP_RANGE -p tcp --syn -m connlimit --connlimit-above 15 -j DROP #设置 icmp 阈值,记录攻击行为 $IPT -A INPUT -p icmp -m limit --limit 3/s -j LOG --log-level INFO --log-prefix "ICMP packet IN: " $IPT -A INPUT -p icmp -m limit --limit 6/m -j ACCEPT $IPT -A INPUT -p icmp -j DROP #开放的端口 $IPT -A INPUT -p TCP -i $INET_IF --dport 21 -j ACCEPT # FTP $IPT -A INPUT -p TCP -i $INET_IF --dport 22 -j ACCEPT # SSH $IPT -A INPUT -p TCP -i $INET_IF --dport 25 -j ACCEPT # SMTP $IPT -A INPUT -p UDP -i $INET_IF --dport 53 -j ACCEPT # DNS $IPT -A INPUT -p TCP -i $INET_IF --dport 53 -j ACCEPT # DNS
SIPT-A INPUT-p TCP-I SINET IF -dport 80-jACCEPT www SIPT-A INPUT-P TCP-I SINET_ IF -dport 110-jACCEPT POP3 #禁止BT连接 SIPT-I FORWARD-m state-state ESTABLISHED, RELATED-jACCEPT SIPT-AFORWARD-m ipp2p--edk-kazaa-bit-j DROP SIPT-A FORWARD-p tcp-m ipp2p--ares-j DROP SIPT-A FORWARD-p udp-m ipp2p--kazaa-jDROP #只允许每组p同时15个80端口转发 SIPT-A FORWARD-p tcp-syn-dport 80-m connlimit--connlimit-above 15--connlimit-mask 24 -j DROP MAC、IP地址绑定 SIPT-A FORWARD-S 192 168.0.1-m mac e 00: E2: 34: Al: 56 C2-p tcp-dport 80-jACCEPT SIPT-A FORWARD-S 192 168.0.10-m mac ce 00: 22: DA: 32: C1: 8B-p tcp--dport 80-j ACCEPT SIPT-A FORWARD-S 192 168.0.62-m mac ce 00: 0C: A1: 2E: BC: 16-p tcp--dport 80-j ACCEPT SIPT-A FORWARD-S 192168.0.254-m mac -mac-source 00: 0D: B3: F2: C2: 56-ptcp--dport 80-jACCEPT #禁止192.1680.22使用QQ SIPT-t mangle-A POSTROUTING-m layer7--17proto qq-s 192 168.1.12/32-j DROP SIPT-t mangle-A POSTROUTING-m layer7--I7proto qq-d 192.168.1 12/32-j DROP #禁止192.1680.22使用MSN #SIPT-t mangle -A POSTROUTING-m layer7--I7proto msnmessenger-s 192 168.0.22/32 - DROP #SIPT-t mangle -A POSTROUTING-m layer7--17proto msnmessenger-d 192.168.0. 22/32 -j DROP 022流量 SIPT -A PREROUTING-S 192 168.0.22-j MARK--set-mark 30 SIPT a POstroUting- d 192. 168.0.22-jMArK--set-mark 30
$IPT -A INPUT -p TCP -i $INET_IF --dport 80 -j ACCEPT # WWW $IPT -A INPUT -p TCP -i $INET_IF --dport 110 -j ACCEPT # POP3 #禁止 BT 连接 $IPT -I FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT $IPT -A FORWARD -m ipp2p --edk --kazaa --bit -j DROP $IPT -A FORWARD -p tcp -m ipp2p --ares -j DROP $IPT -A FORWARD -p udp -m ipp2p --kazaa -j DROP #只允许每组 ip 同时 15 个 80 端口转发 $IPT -A FORWARD -p tcp --syn --dport 80 -m connlimit --connlimit-above 15 --connlimit-mask 24 -j DROP #MAC、IP 地址绑定 $IPT -A FORWARD -s 192.168.0.1 -m mac --mac-source 00:E2:34:A1:56:C2 -p tcp --dport 80 -j ACCEPT $IPT -A FORWARD -s 192.168.0.10 -m mac --mac-source 00:22:DA:32:C1:8B -p tcp --dport 80 -j ACCEPT $IPT -A FORWARD -s 192.168.0.62 -m mac --mac-source 00:0C:A1:2E:BC:16 -p tcp --dport 80 -j ACCEPT $IPT -A FORWARD -s 192.168.0.254 -m mac --mac-source 00:0D:E3:F2:C2:56 -p tcp --dport 80 -j ACCEPT # 禁止 192.168.0.22 使用 QQ $IPT -t mangle -A POSTROUTING -m layer7 --l7proto qq -s 192.168.1.12/32 -j DROP $IPT -t mangle -A POSTROUTING -m layer7 --l7proto qq -d 192.168.1.12/32 -j DROP # 禁止 192.168.0.22 使用 MSN # $IPT -t mangle -A POSTROUTING -m layer7 --l7proto msnmessenger -s 192.168.0.22/32 -j DROP # $IPT -t mangle -A POSTROUTING -m layer7 --l7proto msnmessenger -d 192.168.0.22/32 -j DROP #限制 192.168.0.22 流量 $IPT -t mangle -A PREROUTING -s 192.168.0.22 -j MARK --set-mark 30 $IPT -t mangle -A POSTROUTING -d 192.168.0.22 -j MARK --set-mark 30