

统一声明:
1.本站联系方式QQ:709466365 TG:@UXWNET 官方TG频道:@UXW_NET 如果有其他人通过本站链接联系您导致被骗,本站一律不负责! 2.需要付费搭建请联系站长QQ:709466365 TG:@UXWNET 3.免实名域名注册购买- 游侠云域名 4.免实名国外服务器购买- 游侠网云服务
其实这种问题,用Iptables的自定义链表就能轻松解决。就像我们整理电脑文件时会建不同文件夹分类存放,自定义链表就是给防火墙规则建“文件夹”,把SSH访问、Web防护、日志审计这些功能的规则分开管理,不仅好找还好改。今天我就把这套方法掰开揉碎了讲给你,从怎么创建链表,到怎么把规则分类放进去,再到不同服务器场景怎么配置,都是我自己实操过的笨办法,就算你刚接触Iptables,跟着做也能把服务器防火墙打理得明明白白。
从规则混乱到模块化管理:自定义链表的核心价值与创建步骤
你可能会说:“Iptables默认不是有INPUT、OUTPUT这些链吗?直接往里面加规则不就行了?” 这话没错,但用久了你就会发现问题——默认链就像电脑桌面上的“我的文档”,所有文件都往里扔,刚开始还行,文件多了就乱。比如你想给Web服务加一条允许80端口的规则,又想给数据库加一条只允许内网访问3306端口的规则,还想给SSH加个IP白名单,这些规则全堆在INPUT链里,时间一长,别说管理了,光看着就头大。更麻烦的是,规则是按顺序执行的,前面的规则可能会影响后面的,有时候你新加一条规则不生效,查半天发现是被前面的规则挡住了。
自定义链表就不一样了,它允许你创建自己的“规则文件夹”。比如你可以建一个叫“WEB_RULES”的链表专门放Web服务相关规则,一个“DB_RULES”放数据库规则,一个“LOG_RULES”放日志记录规则。这样一来,你想改Web规则就直接操作WEB_RULES,不用担心动到数据库的规则;排查问题时,哪个功能出问题就查对应的链,效率至少能提高一半。我那个电商朋友的服务器,用自定义链表后,规则从30多行拆成了4个链,后来他自己维护时,加规则、删规则再也没出过岔子。
手把手教你创建自定义链表:从“建文件夹”到“放文件”
创建自定义链表其实很简单,就像在电脑上新建文件夹再放文件,分四步就能搞定:
第一步,创建链表。用iptables -N 链名
命令,比如想建一个Web防护链,就输iptables -N WEB_RULES
。这里要注意,链名最好见名知意,别用“chain1”“chain2”这种以后自己都记不住的名字。我之前帮人配置时见过有人用“aaa”“bbb”当链名,三个月后他自己都忘了哪个链是干嘛的,还得一条条规则看,纯属给自己挖坑。
第二步,往链里加规则。比如Web服务需要允许80和443端口,就用iptables -A WEB_RULES -p tcp dport 80 -j ACCEPT
和iptables -A WEB_RULES -p tcp dport 443 -j ACCEPT
。这里的-A
是“追加”的意思,规则会按添加顺序执行,所以重要的规则(比如拒绝恶意IP)要放在前面。我之前给一个博客服务器配置时,先加了允许80端口的规则,后来才加拦截恶意爬虫的规则,结果爬虫还是能进来——因为规则是按顺序执行的,允许规则先生效了,后面的拦截规则就白加了。后来把拦截规则换到前面,问题才解决。
第三步,把自定义链关联到主链。你建了“文件夹”,还得告诉系统去哪里找它,否则规则不会生效。比如Web规则是处理入站流量的,就需要关联到INPUT主链,用iptables -A INPUT -j WEB_RULES
命令。这里要注意,关联的位置很重要——如果你的INPUT链已经有其他规则, 把自定义链放在最前面,避免被其他规则挡住。我第一次创建自定义链时就犯过傻,把关联命令加在了INPUT链的最后面,结果前面有一条“拒绝所有”的规则,自定义链根本没机会执行,折腾半天才发现是顺序错了。
第四步,设置规则优先级和保存。规则添加完后,用iptables -L WEB_RULES line-numbers
可以查看链内规则的序号,用iptables -D WEB_RULES 序号
删除不需要的规则,用iptables -I WEB_RULES 序号 规则内容
插入新规则到指定位置。最后一定要用service iptables save
(CentOS系统)或iptables-save > /etc/iptables/rules.v4
(Debian/Ubuntu系统)保存规则,否则服务器重启后规则就没了——我见过太多人辛辛苦苦配好规则,结果重启服务器后全丢了,就是因为忘了这一步。
可能你会问,这么折腾有必要吗?我之前也觉得麻烦,直到有一次维护一台跑了三年的服务器,那台服务器用默认链堆了120多条规则,想禁用FTP服务的规则,找了20分钟才找到对应的两条规则,删的时候还不小心删错了旁边的SSH规则,导致远程连接中断,最后只能去机房接显示器改,来回跑了两小时。要是当时用了自定义链表,直接iptables -F FTP_RULES
清空FTP链就行,哪用这么费劲。
实战场景落地:从Web服务到数据库服务器的安全防护配置
学会了基础操作,接下来咱们看几个实际场景怎么配置。不同服务器的防护需求不一样,比如Web服务器要开放80/443端口,数据库服务器则要严格限制访问来源,用自定义链表就能精准适配这些场景。
Web服务器防护:精准放行端口+拦截恶意流量
假设你有一台Web服务器,需要允许正常用户访问80/443端口,同时拦截恶意爬虫和异常请求。用自定义链表可以这么配:
先创建Web规则链和日志链:
iptables -N WEB_RULES # Web主规则链 iptables -N WEB_LOG # Web日志链(记录访问和拦截日志)
然后往WEB_RULES里加核心规则:
# 拦截恶意User-Agent(比如常见的扫描工具) iptables -A WEB_RULES -p tcp dport 80 -m string string "Masscan" algo bm -j WEB_LOG
iptables -A WEB_RULES -p tcp dport 80 -m string string "Masscan" algo bm -j DROP
允许正常80/443端口访问
iptables -A WEB_RULES -p tcp dport 80 -j ACCEPT
iptables -A WEB_RULES -p tcp dport 443 -j ACCEPT
接着配置WEB_LOG链记录日志(日志会存到/var/log/messages):
iptables -A WEB_LOG -j LOG log-prefix "Web Attack: " log-level 6 iptables -A WEB_LOG -j RETURN # 记录完日志返回主链继续处理
最后关联到INPUT主链:
iptables -A INPUT -p tcp -m multiport dports 80,443 -j WEB_RULES
这么配置后,所有访问80/443端口的流量会先经过WEB_RULES处理,恶意流量被拦截并记录日志,正常流量放行。我用这个配置维护过一个博客服务器,之前每天被扫描几百次,加了规则后日志里能清晰看到拦截记录,服务器负载直接降了20%。
数据库服务器防护:内网白名单+连接频率限制
数据库服务器比Web服务器更敏感,最好只允许内网IP访问,还得限制连接频率防止暴力破解。用自定义链表可以这么做:
创建数据库规则链:
iptables -N DB_RULES
添加规则(假设数据库端口是3306,内网网段是192.168.1.0/24):
# 只允许内网IP访问3306端口 iptables -A DB_RULES -s 192.168.1.0/24 -p tcp dport 3306 -j ACCEPT
限制单IP每分钟最多10个连接(防止暴力破解)
iptables -A DB_RULES -p tcp dport 3306 -m limit limit 10/min limit-burst 5 -j LOG log-prefix "DB Connection Limit: "
iptables -A DB_RULES -p tcp dport 3306 -m limit limit 10/min limit-burst 5 -j DROP
关联到INPUT链:
iptables -A INPUT -p tcp dport 3306 -j DB_RULES
这里的“limit”模块就是限制连接频率的关键,limit 10/min
表示每分钟最多10个连接,limit-burst 5
表示允许突发5个连接后再限速。我之前帮一个公司配置MySQL服务器时,没加这个限制,结果被人用脚本暴力猜解密码,数据库连接数经常满了,加了限制后这种情况再也没发生过。
规则监控与优化:让防护更高效
配好规则不是结束,还得定期监控和优化。你可以用iptables -L -n -v line-numbers
查看每条规则的命中次数(pkts列),比如发现某条允许规则的命中次数是0,说明这条规则没用,可以删掉;如果某条拦截规则命中次数很高,说明服务器正在被攻击,可以考虑加强防护。
我习惯每周做一次规则审计,用下面这个脚本导出规则和命中次数(保存为check_iptables.sh):
#!/bin/bash echo "=== Iptables规则命中统计 ==="
iptables -L -n -v line-numbers | grep -v "0 0" # 只显示有命中的规则
执行后就能看到哪些规则在实际生效,哪些是冗余的。比如有一次我发现一条允许21端口的规则命中次数为0,一问才知道服务器早就不用FTP了,赶紧删了这条规则——少一条规则,服务器就少一分风险。
如果你觉得Iptables的日志不够详细,可以装xtables-addons
扩展模块,用u32
模块匹配更复杂的流量特征,或者用tee
模块把日志同时发给多个目标。Linux官方文档里有详细的模块说明(https://man7.org/linux/man-pages/man8/iptables-extensions.8.htmlnofollow),你可以根据需要研究下。
最后再提醒一句,刚开始用自定义链表可能会觉得麻烦,但用熟了你会发现,服务器防火墙管理变得像整理文件一样简单。你可以先在测试服务器上练手,比如建一个测试链,把SSH规则放进去试试,看看能不能正常登录。如果遇到规则不生效,别慌,先检查自定义链有没有关联到主链,规则顺序对不对,用iptables -L
仔细看看每条规则的位置。
要是你按这些方法试了,欢迎回来告诉我效果——比如规则管理时间有没有缩短,服务器安全事件有没有减少。毕竟安全这事儿,多交流才能少踩坑嘛!
你在自定义链表里面加规则的时候,它可不是随便乱执行的,是严格按照你添加的顺序来的——你用-A
命令先加的规则,就会先被执行,后面加的规则得等前面的“判断完”才能轮到。就像排队过安检,排在前面的人先检查,后面的人得等着。比如你先给WEB_RULES链加了一条“拦截IP 1.2.3.4”的规则,又加了一条“允许80端口”的规则,那流量过来的时候,会先看是不是1.2.3.4的,是的话直接拦截,根本不会再去看80端口的规则;如果不是,才会继续检查后面的允许规则。
想调整规则顺序也不难,先得知道现在每条规则排第几。你可以用iptables -L 自定义链名 line-numbers
这个命令,比如iptables -L WEB_RULES line-numbers
,它会把链里的规则一条条列出来,每条前面都带着序号,1、2、3清清楚楚。要是你想在第2条规则前面插一条新的,就用-I
命令(I是Insert的意思,插入),比如iptables -I WEB_RULES 2 -p tcp dport 443 -j ACCEPT
,这条规则就会变成第2条,原来的第2条及后面的规则会自动往后“挪位置”。要是某条规则写错了或者没用了,直接用-D
命令(Delete,删除)加序号删掉,比如iptables -D WEB_RULES 3
就是删掉第3条规则。
这里有个小技巧你得记着:规则顺序直接影响服务器效率。你想啊,要是把一条很少用到的规则放在最前面,那大部分流量都得“路过”它才能到后面的常用规则,服务器就得多做很多无用功。所以我平时配置的时候,都会把那些“热门”规则——比如拦截频繁攻击的IP、允许80/443这些常用端口的规则——放在最前面,让流量能尽快被处理,服务器也能跑得更轻快些。之前我给一个论坛服务器调规则顺序,把“拦截爬虫IP”的规则从第5位挪到第2位,服务器CPU占用直接降了15%,就是这个道理。
自定义链表和Iptables默认链(INPUT/OUTPUT等)有什么区别?
Iptables默认链(如INPUT、OUTPUT、FORWARD)是系统预设的“基础容器”,所有入站、出站、转发流量会默认流经这些链。但默认链缺乏分类机制,规则直接堆砌易导致混乱,且修改时可能影响其他功能。自定义链表则是用户创建的“规则分类文件夹”,可按功能(如Web防护、数据库访问)独立管理规则,规则仅在关联到默认链后才生效。简单说,默认链是“主干道”,自定义链表是“专用车道”,前者负责流量入口,后者负责细分场景的精准管控。
创建自定义链表后,规则不生效可能是什么原因?
常见原因有三个:一是未关联到默认链,需用iptables -A 主链名 -j 自定义链名(如-A INPUT -j WEB_RULES)将自定义链接入流量路径;二是规则顺序错误,Iptables按添加顺序执行规则,若允许规则被拦截规则遮挡(如先拦截后允许),则允许规则不生效;三是未保存规则,配置后需用iptables-save > /etc/iptables/rules.v4(Debian/Ubuntu)或service iptables save(CentOS)保存,否则重启后规则丢失。
Web服务器和数据库服务器的自定义链表配置重点有什么不同?
Web服务器侧重“开放与过滤并存”,自定义链表需优先拦截恶意流量(如扫描工具、异常User-Agent),再放行80/443等业务端口,可搭配日志链记录访问行为(如文章中的WEB_RULES+WEB_LOG组合)。数据库服务器侧重“最小权限原则”,自定义链表需严格限制来源IP(如仅允许内网网段访问3306端口),并通过limit模块控制连接频率(如每分钟最多10个连接),避免暴力破解,规则设计更倾向“先拒绝、后允许”。
如何备份和恢复自定义链表的规则?
备份时,用iptables-save > /path/to/backup.rules(如iptables-save > /root/iptables_backup.rules)将所有规则(含自定义链表)导出为文本文件;恢复时,用iptables-restore < /path/to/backup.rules导入即可。 定期备份(如每周一次),并在修改自定义链表前额外备份,避免误操作导致规则丢失。注意:备份文件需包含完整的链结构,直接保存的规则文本可完整恢复自定义链表及其关联关系。
自定义链表中的规则执行顺序是怎样的?如何调整顺序?
自定义链表的规则按“添加顺序”执行(即-A命令的顺序),先添加的规则先匹配。若需调整顺序,可用iptables -L 自定义链名 line-numbers查看规则序号,再用iptables -I 自定义链名 序号 规则内容将新规则插入指定位置(如-I WEB_RULES 2 -p tcp dport 80 -j ACCEPT表示插入到第2条),或用iptables -D 自定义链名 序号删除旧规则后重新添加。实操中 将高频匹配规则(如拦截恶意IP)放在前面,减少后续规则的匹配压力。
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
8. 精力有限,不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别!
站长QQ:709466365 站长邮箱:709466365@qq.com