本文首发于个人公众号 cloud_dev,专一于干货分享,号内有大量书籍和视频资源,后台回复 「1024」便可领取,欢迎你们关注,二维码文末能够扫。
这篇文章继上篇文章 Linux 虚拟网络设备详解之 Bridge,上篇发表以后,有读者问我这样一个问题:编程
个人回答基本上是一句废话,由于只要你知道点网络的基础知识,确定知道这种状况要走三层路由。网络
但知道归知道,不实践永远不知道本身是否是真的知道(有点绕),我相信那位读者也是但愿我能讲讲这其中具体是怎么路由的,今天这篇文章就来讲说这个。工具
前面的文章咱们学习了多种虚拟的网络设备,包括网卡、交换机等,也了解了怎么用工具来操做这些设备,那么,回到今天的主题,路由器有没有对应的虚拟设备,能不能也用相关工具来操做呢,这个答案若是要深究的话,也是有的,好比 OpenStack 的 DVR、一些开源的虚拟路由器实现等等。学习
不过咱们不作那么深究的讨论,简化问题,Linux 系统实际上没有实现相关的虚拟路由器设备,天然也没有工具能够操做路由器,由于 Linux 自己就是一台路由器。(这也是我文章的标题对 vRouter 打双引号的缘由)云计算
Linux 提供一个开关来操做路由功能,就是 /proc/sys/net/ipv4/ip_forward
,默认这个开关是关的,打开只需:spa
echo 1 > /proc/sys/net/ipv4/ip_forward
但这种打开方式只是临时的,若是要一劳永逸,能够修改配置文件 /etc/sysctl.conf
,添加或修改项 net.ipv4.ip_forward
为:3d
net.ipv4.ip_forward = 1
便可。code
为了下降你们实践的难度,咱们就不建立虚拟机了,直接使用 namespace,一条 ip
命令就能够搞定全部的操做。视频
咱们按照下面的图示进行操做(NS1 和 NS2 分布在不一样网段):blog
建立两个 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 效果和使用虚拟机是同样的,关键是知道有这个功能,知道怎么用就差很少了。
个人公众号 cloud_dev,号内有大量书籍和视频资源,后台回复 「1024」便可领取,分享的内容包括但不限于云计算虚拟化、容器、OpenStack、K8S、雾计算、网络、工具、SDN、OVS、DPDK、Linux、Go、Python、C/C++编程技术等内容,欢迎你们关注。