重定向網(wǎng)關(guān)
示例:將默認(rèn)網(wǎng)關(guān)重定向到 VPN 上的主機
可以讓一個節(jié)點將其所有網(wǎng)絡(luò)流量轉(zhuǎn)發(fā)到 VPN 上的主機,從而有效地使用此 VPN 主機作為默認(rèn)網(wǎng)關(guān)。在 OpenVPN 中,有一個 --redirect-gateway為客戶端執(zhí)行此操作的選項。使用 tinc,沒有這樣的選項,但可以使用 host-up 和 host-down 腳本復(fù)制此行為。首先解釋重定向默認(rèn)網(wǎng)關(guān)背后的理論,然后是示例腳本。
示例:將默認(rèn)網(wǎng)關(guān)重定向到 VPN 上的主機
理論
腳本
進一步配置
路由器與交換機模式
理論
通常,路由表中有兩個條目。一個是本地網(wǎng)絡(luò)的路由,它告訴內(nèi)核哪些 IP 地址可直接訪問。第二個是“默認(rèn)網(wǎng)關(guān)”,它告訴內(nèi)核,為了到達互聯(lián)網(wǎng)的其余部分,流量應(yīng)發(fā)送到本地網(wǎng)絡(luò)的網(wǎng)關(guān)。通常網(wǎng)關(guān)是路由器或防火墻設(shè)備,其 IPv4 地址通常以 結(jié)尾.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,網(wǎng)關(guān)為 192.168.1.1。假設(shè)我們有一個地址范圍為 172.16.0.0/16 的 VPN,其中存在一個地址為 172.16.1.1 的服務(wù)器。如果我們有一個 VPN 連接,并且客戶端想要用指向 172.16.1.1 的默認(rèn)路由替換標(biāo)準(zhǔn)默認(rèn)路由,那么就會出現(xiàn)問題:內(nèi)核不再知道如何將封裝的 VPN 數(shù)據(jù)包發(fā)送到服務(wù)器。因此,我們需要為 VPN 服務(wù)器的真實 IP 地址的流量添加例外。假設(shè)其真實地址為 192.0.32.10,則路由表應(yīng)變?yōu)椋?br/>
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 服務(wù)器的真實 IP 地址可通過原始網(wǎng)關(guān)可達、VPN 服務(wù)器的 VPN IP 地址可通過 VPN 接口可達,并且所有其他流量都通過 VPN 上的服務(wù)器進行。
最好不要刪除原始默認(rèn)網(wǎng)關(guān)路由,因為有人可能會終止該tincd進程,這樣它就沒有機會恢復(fù)原始路由。相反,我們使用一個技巧,即添加兩個 /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 覆蓋所有可能的地址,因此當(dāng)存在兩個 /1 路由時,永遠(yuǎn)不會使用真正的默認(rèn)路由。
腳本
假設(shè)我們有兩個節(jié)點,分別稱為client和 server,網(wǎng)絡(luò)名稱為myvpn。此外,我們假設(shè)服務(wù)器已正確配置為在 VPN 和 Internet 之間為將其用作默認(rèn)網(wǎng)關(guān)的客戶端執(zhí)行路由或偽裝。然后,客戶端上只需要兩個腳本。以下腳本是 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變量從原始默認(rèn)路由復(fù)制相關(guān)信息,以創(chuàng)建到 VPN 服務(wù)器的例外路由。
進一步配置
還必須確保 tinc 守護進程知道將所有數(shù)據(jù)包發(fā)送到哪個節(jié)點。確保以下行位于 /etc/tinc/myvpn/hosts/server:
Subnet = 0.0.0.0/0
確保服務(wù)器上設(shè)置了偽裝或其他形式的路由。不要忘記允許轉(zhuǎn)發(fā)數(shù)據(jù)包;檢查防火墻設(shè)置,并確保內(nèi)核中啟用了轉(zhuǎn)發(fā):
echo 1 >/proc/sys/net/ipv4/ip_forward
您還可以設(shè)置端口轉(zhuǎn)發(fā)或代理,以便能夠從 Internet 的其余部分連接到客戶端上運行的服務(wù)。
路由器與交換機模式
上述示例適用于路由器和交換機模式。然而,在路由器模式下,實際上沒有網(wǎng)關(guān)路由。在該模式下,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
上一篇: 簡單橋接與 DHCP 客戶端
下一篇: 代理 ARP 作為橋接的替代方案