【无标题】网络命名空间中创建双网卡

news/2024/11/20 8:12:22/

这里写自定义目录标题

  • 创建 veth peer 接口对
  • 将 veth1 移动到名为 ns1 的网络命名空间
  • 配置命名空间 veth1 的ip地址
  • 配置命名空间 路由规则
  • 配置命名空间 NAT 规则
  • 获取容器的命名空间

如果网络命名空间和宿主机的 IP 地址不在同一网段,它们之间仍然可以通过配置适当的路由进行通信。
关键是需要确保宿主机和网络命名空间之间有适当的路由规则,并且可以进行地址转换。
你可以使用 NAT(网络地址转换) 或 路由 来实现这种跨网段的通信。

情景假设:
宿主机的物理网卡 eth0 IP 地址 192.168.33.180
宿主机的 IP 地址为 10.0.0.1/24(宿主机的接口 veth0)。
网络命名空间的 IP 地址为 10.0.0.20/24(网络命名空间的接口是 veth1)。

步骤 1:创建 net 命名空间和接口对

ip netns add ns1

创建 veth peer 接口对

ip link add veth0 type veth peer name veth1

将 veth1 移动到名为 ns1 的网络命名空间

ip link set veth1 netns ns1

步骤 2:配置 IP 地址
分别为宿主机和网络命名空间配置 IP 地址(假设宿主机和命名空间的 IP 地址不在同一网段):

配置宿主机接口(veth0):

ip addr add 10.0.0.1/24 dev veth0
ip link set veth0 up

配置网络命名空间接口(veth1):

ip netns exec ns1 ip addr add 10.0.0.15/24 dev veth1
ip netns exec ns1 ip link set veth1 up

步骤 3:配置宿主机 iptables 转发规则
由于宿主机和网络命名空间的 IP 地址不在同一网段,我们需要设置NAT让网络命名空间可上网。
为宿主机启用 IP 转发(允许转发流量):

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

配置宿主机的iptables规则:

s:/ # iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE

上述命令的作用是,将所有从 10.0.0.0/24 网段发出的流量转换为宿主机 eth0 接口的外部 IP 地址。

验证配置内容。

s:/ # iptables -t nat -vnL
Chain PREROUTING (policy ACCEPT 528 packets, 114K bytes)pkts bytes target     prot opt in     out     source               destination         1054  225K oem_nat_pre  all  --  *      *       0.0.0.0/0            0.0.0.0/0           Chain INPUT (policy ACCEPT 417 packets, 106K bytes)pkts bytes target     prot opt in     out     source               destination         Chain OUTPUT (policy ACCEPT 60 packets, 16483 bytes)pkts bytes target     prot opt in     out     source               destination         Chain POSTROUTING (policy ACCEPT 63 packets, 17955 bytes)pkts bytes target     prot opt in     out     source               destination         142 33637 tetherctrl_nat_POSTROUTING  all  --  *      *       0.0.0.0/0            0.0.0.0/0           5   420 MASQUERADE  all  --  *      eth0    10.0.0.0/24          0.0.0.0/0           6   504 MASQUERADE  all  --  *      eth0    10.10.0.0/16         0.0.0.0/0           Chain oem_nat_pre (1 references)pkts bytes target     prot opt in     out     source               destination         Chain tetherctrl_nat_POSTROUTING (1 references)pkts bytes target     prot opt in     out     source               destination         

步骤 4:配置命名空间参数

配置命名空间 veth1 的ip地址

ip netns exec ns1 ip addr add 10.0.0.15/24 dev veth1
ip link set veth1 up

设置ip地址并拉起网卡;

配置命名空间 路由规则

ip netns exec ns1 ip rout add default via 10.0.0.1 

查看路由配置结果

kona:/ # ip netns exec ns1 ip rout ls
default via 10.0.0.1 dev veth1 
default via 10.10.0.1 dev wlan1 metric 100 
10.0.0.0/24 dev veth1 proto kernel scope link src 10.0.0.15 
10.10.0.0/16 dev wlan1 proto kernel scope link src 10.10.0.15 

配置命名空间 NAT 规则

ip netns exec ns1 iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o veth1 -j MASQUERADE

查看 iptablse 规则

kona:/ # ip netns exec ns1 iptables -t nat -nvL
Chain PREROUTING (policy ACCEPT 100 packets, 26969 bytes)pkts bytes target     prot opt in     out     source               destination         Chain INPUT (policy ACCEPT 1 packets, 84 bytes)pkts bytes target     prot opt in     out     source               destination         Chain OUTPUT (policy ACCEPT 14 packets, 1176 bytes)pkts bytes target     prot opt in     out     source               destination         Chain POSTROUTING (policy ACCEPT 7 packets, 588 bytes)pkts bytes target     prot opt in     out     source               destination         8   672 MASQUERADE  all  --  *      veth1   10.0.0.0/24          0.0.0.0/0           0     0 MASQUERADE  all  --  *      *       10.0.0.0/24          0.0.0.0/0         

步骤 5:验证通信
宿主机与网络命名空间的通信:

在宿主机上使用 ping 测试与网络命名空间的连接:

kona:/ # ping 10.0.0.15                                                                                                                                                             
PING 10.0.0.15 (10.0.0.15) 56(84) bytes of data.
64 bytes from 10.0.0.15: icmp_seq=1 ttl=64 time=0.201 ms
64 bytes from 10.0.0.15: icmp_seq=2 ttl=64 time=0.245 ms
64 bytes from 10.0.0.15: icmp_seq=3 ttl=64 time=0.244 ms

网络命名空间上网通信:

ip netns exec ns1 ping -I 10.0.0.15 www.bing.com
PING china.bing123.com (202.89.233.101) from 10.0.0.15 : 56(84) bytes of data.
64 bytes from 202.89.233.101: icmp_seq=1 ttl=116 time=4.49 ms
64 bytes from 202.89.233.101: icmp_seq=2 ttl=116 time=9.55 ms
64 bytes from 202.89.233.101: icmp_seq=3 ttl=116 time=4.83 ms

步骤 6:把 veth1 创建到容器网络命名空间

获取容器的命名空间

kona:/ # docker inspect con6|grep id"Pid": 13455,
kona:/ # mkdir -p /var/run/netns/13455
kona:/ # ln -s /proc/13455/ns/net /var/run/netns/13455
kona:/ # nsenter -t 13455 -n ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000link/ipip 0.0.0.0 brd 0.0.0.0
3: gre0@NONE: <NOARP> mtu 1476 qdisc noop state DOWN group default qlen 1000link/gre 0.0.0.0 brd 0.0.0.0
4: gretap0@NONE: <BROADCAST,MULTICAST> mtu 1462 qdisc noop state DOWN group default qlen 1000link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
5: erspan0@NONE: <BROADCAST,MULTICAST> mtu 1450 qdisc noop state DOWN group default qlen 1000link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
6: ip_vti0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000link/ipip 0.0.0.0 brd 0.0.0.0
7: ip6_vti0@NONE: <NOARP> mtu 1364 qdisc noop state DOWN group default qlen 1000link/tunnel6 :: brd ::
8: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000link/sit 0.0.0.0 brd 0.0.0.0
9: ip6tnl0@NONE: <NOARP> mtu 1452 qdisc noop state DOWN group default qlen 1000link/tunnel6 :: brd ::
10: ip6gre0@NONE: <NOARP> mtu 1448 qdisc noop state DOWN group default qlen 1000link/gre6 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00 brd 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
11: rmnet0@if15: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000link/ether f8:02:78:9d:88:44 brd ff:ff:ff:ff:ff:ff link-netnsid 0inet 192.168.33.16/24 brd 192.168.33.255 scope global rmnet0valid_lft forever preferred_lft foreverinet6 fe80::91a0:2fd9:8bf:2dc6/64 scope link stable-privacy valid_lft forever preferred_lft forever
12: rmnet1@if15: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000link/ether f8:02:78:9d:88:44 brd ff:ff:ff:ff:ff:ff link-netnsid 0
13: wlan0@if15: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000link/ether f8:02:78:9d:88:44 brd ff:ff:ff:ff:ff:ff link-netnsid 0inet 192.168.33.14/24 brd 192.168.33.255 scope global wlan0valid_lft forever preferred_lft forever

如何把 veth peer 创建到容器的网络命名空间,待时间方便时不这个内容补齐。


http://www.ppmy.cn/news/1548442.html

相关文章

编译报错:protoc did not exit cleanly. Review output for more information.

目录标题 解决“protoc did not exit cleanly”的报错问题检查.proto文件的语法 解决“protoc did not exit cleanly”的报错问题 今天做的项目需要用到grpc&#xff0c;然后需要编写proto然后编译后实现grpc的具体方法&#xff01; 结果编译的时候报了protoc did not exit cl…

【Linux】用户和用户组管理

管理用户 1&#xff0e;添加用户账号——useradd命令 【实例2-1-1】 按系统默认配置添加指定用户账号st和stu。 # 添加用户账号st [rootlocalhost ~]# useradd st # 添加用户账号stu [rootlocalhost ~]# useradd stu【实例2-1-2】添加用户账号stu01&#xff0c;UID为1004&am…

矩阵论在图像算法中的应用

摘要&#xff1a; 本文详细阐述了矩阵论在图像算法中的广泛应用。首先介绍了图像在计算机中的矩阵表示形式&#xff0c;然后从图像压缩、图像变换、图像特征提取与识别、图像恢复与重建等多个方面深入分析了矩阵论相关技术的作用原理和优势。通过对这些应用的探讨&#xff0c;展…

私域流量与视频号直播的融合创新:以 2+1 链动模式 S2B2C 商城小程序为例

摘要&#xff1a;本研究探讨了私域流量与视频号直播融合创新的路径及对商业发展的推动作用。通过分析私域流量的稳定性与个性化营销&#xff0c;以及视频号直播的社交属性和公域引流优势&#xff0c;阐述了21链动模式S2B2C商城小程序的内涵与机制、功能与优势。以门店实践策略和…

Ubuntu安装Microsoft Edge浏览器

1、官网下载地址&#xff1a;Microsoft Edge 2、安装 进入安装包目录&#xff0c;打开终端输入&#xff1a;sudo dpkg -i <安装包名> 如&#xff1a;我的安装包名为 microsoft-edge-stable_130.0.2849.80-1_amd64.deb sudo dpkg -i microsoft-edge-stable_130.0.2849.8…

J.U.C - 深入解读Condition条件变量原理源码

文章目录 Pre概述Condition 主要方法Condition案例Condition的源码解析1. 等待&#xff1a;condition. await2. 唤醒Condition. signal Condition总结 Pre J.U.C - 深入解析ReentrantLock原理&源码 概述 配合synchronized同步锁在同步代码块中调用加锁对象notify和wait方…

【MCU】GD32H7定时器使用外部时钟源

1、定时器可以使用系统内部的mcuclk&#xff0c;也可以通过管脚使用外部输入的时钟源 2、GD32H7怎么使用外部的源来驱动定时器呢 3、GD32H7通用定时器的框图如下&#xff1a; 这是官方手册上的图&#xff0c;不得不说&#xff0c;画的不够详细&#xff0c;只是一个大概的框图…

kafka-clients之max.block.ms

max.block.ms 是 Kafka 客户端Producer配置中的一个参数&#xff0c;决定了客户端阻塞的最大时间。当生产者调用某些方法&#xff08;如 send() &#xff09;时&#xff0c;如果客户端在内部遇到某些资源&#xff08;如元数据或可用的缓冲区空间&#xff09;不可用&#xff0c;…