Iptables防火墙
一、iptables
1.1 企业中安全服务配置情况:
- SELinux:生产中也是关闭状态
- iptables:生产环境中看情况
1.2 企业中安全优化原则:
- 尽可能的不给服务器配置外网IP
- 并发不大的情况下有外网IP,可以开启防火墙服务
- 大并发的情况下,不能开iptables,影响性能,利用硬件防火墙提升架构安全性
1.3 iptables防火墙简介
http://www.netfilter.org/projects/iptables/index.html
netfilter是内核中的一个安全模块,iptables是控制这个模块的软件。
netfilter 组件也称为内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。
iptables 组件是一种工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。除非正在使用 Red Hat Linux 7.1 或更高版本,否则需要下载该工具并安装使用它。
iptables是Unix/Linux自带的一款优秀且开放源代码的完全自由的基于包过滤的防火墙工具,它的功能十分强大,使用非常灵活,可以对流入和流出服务器的数据包进行很精细的控制,特别是它可以在一台非常低的配置服务器上跑的非常好,iptables+zebra+squid。
iptables主要工作在OSI七层的二、三、四层,如果重新编译内核,iptables也可以支持7层控制(squid代理+iptables)
1.4 iptables名词
1.4.1 容器
容器用来包装或装载物品的贮存器(如箱、罐、坛)或者成形或柔软不成形的包覆材料。
能够将其他控件放置在其上面的控件。
1.4.2 Netfilter
Netfilter是Linux 2.4.x引入的一个子系统,它作为一个通用的、抽象的框架,提供一整套的hook函数的管理机制,使得诸如数据包过滤、网络地址转换(NAT)和基于协议类型的连接跟踪成为了可能。
netfilter的架构就是在整个网络流程的若干位置放置了一些检测点(HOOK),而在每个检测点上登记了一些处理函数进行处理。
1.4.3 表(tables)
表是链的容器,即所有的链(chains)都属于其对应的表(tables)。
1.4.4 链(chains)
链是规则(policys)的容器。
1.4.5 规则(policy)
规则(policy)就是iptables一系列过滤信息的规范和具体方法条款了。
1.5 iptables工作原理
小结:
-
防火墙是层层过滤的,实际是按照配置规则的顺序从上到下,从前到后进行过滤的。
-
如果匹配上规则,即明确表示是阻止还是通过,数据包就不再向下匹配新的规则。
-
如果规则中没有明确表明是阻止还是通过,也没有匹配规则,向下进行匹配,直到匹配默认规则得到明确的行为是阻止还是通过。
-
防火墙的默认规则是所有规则执行完后才执行的。
1.6 iptables表(table)和链(chain)
iptables中表和链的对应关系:
INPUT | FORWARD | PREROUTING | OUTPUT | POSTROUTING | |
---|---|---|---|---|---|
filter | ![]() |
![]() |
![]() |
![]() |
![]() |
NAT | ![]() |
![]() |
![]() |
![]() |
![]() |
mangle | ![]() |
![]() |
![]() |
![]() |
![]() |
raw | ![]() |
![]() |
![]() |
![]() |
![]() |
1.6.1 filter表
filter表 | 强调:主要和主机自身相关,真正负责主机防火墙功能的(过滤流入流出主机的数据包) filter表是iptables默认使用的表,定义了三个链 企业工作场景:主机防火墙 |
---|---|
INPUT | 负责过滤所有目标地址是本机地址的数据包 |
FORWARD | 负责转发流经主机的数据包。起转发作用,和NAT关系很大。 LVS NAT模式:net.ipv4.ip_forward=0 |
OUTPUT | 处理所有源地址是本机地址的数据包 |
对于filter表的控制是我们实现本机防火墙功能的重要手段,特别是针对INPUT链的控制
1.6.2 NAT表
NAT表 | 负责网络地址转换的,即来源和目的ip地址的port的转换 应用:和主机本身无关,一般用于局域网共享上网或者特殊的端口转换服务相关。 工作场景: 1. 用于企业路由(zebra)或网关(iptables),共享上网(POSTROUTING) 2. 做内部外部IP地址一对一映射(dmz),硬件防火墙映射IP到内部服务器,FTP服务(PREROUTING) 3. WEB,单个端口的映射,直接映射端口80端口(PREROUTING) |
---|---|
OUTPUT | 和主机放出去的数据包有关,改变主机发出数据包的目的地址 |
PREROUTING | 在数据包到达防火墙时,进行路由判断之前执行的规则,作用是改变数据包的目的地址,目的端口等。 |
POSTROUTING | 在数据包离开防火墙时进行路由判断之后执行的规则,作用改变数据包的源地址,源端口等。 |
1.6.3 mangle表
mangle表 | 主要负责修改数据包中特殊的路由标记,例如TTL,TOS,MARK等。 |
---|---|
由于这个表与特殊标记相关,一般情况下,用不到这个mangle表。
1.6.4 raw表
优限级最高,设置raw时一般是为了不再让iptables做数据包的链接跟踪处理,提高性能。
RAW 表只使用在PREROUTING链和OUTPUT链上,因为优先级最高,从而可以对收到的数据包在连接跟踪前进行处理。一但用户使用了RAW表,在某个链 上,RAW表处理完后,将跳过NAT表和 ip_conntrack处理,即不再做地址转换和数据包的链接跟踪处理了.
RAW表可以应用在那些不需要做nat的情况下,以提高性能。如大量访问的web服务器,可以让80端口不再让iptables做数据包的链接跟踪处理,以提高用户的访问速度。
1.7 iptables工作流程
基础步骤:
-
数据包到达网络接口,例如eth0
-
进入raw表的PREROUTING链,这个链的作用是赶在连接跟踪之前处理数据包
-
如果进行了连接跟踪,在此处理
-
进入mangle表的PREROUTING链,在此可以修改数据包,比如TOS等
-
进入nat表的PREROUTING链,可以在此做DNAT,但不要做过滤
-
决定路由,看是交给本地主机还是转发给其它主机。
到了这里我们就得分两种不同的情况进行讨论了,一种情况就是数据包要转发给其它主机,这时候它会依次经过:
-
进入 mangle 表的 FORWARD 链,这里也比较特殊,这是在第一次路由决定之后,在进行最后的路由决定之前,我们仍然可以对数据包进行某些修改。
-
进入 filter 表的 FORWARD 链,在这里我们可以对所有转发的数据包进行过滤。需要注意的是:经过这里的数据包是转发的,方向是双向的。
-
进入 mangle 表的 POSTROUTING 链,到这里已经做完了所有的路由决定,但数据包仍然在本地主机,我们还可以进行某些修改。
-
进入 nat 表的 POSTROUTING 链,在这里一般都是用来做 SNAT ,不要在这里进行过滤。
-
进入出去的网络接口,完毕。
另一种情况是,数据包就是发给本地主机的,那么它会依次穿过:
-
进入 mangle 表的 INPUT 链,这里是在路由之后,交由本地主机之前,我们也可以进行一些相应的修改。
-
进入 filter 表的 INPUT 链,在这里我们可以对流入的所有数据包进行过滤,无论它来自哪个网络接口。
-
交给本地主机的应用程序进行处理。
-
处理完毕后进行路由决定,看该往那里发出。
-
进入 raw 表的 OUTPUT 链,这里是在连接跟踪处理本地的数据包之前。
-
连接跟踪对本地的数据包进行处理。
-
进入 mangle 表的 OUTPUT 链,在这里我们可以修改数据包,但不要做过滤。
-
进入 nat 表的 OUTPUT 链,可以对防火墙自己发出的数据做 NAT 。
-
再次进行路由决定。
-
进入 filter 表的 OUTPUT 链,可以对本地出去的数据包进行过滤。
-
进入 mangle 表的 POSTROUTING 链,同上一种情况的第9步。注意,这里不光对经过防火墙的数据包进行处理,还对防火墙自己产生的数据包进行处理。
-
进入 nat 表的 POSTROUTING 链,同上一种情况的第10步。
-
进入出去的网络接口,完毕。
1.8 iptables命令
说明:
问题1:iptables启动不了
解决方法:setup进入Firewall设置enable
问题2:setup进不去Firewall
解决方法:
1.设置字符集
2.启动总线进程:dbus-daemon system
1.8.1 iptables语法格式
iptables [-t table] {-A|-C|-D} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
1.8.2 iptables参数选项
参数选项 | 说明 |
---|---|
表 | |
-t | 对指定的表 table 进行操作,如果不指定此选项,默认的是 filter 表 |
显示信息 | |
-h | 显示帮助信息 |
-L | 显示所选链的所有规则。如果没有选择链,所有链将被显示。 |
-V | 显示iptables版本信息 |
-v | 详细输出。这个选项让-L参数显示接口地址、规则选项(如果有)和TOS (Type of Service)掩码。包和字节计数器也将被显示,分别用K、M、G (前缀)表示1000、1,000,000和1,000,000,000倍(不过请参看-x标志改变它), 对于添加,插入,删除和替换命令,这会使一个或多个规则的相关详细信息被打印。 |
-n | 数字输出。IP地址和端口会以数字的形式打印。默认情况下,程序试显 示主机名、网络名或者服务(只要可用)。 |
-x | 扩展数字。显示包和字节计数器的精确值,代替用K,M,G表示的约数。 这个选项仅能用于 -L 命令。 |
--line-numbers | 当列表显示规则时,在每个规则的前面加上行号,与该规则在链中的位置相对应。 |
清除规则 | |
-F | 清空指定链上面的所有规则。如果没有指定链,清空该表上所有链的所有规则。 |
-X | 删除指定的链,这个链必须没有被其它任何规则引用,而且这条上必须没有任何规则。如果没有指定链名,则会删除该表中所有非内置的链。 |
-Z | 把指定链,或者表中的所有链上的所有计数器清零。 |
-D | 在指定的链中删除一个或多个指定规则。 可以把被删除规则指定为链中的序号(第一条序号为1),或者指定为要匹配的规则。 |
规则管理 | |
-A | 在所选择的链末添加一条或更多规则。当源(地址)或者/与 目的(地址)转换 为多于一个(多个)地址时,这条规则会加到所有可能的地址(组合)后面。 |
-I | 在链中的指定位置插入一条或多条规则。如果指定的规则号是1,则在链的头部插入。这也是默认的情况,如果没有指定规则号。 |
-R | Replays替换/修改第几条规则;从选中的链中取代一条规则。 |
-P | 定义规则链中的默认目标。 |
规则参数 | |
-p | 规则或者包检查(待检查包)的协议。指定协议可以是tcp、udp、icmp中的一个或 者全部,也可以是数值,代表这些协议中的某一个。当然也可以使用在/etc/pro tocols中定义的协议名。在协议名前加上"!"表示相反的规则。数字0相当于所有 all |
-s | 指定源地址,可以是主机名、网络名和清楚的IP地址。mask说明可以是网络掩码或清楚的数字。在参数加上"!"说明指定了相反的地址段。 |
-d | 指定目标地址,地址格式同上。在参数加上"!"说明指定了相反的地址段。 |
-j | 指定规则的目标;也就是说,如果包匹配应当做什么。即满足某条件时该执行什么样的动作。比如 ACCEPT|DROP|REJECT,推荐DROP。 |
-sport | 源端口或端口范围指定。 |
-dport | 目标端口或端口范围指定。 |
-i | 指定数据包接收的网络接口,比如最常见的 eth0 。注意:它只对 INPUT,FORWARD,PREROUTING 这三个链起作用。如果没有指定此选项, 说明可以来自任何一个网络接口。当在参数前使用"!"说明后,指的是相反的名称。 |
-o | 指定数据包出去的网络接口。只对 OUTPUT,FORWARD,POSTROUTING 三个链起作用。当在参数前使用"!"说明 后,指的是相反的名称。 |
-m | 匹配iptables的扩展模块,指定数据包规则所使用的过滤模块,常见的有state、mac、limit |
模块参数 | |
--state | 允许访问包的连接跟踪状态 INVALID:表示包是未知连接,无效的封包,例如数据破损的封包状态; ESTABLISHED:已经联接成功的联接状态; NEW:表示包为新的连接,否则是非双向传送的 RELATED:表示这个封包是与我们主机发送出去的封包有关,如FTP数据传送 |
--limit | 最大平均匹配速率:可赋的值有'/second', '/minute', '/hour', or '/day'这样的单位,默认是3/hour。 |
--limit-burst | 待匹配包初始个数的最大值:若前面指定的极限还没达到这个数值,则该数字加1.默认值为5 刚开始时,通行证的数量是有限的,但每隔一段时间就有新的通行证可用。limit match有两个参数就对应这种情况,--limit-burst指定刚开始时有多少通行证可用,--limit指定要隔多长时间才能签发一个新的通行证。 |
multiport | 可用于匹配非连续或连续端口;最多指定15个端口; |
iprange | ip范围匹配模块,匹配一段连续的地址而非整个网络时有用 |
mac | Mac地址匹配模块 |
string | 字符串匹配,能够检测报文应用层中的字符串, 字符匹配检查高效算法:kmp, bm 能够屏蔽非法字符 |
connlimit | 连接数限制,对每IP所能够发起并发连接数做限制 |
1.8.3 模块说明
- multiport:多端口匹配
可用于匹配非连续或连续端口,最多指定15个端口。
实例:
iptables -A INPUT -p tcp -m multiport --dport 22,80 -j ACCEPT
- iprange:匹配指定范围内的地址
匹配一段连续的地址而非整个网络时可用。
实例:
iptables -A INPUT -p tcp -m iprange --src-range 10.0.0.0-10.0.0.100 --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp -m iprange --dst-range 10.0.0.20-10.0.0.50 --sport 22 -j ACCEPT
- string:字符串匹配
能够检测报文应用层中的字符串;字符匹配检查高效算法:kmp、bm
能够屏蔽非法字符
实例:
# 注意该条规则需要添加到OUTPUT链,当服务端返回数据报文检查到有关键字"sex"时,则丢弃该报文,可用于web敏感词过滤
iptables -A OUTPUT -p tcp --dport 80 -m string --algo kmp --string "sex" -j DROP
- connlimit:连接数限制
对每个IP所能够发起并发连接数做限制
iptables -A INPUT -p tcp --dport 22 -m connlimit ! --connlimit-above 3 -j ACCEPT
- limit:速率限制
limit-burst: 设置默认阀值
iptables -A INPUT -p icmp -m limit --limit 10/minute --limit-burst 10 -j ACCEPT
- state:状态检查
连接追踪中的状态:
NEW: 新建立一个会话
ESTABLISHED:已建立的连接
RELATED: 有关联关系的连接
INVALID: 无法识别的连接
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT
1.8.4 内核模块扩展
[root@web01 ~]# lsmod | egrep "ipt|filter|nat"
ipt_REJECT 2383 2
iptable_filter 2793 1
ip_tables 17895 1 iptable_filter
lsmod命令 | 适用:列出已加载的系统模块,以友好的方式显示/proc/modules内容 |
---|---|
格式 | 第一列:module表示模块的名称 |
第二列:size表示模块的大小,以字节为单位 | |
第三列:used表示依赖模块的个数 | |
第四列:by表示依赖模块的内容 | |
实例 | lsmod:列出所有载入系统的模块 |
lsmod | grep -i ext3:查询当前系统是否加载某些模块 | |
备注 | 通过lsmod来查看当前系统中已经加载的模块 |
通过modprobe加载模块 | |
通过rmmod卸载已加载的模块 |
加载的内核模块说明:
模块 | 说明 |
---|---|
ip_tables | 防火墙的核心模块,负责维护防火墙的规则表,通过这些规则,实现防火墙的核心功能。主要有三种功能:包过滤(filter)、NAT以及包处理(mangle) |
iptable_filter | 防火墙数据包过滤模块,实现对数据包的过滤与放行功能 |
iptable_nat | 防火墙数据包转发模块,用于对数据包进行修改,从而实现数据转发的目的 |
ip_conntrack | 主要用于修改应用层协议控制包,最重要的是实现NAT |
ip_conntrack_ftp | 与ftp服务NAT映射相关的模块 |
ip_nat_ftp | 与ftp服务nat映射相关的模块 |
ipt_state | 防火墙状态信息模块,在新版CentOS6中已经忽略此模块的加载 |
1.8.5 实例
1、ICMP
利用防火墙控制ICMP协议要注意ICMP的类型
主要的类型有:
- 0:回显应答(Ping应答)
- 8:回显请求(Ping请求)
实例:
禁止ping
iptables -A INPUT -i eth0 -s 10.0.0.0/24 -p icmp -j DROP
允许ping
iptables -I INPUT -i eth0 -s 10.0.0.0/24 -p icmp --icmp-type 8 -j ACCEPT
2、SSH
禁止22端口
iptables -A INPUT -i eth0 -s 10.0.0.0/24 -p tcp --dport 22 -j DROP
实例扩展:恢复因防火墙配置而断掉的SSH连接
(1)去机房重启系统或登录服务器删除刚才的禁止规则
(2)让机房人员重启服务器或者让机房人员去登录进去操作
(3)通过服务器的远程管理卡管理(推荐)
(4)写一个定时任务,每5分钟就关闭防火墙
(5)在测试环境测试好,然后在写成脚本批量执行
3、匹配端口
禁止80端口
iptables -A INPUT -p tcp --dport 80 -j DROP
禁止500-600端口范围
iptables -A INPUT -p tcp --dport 500:600 -j DROP
禁止不连续的端口
iptables -A INPUT -p tcp -m multiport --dport 90,96 -j DROP
1.8.6 ICMP扩展
ICMP的类型
TYPE | CODE | Description | Query | Error |
---|---|---|---|---|
0 | 0 | Echo Reply——回显应答(Ping应答) | x | |
3 | 0 | Network Unreachable——网络不可达 | x | |
3 | 1 | Host Unreachable——主机不可达 | x | |
3 | 2 | Protocol Unreachable——协议不可达 | x | |
3 | 3 | Port Unreachable——端口不可达 | x | |
3 | 4 | Fragmentation needed but no frag. bit set——需要进行分片但设置不分片比特 | x | |
3 | 5 | Source routing failed——源站选路失败 | x | |
3 | 6 | Destination network unknown——目的网络未知 | x | |
3 | 7 | Destination host unknown——目的主机未知 | x | |
3 | 8 | Source host isolated (obsolete)——源主机被隔离(作废不用) | x | |
3 | 9 | Destination network administratively prohibited——目的网络被强制禁止 | x | |
3 | 10 | Destination host administratively prohibited——目的主机被强制禁止 | x | |
3 | 11 | Network unreachable for TOS——由于服务类型TOS,网络不可达 | x | |
3 | 12 | Host unreachable for TOS——由于服务类型TOS,主机不可达 | x | |
3 | 13 | Communication administratively prohibited by filtering——由于过滤,通信被强制禁止 | x | |
3 | 14 | Host precedence violation——主机越权 | x | |
3 | 15 | Precedence cutoff in effect——优先中止生效 | x | |
4 | 0 | Source quench——源端被关闭(基本流控制) | ||
5 | 0 | Redirect for network——对网络重定向 | ||
5 | 1 | Redirect for host——对主机重定向 | ||
5 | 2 | Redirect for TOS and network——对服务类型和网络重定向 | ||
5 | 3 | Redirect for TOS and host——对服务类型和主机重定向 | ||
8 | 0 | Echo request——回显请求(Ping请求) | x | |
9 | 0 | Router advertisement——路由器通告 | ||
10 | 0 | Route solicitation——路由器请求 | ||
11 | 0 | TTL equals 0 during transit——传输期间生存时间为0 | x | |
11 | 1 | TTL equals 0 during reassembly——在数据报组装期间生存时间为0 | x | |
12 | 0 | IP header bad (catchall error)——坏的IP首部(包括各种差错) | x | |
12 | 1 | Required options missing——缺少必需的选项 | x | |
13 | 0 | Timestamp request (obsolete)——时间戳请求(作废不用) | x | |
14 | Timestamp reply (obsolete)——时间戳应答(作废不用) | x | ||
15 | 0 | Information request (obsolete)——信息请求(作废不用) | x | |
16 | 0 | Information reply (obsolete)——信息应答(作废不用) | x | |
17 | 0 | Address mask request——地址掩码请求 | x | |
18 | 0 | Address mask reply——地址掩码应答 |
1.8.7 默认规则
-
如果默认规则为拒绝,那么可以认为是一个白名单(更安全)
-
如果默认规则为运行,那么可以认为是一个黑名单
配置防火墙之前需要清除:
iptables -F
iptables -X
iptables -Z
然后配置ssh的允许规则:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
修改默认规则:
iptables -P INPUT DROP
iptables -P FORWARD DROP
配置环回接口(用来做测试使用):
iptables -A INPUT -i lo -j ACCEPT
配置样例:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -s 10.0.0.0/24 -j ACCEPT
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -nL
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dport 80,443 -j ACCEPT
iptables -A INPUT -p icmp -s 10.0.0.0/24 -m icmp --icmp-type any -j ACCEPT
iptables -A INPUT -s 172.16.1.0/24 -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
保存:
/etc/init.d/iptables save
或
iptables-save > /etc/sysconfig/iptables
iptables的配置文件:
[root@web01 ~]# vim /etc/sysconfig/iptables
# Generated by iptables-save v1.4.7 on Tue Dec 5 15:22:33 2017
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [201:20612]
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -s 10.0.0.0/24 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
-A INPUT -s 10.0.0.0/24 -p icmp -m icmp --icmp-type any -j ACCEPT
-A INPUT -s 172.16.1.0/24 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
COMMIT
# Completed on Tue Dec 5 15:22:33 2017
注意:在配置文件中设置后需要重启。
脚本样例:
#!/bin/bash
#this is a server firewall created by oldboy 17:03 2006-7-26
#updated by oldboy on 10:30 2009-6-23
#http://blog.etiantian.org
#qq:49000448
#define variable PATH
IPT=/sbin/iptables
#Remove any existing rules
$IPT -F
$IPT -X
$IPT -Z
#setting default firewall policy
$IPT --policy OUTPUT ACCEPT
$IPT --policy FORWARD DROP
$IPT -P INPUT DROP
#setting for loopback interface
$IPT -A INPUT -i lo -j ACCEPT
#setting access rules
#one,ip access rules,allow all the ips of
$IPT -A INPUT -s 202.81.17.0/24 -p all -j ACCEPT
$IPT -A INPUT -s 202.81.18.0/24 -p all -j ACCEPT
$IPT -A INPUT -s 124.43.62.96/27 -p all -j ACCEPT
$IPT -A INPUT -s 192.168.1.0/24 -p all -j ACCEPT
$IPT -A INPUT -s 10.0.0.0/24 -p all -j ACCEPT
#icmp
$IPT -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT
#others RELATED
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
1.9 iptables之NAT技术
1.9.1 NAT映射
配置内网主机指定网关(网关为防火墙所在主机):
route add default gw 172.16.1.8
开启防火墙主机的路由转发功能
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p
设置iptables的nat表
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j SNAT --to-source 10.0.0.8
局域网共享的2种方法:
方法1:适合于有固定外网地址的:
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j SNAT --to-source 10.0.0.8
(1)-s 172.16.1.0/24 办公室或IDC内网网段。
(2)-o eth0 为网关的外网卡接口。
(3)-j SNAT --to-source 10.0.0.8 是网关外网卡IP地址。
方法2:适合变化外网地址(拨号)
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j MASQUERADE
1.9.2 地址映射
源地址映射:SNAT
目标地址映射:DNAT
SNAT源地址映射需要在外网口上配置,否则在接收回复时会出现目标地址不同意丢弃的动作。
DNAT目标地址映射需配置在外网网卡上,否则会出现和SNAT一样的错误。
IP一对一映射
辅助IP:
ip addr add 10.0.0.81/24 dev eth0 label eth0:0 #<==辅助IP
iptables -t nat -I PREROUTING -d 10.0.0.81 -j DNAT --to-destination 172.16.1.51
iptables -t nat -I POSTROUTING -s 172.16.1.51 -o eth0 -j SNAT --to-source 10.0.0.81
1.9.3 优化
调整内核参数文件/etc/sysctl.conf
------------解决time-wait过多-------------
net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_max_tw_buckets = 36000
----------------------------------
net.ipv4.ip_local_port_range = 4000 65000
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
1.9.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,链接碰到各种状态的超时后就会从表中删除。
/proc/net/nf_conntrack文件就是链接跟踪表
可以使用yum install -y iptstate进行命令行查看。
最大值:
[root@web01 ~]# cat /proc/sys/net/nf_conntrack_max
15184
超过最大值会出错,提示表满了,接下来的请求会被DROP
dmesg里面显示 ip_conntrack: table full, dropping packet.的错误提示
iptables优化:
net.nf_conntrack_max = 25000000
net.netfilter.nf_conntrack_max = 25000000
net.netfilter.nf_conntrack_tcp_timeout_established = 180
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
还有一个方法,raw表是不记录数据包的链接跟踪处理的,所以可以设置raw表来进行处理。
例如:
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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下