為了方面在家時可以取得公司電腦的資料,便直接在 NAT server 上面設定自動連接 VPN
方法可參考之前寫的 linux 中使用 pptp client 連線到windows vpn server 包含 mppe-128 支援
一切看起來都運作的很好,直到有一天在公司突然想連線回家裡電腦拿些資料
卻發現無法連線,VPN 關掉後卻可以正常,看來問題是出在 VPN 上
經過一番研究,終於發現問題出在哪了
從公司連線到家裡網路時,封包內容: src ip=公司ip, dest ip=家裡ISP ip
回應時封包內容: src ip=家裡ISP ip, dest ip=公司ip
這邊看起來都正常沒錯,但是在有 VPN 的情況下
本來應該透過 ISP 回去的封包,會因為 VPN 的 routing 設定變成透過 VPN,所以封包會 lost
這時就必須透過 iproute2 提供的 ip 來指定特定的 routing rule,如下:
假設公司網域: 192.168.0.0/16 家裡網路gateway: 1.2.3.254, 家裡ip: 1.2.3.4
#把新的 routing path 加入 routing table 100 中
ip route add 192.168.0.0/16 via 1.2.3.254 table 100
#新增 routing rule,當符合時參考 table 100 中定義應該往那丟封包
ip rule add from 1.2.3.4 to 192.168.0.0/16 table 100
解釋一下上面兩行指令的作用:
linux kernel 處理封包流程會先參考 ip rule 的設定,可用 ip rule ls 察看:
# ip rule ls
0: from all lookup local
32765: from 1.2.3.4 to 192.168.0.0/16 lookup 100
32766: from all lookup main
32767: from all lookup default
(除了第2條是剛剛加進去的以外,其他是預設值,所以在預設情況下,並不會察看封包的來源)
當 rule 條件符合時,察看相關的 routing table,可用 ip route ls table 100/main/... 看 table 內容:
# ip route ls table 100
192.168.0.0/16 via 1.2.3.254 dev ppp0
這樣就可以讓從 ISP 近來的封包一樣從 ISP 回去,而不是 VPN
ps. routing table 可以指定名稱在 /etc/iproute2/rt_tables