連結兩個私有內網

作者: Yong-Siang Shih / Wed 12 November 2014 / 分類: Notes

linux, network, subnet

實驗室的工作站先生們待在兩個不同的內網,各自透過一台工作站當 gateway 和外面的世界溝通。因此,要連結彼此時,常需要透過 gateway 的特定 port 來轉送到 sshd。這樣每台機器的其他不同 services 也都要額外開個 port,感覺非常不方便。

記得學長大大離開實驗室前,總是不能忘懷他們無法在一起的困難。於是晚輩們就決定試圖解決這個問題了!

機器配置

假設現在有兩群工作站:

bob     eth0: 192.168.13.1/24  eth1: 140.112.13.5
jack    eth0: 192.168.13.2/24

ted     eth0: 192.168.14.1/24  eth1: 140.112.14.20
nick    eth0: 192.168.14.2/24

其中,bob 和 ted 有接上 Internet,而 jack 接到 bob,nick 接到 ted,並透過他們連結外網。我們希望讓 jack 和 nick 可以直接連結。

作法

Bob 的設定

我們將會在 bob 和 ted 之間建立一個 tunnel,然後修改 routing table 將送往另一個內網的流量導進 tunnel 之中。

首先,在 bob 的 /etc/network/interface 中,修改 eth0 的設置(或者修改 eth1 也可以,不過考慮到如果 eth1 改錯可能就無法用 ssh 連進來,所以先改 eth0):

auto eth0
iface eth0 inet static
        address 192.168.13.1
        netmask 255.255.255.0
        network 192.168.13.0
        broadcast 192.168.13.255
        pre-up ip tunnel add mytunnel mode ipip remote 140.112.14.20
        up ip addr add 192.168.15.5/24 dev mytunnel
        up ip link set dev mytunnel up
        up ip route add 192.168.14.0/24 via 192.168.15.20
        down ip route del 192.168.14.0/24 via 192.168.15.20
        post-down ip tunnel del mytunnel

主要是要讓 bob 連結內網時,自動建立起 tunnel,而切斷連線時自動取消,在實際修改檔案前,也可以先用指令列測試其中的指令:

首先是建立一個虛擬的 tunnel 界面,並連結到 ted 的外部 IP:

sudo ip tunnel add mytunnel mode ipip remote 140.112.14.20

緊接著,隨意為 bob 在此界面指定一個 IP:

sudo up ip addr add 192.168.15.5/24 dev mytunnel

再來,把界面啟動連結:

sudo up ip link set dev mytunnel up

最後再設定把連到另一個內網的流量都導到 ted 在此 tunnel 的 IP:

sudo up ip route add 192.168.14.0/24 via 192.168.15.20

Ted 的設定

同樣的道理,在 ted 的 /etc/network/interface 中,修改 eth0 的設置,加入以下項目:

pre-up ip tunnel add mytunnel mode ipip remote 140.112.13.5
up ip addr add 192.168.15.20/24 dev mytunnel
up ip link set dev mytunnel up
up ip route add 192.168.13.0/24 via 192.168.15.5
down ip route del 192.168.13.0/24 via 192.168.15.5
post-down ip tunnel del mytunnel

啟用 IP Forwarding

理論上原本工作站的內網設置應該就有啟用 IP forwarding 的功能,不過為求完整,在這裡記載啟用的方法。可以在 bob 和 ted 上執行以下指令:

sudo sysctl -w net.ipv4.ip_forward=1

此外,若要讓此設定開機後仍然維持,則需修改 /etc/sysctl.conf,並取消註解以下的項目:

#net.ipv4.ip_forward=1

啟用新網路設定

接下來就可以在 bob 和 ted 上執行以下指令使新設定生效了:

sudo ifdown eth0 && ifup eth0

注意由於一開始 down 和 post-down 的指令可能會失敗,所以如果直接執行以上指令有可能會有問題,這時也可以重新開機。或者稍微修改一下指令執行及檔案修改的順序來達成想要的效果。

測試

可以在 bob 和 jack 上測試以下指令:

ping 192.168.14.2

在 ted 和 nick 上測試以下指令:

ping 192.168.13.2

參考

如果想要把兩組機器都放進同個內網,也可以參考更進階的:

Notebook
Yong-Siang Shih

作者

Yong-Siang Shih

軟體工程師,機器學習科學家,開放原始碼愛好者。曾在 Appier 從事機器學習系統開發,也曾在 Google, IBM, Microsoft 擔任軟體實習生。喜好探索學習新科技。* 在 GitHub 上追蹤我

載入 Disqus 評論