實驗室的工作站先生們待在兩個不同的內網,各自透過一台工作站當 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
參考
如果想要把兩組機器都放進同個內網,也可以參考更進階的: