iptables实际上是定义防火墙规则的工具,真正对数据报文处理的是内核中的netfilter模块。netfilter对报文的处理方式一般有:过滤,地址转换,连接追踪。
防火墙实际上是对进出本机的各种报文进行控制,所以了解常见报文的结构(格式)可以精确的控制报文。
ip报文的结构如下图:
<a href="http://guoting.blog.51cto.com/attachment/201408/21/8886857_140862050639st.jpg" target="_blank"></a>
在这里与防火墙关系最大的是源地址、目标地址、协议。源地址指明报文的来源,目标地址说明报文的去处,协议指明传输层所使用的协议。
补充:
ip报文在互联网中传输的时候,要经过各种各样的网络设备,但是这些网络设备的MTU(一般为1500字节),所以ip报文在传输过程中需要进行分段,每段都有一个分段标识。在目标地址的主机接收到,这些报文后,需要进行组装,此时就需要靠段偏移来实现。有时候,在网络中可能会形成回环现象,为了避免诸如此类现象的发生,TTL(time-to-live)帮我们解决这个问题,ip报文每经过一个网络设备,其值会减少1。如果值为0,我们就认为网络不可达。
<a href="http://guoting.blog.51cto.com/attachment/201408/21/8886857_1408620513Pygo.jpg" target="_blank"></a>
这里我们使常关注的是:
源地址端口:源地址进程的端口号
目标地址端口:目标地址进程对应的端口号
FIN: 结束标识符,tcp断开连接时,此标志位为1
SYN: 请求标志符,客户端发起请求时,用于标识三次握手
ACK: 序列确认号,建立连接后,此标志位是1。ACK=0,FIN=1通常用来确定是第一次”握手”
补充:
RST:重置标识,重新建立连接的时候会用到
PSH: 此标志位为1时,表明在接受端不缓冲,直接处理
URG: 来说明紧急指针是否有效
窗口大小:目的告诉接收方在未收到“我”的确认时,接收方可以允许发送的数据的最大字节数
原理如下图所示:
<a href="http://guoting.blog.51cto.com/attachment/201408/21/8886857_1408620521qTDR.jpg" target="_blank"></a>
Netfilte在内核中使用5个钩子(Hook)函数来实现,对应netfilter的5个链,它们分别是PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING。对报文做出的动作有4张表raw,mangle,nat,filter来实现。
raw:目标是关闭nat表的连接追踪功能;
mangle:自定义功能。
nat:实现地址转换(SNAT,DNAT),启用连接追踪(connection_track)
filter: 实现数据包的过滤功能
PREROUTING:路由前,数据包最先到达的链
INPUT:到达本机内部的报文必经之路
FORWARD:由本机转发的报文必经之路
OUTPUT:由本机发出的报文的必经之路
POSTROUTING:路由后,报文出本机的最后一个链
filter: INPUT, FORWARD, OUTPUT
nat: PREROUTING(DNAT),POSTROUTING(SNAT),OUTPUT(SNAT)
mangle: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
raw: PREROUTING, OUTPUT
优先级从高到底的是:raw,mangle,nat,filter
跟本机内部进程通信:
进入:PREROUTING, INPUT
出去:OUTPUT, POSTROUTING
由本机转发:
PREROUTING, FORWARD, POSTROUTING
启动脚本:/etc/init.d/iptables {start|stop|restart|save}
save是将写好的规则保存到/etc/sysconfig/iptables,下次启动时会去读取此文件中的规则。也可使用iptables-save重定向到某个文件中,下次可以使用iptables-restore命令来导入规则。
iptables [-t TABLE] COMMAND CHAIN [RULE] [-j TARGET]
选项
意义
-t
指明处理的表名,默认是filter
-A|-D|-I|R
增加、删除、插入、替换匹配的规则,后面是对应要处理的链名
-F
刷新规则库
-Z
清空计数器
-N|-X|-E
自己 创建、删除、重命名一个链
-P
设置默认策略,经常用来设置黑名单、白名单
-L
列出对应表的防火墙规则,可以使用以下子选项
-n 以数字形式显示ip地址和端口号
-v -vv -vvv 显示信息的详细程度
-x 精确显示匹配到的包数和包的字节数
--line-numbers 列出每个规则的序列号
--modprobe=command 可以通过这个加载必要的模块
说明,以下每个选项前面都可以加 ! 来取反
1)通用的匹配条件
-s
指明报文的源地址
-d
指明报文的目的地址
-p
指明报文的协议
-i
指明报文的进入的网卡,与INPUT链一起使用
-o
指明报文出去的网卡,与OUTPUT一起使用
2)扩展匹配
扩展匹配有隐式扩展和显式扩展,隐式扩展是 -p 指定协议的补充说明,显式扩展是用 -m 来指定特定的其他扩展选项。
常见的隐式扩展如下:
tcp协议的扩展选项:
--sport
指定源端口,udp协议也同样适用
--dport
指定目标端口,udp协议也同样适用
--tcp-flags
指明tcp报文中的状态时,格式:--tcp-flags mask(要检查的状态值) comp(为1的状态值)
可以设置的状态值有SYN ACK FIN RST URG PSH ,ALL表示所有的状态,NONE表示所有没有设定
例如:--tcp-flags ALL ALL 检查所有状态都为1
--tcp-flags ALL NONE 检查所有状态都为0
--syn
只检查SYN状态标志位为1
icmp协议的常见扩展:
icmp-type:icmp报文的类型,常见的有0和8,0代表响应报文,8代表请求报文。
常见的显式扩展如下:
iprange:指明ip范围的
--src-range
指明源地址的范围
用法:--src-range from[-to] 例如:--src-range 192.168.1.1-192.168.1.24
--dst-range
指明目标地址的范围,用法同--src-range相同
multiport:指明多端口,只能用于tcp和udp协议
--sports
指明多个源端口
例如:--sports 21,22,80,53
--dports
指明多个目标端口
--ports
指明多个端口,这些端口包括源端口和目标端口
connlimit:限定连接的并发数
--connlimit-above
同一客户端的连接并发数
--connlimit-msak
指明客户端的有掩码位数(prefix length)
limit:限制传输速率的
--limit-rate
限制传输速率的的
用法:--limit rate[/second|/minute|/hour|/day]
--limit-brust
brust是令牌桶,里面存放的是令牌的个数。简单的来说,客户端只用得带令牌才可以传输数据,此令牌数会累加
string:过滤字符串的
--algo
指明匹配字符串的加密类型 kmp和bm(根据人名命名的)
--string
指明匹配的字符串
--hex-string
匹配的字符串使用十六进制形式给出
--from
指明匹配字符串的开始处,默认是0
--to
指明匹配字符串的结束处,默认是65535
time:限定时间和日期
--datestart
起始日期,格式:YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--datestop
截止日期,格式同上
--timestart
起始时间,格式是:hh:mm[:ss]
--timestop
截止时间,格式同上
--weekdays
指定星期数:Mon, Tue, Wed, Thu, Fri, Sat,Sun 也可以使用1-7
--monthdays day
指明一个月中的特定天数,1-31都可以使用
state:指明连接的状态
--state
指明连接状态,状态有:
NEW:新建立的连接
ESTABLISHED: 已建立的连接
RELATED: 关联的连接
INVILID:表示无效的状态
recent: 阻挡大量的请求,例如可以防止DOS的攻击
在内核里面维护了地址列表,这个列表可以通过--set, --rcheck, --update and --remove四种方法来修改列表。--set, --rcheck, --update and --remove 是相互排斥的,不可同时使用。recent模块个规则有返回值(布尔值),为真会执行 -j 指定的动作。
--set
将地址添加到地址列表中,包含地址的时间戳
--name
指定地址列表的名字,默认是DEFAULT
--rsource --rdest
指明当前的规则是应用到数据包的源地址还是目标地址,默认是源地址
--rcheck
检查地址是否在地址列表中
--remove
删除地址列表中的
--update
和rcheck作用一样,但他会刷新时间戳
--hitcount
指定时间内的命中数(在地址列表中匹配的次数)
必须与-rcheck和--update同时使用
--seconds
用法:--seconds n
限制数据包里的地址记录到地址列表里的时间要小于n
layre7:从应用层来协议来控制,不过CentOS6.5的内核不支持,此时我们需要向内核打补丁,这一块会在下面详细的介绍。
一般有-j选项指定,常见的有:
DROP,ACCEPT,REJECT,DNAT,SNAT,MASQUERADE,RETRUN,MARK,LOG
DROP,ACCEPT,REJECT常用与过滤数据包
DNAT,SNAT,MASQUERADE用在地址转换的模块
DNAT常与--to-destination一起使用,指明目标地址转换的地址 SNAT常与--to-source一起使用,指明目标地址转换的地址,但有时这个地址是动态获取的,所以就要借助于MASQUERADE来动态指明要转换的地址
RETRUN:是跳转,通常用在自定义的链上,在自义链中无法匹配报文时,将其返回主链
LOG:是定义日志功能的
常见的选项有 --log-prefix (用于在日志信息中标注信息) --log-level(用于指明日志的级别)
INPUT和OUTPUT默认策略为DROP,要求:
1、限制本地主机的web服务器在周一不允许访问;新请求的速率不能超过100个每秒;web服务器包含了admin字符串的页面不允许访问;web服务器仅允许响应报文离开本机;
2、在工作时间,即周一到周五的8:30-18:00,开放本机的ftp服务给172.168.1.0 网络中的主机访问;数据下载请求的次数每分钟不得超过5个;
3、开放本机的ssh服务给192.168.1.1-192.168.1.100中主机,新请求建立的速率一分钟不得超过2个;仅允许响应报文通过其服务端口离开本机;
4、拒绝TCP标志位全部为1及全部为0的报文访问本机;
5、允许本机ping别的主机;但不开放别的主机ping本机;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<code># 设置防火墙规则机器的ip地址是192.168.1.99</code>
<code>iptables -A INPUT -p tcp --dport 80 -m </code><code>time</code> <code>! --weekdays Mon -m string \</code>
<code>--algo kmp ! --string </code><code>"admin"</code> <code>-m limit --limit 100</code><code>/second</code> <code>-j ACCEPT</code>
<code># ftp运行依赖于nf_conntrack_ftp 模块,所以需要加载此模块。</code>
<code>#在CerntOS中也可以编辑/etc/sysconfig/iptables-config配置文件中的IPTABLES_MODULES选项修改</code>
<code>iptables -A INPUT -p tcp --dport 21 -m </code><code>time</code> <code>--weekdays 1,2,3,4,5 --start-</code><code>time</code> <code>08:30 \</code>
<code>--stop-</code><code>time</code> <code>18:00 -m limit --climit-rate 5</code><code>/minute</code> <code>\</code>
<code>--modprobe=</code><code>"modprobe nf_conntrack_ftp"</code> <code>-j ACCEPT </code>
<code>iptables -A INPUT -p tcp --dport 22 -m iprange \</code>
<code>--src-range 192.168.1.1-192.168.10.100 -m limit --limit-rate 2</code><code>/minute</code> <code>-j ACCEPT</code>
<code>iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP</code>
<code>iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP</code>
<code># 把这条规则放入到INPUT链的第一条,对于已建立的连接直接放行,提高效率。</code>
<code># RELATED是相关联的状态。例如ftp的被动连接</code>
<code>iptables -I INPUT 1 -m state --state ESTABLISED,RELATED -j ACCEPT</code>
<code>iptables -A OUTPUT -s 192.168.1.99 -p icmp --icmp-</code><code>type</code> <code>8 -j ACCEPT </code>
<code>iptables -P INPUT DROP</code>
<code>iptables -P OUTPUT DROP</code>
<code># 对于各种响应报文,只要是能进入的数据包,并且是已建立或者相关联的连接都予以放行</code>
<code>iptables -I OUTPUT 1 -m state --state ESTABLISED,RELATED -j ACCEPT</code>
另一种设置的方法:(使用自定义链)
28
29
30
31
32
33
34
<code>iptables -N httpd_in</code>
<code>iptables -A httpd_in -m </code><code>time</code> <code>! --weekdays Mon -m string --algo kmp \</code>
<code> </code><code>! --string </code><code>"admin"</code> <code>-m limit --limit 100</code><code>/second</code> <code>-j ACCEPT</code>
<code>iptables -A httpd_in -j RETURN </code>
<code>iptables -N ftp_in</code>
<code>iptables -A INPUT -m </code><code>time</code> <code>--weekdays 1,2,3,4,5 --start-</code><code>time</code> <code>08:30 \</code>
<code>iptables -A ftp_in -j RETURN </code>
<code>iptables -N ssh_in</code>
<code>iptables -A ssh_in -m iprange --src-range 192.168.1.1-192.168.10.100 \</code>
<code>-m limit --limit-rate 2</code><code>/minute</code> <code>-j ACCEPT</code>
<code> </code>
<code>iptables -A INPUT -p tcp --dport 80 -d 192.168.1.99 -j httpd_in</code>
<code>iptables -A INPUT -p tcp --dport 21 -d 192.168.1.99 -j ftp_in</code>
<code>iptables -A INPUT -p tcp --dport 22 -d 192.168.1.99 -j ssh_in </code>
<code>iptables -A INPUT -d 192.168.1.99 -p icmp --icmp-</code><code>type</code> <code>8 -j DROP</code>
<code>iptables -A INPUT -p tcp --tcp-flags ALL NONE. -j DROP</code>
<code>iptables -I INPUT -m state ESTABLISHED,RELEATED -j ACCEPT</code>
情形如下:172.16.10.22通过192.168.1.99这台主机作为转发访问192.168.1.77的资源。
前提:192.168.1.99主机必须打开路由转发功能,即内核参数net.ipv4.ip_forward=1
防火墙规则如下:
<code># 设置转发策略,放行请求和响应的报文,但是每次这样转发效率就不是很高了</code>
<code>## iptables -A FORWARD -d 192.168.1.77 -p tcp --dport 80 -j ACCEPT</code>
<code>iptables -A FORWARD -s 192.168.1.77 -p tcp --sport 80 -j ACCEPT</code>
<code>iptables -P FOREARD DROP</code>
<code># 优化策略如下,实现状态匹配。但此种模式,要开启连接追踪的功能,很大程度上会消耗防火墙资源</code>
<code>iptables -I FORWARD 1 ESTABLISHED -j ACCEPT</code>
<code>iptables -A FORWARD -s 192.168.1.77 -p tcp --sport 80 -m state --state NEW -j ACCEPT</code>
NAT实现网络地址转换,早期是为了安全角度设置的,现在也可以使用节约ip资源,实现内网共享地址上网。常见的地址转换有:SNAT 源地址转换,DANT 目的地址转换,PNAT 端口转换(通常原DNAT有关),FNAT (在虚拟局域网中会用到)源地址和目标地址转换。
SNAT:在内网报文离开网络防火墙之前,做源地址转换。在外网接收到报文请求后,会先将报文发送到网络防火墙处,网络防火墙出会进行目标地址转换,转换到请求的内网主机。但是,这一步骤是由网络防火墙中自己维护的地址映射表来完成的,不需要我们参与。
<a href="http://guoting.blog.51cto.com/attachment/201408/21/8886857_14086205355U2t.jpg" target="_blank"></a>
前提:(在网络防火墙处)
有路由功能:net.ipv4.ip_forward=1
FORWARD默认策略是DROP
在网络防火墙处配置策略:
<code>iptables -I FORWARD 1 -m state --state ESTABLISHED -j ACCEPT</code>
<code>iptables -A FORWARD -s 192.168.1.77 -p tcp --dport 80 -m state \</code>
<code>--state NEW -j ACCEPT</code>
<code># 如果SNAT时,地址是不确定的,可以使用MASQUERADE</code>
<code>iptables -t nat -A POSTROUTING -s 192.168.1.77 -p tcp --sport 80 \</code>
<code>-j SNAT --to-</code><code>source</code> <code>172.16.10.16</code>
DNAT:我想访问内网中的web服务,在么办?内网地址可是不能在公网上路由。所以,此时就需要DNAT转换,直接请求172.16.10.16(在这里模拟的是公网地址),由它转换给内网主机。
<a href="http://guoting.blog.51cto.com/attachment/201408/21/8886857_1408620540vRhl.jpg" target="_blank"></a>
<code>iptables -A FORWARD -d 192.168.1.77 -p tcp --dport 80 -m state --state NEW -j ACCEPT</code>
<code># 此时还可以做端口转换PNAT,真正的web服务是192.168.1.77:8080端口上</code>
<code>iptables -t nat -A PREROUTING -d 172.16.10.16 -p tcp --dport 80 -j SNAT \</code>
<code>--to-</code><code>source</code> <code>192.168.1.77:8080</code>
限制一分钟之内同一客户端的ip访问http协议请求最多10次
<code># 设置每个IP的最大http并发请求</code>
<code>iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 10 -j DROP</code>
<code># 对于刚刚建立的请求时,记录到HTTP的地址列表中,在/proc/net/xt_recent/HTTP</code>
<code>iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m recent --</code><code>set</code> <code>--name HTTP</code>
<code># 同一源地址在一分钟之内请求到达11次时,会对它进行LOG记录</code>
<code>iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m recent --update \</code>
<code>--seconds 60 --hitcount 11 --name HHTP -j LOG --log-prefix </code><code>"HHTP Attach: "</code>
<code># 同一源地址在一分钟之内请求到达11次时,会将其拒绝</code>
<code>--seconds 60 --hitcount 11 --name SSH -j DROP</code>
layer7是可以识别应用层协议的模块,但是CentOS6.5的内核是不支持这个模块的,此时要对内核打补丁,重新编译内核。对iptables打补丁,支持layer7模块,重新编译iptables。
diff:
diff是Unix系统的一个很重要的工具程序。它用来比较两个文本文件的差异,是代码版本管理的核心工具之一。其用法非常简单:
# diff <变动前的文件> <变动后的文件>
patch:
尽管并没有指定patch和diff的关系,但通常patch都使用diff的结果来完成打补丁的工作,这和patch本身支持多种diff输出文件格式有很大关系。patch通过读入patch命令文件(可以从标准输入),对目标文件进行修改。通常先用diff命令比较新老版本,patch命令文件则采用diff的输出文件,从而保持原版本与新版本一致。
patch的标准格式为:
patch [options] [originalfile] [patchfile]
常使用的选项:
-p参数决定了是否使用读出的源文件名的前缀目录信息,不提供-p参数,则忽略所有目录信息,-p0(或者-p 0)表示使用全部的路径信息,-p1将忽略第一个"/"以前的目录,依此类推。如/usr/src/linux-2.4.15/Makefile这样的文件名,在提供-p3参数时将使用linux-2.4.15/Makefile作为所要patch的文件。
-R 相逆补丁,降级
具体步骤:
<code>#1、获取并编译内核</code>
<code>useradd</code> <code>mockbuild</code>
<code>rpm -ivh kernel-2.6.32-431.5.1.x86_64.el6.src.rpm</code>
<code>tar</code> <code>-xf rpmbuild</code><code>/SOURCES/linux-2</code><code>.6.32-431.11.2.el6.</code><code>tar</code><code>.bz2 -C </code><code>/usr/src/cd</code> <code>/usr/src</code>
<code>cd</code> <code>/usr/src/</code>
<code>ln</code> <code>-sv linux-2.6.32-431.11.2.el6 linux </code>
<code>#2、给内核打补丁</code>
<code>tar</code> <code>xf netfilter-layer7-v2.23.</code><code>tar</code><code>.bz2 -C </code><code>/usr/src</code>
<code>cd</code> <code>/usr/src/linux</code>
<code>patch -p1 < ..</code><code>/netfilter-layer7-v2</code><code>.23</code><code>/kernel-2</code><code>.6.32-layer7-2.23.patch</code>
<code>cp</code> <code>/boot/config-</code><code>* .config</code>
<code># 先确定安装 ncurses 包</code>
<code>make</code> <code>menuconfig</code>
<code>按如下步骤启用layer7模块 </code>
<code>Networking support → Networking Options →Network packet filtering framework\</code>
<code> </code><code>→ Core Netfilter Configuration</code>
<code><M> “layer7” match support</code>
<code>关闭内核签名功能:</code>
<code>Enable loadable modules support -> [ ] Module signature verification </code>
<code>Cryptographic API -> [ ] In-kernel signature checker</code>
<code>#3、编译并安装内核</code>
<code>make</code>
<code>make</code> <code>modules_install</code>
<code>make</code> <code>install</code>
<code># 4、重启系统,启用新内核</code>
<code># 1、获取iptables源码的rpm包</code>
<code>rpm -ivh </code><code>/root/iptables-1</code><code>.4.7-11.el6.src.rpm </code>
<code>tar</code> <code>xf </code><code>/root/rpmbuild/SOURCES/iptables-1</code><code>.4.7.</code><code>tar</code><code>.bz2 </code>
<code># 2、向iptables打补丁</code>
<code>cd</code> <code>/root/rpmbuild/SOURCES/iptables-1</code><code>.4.7</code>
<code>cp</code> <code>/root/netfilter-layer7-v2</code><code>.23</code><code>/iptables-1</code><code>.4.3forward-</code><code>for</code><code>-kernel-2.6.20forward/* .</code><code>/extensions/</code>
<code>rm</code> <code>-rf iptables-1.4.7.</code><code>tar</code><code>.bz2 </code>
<code>tar</code> <code>jcf iptables-1.4.7.</code><code>tar</code><code>.bz2 iptables-1.4.7/*</code>
<code># 3、修改rpm包的spec文件的下面内容</code>
<code># vim /root/rpmbuild/SPECS/iptables.spec</code>
<code>Release: 12%{?dist}</code>
<code>.</code><code>/configure</code> <code>--</code><code>enable</code><code>-devel --</code><code>enable</code><code>-libipq --bindir=</code><code>/bin</code> <code>--sbindir=</code><code>/sbin</code> <code>--sysconfdir=</code><code>/etc</code> <code>--libdir=/%{_lib} --libexecdir=/%{_lib} --mandir=%{_mandir} --includedir=</code>
<code>%{_includedir} --with-ksource=</code><code>/usr/src/linux</code>
<code># 4、重新制作rpm包</code>
<code>rpmbuild -ba </code><code>/root/rpmbuild/SPECS/iptables</code><code>.spec</code>
<code># 5、升级iptables源码包</code>
<code>rpm -Uvh </code><code>/root/rpmbuild/RPMS/x86_64/iptables-1</code><code>.4.7-12.el6.x86_64.rpm </code><code>/root/rpmbuild/RPMS/x86_64/iptables-ipv6-1</code><code>.4.7-12.el6.x86_64.rpm </code>
<code># 6、确认iptables打补丁成功,成功后会出现libxt_layer7.so的模块</code>
<code>rpm -ql iptables | </code><code>grep</code> <code>"layer"</code>
<code>/lib64/xtables/libxt_layer7</code><code>.so</code>
<code>tar</code> <code>zxvf l7-protocols-2009-05-28.</code><code>tar</code><code>.gz</code>
<code>cd</code> <code>l7-protocols-2009-05-28</code>
<code># 1、加载内核模块</code>
<code>modprobe nf_conntrack</code>
<code>modprobe xt_layer7</code>
<code># 2、修改内核参数,此参数需要装载nf_conntrack模块后方能生效。</code>
<code>net.netfilter.nf_conntrack_acct = 1</code>
至此,layer7模块就可以使用了。
用法如下:
iptables [specify table & chain] -m layer7 --l7proto [protocol name] -j [action]
例如:iptables -A FORWARD -m layer7 --l7proto qq -j REJECT # 在应用层放行qq协议的数据包
实验拓扑图:实现内网主机上网功能,但是不允许qq,xunlei协议的数据包。
<a href="http://guoting.blog.51cto.com/attachment/201408/21/8886857_1408620545Ac9U.jpg" target="_blank"></a>
FORWARD默认策略是ACCEPT
<code>iptables -A FORWARD -m layer7 --l7proto qq,xunlei -j REJECT </code>
<code>iptables -t nat -A POSTROUTING -s 192.168.1.77 -j SNAT --to-</code><code>source</code> <code>172.16.10.16</code>
RAW表只使用在PREROUTING链和OUTPUT链上,因为优先级最高,从而可以对收到的数据包在连接跟踪前进行处理。一但用户使用了RAW表,在某个链上,RAW表处理完后,将跳过NAT表和 ip_conntrack处理,即不再做地址转换和数据包的链接跟踪处理了。
RAW表可以应用在那些不需要做nat的情况下,以提高性能。如大量访问的web服务器,可以让80端口不再让iptables做数据包的链接跟踪处理,以提高用户的访问速度。
实际测试发现filter链仍然处理一些NOTRACK的包,但没有进行connect tracking,所以filter链条里必须将UNTRACKED状态的包放行
iptables的链接跟踪表最大容量为/proc/sys/net/ipv4/ip_conntrack_max,链接碰到各种状态的超时后就会从表中删除。
所以解決方法一般有两个:
(1) 加大 ip_conntrack_max 值
<code># vi /etc/sysctl.conf</code>
<code>net.ipv4.ip_conntrack_max = 393216</code>
<code>net.ipv4.netfilter.ip_conntrack_max = 393216</code>
(2): 降低 ip_conntrack timeout时间
<code>#vi /etc/sysctl.conf</code>
<code>net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 300</code>
<code>net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120</code>
<code>net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60</code>
<code>net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120</code>
至此,iptables的基础配置介绍完毕。
本文转自 羊木狼 51CTO博客,原文链接:http://blog.51cto.com/guoting/1543295,如需转载请自行联系原作者