iptables raw表

2023-05-16

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的数据包的流程是怎样的?
(流程介绍来源:http://selboo.com.cn/post/721/)
一个数据包到达时,是怎么依次穿过各个链和表的(图)。 

基本步骤如下: 
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的问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iptables raw表 的相关文章

  • 函数重载常见问题

    问题一 cannot bind non const lvalue reference of type 39 Complex amp 39 to an rvalue of type 39 Complex 39 该错误提示出现的原因是 xff0

随机推荐

  • 输入输出流

    iomanip的控制符 resetiosflags long f 关闭由参数f指定的格式标志 xff0c 用于输入输出 setprecision int n 设置数据小数位数 xff0c 缺省时为6 xff0c 用于输入输出 setw in
  • 解决TIME_WAIT过多造成的问题

    看到TIME WAIT状态是在tcp断开链接时产生的 xff0c 因为TCP连接是双向的 xff0c 所以在关闭连接的时候 xff0c 两个方向各自都需要关闭 先发FIN包的一方执行的是主动关闭 xff1b 后发FIN包的一方执行的是被动关
  • linux后台开发常用调试工具

    一 编译阶段 nm 获取二进制文件包含的符号信息 strings 获取二进制文件包含的字符串常量 strip 去除二进制文件包含的符号 readelf 显示目标文件详细信息 objdump 尽可能反汇编出源代码 addr2line 根据地址
  • 将Ubuntu 8.04 Live CD Desktop放在硬盘上启动

    将Ubuntu 8 04 Live CD Desktop放在硬盘上启动 最近下了一个Ubuntu 8 04 Live CD Desktop 镜象文件 xff0c 放在VMWere虚拟机里试用了一下 xff0c 觉的还不错 于是更想把它放在硬
  • 如何在Android项目中使用Kotlin

    本文是作者阅读How to Use Kotlin in Your Android Projects xff0c 按照文章实现了一遍 xff0c 并将实现过程中碰到的坑总结出来的文章 简介 Kotlin是由JetBrains设计的开源编程语言
  • Android中使用log4j、android-logging-log4j-1.0

    Android中使用log4j android logging log4j 1 0 3 1 下载相关资源包 资源包下载路径 xff1a log4j xff1a http logging apache org log4j 1 2 downlo
  • 8G内存机器JVM设置模版

    Xms4096m Xmx4096m Xmn3072m XX MetaspaceSize 61 256m XX MaxMetaspaceSize 61 256m XX 43 UseParNewGC XX 43 UseConcMarkSweep
  • Java文件名及其他命名规则

    http bbs csdn net topics 70157841 关于JAVA 源文件命名的问题 Java文件命名 xff1a java程序是由类组成的 xff1b java应用程序必须有一个包含main方法的public类 xff0c
  • gdb+gdbserver调试详解

    1 gdb 43 gdbserver总体介绍 远程调试环境由宿主机GDB和目标机调试stub共同构成 xff0c 两者通过串口或TCP连接 使用 GDB标准串行协议协同工作 xff0c 实现对目标机上的系统内核和上层应用的监控和调试功能 调
  • TCP连接状态详解及TIME_WAIT过多的解决方法

    上图对排除和定位网络或系统故障时大有帮助 xff0c 但是怎样牢牢地将这张图刻在脑中呢 xff1f 那么你就一定要对这张图的每一个状态 xff0c 及转换的过程有深刻地认识 xff0c 不能只停留在一知半解之中 下面对这张图的11种状态详细
  • python爬虫 记录一次爬取淘宝的过程

    淘宝可以说是一个检验爬虫技术是否过关的最强关卡了 xff0c 下面来打破它吧 淘宝的所有操作差不多都是在登录的状态下进行的 xff0c 这时候想要对淘宝进行请求获取信息就必须在登录的状态下进行了 方式一 xff1a xff08 seleni
  • 计算机网络技术(一)——概论

    摘要 计算机网络的起源与发展计算机网络的分类计算机网络的硬件和软件设备计算机网络的性能指标计算机网络的功能和应用计算机网络的标准化组织 一 计算机网络的起源与发展 1 1 产生背景 计算机诞生后 xff0c 作为信息处理的核心器件 xff0
  • 链游玩家:浅谈链游开发平台,千里之行始于足下

    链游玩家 出品 区块链游戏行业 xff0c 截止目前已有近千款的产品 xff0c 往常我们只知道这些游戏好不好玩 xff0c 以及怎么玩 xff0c 却不知道这些游戏都是用什么开发出来的 今天 xff0c 就来带大家盘点一下 xff0c 几
  • 解决部分网页打不开的方法(特别是CSDN)

    近来遇到好几次CSDN网站连不上的状况 起初是在学校因为是连的校园网 xff0c 突然有一天连着校园网就打不开CSDN的相关网页了 xff0c 问了周围的同学 xff0c 问了几个她们也都打不开 xff0c 但是用流量就能打开CSDN网页
  • MTK平台Android项目开发框架搭建

    前言 xff1a 不同的项目配置存在差异 xff0c 原生的SDK无法兼容多个项目作业 xff0c 按照原生框架创建项目比较繁琐 xff0c 如果采用GIT分支形式来管理每个项目同样过于繁琐 因此一套代码多个项目框架是有必要的 1 编译脚本
  • windows平台 Anaconda及相关插件安装

    1 Anaconda官网 https www anaconda com products individual 2 Anaconda安装 3 创建python3 7虚拟环境 conda create n 名字 python 61 3 7 如
  • python paramiko 远程登陆主机并获取主机信息

    usr bin python encoding utf 8 filename host information get py author gaohaixiang writetime 20200409 import paramiko def
  • rk3568 android11 AP6275s调试

    一 AP6275S的32 768k波形要求 xff1a 1 43 25ppm xff0c 计算的范围是 xff1a 32767 1808 32768 8192Hz 2 占空比 xff1a 30 70 3 峰峰值 xff1a 1 8v 43
  • OpenCV如何获取视频当前的一帧图像

    xff08 OpenCV读取视频 OpenCV提取视频每一帧 每一帧图片合成新的AVI视频 xff09 CvCapture 是视频获取结构 被用来作为视频获取函数的一个参数 比如 CvCapture cap IplImage cvQuery
  • iptables raw表

    1 什么是raw表 xff1f 做什么用的 xff1f iptables有5个链 PREROUTING INPUT FORWARD OUTPUT POSTROUTING 4个表 filter nat mangle raw 4个表的优先级由高