iptables详解

一: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


                

你可能感兴趣的:(高并发,iptables)