iptables的一次修复日志

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=59853TRACE: 2 31ae5dec raw:PREROUTING:rule:0x2:CONTINUE  -4 -t raw -A PREROUTING -d 11.11.11.70/32 -j TRACETRACE: 2 31ae5dec raw:PREROUTING:return:TRACE: 2 31ae5dec raw:PREROUTING:policy:ACCEPTTRACE: 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=59853TRACE: 2 31ae5dec filter:FORWARD:rule:0x25:ACCEPT  -4 -t filter -A FORWARD -o wg0 -m comment --comment "Added in wg0.conf" -j ACCEPTTRACE: 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=59854TRACE: 2 510f38f9 raw:PREROUTING:rule:0x2:CONTINUE  -4 -t raw -A PREROUTING -d 11.11.11.70/32 -j TRACETRACE: 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=59854TRACE: 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=59855TRACE: 2 47202071 raw:PREROUTING:rule:0x2:CONTINUE  -4 -t raw -A PREROUTING -d 11.11.11.70/32 -j TRACETRACE: 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=59855TRACE: 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=59856TRACE: 2 47202071 raw:PREROUTING:rule:0x2:CONTINUE  -4 -t raw -A PREROUTING -d 11.11.11.70/32 -j TRACETRACE: 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=59856TRACE: 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.mzph.cn/news/154893.shtml

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

相关文章

M2 Mac Xcode编译报错 ‘***.framework/‘ for architecture arm64

In /Users/fly/Project/Pods/YYKit/Vendor/WebP.framework/WebP(anim_decode.o), building for iOS Simulator, but linking in object file built for iOS, file /Users/fly/Project/Pods/YYKit/Vendor/WebP.framework/WebP for architecture arm64 这是我当时编译模拟器时报…

Mars3d-vue最简项目模板集成使用Mars3d的UI控件样板

备注说明&#xff1a; 1.小白可看步骤一二&#xff0c;进阶小白可直接看步骤三 步骤一&#xff1a;新建文件夹<uitest>&#xff0c;在mars3d仓库拉一份最简项目模板&#xff1a; git clone mars3d-vue-template: Vue3.x 技术栈下的Mars3D项目模板 步骤二&#xff1a;运…

本地部署 EmotiVoice易魔声 多音色提示控制TTS

本地部署 EmotiVoice易魔声 多音色提示控制TTS EmotiVoice易魔声 介绍ChatGLM3 Github 地址部署 EmotiVoice准备模型文件准备预训练模型推理 EmotiVoice易魔声 介绍 EmotiVoice是一个强大的开源TTS引擎&#xff0c;支持中英文双语&#xff0c;包含2000多种不同的音色&#xff…

网站为什么一定要安装SSL证书

随着互联网的普及和发展&#xff0c;网络安全问题日益凸显。在这个信息爆炸的时代&#xff0c;保护用户隐私和数据安全已经成为各大网站和企业的首要任务。而SSL证书作为一种网络安全技术&#xff0c;已经成为网站必备的安全工具。那么&#xff0c;为什么网站一定要安装SSL证书…

electron项目开机自启动

一、效果展示&#xff1a;界面控制是否需要开机自启动 二、代码实现&#xff1a; 1、在渲染进程login.html中&#xff0c;画好界面&#xff0c;默认勾选&#xff1b; <div class"intro">开机自启动 <input type"checkbox" id"checkbox&quo…

C++纯虚函数和抽象类 制作饮品案例(涉及知识点:继承,多态,实例化继承抽象类的子类,多文件实现项目)

一.纯虚函数的由来 在多态中&#xff0c;通常父类中虚函数的实现是毫无意义的&#xff0c;主要都是调用子类重写的内容。例如&#xff1a; #include<iostream>using namespace std;class AbstractCalculator { public:int m_Num1;int m_Num2;virtual int getResult(){r…

PHP手动为第三方类添加composer自动加载

有时候我们要使用的第三方的类库&#xff08;SDK&#xff09;没用用composer封装好&#xff0c;无法用composer进行安装&#xff0c;怎么办呢&#xff1f;&#xff1f;&#xff1f; 步骤如下&#xff1a; 第一步、下载需要的SDK文件包&#xff0c;把它放在vendor目录下 第二步…

SSM高考志愿辅助推荐系统-计算机毕业设计附源码21279

目 录 摘要 1 绪论 1.1 研究背景 1.2研究意义 1.3论文结构与章节安排 2 高考志愿辅助推荐系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 2…

竞赛选题 身份证识别系统 - 图像识别 深度学习

文章目录 0 前言1 实现方法1.1 原理1.1.1 字符定位1.1.2 字符识别1.1.3 深度学习算法介绍1.1.4 模型选择 2 算法流程3 部分关键代码 4 效果展示5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 毕业设计 图像识别 深度学习 身份证识别…

K8S精进之路-控制器Deployment-(1)

在K8S中&#xff0c;最小运行单位为POD,它是一个逻辑概念&#xff0c;其实是一组共享了某些资源的容器组。POD是能运行多个容器的&#xff0c;Pod 里的所有容器&#xff0c;共享的是同一个 Network Namespace&#xff0c;并且可以声明共享同一个 Volume。在POD中能够hold住网络…

Python数据分析实战-爬取以某个关键词搜索的最新的500条新闻的标题和链接(附源码和实现效果)

实现功能 通过百度引擎&#xff0c;爬取以“开源之夏”为搜索关键词最新的500条新闻的标题和链接 实现代码 1.安装所需的库&#xff1a;你需要安装requests和beautifulsoup4库。可以使用以下命令通过pip安装&#xff1a; pip install requests beautifulsoup42.发起搜索请求…

【AT模式连接ONENET】ONENET可视化平台的使用

02 ONENET可视化平台的使用 ATCWMODE1 设置模式 ATCWDHCP1,1 启动DHCP功能 ①ATCWJAP"ssid","password" ATCWJAP“123456789”&#xff0c;“wang020118” ②ATMQTTUSERCFG0,1,"设备名字","设备ID","你的鉴权信息""…

每日一题(LeetCode)----数组--螺旋矩阵(一)

每日一题(LeetCode)----数组–螺旋矩阵&#xff08;一&#xff09; 1.题目&#xff08;54. 螺旋矩阵&#xff09; 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1…

No appropriate protocol -- Mysql

DataGrip连接mysql报以下异常信息&#xff1a; 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…

VsCode连接远程Linux编译环境的便捷处理

1.免输登录密码 免输命令的正确方法是使用公钥和私鈅在研发设备&#xff0c;和linux服务器上校验身份。公钥和私钥可在windows系统上生成。公钥要发送到linux服务器。私钥需要通知给本地的ssh客户端程序&#xff0c;相关的操作如下&#xff1a; 生成 SSH Key&#xff1a; 打开…

安卓中轻量级数据存储方案分析探讨

轻量级数据存储功能通常用于保存应用的一些常用配置信息&#xff0c;并不适合需要存储大量数据和频繁改变数据的场景。应用的数据保存在文件中&#xff0c;这些文件可以持久化地存储在设备上。需要注意的是&#xff0c;应用访问的实例包含文件所有数据&#xff0c;这些数据会一…

⑩⑦【MySQL】锁:全局锁、表级锁、行级锁

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ MySQL锁 ⑩⑦【MySQL】锁&#xff1a;全局锁、…

2023亚太杯数学建模思路 - 案例:感知机原理剖析及实现

文章目录 1 感知机的直观理解2 感知机的数学角度3 代码实现 4 建模资料 # 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 感知机的直观理解 感知机应该属于机器学习算法中最简单的一种算法&#xff0c;其…

Prometheus+Grafana环境搭建(window)

PrometheusGrafana环境搭建 1&#xff1a;配置Prometheus 1.1: 下载Prometheus安装包 官方下载地址 找到对应的win版本进行下载并解压 1.2 下载Window数据采集 官方下载地址 下载以管理员运行&#xff0c;安装成功后在服务里会出现一个"windows_exporter"采集…

光伏、储能双层优化配置接入配电网研究(附带Matlab代码)

由于能源的日益匮乏&#xff0c;电力需求的不断增长等&#xff0c;配电网中分布式能源渗透率不断提高&#xff0c;且逐渐向主动配电网方向发展。此外&#xff0c;需求响应(demand response&#xff0c;DR)的加入对配电网的规划运行也带来了新的因素。因此&#xff0c;如何综合考…