raw表 IPTABLE和高并发下的优化

http://blog.csdn.net/hwyfy/article/details/18053545

1)  什么是raw表?做什么用的?


iptables有5个链:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING,4个表:filter,nat,mangle,raw.

4个表的优先级由高到低的顺序为:raw-->mangle-->nat-->filter

举例来说:如果PRROUTING链上,即有mangle表,也有nat表,那么先由mangle处理,然后由nat表处理

RAW表 只使用在PREROUTING链和OUTPUT链 上,因为优先级最高,从而可以对收到的数据包在连接跟踪前进行处理。 一但用户使用了RAW表,在某个链上,RAW表处理完后,将跳过NAT表和 ip_conntrack处理,即不再做地址转换和数据包的链接跟踪处理了 .

RAW表可以应用在那些不需要做nat的情况下,以提高性能。 如大量访问的web服务器,可以让80端口不再让iptables做数据包的链接跟踪处理,以提高用户的访问速度。

2)  iptables的数据包的流程是怎样的?


iptables包含4个表,5个链。其中表是按照对数据包的操作区分的,链是按照不同的Hook点来区分的,表和链实际上是netfilter的两个维度。

4个表:filter,nat,mangle,raw,默认表是filter(没有指定表的时候就是filter表)。表的处理优先级:raw>mangle>nat>filter。

filter:一般的过滤功能

nat:用于nat功能(端口映射,地址映射等)

mangle:用于对特定数据包的修改

raw:优先级最高,设置raw时一般是为了不再让iptables做数据包的链接跟踪处理,提高性能

5个链:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING。

PREROUTING:数据包进入路由表之前

INPUT:通过路由表后目的地为本机

FORWARDING:通过路由表后,目的地不为本机

OUTPUT:由本机产生,向外转发

POSTROUTING数据包通过路由表后,发送至出去的网卡前


####################################################################################################################################
(流程介绍来源:http://selboo.com.cn/post/721/)

一个数据包到达时,是怎么依次穿过各个链和表的(图)。 

只关注filternat表的数据包流经图



##################################################################################################################################


######################################################################################################################################

####################################################################################################################################


基本步骤如下: 
1. 数据包到达网络接口,比如 eth0。 
2. 进入 raw 表的 PREROUTING 链,这个链的作用是赶在连接跟踪之前处理数据包。 
3. 如果进行了连接跟踪,在此处理。 
4. 进入 mangle 表的 PREROUTING 链,在此可以修改数据包,比如 TOS 等。 
5. 进入 nat 表的 PREROUTING 链,可以在此做DNAT,但不要做过滤。 
6. 决定路由,看是交给本地主机还是转发给其它主机。 


到了这里我们就得分两种不同的情况进行讨论了,一种情况就是数据包要转发给其它主机,这时候它会依次经过: 
7. 进入 mangle 表的 FORWARD 链,这里也比较特殊,这是在第一次路由决定之后,在进行最后的路由决定之前,我们仍然可以对数据包进行某些修改。 
8. 进入 filter 表的 FORWARD 链,在这里我们可以对所有转发的数据包进行过滤。需要注意的是:经过这里的数据包是转发的,方向是双向的。 
9. 进入 mangle 表的 POSTROUTING 链,到这里已经做完了所有的路由决定,但数据包仍然在本地主机,我们还可以进行某些修改。 
10. 进入 nat 表的 POSTROUTING 链,在这里一般都是用来做 SNAT ,不要在这里进行过滤。 
11. 进入出去的网络接口。完毕。 


另一种情况是,数据包就是发给本地主机的,那么它会依次穿过: 
7. 进入 mangle 表的 INPUT 链,这里是在路由之后,交由本地主机之前,我们也可以进行一些相应的修改。 
8. 进入 filter 表的 INPUT 链,在这里我们可以对流入的所有数据包进行过滤,无论它来自哪个网络接口。 
9. 交给本地主机的应用程序进行处理。 
10. 处理完毕后进行路由决定,看该往那里发出。 
11. 进入 raw 表的 OUTPUT 链,这里是在连接跟踪处理本地的数据包之前。 
12. 连接跟踪对本地的数据包进行处理。 
13. 进入 mangle 表的 OUTPUT 链,在这里我们可以修改数据包,但不要做过滤。 
14. 进入 nat 表的 OUTPUT 链,可以对防火墙自己发出的数据做 NAT 。 
15. 再次进行路由决定。 
16. 进入 filter 表的 OUTPUT 链,可以对本地出去的数据包进行过滤。 
17. 进入 mangle 表的 POSTROUTING 链,同上一种情况的第9步。注意,这里不光对经过防火墙的数据包进行处理,还对防火墙自己产生的数据包进行处理。
18. 进入 nat 表的 POSTROUTING 链,同上一种情况的第10步。 
19. 进入出去的网络接口。完毕。



3)  iptables raw表的使用

增加raw表,在其他表处理之前,-j NOTRACK跳过其它表处理
状态除了以前的四个还增加了一个UNTRACKED

例如:
可以使用 “NOTRACK” target 允许规则指定80端口的包不进入链接跟踪/NAT子系统

iptables -t raw -A PREROUTING -d 1.2.3.4 -p tcp --dport 80 -j NOTRACK
iptables -t raw -A PREROUTING -s 1.2.3.4 -p tcp --sport 80 -j NOTRACK
iptables -A FORWARD -m state --state UNTRACKED -j ACCEPT

4) 解决ip_conntrack: table full, dropping packet 的问题


在启用了iptables web服务器上,流量高的时候经常会出现下面的错误:

ip_conntrack: table full, dropping packet


这个问题的原因是由于web服务器收到了大量的连接,在启用了iptables的情况下,iptables会把所有的连接都做链接跟踪处理,这样iptables就会有一个链接跟踪表,当这个表满的时候,就会出现上面的错误。

iptables的链接跟踪表最大容量为/proc/sys/net/ipv4/ip_conntrack_max,链接碰到各种状态的超时后就会从表中删除。

所以解決方法一般有两个:

(1) 加大 ip_conntrack_max 值

vi /etc/sysctl.conf

net.ipv4.ip_conntrack_max = 393216
net.ipv4.netfilter.ip_conntrack_max = 393216


(2): 降低 ip_conntrack timeout时间

vi /etc/sysctl.conf

net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 300
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120


上面两种方法打个比喻就是烧水水开的时候,换一个大锅。一般情况下都可以解决问题,但是在极端情况下,还是不够用,怎么办?

这样就得反其道而行,用釜底抽薪的办法。iptables的raw表是不做数据包的链接跟踪处理的,我们就把那些连接量非常大的链接加入到iptables raw表。

如一台web服务器可以这样:

iptables -t raw -A PREROUTING -d 1.2.3.4 -p tcp --dport 80 -j NOTRACK
iptables -A FORWARD -m state --state UNTRACKED -j ACCEPT


5)  iptables raw表的效果测试

我们在一台web server上做测试,先不使用raw表,观察链接跟踪表(/proc/net/ip_conntrack)的大小:

先看下iptables配置:
cat /etc/sysconfig/iptables

# Generated by iptables-save v1.3.5 on Wed Aug 18 10:10:52 2010
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [104076:12500201]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp -m icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p esp -j ACCEPT
-A RH-Firewall-1-INPUT -p ah -j ACCEPT
-A RH-Firewall-1-INPUT -d 224.0.0.251 -p udp -m udp --dport 5353 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Wed Aug 18 10:10:52 2010

在另一台机器上用ab测试:

ab -c 1000 -n 5000 http://192.168.20.26/index.html

在web server上查看链接跟踪表(/proc/net/ip_conntrack)的大小:

[root@mongo html]# wc -l /proc/net/ip_conntrack
5153 /proc/net/ip_conntrack

可以看到跟踪表内有5153个链接,再大一些的压力可能就要报ip_conntrack: table full, dropping packet的错误了。


下面我们启用raw表:

先更新iptables:

[root@mongo html]# cat /etc/sysconfig/iptables
# Generated by iptables-save v1.3.5 on Wed Aug 18 10:10:52 2010
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [104076:12500201]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT 
-A FORWARD -j RH-Firewall-1-INPUT 
-A RH-Firewall-1-INPUT -i lo -j ACCEPT 
-A RH-Firewall-1-INPUT -p icmp -m icmp --icmp-type any -j ACCEPT 
-A RH-Firewall-1-INPUT -p esp -j ACCEPT 
-A RH-Firewall-1-INPUT -p ah -j ACCEPT 
-A RH-Firewall-1-INPUT -d 224.0.0.251 -p udp -m udp --dport 5353 -j ACCEPT 
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT 
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT 
-A RH-Firewall-1-INPUT -m state --state RELATED,ESTABLISHED, UNTRACKED  -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT 
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT 
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited 
COMMIT
# Completed on Wed Aug 18 10:10:52 2010
# Generated by iptables-save v1.3.5 on Wed Aug 18 10:10:52 2010
*raw
:PREROUTING ACCEPT [116163:9327716]
:OUTPUT ACCEPT [104076:12500201]
-A PREROUTING -p tcp -m tcp --dport 80 -j NOTRACK 
-A OUTPUT -p tcp -m tcp --sport 80 -j NOTRACK 
COMMIT

# Completed on Wed Aug 18 10:10:52 2010

红色部分是新增的。

重启iptables:

service iptables restart

可以用iptables命令查看是否启用成功了:

[root@mongo html]# iptables -t raw -L -n
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
NOTRACK    tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80 

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
NOTRACK    tcp  --  0.0.0.0/0            0.0.0.0/0           tcp spt:80 

然后再用ab测试:

ab -c 1000 -n 5000 http://192.168.20.26/index.html

查看链接跟踪表(/proc/net/ip_conntrack)的大小:

[root@mongo html]# wc -l /proc/net/ip_conntrack
1 /proc/net/ip_conntrack

跟踪表内只跟踪了一个链接了。

[root@mongo html]# cat /proc/net/ip_conntrack  
tcp      6 431999 ESTABLISHED src=192.168.20.26 dst=192.168.20.10 sport=22 dport=50088 packets=85 bytes=10200 src=192.168.20.10 dst=192.168.20.26 sport=50088 dport=22 packets=92 bytes=6832 [ASSURED] mark=0 secmark=0 use=1

可以看到iptables已经不跟踪进出端口为80的链接了。测试结果表明用iptables的raw表可以完美解决ip_conntrack: table full, dropping packet的问题
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
iptables 是 Linux 操作系统中一个非常常用的防火墙工具,它可以通过过滤、转发、伪装等机制实现对网络流量的控制和管理。iptables 通过四个(filter、nat、mangleraw)和五个链(INPUT、OUTPUT、FORWARD、PREROUTING 和 POSTROUTING)来进行规则匹配和处理。 四个: 1. filter :该是默认,主要用于过滤数据包,决定是否允许进入或者离开本机。 2. nat :该用于网络地址转换,主要用于实现内网访问外网的功能。它可以将内网 IP 地址转换成公网 IP 地址,从而实现外网访问内网的功能。 3. mangle :该主要用于对数据包头部进行修改,包括 TOS、TTL、MARK 等字段的修改。 4. raw :该主要用于配置特殊的处理规则,如连接跟踪、数据包状态等。 五个链: 1. INPUT 链:该链用于处理所有目标地址为本机的数据包,包括从本机产生的数据包和从其他机器发往本机的数据包。 2. OUTPUT 链:该链用于处理所有源地址为本机的数据包,包括从本机产生的数据包和从本机发往其他机器的数据包。 3. FORWARD 链:该链用于处理所有经过本机的数据包,包括本机转发的数据包和其他机器经过本机转发的数据包。 4. PREROUTING 链:该链用于对目标地址进行修改和转发,处理数据包到达本机之前的操作。 5. POSTROUTING 链:该链用于对源地址进行修改和转发,处理数据包离开本机之后的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值