零入门kubernetes网络实战-30->基于bridge+veth pair+DNAT技术来实现外网可以访问内网的方案

news2024/9/25 21:29:17

《零入门kubernetes网络实战》视频专栏地址

https://www.ixigua.com/7193641905282875942

本篇文章视频地址(稍后上传)


通过DNAT技术可以将brige虚拟网桥管理的内网中的服务暴露出来,以供外网访问。

1、测试环境介绍

两台centos虚拟机

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

在这里插入图片描述

2、网络拓扑

在这里插入图片描述

从Slave节点的用户空间里的curl应用发起请求。

3、操作实战

3.1、第1步:在master上执行下面的命令

brctl addbr br0
ip link set br0 up
ip addr add 10.244.1.3/24 dev br0

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 link set veth1b up

brctl addif br0 veth1b

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.2、第2步:被测试服务

3.2.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
	}
}

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

3.2.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

3.3、第3步:在master节点上,ns1命名空间里启动http-web服务

ip netns exec ns1 ./http-web

在这里插入图片描述

3.4、第4步:slave节点上发起curl请求

curl 10.211.55.122:8090

在这里插入图片描述

4、从iptables链的角度,对整个过程进行分析

为了分析整个传输过程,我们添加一些日志埋点,来验证我们的猜测。

如果你已经根据前面的文章安装过了rsyslog服务,就不需要重复操作了

4.1、安装

4.1.1、安装rsyslog服务

yum -y install rsyslog

4.1.2、更新配置文件

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之外的等级信息

4.1.3、重启rsyslog服务

systemctl restart rsyslog

systemctl status  rsyslog

在这里插入图片描述

4.2、日志埋点

4.3、在master节点上,进行日志埋点

将当前的日志统计清零

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

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

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

插入日志埋点

iptables -t nat -I PREROUTING -d 10.211.55.0/24 -p tcp --dport 8090 -j LOG --log-prefix "Test-nat-PREROUTING-2-"
iptables -t filter -A FORWARD -d 10.244.1.0/24 -p tcp -j LOG --log-prefix "Test-filter-FORWARD-1-"
iptables -t nat -I POSTROUTING -p tcp -d 10.244.1.0/24 -j LOG --log-prefix "Test-nat-POSTROUTING-2-"

iptables -t filter -A FORWARD -d 10.211.55.0/24 -p tcp --sport 9090 -j LOG --log-prefix "Test-filter-FORWARD-333-"

在这里插入图片描述

也可以查看一下,ns1命名空间的iptables规则链情况

ip netns exec ns1 iptables -t nat -nvL

查看日志文件

tail -f /var/log/iptables.log

在这里插入图片描述

4.3.1、在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 PREROUTING --line-number
iptables -t filter -nvL INPUT --line-number

插入日志埋点


iptables -t nat -I OUTPUT -d 10.211.55.0/24 -p tcp --dport 8090 -j LOG --log-prefix "Test-nat-OUTPUT-1-"
iptables -t filter -I OUTPUT -d 10.211.55.0/24 -p tcp --dport 8090 -j LOG --log-prefix "Test-filter-OUTPUT-1-"
iptables -t nat -I POSTROUTING -d 10.211.55.0/24 -p tcp --dport 8090 -j LOG --log-prefix "Test-nat-POSTROUTING-1-"

iptables -t filter -I INPUT -d 10.211.55.0/24 -p tcp --sport 8090 -j LOG --log-prefix "Test-nat-INPUT-1-"

在这里插入图片描述

查看日志文件

tail -f /var/log/iptables.log

在这里插入图片描述

4.4、测试

4.4.1、在slave节点,发起请求

curl 10.211.55.122:8090

在这里插入图片描述

4.4.2、查看一下,master上日志

tail -f /var/log/iptables.log

在这里插入图片描述

4.4.3、查看一下,slave上日志

在这里插入图片描述

4.5、整个传输过程,数据包经过了哪些iptables链呢?

下图是 从slave节点通过curl发起请求的路线
在这里插入图片描述

这个图,主要是要明白一点,外部数据包进入到eth0网卡后,经过了哪些链才能到达br0

需要经过PRETOUTING链,FORWARD链,POSTROUTING链,才能到达虚拟网桥br0

下图是 master节点上的http-web服务接收到请求后的,反馈路线
在这里插入图片描述

备注:
反馈路线,仅供参考。
我个人是有疑问的。
比方说,Master节点上,eth0接收到反馈数据包后,没有走nat表中的PREROUTING链,当然,走了raw,mangle表中的PREROUTING链。

5、传输过程中,数据包是否被修改过?

5.1、针对master节点上的eth0进行抓包

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

在这里插入图片描述

5.2、针对master节点上的br0网桥进行抓包

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

在这里插入图片描述

5.3、传输过程中数据包的报文内容变化

在这里插入图片描述

即,经过DNAT操作后数据包的变化,如下

在这里插入图片描述

6、总结

  • 通过DNAT操作,可以将内网的服务暴露到外面,以供外网访问。端口映射
  • 通过SNAT或者MASQUERADE操作,可以允许内网去访问外网的服务。
  • DNAT和SNAT刚好相反,
  • 因此,在实际中,要明白到底用哪个?还是一起使用。
  • 比方说,kube-proxy里都使用了DNAT、MASQUERADE操作。
  • 即,通过DNAT将POD里的服务暴露出来,通过MASQUERADE允许POD内部的服务去访问外网服务。

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


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

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

相关文章

Typora 文字快捷修改颜色

Typora 设置字体上色快捷键 1. 安装AutoHotKey AutoHotkey 是一种 免费 和 开源 的微软Windows自定义脚本语言&#xff0c;最初旨在 提供简单的键盘快捷键或热键 &#xff0c; 快速创建宏和软件自动化 。 基于成熟的做法&#xff0c;本脚本也采用 AutoHotKey 实现。 AutoHot…

精炼计算机网络——物理层(一)

文章目录 前言2.1物理层的基本概念2.2 数据通信的基础知识2.2.1 数据通信系统的模型2.2.3 信道的极限容量 2.3 物理层下面的传输媒体2.3.1 导引型传输媒体2.3.2 非导引型传输媒体 总结 前言 经历了两篇文章的学习&#xff0c;相信读者们一定对计算机网络有了一个基础的了解。接…

vue3+element-plus 通过v-infinite实现下拉滚动无限加载

v-infinite官网 v-infinite-scroll无限滚动组件使用详解 1、v-infinite-scroll"load" //load无限滚动加载的方法2、infinite-scroll-disabled //是否禁用无限滚动加载3、infinite-scroll-delay //节流时延&#xff0c;单位为ms4、infinite-scroll-distance //触发加载…

深入理解Java Class文件格式 constant_UTF_info

首先&#xff0c; 让我们回顾一下关于class文件格式的之前两篇博客的主要内容。 在 深入理解Java Class文件格式&#xff08;一&#xff09; 中&#xff0c; 讲解了class文件在整个java体系结构中的位置和作用&#xff0c; 讲解了class文件中的魔数和版本号相关的信息&#xff…

GitHub上“千金难求”的Spring Boot趣味实战全彩版手册,太干了

本书内容极其丰富&#xff0c;不仅涵盖了Spring MVC、MyBatis Plus、SpringData JPA、Spring Security、Quartz等主流框架&#xff0c;整合了MySQL、Druid、Redis、RabbitMQ、Elasticsearch等互联网常用技术与中间件&#xff0c;还涉及单元测试、异常处理、日志、Swagger等技术…

Vue——Vue2项目开发流程以及Element组件库的使用

Vue项目开发流程&#xff08;Vue2演示&#xff09; 在使用Vue提供的脚手架创建的项目文件里面&#xff0c;可以看见引入了三个组件 一个是Vue组件&#xff0c;有了这个下面才可以新建一个Vue实例 一个是App组件&#xff0c;下面将其使用一个render函数打包成了一个DOM元素放…

Redis分片集群和亿级访问量数据处理

一、redis分片集群 1.简介 业务场景&#xff0c;需要存储50G的数据。对于内存和硬盘配置不足&#xff0c;选用两种方式 一种&#xff1a;纵向扩展&#xff1a;加内存&#xff0c;加硬盘&#xff0c;提高CPU。简单、直接。RDB存储效率要考虑。成本要考虑。 二种&#xff1a;横…

016+limou+C语言常用的32个关键字

0.前言 本博文是在对C语言有一定深入了解后&#xff0c;对C语言最为主要的32个关键字进行了简要的概述和一些容易被忽略的细节研究&#xff0c;您可以当作学习或复习C语言基础使用&#xff08;毕竟关键字就是构成C语言语法的基石&#xff09;&#xff0c;也可以提出您所不认同…

java版企业电子招投标采购系统源码之首页设计

功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&#xff0c;为外部…

易岸教育:公务员两科目考试内容是什么?

&#xff08;一&#xff09;《行政能力测验》 《行政能力测验》分为常识判断、言语理解与表达、数量关系、推理判断、资料分析五大部分。 1、常识判断题共20道题&#xff0c;涵盖面广&#xff0c;内容丰富&#xff0c;可归纳为自然科学、社会科学、时事热点三大类。 2、语言…

风扇的气动性能简介

1 风扇的定义 & 分类 风扇是很常见的设备&#xff0c;应用于通风、设备散热等多种场景&#xff0c;典型如家用的电风扇、抽风机&#xff0c;各类电子设备的散热风扇等。 风扇是通过外力驱动叶片旋转引发气体运动的设备。根据AMCA Standard 210-16的规定&#xff0c;风扇对气…

一个滑模控制(SMC)实例及仿真

被控对象 考虑这么一个被控对象 J θ ( t ) u ( t ) d ( t ) J \ddot\theta(t) u(t) d(t) Jθ(t)u(t)d(t) 其中&#xff0c; J J J 为转动惯量&#xff0c; θ \theta θ 为角度&#xff0c; u u u 为控制量&#xff0c; d d d 为扰动&#xff0c;且 d ( t ) < D d(…

联想天逸510S-i5电脑如何重装windows系统

如果你的联想天逸510S-i5电脑出现了系统故障、病毒感染、运行缓慢等问题&#xff0c;你可能需要重装系统来解决。但是&#xff0c;联想天逸510S-i5电脑如何重装windows系统呢?本文将为你介绍两种方法&#xff1a;用U盘重装系统和用联想系统自带的重置功能。 ​ 联想天逸510S…

天气预报查询 API 提供个性化的天气服务的设计思路

引言 假设你是一个开发人员或公司&#xff0c;正在考虑开发一款天气应用程序&#xff0c;但你意识到市场上已经有很多竞争者在使用天气预报查询 API 来提供类似的服务&#xff0c;本文将一起探寻一些创新的方法来提高应用程序的竞争力。 扩大竞争力的一些建议 如果市面上已经…

java企业工程项目管理系统平台源码(三控:进度组织、质量安全、预算资金成本、二平台:招采、设计管理)

工程项目管理软件&#xff08;工程项目管理系统&#xff09;对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#…

OpenWrt SDK 制作与使用

OpenWrt SDK 制作与使用 参考资料&#xff1a;https://openwrt.org/docs/guide-developer/toolchain/using_the_sdk SDK 制作 make menuconfig 选中 SDK 然后编译 编译完后&#xff1a; bin/targets/sunxi/cortexa7/openwrt-sdk-sunxi-cortexa7_gcc-10.2.0_musl_eabi.Linux…

搭建大型分布式服务(四十六)利用mockito不启动SpringBoot项目下进行单元测试

系列文章目录 文章目录 系列文章目录前言一、本文要点二、开发环境三、编写真实类四、编写测试类四、小结 前言 SpringBoot支持集成Mockito做单元测试&#xff0c;有时候SpringBoot有很多外部依赖&#xff0c;在本地很难启动或者启动时间很长&#xff0c;而我们只想对某个方法…

Lattics ——一款简单易用、好看强大的知识管理工具

如何选择一款适合自己的知识管理工具&#xff1f; 对于很多用户而言&#xff0c;在追求效率的路上&#xff0c;经常需要一款适合自己的知识管理工具。然而&#xff0c;随着工具市场的发展&#xff0c;各种新兴工具层出不穷。在传统领域&#xff0c;有印象笔记、Onenote 为代表…

ChatGPT实现知识图谱生成

知识图谱生成 在之前章节中&#xff0c;我们尝试过让 ChatGPT 对一段文本做实体识别和词性分析&#xff0c;结果很不错。但如果是需要长期留存下来&#xff0c;后续在不同场景下快速查询分析&#xff0c;最好还是要把数据存入到专门的图数据库中&#xff0c;才能方便随时读取。…

SpringCloud学习(八)——Docker

文章目录 1. 认识Docker1.1 容器1.2 Linux容器1.3 Docker 2. 配置Docker2.1 安装Docker2.2 启动Docker2.3 配置镜像加速 3. Docker镜像操作3.1 拉取镜像3.2 镜像的打包和加载3.3 查看帮助文档 4. 容器命令4.1 运行容器4.2 进入容器4.3 数据卷 5. 自定义镜像5.1 Dockerfile语法5…