iptables raw表

摘要:
RAW(提供PREROUTING链和OUTPUT链)表具有最高优先级,可以在连接跟踪之前处理接收到的数据包。将跳过NAT表和IP_ Contrack处理,即不再执行数据包的地址转换和链接跟踪。当不需要nat和链接跟踪时,可以使用RAW表。默认情况下,Conntrace模块将记录所有网络五分位数(类型)。

参考文档:http://blog.chinaunix.net/uid-10915175-id-3381754.html

iptables

iptables <wbr>raw表

5:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

4:优先级由高到低raw-->mangle-->nat-->filter

如果PRROUTING链上既有mangle表也有nat,那么先由mangle处理后再由nat表处理。


RAW(提供PREROUTING链和OUTPUT)表优先级最高,可以对收到的数据包在连接跟踪前进行处理。一但用户使用了RAW,将跳NAT表和ip_conntrack处理,即不再做地址转换和数据包的链接跟踪

RAW表可以应用在那些不需要做nat和链接跟踪的情况,如大量迸发的Web服务,可以让80端口不再做数据包的链接跟踪,节省iptables处理开销以提高用户的访问速度。

iptables <wbr>raw表

man iptables

raw:

                  This table is used mainly for configuring exemptions from  connection

                  tracking in combination with the NOTRACK target.  It registers at the

                  netfilter hooks with  higher  priority  and  is  thus  called before

                  ip_conntrack,  or  any  other  IP  tables It provides the following

                  built-in chains: PREROUTING (for packets  arriving  via  any  network

                  interface) OUTPUT (for packets generated by local processes)

 

NOTRACK

       This target disables connection tracking for all packets matching that rule.

       It can only be used in the raw table.


简要示例:

Conntrack模块会默认记录所有网络五元组(类型,源IP/Port,目的IP/Port),并标识连接的状态。用户添加的IPtables规则是在Filter表中,在Conntrack的后面,所以用户的规则在有Conntrack记录的情况下无法起作用。
延时的时间我们用的是Conntracknf_conntrack_tcp_timeout_established默认值五天。所以如果用户用的是mysql之类的长连接,并且已经有记录的情况下,想禁止外部用户对于mysql的访问,即使加了规则,也要等5天才能生效。

Nginx影响不大。因为Nginx会在keepalive_timeout(默认值65秒)之后发FIN包,让nf_conntrack_tcp_timeout_established不再起作用,转而触发nf_conntrack_tcp_timeout_time_wait这个值起作用,它的默认值是120秒,这个影响一般用户应该能接受。

补救措施:

Mysql中的3306端口为例,利用VM中的iptables RAW表,假设源src101.231.119.202,那么在VM中请加入:
iptables -t raw -I
 PREROUTING -s 101.231.119.202 -p tcp -m tcp --dport 3306 -j DROP

用此措施的原因:
1.Raw
表的引入:
Linux
NetfilterPREROUTING以及OUTPUT这两个HOOKconntrack之前安插了一个优先级更高的raw表,通过它就可以分离出不需要被conntrack的流量。
2.Raw
表的位置:
VM级别优于VNAT
为了减少对于宿主机上对别的VM的影响。可以利用VM中的IPtables


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

到了这里我们就得分两种不同的情况进行讨论了

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

B.数据包就是发给本地主机的
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. 进入出去的网络接口。完毕。

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

解决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 值
vim /etc/sysctl.conf
net.ipv4.ip_conntrack_max = 393216
net.ipv4.netfilter.ip_conntrack_max = 393216
(2): 降低 ip_conntrack timeout时间
vim /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

iptables raw表的效果测试
我们在一台web server上做测试,先不使用raw表,观察链接跟踪表(/proc/net/ip_conntrack)的大小:
在另一台机器上用ab测试:
ab -c 1000 -n 5000 http://192.168.20.26/index.html
在web server上查看链接跟踪表(/proc/net/ip_conntrack)的大小:
 wc -l /proc/net/ip_conntrack
  4887 /proc/net/ip_conntrack
可以看到跟踪表内有5153个链接,再大一些的压力可能就要报ip_conntrack: table full, dropping packet的错误了。

启用raw表:
cat /etc/sysconfig/iptables
... ...
# 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

然后再用ab测试:
ab -c 1000 -n 5000 http://192.168.20.26/index.html
查看链接跟踪表(/proc/net/ip_conntrack)的大小:
wc -l /proc/net/ip_conntrack
1 /proc/net/ip_conntrack
跟踪表内只跟踪了一个链接了。
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的问题。

免责声明:文章转载自《iptables raw表》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Delphi管理多线程之线程局部存储:threadvar利用Python操作MySQL数据库下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

单点登录(SSO)原理

在整个SSO流程当,有两个流程非常重要:   第一个是用户没有登录系统到登录系统的过程;   第二是用户在一个系统当中已经登录(例如在OA系统中登录 了),但又想进入另一个系统(例如进入PRO系统)的过程 一、用户没有登录系统到登录系统的过程: 1:用户通过URL访问OA系统。  2:在OA系统中的filter发现这个URL没有ticket,此...

google软件测试之道读后感(二)

这几天又翻了几页这本书,觉得妙语连珠,关键语录摘抄如下,并补充自己的一些思考: “如果你想要求一个团队去尝试新的事物或者做某些改进,给他们提供一个联系人会更好一些,这个联系人来源于更大的社区,并可以从他那里得到帮助”; “不要陷入尝试去创建一个包含独立指标的完美系统的陷阱中。对所有人都完美的事情是不存在的。在没有可替代的方案时,在合理的地方达成一致并勇往直...

NBI可视化集成clickhouse,实现百亿级数据分析能力

什么是ClickHouse ClickHouse是一款MPP架构的列式存储数据库,并允许使用SQL查询实时生成分析报告,也是一个新的开源列式数据库。 随着业务的迅猛增长,Yandex.Metrica目前已经成为世界第三大Web流量分析平台,每天处理超过200亿个跟踪事件。能够拥有如此惊人的体量,在它背后提供支撑的ClickHouse功不可没。ClickH...

开源堡垒机_jumpserver

前介 1、jumperver介绍 ​ Jumpserver 是一款由Python编写开源的跳板机(堡垒机)系统,实现了跳板机应有的功能。基于ssh协议来管理,客户端无需安装agent。 ​ 特点: ​ 完全开源,GPL授权 Python编写,容易再次开发 实现了跳板机基本功能,认证、授权、审计 集成了Ansible,批量命令等 支持WebTerminal...

Linux下防御ddos攻击

导读 Linux服务器在运营过程中可能会受到黑客攻击,常见的攻击方式有SYN,DDOS等。通过更换IP,查找被攻击的站点可能避开攻击,但是中断服务的时间比较长。比较彻底的解决方法是添置硬件防火墙。不过,硬件防火墙价格比较昂贵。可以考虑利用Linux 系统本身提供的防火墙功能来防御。 SYN攻击是利用TCP/IP协议3次握手的原理,发送大量的建立...

Android开发经验02:Android 项目开发流程

Android开发完整流程:   一、用户需求分析 用户需求分析占据整个APP开发流程中最重要的一个环节。一款APP开发的成功与否很大程度都决定于此。这里所说的用户需求分析指的是基于用户的要求所进行的APP功能的梳理。针对的主体都是用户,"以用户为中心",不是瞎喊口号。因为很多公司所开发的APP都是给需求用户所使用的,所以,在整理APP开发需求的同时,不...