iptables的一次修复日志

news2024/11/17 17:38:59

iptables的一次修复日志

搭建配置wireguard后,使用内网连接设备十分方便,我采用的是星型连接,即每个节点都连接到中心节点,但是突然发生了重启wg后中心节点不转发流量的问题,即每个接入的节点只能与中心节点连接,而节点与节点间无法连接。然而reboot重启中心节点机器后,wg内网却能正常工作。最后发现是iptables配置的问题。借此机会熟悉了iptables的逻辑。

1. 发现和解决问题

1.1 现象

当时中心节点上挂了 ipsec,wireguard,和docker等,当时也不知道是谁干的好事,我甚至不知道ipsec也写了这个表,最后锁定了问题出在FORWARD 链。具体是这样的
重启wireguard,复现了问题后,使用

sudo iptables -nvL

查看这个表,最后观察到这个表是这样的。

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1     195K   51M DOCKER-USER  0    --  *      *       0.0.0.0/0            0.0.0.0/0           
2     195K   51M DOCKER-ISOLATION-STAGE-1  0    --  *      *       0.0.0.0/0            0.0.0.0/0           
3        0     0 ACCEPT     0    --  *      docker0  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
4        0     0 DOCKER     0    --  *      docker0  0.0.0.0/0            0.0.0.0/0           
5        0     0 ACCEPT     0    --  docker0 !docker0  0.0.0.0/0            0.0.0.0/0           
6        0     0 ACCEPT     0    --  docker0 docker0  0.0.0.0/0            0.0.0.0/0           
7       20   800 DROP       0    --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate INVALID
8        0     0 ACCEPT     0    --  eth0   ppp+    0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
9        0     0 ACCEPT     0    --  ppp+   eth0    0.0.0.0/0            0.0.0.0/0           
10       0     0 ACCEPT     0    --  ppp+   ppp+    0.0.0.0/0            0.0.0.0/0           
11       0     0 ACCEPT     0    --  eth0   *       0.0.0.0/0            192.168.43.0/24      ctstate RELATED,ESTABLISHED
12       0     0 ACCEPT     0    --  *      eth0    192.168.43.0/24      0.0.0.0/0           
13       0     0 ACCEPT     0    --  *      ppp+    192.168.43.0/24      0.0.0.0/0           
14       0     0 ACCEPT     0    --  wg2    *       0.0.0.0/0            0.0.0.0/0           
15       0     0 ACCEPT     0    --  *      wg2     0.0.0.0/0            0.0.0.0/0           
16     393 26860 DROP       0    --  *      *       0.0.0.0/0            0.0.0.0/0           
17       0     0 ACCEPT     0    --  wg2    *       0.0.0.0/0            0.0.0.0/0           
18       0     0 ACCEPT     0    --  *      wg2     0.0.0.0/0            0.0.0.0/0           
19       0     0 ACCEPT     0    --  wg0    *       0.0.0.0/0            0.0.0.0/0           
20       0     0 ACCEPT     0    --  *      wg0     0.0.0.0/0            0.0.0.0/0           
21       0     0 ACCEPT     0    --  wg0    *       0.0.0.0/0            0.0.0.0/0           
22       0     0 ACCEPT     0    --  *      wg0     0.0.0.0/0            0.0.0.0/0           

流量从上往下匹配,在匹配到wg0的规则前,匹配到了DROP,卒。
然后reboot重启了机器,FORWARD链变成了这样

1      491  106K DOCKER-USER  0    --  *      *       0.0.0.0/0            0.0.0.0/0           
2      491  106K DOCKER-ISOLATION-STAGE-1  0    --  *      *       0.0.0.0/0            0.0.0.0/0           
3        0     0 ACCEPT     0    --  *      docker0  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
4        0     0 DOCKER     0    --  *      docker0  0.0.0.0/0            0.0.0.0/0           
5        0     0 ACCEPT     0    --  docker0 !docker0  0.0.0.0/0            0.0.0.0/0           
6        0     0 ACCEPT     0    --  docker0 docker0  0.0.0.0/0            0.0.0.0/0           
7        0     0 DROP       0    --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate INVALID
8        0     0 ACCEPT     0    --  eth0   ppp+    0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
9        0     0 ACCEPT     0    --  ppp+   eth0    0.0.0.0/0            0.0.0.0/0           
10       0     0 ACCEPT     0    --  ppp+   ppp+    0.0.0.0/0            0.0.0.0/0           
11       0     0 ACCEPT     0    --  eth0   *       0.0.0.0/0            192.168.43.0/24      ctstate RELATED,ESTABLISHED
12       0     0 ACCEPT     0    --  *      eth0    192.168.43.0/24      0.0.0.0/0           
13       0     0 ACCEPT     0    --  *      ppp+    192.168.43.0/24      0.0.0.0/0           
14       0     0 ACCEPT     0    --  wg2    *       0.0.0.0/0            0.0.0.0/0           
15       0     0 ACCEPT     0    --  *      wg2     0.0.0.0/0            0.0.0.0/0           
16     491  106K ACCEPT     0    --  wg0    *       0.0.0.0/0            0.0.0.0/0           
17       0     0 ACCEPT     0    --  *      wg0     0.0.0.0/0            0.0.0.0/0           
18       0     0 DROP       0    --  *      *       0.0.0.0/0            0.0.0.0/0           
19       0     0 ACCEPT     0    --  wg2    *       0.0.0.0/0            0.0.0.0/0           
20       0     0 ACCEPT     0    --  *      wg2     0.0.0.0/0            0.0.0.0/0           
21       0     0 ACCEPT     0    --  wg0    *       0.0.0.0/0            0.0.0.0/0           
22       0     0 ACCEPT     0    --  *      wg0     0.0.0.0/0            0.0.0.0/0                

因为有wg0的规则出现在了DROP之前,所以流量成功的走了出来。

1.2 补充知识点

iptables中的-A和-I,一个是Insert,一个是Append,Insert会直接插在链规则的最前边,Append则是会直接插在最后边。

1.3 解决问题

看了下wg0.conf是怎么写的

Address = **.**.**.1/24
PrivateKey = *******************************************=
PostUp   = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
publickey = *******************************************=
AllowedIPs = **.**.**.2/32

[Peer]
publickey = *******************************************=
AllowedIPs = **.**.**.3/32

[Peer]
publickey = *******************************************=
AllowedIPs = **.**.**.4/32

[Peer]
publickey =  *******************************************=
AllowedIPs = **.**.**.5/32

... ...

其中的PostUp和PostDown被执行,-A 指定了规则append到该表该链的所有规则的后边。
所以reboot重启机器的时候,由于DROP最后才被append加进来,而wireguard的规则先append进来了,所以从上往下执行。就没事。
然而此后重启wireguard,由于重新append时append到了DROP后边,所以该规则没能先于DROP被执行
所以只要重启的时候使用Insert而不是Append就解决了,即把PostUP中的"-A"换成"-I",即

PostUp   = iptables -I FORWARD -i %i -j ACCEPT; iptables -I FORWARD -o %i -j ACCEPT; iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE

问题就解决了。

2. 问题的解释

关于wg0的规则并排的0有两条,一条是in * out wg0 ,一条是in wg0 out *,它们是冗余的,因为有路由表保证了只有来自wg0的流量才会到wg0。

3.排查docker和ipsec

缺德的DROP是谁添加的呢?为了观察这一点,首先引入了两条工具

3.1 工具

iptables的注释
语法是

iptables -m comment --comment "My comments here"

具体使用案例(直接写在wg0.conf里)

PostUp   = iptables -I FORWARD -i %i -m comment --comment "Added in wg0.conf" -j ACCEPT; iptables -I FORWARD -o %i -m comment --comment "Added in wg0.conf" -j ACCEPT; iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE

这样就可以在打印iptables表的时候看到注释。

sudo iptables -nvL
 4270  203K ACCEPT     0    --  *      wg0     0.0.0.0/0            0.0.0.0/0            /* Added in wg0.conf */
    0     0 ACCEPT     0    --  wg0    *       0.0.0.0/0            0.0.0.0/0            /* Added in wg0.conf */

TRACE功能
执行以下命令

iptables -t raw -I PREROUTING -d **.**.**.70 -j TRACE

在raw表的PREROUTING链中添加这条规则,
这样在到**.**.**.70的流量如何通过的iptables就可以观察了。观察的方法是执行以下命令

sudo xtables-monitor -t

事后我看到的是这样的情况

PACKET: 2 31ae5dec IN=wg0 SRC=11.11.11.20 DST=11.11.11.70 LEN=60 TOS=0x0 TTL=128 ID=59853
 TRACE: 2 31ae5dec raw:PREROUTING:rule:0x2:CONTINUE  -4 -t raw -A PREROUTING -d 11.11.11.70/32 -j TRACE
 TRACE: 2 31ae5dec raw:PREROUTING:return:
 TRACE: 2 31ae5dec raw:PREROUTING:policy:ACCEPT
 TRACE: 2 31ae5dec nat:PREROUTING:return:
 TRACE: 2 31ae5dec nat:PREROUTING:policy:ACCEPT
PACKET: 2 31ae5dec IN=wg0 OUT=wg0 SRC=11.11.11.20 DST=11.11.11.70 LEN=60 TOS=0x0 TTL=127 ID=59853
 TRACE: 2 31ae5dec filter:FORWARD:rule:0x25:ACCEPT  -4 -t filter -A FORWARD -o wg0 -m comment --comment "Added in wg0.conf" -j ACCEPT
 TRACE: 2 31ae5dec nat:POSTROUTING:return:
 TRACE: 2 31ae5dec nat:POSTROUTING:policy:ACCEPT
PACKET: 2 510f38f9 IN=wg0 SRC=11.11.11.20 DST=11.11.11.70 LEN=60 TOS=0x0 TTL=128 ID=59854
 TRACE: 2 510f38f9 raw:PREROUTING:rule:0x2:CONTINUE  -4 -t raw -A PREROUTING -d 11.11.11.70/32 -j TRACE
 TRACE: 2 510f38f9 raw:PREROUTING:return:
 TRACE: 2 510f38f9 raw:PREROUTING:policy:ACCEPT
PACKET: 2 510f38f9 IN=wg0 OUT=wg0 SRC=11.11.11.20 DST=11.11.11.70 LEN=60 TOS=0x0 TTL=127 ID=59854
 TRACE: 2 510f38f9 filter:FORWARD:rule:0x25:ACCEPT  -4 -t filter -A FORWARD -o wg0 -m comment --comment "Added in wg0.conf" -j ACCEPT
PACKET: 2 47202071 IN=wg0 SRC=11.11.11.20 DST=11.11.11.70 LEN=60 TOS=0x0 TTL=128 ID=59855
 TRACE: 2 47202071 raw:PREROUTING:rule:0x2:CONTINUE  -4 -t raw -A PREROUTING -d 11.11.11.70/32 -j TRACE
 TRACE: 2 47202071 raw:PREROUTING:return:
 TRACE: 2 47202071 raw:PREROUTING:policy:ACCEPT
PACKET: 2 47202071 IN=wg0 OUT=wg0 SRC=11.11.11.20 DST=11.11.11.70 LEN=60 TOS=0x0 TTL=127 ID=59855
 TRACE: 2 47202071 filter:FORWARD:rule:0x25:ACCEPT  -4 -t filter -A FORWARD -o wg0 -m comment --comment "Added in wg0.conf" -j ACCEPT
PACKET: 2 47202071 IN=wg0 SRC=11.11.11.20 DST=11.11.11.70 LEN=60 TOS=0x0 TTL=128 ID=59856
 TRACE: 2 47202071 raw:PREROUTING:rule:0x2:CONTINUE  -4 -t raw -A PREROUTING -d 11.11.11.70/32 -j TRACE
 TRACE: 2 47202071 raw:PREROUTING:return:
 TRACE: 2 47202071 raw:PREROUTING:policy:ACCEPT
PACKET: 2 47202071 IN=wg0 OUT=wg0 SRC=11.11.11.20 DST=11.11.11.70 LEN=60 TOS=0x0 TTL=127 ID=59856
 TRACE: 2 47202071 filter:FORWARD:rule:0x25:ACCEPT  -4 -t filter -A FORWARD -o wg0 -m comment --comment "Added in wg0.conf" -j ACCEPT

当时的情况是

PACKET: 2 831e9d23 IN=wg0 SRC=11.11.11.20 DST=11.11.11.70 LEN=60 TOS=0x0 TTL=128 ID=59207 
TRACE: 2 831e9d23 raw:PREROUTING:rule:0x2:CONTINUE  -4 -t raw -A PREROUTING -d 11.11.11.70/32 -j TRACE
TRACE: 2 831e9d23 raw:PREROUTING:return:
TRACE: 2 831e9d23 raw:PREROUTING:policy:ACCEPT 
TRACE: 2 831e9d23 nat:PREROUTING:return:
TRACE: 2 831e9d23 nat:PREROUTING:policy:ACCEPT 
PACKET: 2 831e9d23 IN=wg0 OUT=wg0 SRC=11.11.11.20 DST=11.11.11.70 LEN=60 TOS=0x0 TTL=127 ID=59207 
TRACE: 2 831e9d23 filter:FORWARD:rule:0x36:JUMP:DOCKER-USER  -4 -t filter -A FORWARD -j DOCKER-USER
TRACE: 2 831e9d23 filter:DOCKER-USER:return:
TRACE: 2 831e9d23 filter:FORWARD:rule:0x33:JUMP:DOCKER-ISOLATION-STAGE-1  -4 -t filter -A FORWARD -j DOCKER-ISOLATION-STAGE-1
TRACE: 2 831e9d23 filter:DOCKER-ISOLATION-STAGE-1:return:
TRACE: 2 831e9d23 filter:FORWARD:rule:0x1f:DROP  -4 -t filter -A FORWARD -j DROP

就是通过这个DROP发现的问题。

3.2 排查结果

其实上边的工具都没用上,最后发现是ipsec写的DROP,它还同时添加了两条wg0的规则,导致wg0的规则出现了四次。

它想做的是用一个DROP兜底,结果不幸的是我的wg规则append了在它后边。其实这个DROP应该写进policy。

由于iptables大家一起用,所以我感觉在最后append一个DROP这种行为其实本身就很不负责。调整了ipsec,结束维护。

4.iptables的三表五链

三表: nat,mangle,filter,(raw)
五链: PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1233937.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

No appropriate protocol -- Mysql

DataGrip连接mysql报以下异常信息: javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate) The following required algorithms might be disabled: SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5wi…

java-jdbc快速入门

文章目录 简介快速入门 简介 JDBC就是使用Java语言操作关系数据库的一套APIJava DataBase Connectivity 快速入门 -- mysql 中准备工作 create database if not exists my_db; use my_db; create table account(id int,name varchar(20),money int ); insert into account v…

Threejs_09 gltf模型的引入(效果初现)

本节使用到的图片、素材、gltf文件,都是老陈打码的原素材 支持!!!!!!!!!!!!!!!&#x…

Thinkphp-商城项目之oss文件上传及web端直传

4.3头像上传 一般商城网站都会把文件上传到第三方云,例如阿里云(oss),腾讯云(cos),当然如果公司有足够的实力,可以自己部署一台文件服务器,用于文件的保存。 头像上传一般是用户在用户中心上传的,后台管理…

个人如何进行深度复盘?这6大高效的复盘模型,让你的年终总结如虎添翼!

一年之计在于春,一日之计在于晨,而一年的收获与成长,在于这个年终的深度复盘。自我复盘,是对过去一年生活、工作、学习的反思和总结,能帮助我们提炼经验,发现不足,规划未来,以便更好…

DataFunSummit:2023年数据基础架构峰会-核心PPT资料下载

一、峰会简介 正如From、Join、排序等是SQL的基本算子,存储与计算是也是数据架构中数据生产与消费的基本算子,对于数据架构之下的技术栈层级,我们可将其定义为数据基础架构。 数据存储技术在适应大数据时代的规模需求基础之上,持…

模板初阶学习

✨前言✨ 📘 博客主页:to Keep博客主页 🙆欢迎关注,👍点赞,📝留言评论 ⏳首发时间:2023年11月21日 📨 博主码云地址:博主码云地址 📕参考书籍&…

文心一言 VS 讯飞星火 VS chatgpt (140)-- 算法导论11.4 5题

五、用go语言,考虑一个装载因子为a的开放寻址散列表。找出一个非零的a值,使得一次不成功查找的探查期望数是一次成功查找的探查期望数的 2 倍。这两个探查期望数可以使用定理11.6 和定理 11.8 中给定的上界。 文心一言,代码正常运行&#xf…

LENOVO联想ThinkBook 16p G4 IRH(21J8)笔记本电脑原装出厂Windows11系统镜像

链接:https://pan.baidu.com/s/1q1vhzTA_VE4LnLvA-wVx7A?pwdvprc 提取码:vprc lenovo联想ThinkBook16P G4原厂Win11系统自带所有驱动、出厂主题壁纸、Office办公软件、联想电脑管家等预装程序 所需要工具:16G或以上的U盘 文件格式&…

打造高效医患沟通:陪诊小程序开发技术指南

随着科技的不断发展,陪诊小程序作为医患沟通的新工具逐渐成为关注焦点。本文将带领你通过使用React和Node.js技术栈,构建一个功能强大且用户友好的陪诊小程序,实现医患互动的便捷和高效。 1. 准备工作 确保你的开发环境中已安装了Node.js和…

[SWPUCTF 2021 新生赛]非常简单的逻辑题 // %的逆向

代码解密题 flag xxxxxxxxxxxxxxxxxxxxx s wesyvbniazxchjko1973652048$-&*<> result for i in range(len(flag)):s1 ord(flag[i])//17s2 ord(flag[i])%17result s[(s1i)%34]s[-(s2i1)%34] print(result) # result v0b9n1nkajzj0c4jjo3oi1h1i937b395i5y5e0e…

练习题——【学习补档】库函数的模拟实现

各种库函数的模拟实现 一、模拟实现strlen1.地址-地址型2.递归型3.计数器型 二、模拟实现strcpy三、模拟实现strcmp四、模拟实现strcat五、模拟实现strstr 一、模拟实现strlen 模拟实现strlen有三种方法 1.地址-地址型 2.递归型 3.计数器型1.地址-地址型 // //1.地址-地址型 …

新茶饮进入“大逃杀”赛程

2023年&#xff0c;是新茶饮IPO的爆发年&#xff0c;也可能是淘汰赛的起始年。 10月18日&#xff0c;奈雪的茶披露了今年第三季度运营情況&#xff0c;数据显示&#xff0c;截至9月30日&#xff0c;奈雪的茶共经营1360家店。而自7月份开放加盟后&#xff0c;至今只发展了4家加…

区块链技术与应用 【全国职业院校技能大赛国赛题目解析】第五套智能合约安全漏洞测试

第五套题的智能合约安全漏洞测试题目 环境 : ubuntu20 Truffle v5.8.3 (core: 5.8.3) Ganache v7.8.0 Solidity v0.8.3 Node v18.16.0 Web3.js v1.8.2 前言 请在测试的时候开启ganache打开,并且在truffle的配置文件配好ganache,之前两个帖子忘说了/(ㄒoㄒ)/~~ truffle-con…

第四代可燃气体监测仪:可燃气体监测仪在燃气管网中的作用有哪些

燃气管网如同城市的血脉&#xff0c;纵横交错着覆盖在每一寸土地。然而如此复杂的管网&#xff0c;仅靠人工巡查难免有些力不从心。毕竟人工监测的范围有其局限性&#xff0c;难以做到全方位、全天候的紧密监测&#xff0c;难免会有疏忽和遗漏。如何将安全隐患消灭于萌芽状态&a…

WPF TextBox实现placeholder

WPF里TextBox没有placeholder&#xff0c;需要自己实现&#xff0c;本篇博客介绍WPF TextBox实现placeholder&#xff0c;效果如下&#xff1a; 实现技巧是在 TextBox 控件的 Style 中使用触发器&#xff08;Triggers&#xff09;来显示和隐藏placeholder文本。xmal代码如下&am…

基于Cortex®-M4F的TM4C123GH6NMRT7R 32位MCU,LM74900QRGERQ1、LM74930QRGERQ1汽车类理想二极管

一、TM4C123GH6NMRT7R IC MCU 32BIT 256KB FLASH 157BGA Tiva™C系列微控制器为设计人员提供了基于ARMCortex™-M的高性能架构&#xff0c;该架构具有广泛的集成功能以及强大的软件和开发工具生态系统。以性能和灵活性为目标&#xff0c;Tiva™C系列架构提供了一个具有FPU的80…

京东商品详情数据接口【京东API接口开发系列】,监控京东价格走势,接口代码示例,可高并发批量获取

京东开放平台提供了API接口来访问京东商品详情。通过这个接口&#xff0c;您可以获取到商品的详细信息&#xff0c;如商品名称、价格、库存量、描述等。 以下是使用京东商品详情API接口的一般步骤&#xff1a; 注册并获取API权限&#xff1a;您需要在京东开放平台上注册并获取…

初级测试工程师必看的功能测试六点要义

前言 根据一份报告&#xff0c;应用程序崩溃导致71&#xff05;的卸载。迫使用户卸载应用程序的其他原因是页面响应时间&#xff0c;混乱的UI&#xff0c;电池消耗等。这表明功能测试和非功能测试对于交付用户友好型应用程序的重要性。 一、测试基础的重要性 作为一名测试新…