Linux 虛擬網絡設備詳解之 「vRouter」

本文首發於個人公衆號 cloud_dev,專一於乾貨分享,號內有大量書籍和視頻資源,後臺回覆 「1024」便可領取,歡迎你們關注,二維碼文末能夠掃。

這篇文章繼上篇文章 Linux 虛擬網絡設備詳解之 Bridge,上篇發表以後,有讀者問我這樣一個問題:編程

個人回答基本上是一句廢話,由於只要你知道點網絡的基礎知識,確定知道這種狀況要走三層路由。網絡

但知道歸知道,不實踐永遠不知道本身是否是真的知道(有點繞),我相信那位讀者也是但願我能講講這其中具體是怎麼路由的,今天這篇文章就來講說這個。工具

Linux 自己就是一臺路由器

前面的文章咱們學習了多種虛擬的網絡設備,包括網卡、交換機等,也瞭解了怎麼用工具來操做這些設備,那麼,回到今天的主題,路由器有沒有對應的虛擬設備,能不能也用相關工具來操做呢,這個答案若是要深究的話,也是有的,好比 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++編程技術等內容,歡迎你們關注。

相關文章
相關標籤/搜索