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常用命令操作命令
功能
-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中恢复到内核空间的数据包过滤表中。
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
$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
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常用命令操作命令
功能
-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中恢复到内核空间的数据包过滤表中。
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
$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