零入门kubernetes网络实战-12->基于DNAT技术使得外网可以访问本宿主机上veth-pair链接的内部网络

news2025/1/18 6:27:54

视频地址(稍后上传)


本篇文章测试如何让veth pair链接的内网网络可以被本局域网的其他宿主机访问到?

1、测试环境介绍

一台centos虚拟机

# 查看操作系统版本
cat /etc/centos-release
# 内核版本
uname -a
uname -r 
# 查看网卡信息
ip a s eth0

在这里插入图片描述

2、网络拓扑

在这里插入图片描述

3、操作实战

3.1、操作命令

3.1.1、具体操作命令(master节点)

ip netns add ns1

ip link add veth1a type veth peer name veth1b

ip link set veth1a netns ns1
ip netns exec ns1 ip addr add 10.244.1.2/24 dev veth1a
ip netns exec ns1 ip link set veth1a up

ip addr add 10.244.1.3/24 dev veth1b
ip link set veth1b up

ip netns exec ns1 route add default gw 10.244.1.3
iptables -t nat -A PREROUTING -d 10.211.55.122 -p tcp --dport 8090 -i eth0 -j DNAT --to 10.244.1.2:9090

echo 1 > /proc/sys/net/ipv4/ip_forward

3.1.2、查看一下当前环境

3.1.2.1、查看一下ns1里的路由情况

ip netns exec ns1 route -n

在这里插入图片描述

3.1.2.2、查看一下主网络空间里路由情况

route -n

在这里插入图片描述

4、具体测试

在ns1里,启动被测试服务http-web

4.1、被测试服务

4.1.1、被测试服务代码

package main

import (
	"encoding/json"
	"fmt"
	"net/http"
)

type Stu struct {
	Age int
	Msg string
}

const ip = "0.0.0.0"

func sayHello(w http.ResponseWriter, r *http.Request) {
	stu := Stu{Age: 12, Msg: "hello world! this is DNAT+bridge+Veth pair Test!"}
	stuJson, e := json.Marshal(&stu)
	if e != nil {
		panic(e)
	}

	w.Write(stuJson)

	fmt.Printf("Reply MSG:%v\tlen(Msg):%d\n", string(stuJson), len(stuJson))
}

func main() {
	http.HandleFunc("/", sayHello)
	fmt.Printf(fmt.Sprintf("App URL: http://%s:%d\n", ip, 9090))

	err := http.ListenAndServe(fmt.Sprintf("%s:%d", ip, 9090), nil)
	if err != nil {
		fmt.Printf("http server failed, err:%v\n", err)
		return
	}
}

不用关心测试代码的具体逻辑,主要是关心请求后,是否有正常打印输出即可。

4.1.2、本地编译,上传到Master节点

Makefile

build:
	CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o http-web main.go

scp:
	scp http-web root@10.211.55.122:/root

all:
	make build && make scp

大家可以根据自己的实际情况进行修改。

直接执行

make all

4.2、在master节点上,ns1命名空间里启动http-web服务

ip netns exec ns1 ./http-web

在这里插入图片描述

4.3、在slave节点上,发起http-web服务请求

curl 10.211.55.122:8090

在这里插入图片描述

5、观察一下ns1网络空间和主网络空间里的ARP表的变化

ip netns exec ns1 arp -n

在这里插入图片描述

6、分析一下,整个传输过程中数据包的报文变化

为了观察报文变化,需要对网络设备进行抓包分析。

6.1、对master节点上的网络设备进行抓包

6.1.1、对ns1网络空间里的veth1a进行抓包

ip netns exec ns1 tcpdump -nn -i veth1a 
ip netns exec ns1 tcpdump -nn -i veth1a -w icmp-veth1a.pcap

在这里插入图片描述

6.1.2、对主网络空间里的veth1b进行抓包

tcpdump -nn -i veth1b 
tcpdump -nn -i veth1b -w icmp-veth1b.pcap

veth1b可以参考veth1a。

6.1.3、对主网络空间里的eth0进行抓包

tcpdump -nn -i eth0 -p tcp and port 8090 
tcpdump -nn -i eth0 -p tcp and port 8090 -w icmp-eth0.pcap

在这里插入图片描述

6.2、对slave节点上的网络设备进行抓包

6.2.1、对主网络空间里的eth0进行抓包

tcpdump -nn -i eth0 -p tcp and port 8090 
tcpdump -nn -i eth0 -p tcp and port 8090 -w icmp-eth0.pcap

可以参考122节点上的eth0数据抓取情况。

6.3、重新发起请求

为了恢复到最初始的状态,最好重启master、slave两台服务器。
重新根据操作命令,重新创建一下网络拓扑。

在slave节点,重新发起请求

curl 10.211.55.122:8090

在这里插入图片描述

6.4、请求过程,数据包的报文变化情况

在这里插入图片描述

上面是Slave节点,下面是Master节点

主要是观察一下,经过DNAT后,哪些发生了变化。

7、分析一下,整个传输过程中经过了哪些iptables规则链

为了验证测试,分别在master节点、slave上添加日志埋点;

此过程,需要使用到rsyslog服务

7.1、在master节点上安装rsyslog服务

yum -y install rsyslog

7.1.1、更新配置文件

echo "kern.*     /var/log/iptables.log" >> /etc/rsyslog.conf 

在这里插入图片描述

.*,表示所有等级的消息都添加到iptables.log文件里

信息等级的指定方式

  • .XXX,表示 大于XXX级别的信息
  • .=XXX,表示等于XXX级别的信息
    • 如,kern.=notice /var/log/iptables.log, 将notice以上的信息添加到iptables.log里
  • .!XXX, 表示在XXX之外的等级信息

7.1.2、重启rsyslog服务

systemctl restart rsyslog

systemctl status  rsyslog

在这里插入图片描述

7.2、在slave节点上安装rsyslog服务

可完全参考master节点安装过程

7.3、添加针对icmp协议的DNAT规则

如果测试的是tcp服务的协议的话,添加日志埋点时,可能存在测试不足的情况。

因为tcp协议,除了我们自己测试在用外,其他服务也可能在用tcp服务等等吧。

因此,这里使用icmp协议来测试。

(因为测试环境只有我们在用icmp协议,可以唯一确定,然后将规则链的匹配条件设置到最大)

下面是针对icmp协议,添加的DNAT规则
(也就是说,主要有请求目的IP是10.211.55.122,请求协议是ICMP的,就将目的IP进行重定向)

iptables -t nat -A PREROUTING -p icmp -i eth0 -j DNAT --to 10.244.1.2

在这里插入图片描述

7.4、添加日志埋点

7.4.1、在master节点上,添加日志埋点

将当前的日志统计清零

iptables -t nat -Z
iptables -t filter -Z

插入日志埋点前,先查看一下,当前的现状

iptables -t nat -nvL PREROUTING --line-number
iptables -t filter -nvL FORWARD --line-number
iptables -t nat -nvL POSTROUTING --line-number

插入日志埋点

iptables -t nat -I PREROUTING -p icmp -j LOG --log-prefix "Nat-PREROUTING-1-"
iptables -t filter -A FORWARD -p icmp -j LOG --log-prefix "Filter-FORWARD-1-"
iptables -t nat -I POSTROUTING -p icmp -j LOG --log-prefix "Nat-POSTROUTING-1-"

在这里插入图片描述

实时查看日志

tail -f /var/log/iptables.log

7.4.2、在slave节点上,添加日志埋点

将当前的日志统计清零

iptables -t nat -Z
iptables -t filter -Z

插入日志埋点前,先查看一下,当前的现状

iptables -t nat -nvL OUTPUT --line-number
iptables -t filter -nvL OUTPUT --line-number
iptables -t nat -nvL POSTROUTING --line-number
iptables -t nat -nvL INPUT --line-number
iptables -t filter -nvL INPUT --line-number

插入日志埋点

# 匹配出去的数据包
iptables -t nat -I OUTPUT -p icmp -j LOG --log-prefix "Nat-OUTPUT-1-"
iptables -t filter -A OUTPUT -p icmp -j LOG --log-prefix "Filter-OUTPUT-1-"
iptables -t nat -I POSTROUTING -p icmp -j LOG --log-prefix "Nat-POSTROUTING-1-"

# 匹配进来的数据包
iptables -t nat -I PREROUTING -p icmp -j LOG --log-prefix "Nat-PREROUTING-1-"
iptables -t nat -I INPUT -p icmp -j LOG --log-prefix "Nat-INPUT-1-"
iptables -t filter -I INPUT -p icmp -j LOG --log-prefix "Filter-INPUT-1-"

实时查看日志

tail -f /var/log/iptables.log

7.5、发起请求测试

在slave节点,重新发起请求

ping 10.211.55.122

在这里插入图片描述

7.6、重新观察日志情况

7.6.1、观察slave节点上iptables日志变化

先观察主动发起请求的一侧

tail -f /var/log/iptables.log

在这里插入图片描述

7.6.2、观察master节点上iptables日志变化

再观察被请求方

tail -f /var/log/iptables.log

在这里插入图片描述

7.7、第1次请求、反馈都经历了哪些iptable链

7.7.1、请求过程,经历的iptables链

在这里插入图片描述

7.7.2、反馈过程,经历的iptables链

在这里插入图片描述

7.8、从第2次开始,请求、反馈都经历了哪些iptable链(仅供参考)

在这里插入图片描述

从第2次请求开始,只会走OUTPUT,input,forward链了。

8、总结

  • 本篇文章模拟了如何将veth pair链接的内部网络的服务暴露出来。
  • 通过dnat技术,端口映射方式,将内部网络的tcp服务,udp服务,http服务暴露出来。
  • 分析了整个过程数据包的报文内容变化情况
  • 分析了整个过程中都经历了哪些规则链。
    • 第1次请求过程
    • 第2次,3次,。。。。请求过程的区别
  • 实际应用中,其实,就是如何将容器里的服务暴露出来。原理是一样的。

点击 下面 返回 专栏目录

<<零入门kubernetes网络实战>>技术专栏之文章目录

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

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

相关文章

银行零售如何更贴近客户?是时候升级你的客户旅程平台了

随着数字化战略推进&#xff0c;各大银行持续加大对线上多渠道的建设投入&#xff0c;客户触达也愈发移动化、智能化。与此同时&#xff0c;手机银行飞速发展产生并累积了大量客户行为数据&#xff0c;呈多样化、海量化等特点&#xff0c;将在用户体验、客户经营、手机银行运营…

SaaS的阴暗面:网络攻击武器化、平民化

你不一定懂编程&#xff0c;甚至都看不懂几行代码&#xff0c;但依然能成为杀伤力十足的黑客&#xff0c;这就是现阶段不少网络攻击的特点&#xff1a;不需要掌握娴熟的技术或代码&#xff0c;仅仅利用成熟的武器化工具&#xff0c;就能通过简单的“一键操作”&#xff0c;对目…

【Java基础】018 -- 面向对象阶段项目上(拼图小游戏)

目录 拼图小游戏&#xff08;GUI&#xff09; 一、主界面分析 1、练习一&#xff1a;创建主界面1 2、练习二&#xff1a;创建主界面2&#xff08;JFrame&#xff09; 3、练习三&#xff1a;在游戏界面中添加菜单&#xff08;JMenuBar&#xff09; ①、菜单的制作 4、添加图片&a…

传奇开服架设要具备什么条件

传奇开服架设要具备什么条件 新手如果想开服的话因具备哪些条件&#xff1f;我来为您解答 1.传奇SF开服的话你要清楚 具体的有哪些步骤 需要的哪些东西 自己一定要先了解清楚&#xff01;因为这行的话 PZ比我们IDC服务器商都还要多。 {开服的话一定要了解清楚开传奇的一个具…

python(15)--函数设计

前言 函数是可重用的程序代码块。 函数的作用&#xff0c;不仅可以实现代码的复用&#xff0c;还可以保证修改函数的代码时&#xff0c;所有调用该函数的地方都能得到体现。目前我已知函数的作用是&#xff1a;对代码实现了封装、函数调用、传递参数、返回计算结果等。 正文 …

可控硅原理(单向可控硅和双向可控硅)

晶闸管(Thyristor)又叫可控硅&#xff0c;按照其工作特性又可分单向可控硅(SCR)、双向可控硅(TRIAC)。其中双向可控硅又分四象限双向可控硅和三象限双向可控硅。同时可控硅又有绝缘与非绝缘两大类&#xff0c;如ST的可控硅用BT名称后的“A”、与“B”来区分绝缘与非绝缘。 …

SpringCloud(18):Sentinel流控降级入门

Sentinel本地应用流控降级实现分为三步&#xff1a; 创建本地应用搭建本地Sentinel控制台本地应用接入本地Sentinel控制台1 本地应用创建 整体流程分析 创建springboot项目在项目的pom.xml文件中引入sentinel-core的依赖坐标创建TestController&#xff0c;定义使用限流规则…

java面向对象

3.面向对象 3.1 类和对象 public class Main{public static void main(String[] args) { /* 1.面向对象学习的三条主线1.1 类的结构&#xff1a;属性、方法、构造器、代码块、内部类1.2 面向对象的三大特征&#xff1a;封装性、继承性、多态性1.3 其他关键字&#xff1a;this…

当我把ChatGPT机器人拉到微信群里,群友都玩疯了!!!

大家好呀&#xff0c;我是飘渺&#xff01;最近ChatGPT可谓是火出天际&#xff0c;人工智能领域的股票最近都被这家伙带的一路狂飙&#xff0c;如果到现在你都没听过或使用过的话那你可能是有点out了。今天的文章并不打算介绍ChatGPT&#xff0c;而是要带大家玩一件好玩的事。将…

泰克示波器采样率问题解答

1. 怎样选择示波器的采样率?采样率通常由带宽决定。高斯响应的泰克示波器通常而言采样率需要是带宽的 4 倍或更高。2. 选择具有最大额定采样率的示波器, 足以提供示波器的额定实时带宽吗?示波器的最大额定采样率与其实时带宽密切相关。 简单来讲&#xff0c;“实时”表示在单…

【C++】C++入门 类与对象(一)

类与对象&#xff08;一&#xff09;一、类的引入二、类的定义1、类的两种定义方式&#xff1a;2、成员变量命名规则的建议&#xff1a;三、类的访问限定符及封装1、访问限定符2、封装四、类的实例化1、类的实例化概念2、类对象的大小的计算五、this指针this指针的特性一、类的…

1.Redis【介绍与安装】

1.常用数据库介绍 mysql的表类型[表引擎.存储引擎],memory表结构和表数据分开存储的,表结构保存在硬盘中,表数据保存在内存中memcache是一款软件,可以使用键值对的格式保存数据到内存中redis是意大利的工程师开发的开源免费的告诉缓存数据库,需要注意的是作者本身只开发了linu…

1 Flutter UI Container和 Text 和图片组件

一 Text 组件Text 文本组件的一些属性如下body: const Text("this is leonardo fibonacci",// 文本对齐的方式textAlign: TextAlign.center,// 文本方向textDirection: TextDirection.rtl,// 字体显示最大的行数maxLines: 2,// 文字超出屏幕之后的显示方式 ellipsi…

Postgresql中null值和空字符串

NULL和空字符串不同数据库的表现 null和空字符串在不同的数据库中表现不一样&#xff0c;找了一张图&#xff0c;可以很清晰的对比了解。 首先null不是一个空字符串&#xff0c;也不是一个为零的值&#xff0c;上图&#xff0c;Oracle将NULL和空字符串都视为NULL。PostgreSQL…

UDP协议详解

目录 前言&#xff1a; 再谈协议 UDP协议 比较知名的校验和 小结&#xff1a; 前言&#xff1a; UDP和TCP作为传输层非常知名的两个协议&#xff0c;那么将数据从应用层到传输层数据是怎样进行打包的&#xff1f;具体都会增加一些什么样的报头&#xff0c;下面内容详细介绍…

洛谷——P1077 摆花

【题目描述】 小明的花店新开张&#xff0c;为了吸引顾客&#xff0c;他想在花店的门口摆上一排花&#xff0c;共 m 盆。通过调查顾客的喜好&#xff0c;小明列出了顾客最喜欢的 n 种花&#xff0c;从 1 到 n 标号。为了在门口展出更多种花&#xff0c;规定第 i 种花不能超过 …

快捷键被占用了,这能忍吗?赶紧使用 OpenArk 找出元凶并干掉它!!!

文章目录一、 问题&#xff1a;快捷键被占用了导致影响工作效率二、OpenArk2.1 OpenArk简介功能发布官方链接2.2 下载OpenArk2.3 运行OpenArk2.4 被占用的热键元凶到底是谁&#xff1f;三、总结一、 问题&#xff1a;快捷键被占用了导致影响工作效率 你是否遇到过&#xff0c;…

用ChatGPT构建网络设备表,并根据设备关系生成网络拓扑

构造一个数据表&#xff0c;存储包括交换机、路由器、防火墙、入侵检测、上网行为管理等设备的编号、序列号、IP、MAC、访问地址、用户名、密码、管理员、物理位置、上联设备ip等信息下面是一个示例数据表&#xff1a;Device IDSerial NumberIPMACAccess URLUsernamePasswordAd…

一文教会你如何选择远程桌面(五大主流远程软件全面讲解)

写在前面 作为程序员的我们&#xff0c;随时随地写代码改代码是我们的日常。刚回到家&#xff0c;就被老板、产品经理cue是常有的事。基于这种情况&#xff0c;一般都会随身携带电脑&#xff0c;随时备战&#xff0c;不过每天背着电脑上下班非常不方便。因此资深程序员的解决方…

高通开发系列 - linux kernel更新msm-3.18升至msm-4.9

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录 linux kernel更新msm-3.18升至msm-4.9第一周处理的内容:第二周处理的内容第三周处理的内容linux kernel更新msm-3.18升至msm-4.9 第…