专栏首页aCloudDeveloper同主机「跨网段」的两台虚拟机怎么通信?

同主机「跨网段」的两台虚拟机怎么通信?

之前文章有读者留言:

我的回答基本上是一句废话,因为只要你知道点网络的基础知识,肯定知道这种情况要走三层路由。

但知道归知道,不实践永远不知道自己是不是真的知道(有点绕),我相信那位读者也是希望我能讲讲这其中具体是怎么路由的,今天这篇文章就来说说这个。

Linux 本身就是一台路由器

前面的文章我们学习了多种虚拟的网络设备,包括网卡、交换机等,也了解了怎么用工具来操作这些设备,那么,回到今天的主题,路由器有没有对应的虚拟设备,能不能也用相关工具来操作呢,这个答案如果要深究的话,也是有的,比如 OpenStack 的 DVR、一些开源的虚拟路由器实现等等。

不过我们不做那么深究的讨论,简化问题,Linux 系统实际上没有实现相关的虚拟路由器设备,自然也没有工具可以操作路由器,因为 Linux 本身就是一台路由器

Linux 提供一个开关来操作路由功能,就是 /proc/sys/net/ipv4/ip_forward,默认这个开关是关的,打开只需:

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

但这种打开方式只是临时的,如果要一劳永逸,可以修改配置文件 /etc/sysctl.conf,添加或修改项 net.ipv4.ip_forward 为:

net.ipv4.ip_forward = 1

即可。

实践

为了降低大家实践的难度,我们就不创建虚拟机了,直接使用 namespace,一条 ip 命令就可以搞定所有的操作。

我们按照下面的图示进行操作(NS1 和 NS2 分布在不同网段):

创建两个 namespace:

ip netns add ns1
ip netns add ns2

创建两对 veth-pair,一端分别挂在两个 namespace 中:

ip link add v1 type veth peer name v1_r
ip link add v2 type veth peer name v2_r

ip link set v1 netns ns1
ip link set v2 netns ns2

分别给两对 veth-pair 端点配上 IP 并启用:

ip a a 10.10.10.1/24 dev v1_r
ip l s v1_r up
ip a a 10.10.20.1/24 dev v2_r
ip l s v2_r up

ip netns exec ns1 ip a a 10.10.10.2/24 dev v1
ip netns exec ns1 ip l s v1 up
ip netns exec ns2 ip a a 10.10.20.2/24 dev v2
ip netns exec ns2 ip l s v2 up

验证一下: v1 ping v2,结果不通。

看下 ip_forward 的值:

[root@by ~]# cat /proc/sys/net/ipv4/ip_forward
0

没开路由怎么通,改为 1 再试,还是不通。

看下 ns1 的路由表:

[root@by ~]# ip netns exec ns1 route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.10.10.0      0.0.0.0         255.255.255.0   U     0      0        0 v1

只有一条直连路由,没有去往 10.10.20.0/24 网段的路由,怎么通?那就给它配一条:

[root@by ~]# ip netns exec ns1 route add -net 10.10.20.0 netmask 255.255.255.0 gw 10.10.10.1

[root@by ~]# ip netns exec ns1 route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.10.10.0      0.0.0.0         255.255.255.0   U     0      0        0 v1
10.10.20.0      10.10.10.1      255.255.255.0   UG    0      0        0 v1

同理也给 ns2 配上去往 10.10.10.0/24 网段的路由。

最后再 ping,成功了!

[root@by ~]# ip netns exec ns1 ping 10.10.20.2
PING 10.10.20.2 (10.10.20.2) 56(84) bytes of data.
64 bytes from 10.10.20.2: icmp_seq=1 ttl=63 time=0.071 ms
64 bytes from 10.10.20.2: icmp_seq=2 ttl=63 time=0.070 ms
^C
--- 10.10.20.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.070/0.070/0.071/0.008 ms

总结

Linux 本身是一台路由器。

上面的实验使用 namespace 效果和使用虚拟机是一样的,关键是知道有这个功能,知道怎么用就差不多了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 一文搞懂 Linux network namespace

    本文通过 IP 命令操作来简单介绍 network namespace 的基本概念和用法。深入了解可以看看我之前写的两篇文章 Docker 基础技术之 Linu...

    CloudDeveloper
  • 什么是 IP 隧道,Linux 怎么实现隧道通信?

    通过之前的文章,我们知道 tun 是一个网络层的设备,也被叫做点对点设备,之所以叫这个名字,是因为 tun 常常被用来做隧道通信(tunnel)。

    CloudDeveloper
  • Linux 网络工具详解之 ip tuntap 和 tunctl 创建 tap/tun 设备

    在前面一篇文章中,我们已经介绍了 tap/tun 的基本原理,本文将介绍如何使用工具 tunctl 和 ip tuntap 来创建并使用 tap/tun 设备。

    CloudDeveloper
  • python脚本修改hosts文件

    记一次使用python脚本来修改hosts文件,由于公司服务器需要换ip地址,服务器里都是Linux系统,而hosts文件中有些解析的ip,手动一台一台的解析太...

    用户2398817
  • SpringBoot自定义拦截器实现IP白名单功能

    转载请注明源地址:http://www.cnblogs.com/funnyzpc/p/8993331.html

    上帝
  • SpringBoot自定义拦截器实现IP白名单功能

    上帝
  • SpringBoot自定义拦截器实现IP白名单功能

    上帝
  • 一个简单的ip黑名单实例

    Youngxj
  • shell脚本-shell的getops 原

    (adsbygoogle = window.adsbygoogle || []).push({});

    阿dai学长
  • 动态IP池

    IP的抓取我选择的是西刺代理,这个网站的IP是免费提供的,但是它的IP极其不稳定,可能几分钟前能用,几分钟后就失效了。从西刺要抓取IP地址以及端口,类型。

    用户2769421

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动