示例:將默認網關重定向到 VPN 上的主機
可以讓一個節點將其所有網絡流量轉發到 VPN 上的主機,從而有效地使用此 VPN
主機作為默認網關。在 OpenVPN 中,有一個 --redirect-gateway為客戶端執行此操作的選項。使用
tinc,沒有這樣的選項,但可以使用 host-up 和 host-down 腳本復制此行為。首先解釋重定向默認網關背后的理論,然后是示例腳本。
示例:將默認網關重定向到 VPN 上的主機
理論
腳本
進一步配置
路由器與交換機模式
理論
通常,路由表中有兩個條目。一個是本地網絡的路由,它告訴內核哪些
IP 地址可直接訪問。第二個是“默認網關”,它告訴內核,為了到達互聯網的其余部分,流量應發送到本地網絡的網關。通常網關是路由器或防火墻設備,其
IPv4 地址通常以 結尾.1。Linux 上的示例輸出route -n:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
這里,LAN
的 IPv4 地址范圍為 192.168.1.0/24,網關為 192.168.1.1。假設我們有一個地址范圍為 172.16.0.0/16 的
VPN,其中存在一個地址為 172.16.1.1 的服務器。如果我們有一個 VPN 連接,并且客戶端想要用指向 172.16.1.1
的默認路由替換標準默認路由,那么就會出現問題:內核不再知道如何將封裝的 VPN 數據包發送到服務器。因此,我們需要為 VPN 服務器的真實 IP
地址的流量添加例外。假設其真實地址為 192.0.32.10,則路由表應變為:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
172.16.1.1 0.0.0.0 255.255.255.255 UH 0 0 0 vpn
192.0.32.10 192.168.1.1 255.255.255.255 UGH 0 0 0 eth0
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
0.0.0.0 172.16.1.1 0.0.0.0 UG 0 0 0 vpn
這將確保本地 LAN 可達、VPN 服務器的真實 IP 地址可通過原始網關可達、VPN 服務器的 VPN IP 地址可通過 VPN 接口可達,并且所有其他流量都通過 VPN 上的服務器進行。
最好不要刪除原始默認網關路由,因為有人可能會終止該tincd進程,這樣它就沒有機會恢復原始路由。相反,我們使用一個技巧,即添加兩個 /1 路由而不是一個 /0 路由:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
172.16.1.1 0.0.0.0 255.255.255.255 UH 0 0 0 vpn
192.0.32.10 192.168.1.1 255.255.255.255 UGH 0 0 0 eth0
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
128.0.0.0 172.16.1.1 128.0.0.0 UG 0 0 0 vpn
0.0.0.0 172.16.1.1 128.0.0.0 UG 0 0 0 vpn
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
由于兩個 /1 覆蓋所有可能的地址,因此當存在兩個 /1 路由時,永遠不會使用真正的默認路由。
腳本
假設我們有兩個節點,分別稱為client和 server,網絡名稱為myvpn。此外,我們假設服務器已正確配置為在 VPN 和 Internet 之間為將其用作默認網關的客戶端執行路由或偽裝。然后,客戶端上只需要兩個腳本。以下腳本是 Linux 專用的:
/etc/tinc/myvpn/hosts/server-up:
#!/bin/sh
VPN_GATEWAY=172.16.1.1
ORIGINAL_GATEWAY=`ip route show | grep ^default | cut -d ' ' -f 2-5`
ip route add $REMOTEADDRESS $ORIGINAL_GATEWAY
ip route add $VPN_GATEWAY dev $INTERFACE
ip route add 0.0.0.0/1 via $VPN_GATEWAY dev $INTERFACE
ip route add 128.0.0.0/1 via $VPN_GATEWAY dev $INTERFACE
/etc/tinc/myvpn/hosts/server-down:
#!/bin/sh
ORIGINAL_GATEWAY=`ip route show | grep ^default | cut -d ' ' -f 2-5`
ip route del $REMOTEADDRESS $ORIGINAL_GATEWAY
ip route del $VPN_GATEWAY dev $INTERFACE
ip route del 0.0.0.0/1 dev $INTERFACE
ip route del 128.0.0.0/1 dev $INTERFACE
這些腳本使用 iproute2 命令,因為它們更易于使用。VPN_GATEWAY必須手動填寫變量。ORIGINAL_GATEWAY變量從原始默認路由復制相關信息,以創建到 VPN 服務器的例外路由。
進一步配置
還必須確保 tinc 守護進程知道將所有數據包發送到哪個節點。確保以下行位于 /etc/tinc/myvpn/hosts/server:
Subnet = 0.0.0.0/0
確保服務器上設置了偽裝或其他形式的路由。不要忘記允許轉發數據包;檢查防火墻設置,并確保內核中啟用了轉發:
echo 1 >/proc/sys/net/ipv4/ip_forward
您還可以設置端口轉發或代理,以便能夠從 Internet 的其余部分連接到客戶端上運行的服務。
路由器與交換機模式
上述示例適用于路由器和交換機模式。然而,在路由器模式下,實際上沒有網關路由。在該模式下,tinc-up 腳本中的以下四行:
VPN_GATEWAY=...
ip route add $VPN_GATEWAY dev $INTERFACE
ip route add 0.0.0.0/1 via $VPN_GATEWAY dev $INTERFACE
ip route add 128.0.0.0/1 via $VPN_GATEWAY dev $INTERFACE
可以用下面兩行替換,沒有任何問題:
ip route add 0.0.0.0/1 dev $INTERFACE
ip route add 128.0.0.0/1 dev $INTERFACE
上一篇:代理 ARP 作為橋接的替代方案
下一篇:簡單橋接與 DHCP 客戶端