一:iptables工作机制
iptables实际上是用户空间上配置与修改过滤规则的命令,生成的规则保存在linux内核空间netfilter中,netfilter是Linux核心中的一个通用架构,其提供了一系列的表(tables),每个表由若干个链(chains)组成,而每条链可以由一条或若干条规则(rules)组成。实际上netfilter是表的容器,表是链的容器,而链又是规则的容器,netfilter有四张表:filter、nat、mangle、raw。filter表有INPUT、OUTPUT、FILTER三条链,nat表PREROUTING、OUTPUT、POSTROUTING三条链,mangle表有PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING五条链,raw表有PREROUTING、OUTPUT两条链。
数据包经过网卡进入内核空间内TCP/IP协议栈(netfilter hook)时,由netfilter hook内部的五条规则链(PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING)进行匹配,然后路由决策
二:基本命令解释(一定要注意大小写)
iptables [-t 表] 命令 链名 [序号] 匹配标准 -j 处理方法
命令(大写):
-A 新增 (不需要序号)
-D 删除(如果未添加序号,则同-A用法,若添加了序号,则使用iptables -D 链名 序号)
-R 替代(此时需要添加序号)
-I 插入(如果添加序号则插入指定序号的规则,否则会插入为第1条规则)
链名(大写):PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING
匹配标准(小写):-s、-d、-p、-i等
处理方法(大写):ACCEPT(接受)、DROP(丢弃)、REJECT(拒绝)、DNAT(目标地址转换)、 SNAT(源地址转换)、LOG(日志)
管理链(大写):(如果没有添加‘-t 表’,那么iptables默认配置的是filter表)
-F[CHAIN]:flush 清空指定规则链,如果省略chain则清除对应表中的所有链
-X[CHAIN]:清除自定义链,默认链无法删除,如果省略chain则清除对应表中的所有自定义链
-Z[CHAIN]:清除链匹配计数器
-P CHAIN ACCEPT/DROP:设定指定链的默认策略
-L [-n -vv -x --line-numbers] :显示iptables规则链,具体解释如下
-n: 以数字格式显示主机地址和端口号;
-v: 显示链及规则的详细信息
-vv: 显示链及规则的更详细信息
-x: 显示计数器的精确值
--line-numbers: 显示规则号码
三:常用配置实例
iptables -F
#清除nat表的规则链
iptables -X
#清除nat表的自定义链
iptables -Z
#清除nat表的计数器
iptables -P INPUT DROP
#配置nat表INPUT链默认处理方式为丢弃
iptables -P OUTPUT ACCEPT
#配置nat表OUTPUT链默认处理方式为放行
iptables -A INPUT -m limit --limit 30/minute --limit-burst 40-j DROP
#初始连接池有40个,使用完后限制每分钟只能新增连接30个,
iptables -A INPUT -m connlimit --connlimit-above 10 -j DROP
#配置单个ip并发访问数为10,这样会误伤使用NAT上网的用户
iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
#配置单个端口访问情况,需要添加-p参数
iptables -A INPUT -p tcp --dport 8080:8090 -j ACCEPT
#配置连续端口访问情况,需要添加-p参数
iptables -A INPUT -p tcp -m multiport --destination-ports 21,22,80 -j ACCEPT
#配置多端口访问情况,需要添加-p参数
iptables -A INPUT -m state --state established -j ACCEPT
#配置访问状态规则
四:配置路由转换
当服务器只有一张网卡时,利用别名设置一外网ip与一内网ip共两ip,可以不设置ip_forward ,直接为两网进行路由转换,内网段的主机需要将默认网关设置为此服务器对应的内网IP。
当服务器有两种网卡时,分别设置两IP(一网卡配置为内网ip,一网卡配置为外网ip),则需要设置ip_forward,内网主机将默认网关设置为此服务器内网ip。
实例:
iptables -t nat -A POSTROUTING -s 172.16.100.0/24 -j SNAT --to-source 192.168.1.114
注:此条规则配置在表nat上的POSTROUTING链上,使用源地址转换,将内网源地址为172网段主机,映射到ip 192.168.1.114
iptables -t nat -A PREROUTING -d 192.168.1.114 -p tcp --dport 80 -j DNAT --to-destination 172.16.100.7[:8080]
注:此条规则配置在表nat上的PREROUTING链上,使用目标地址转换,将目标地址为192.168.1.114,端口为80的包转发到内网172.16.100.7,端口为8080的主机上
五:高并发网站下防火墙优化
ip_conntrack(centos5)与nf_conntrack(centos6)开启时,即使用nat表或者使用state状态规则,系统会在内存维持状态跟踪表来记录每一个访问ip的状态,这对高并发网站很危险,可能会出现"table full, dropping packet",解决方式修改内核参数:
net.netfilter.nf_conntrack_max = 1048576
#状态跟踪表的最大行数的设定,理论最大值 CONNTRACK_MAX = RAMSIZE (in bytes) / 16384 / (ARCH / 32)
net.netfilter.nf_conntrack_tcp_timeout_established = 3600
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
参考网址:
http://my.oschina.net/kisops/blog/150995