讓RT-AC68U的OpenVPN client存取其他子網段 === ###### tags: `Router` ## 前言 AC68U內建的OpepVPN client可以存取本身的DHCP子網段, 以及AC68U本身, 但如果該網路拓墣存在其他子網段, 例如想要存取AC68U上層的Router(Ex: 中華電信小烏龜), 及位於小烏龜下層, 與AC68U平行的其他子網段, 就會發生ping不到設備的問題 在開始實作之前, 必須要確認在不使用vpn client的狀況下, 各個子網域的設備是可以互相ping得到的 本文只針對vpn client無法存取其他子網段的問題做說明 ## 網路拓墣 {%hackmd s1x7XDQzSWmym0gE8IKQNQ %} ## 網路環境 * RT-AC68U firmware: merlin 386.2 * RT-AC68U使用PPPoE取得Wan IP, 並且開啟OpenVPN server * RT-AC68U開啟NAT與DHCP server, NAT網段為192.168.20.0/24 * RT-AC68U關閉防火牆 * P880, RB750Gr3, RT-AC68U需先設置靜態路由 [參照這篇](https://hackmd.io/@Cyui/ByqFqs0UO) ## 正文開始 進入AC68U的設定頁面後, 把*系統管理->系統設定->啟動SSH*的選項打開 之後使用ssh連線至AC86U, IP及帳號依機器設定不同需自行更改 `$ ssh 192.168.20.1 -l admin` 接下來以下面的指令來看一下iptables的規則, 在這裏只列出有關聯的Chain `# iptables -L -v --line-numbers` ``` Chain FORWARD (policy ACCEPT 1011 packets, 46224 bytes) num pkts bytes target prot opt in out source destination 1 23688 1109K TCPMSS tcp -- any any anywhere anywhere tcpflags: SYN,RST/SYN TCPMSS clamp to PMTU 2 74591 47M ACCEPT all -- any any anywhere anywhere state RELATED,ESTABLISHED 3 320 16672 other2wan all -- !br0 ppp0 anywhere anywhere 4 0 0 DROP all -- !br0 eth0 anywhere anywhere 5 0 0 ACCEPT all -- br0 br0 anywhere anywhere 6 93 5167 DROP all -- any any anywhere anywhere state INVALID 7 22600 1170K NSFW all -- any any anywhere anywhere 8 0 0 ACCEPT all -- any any anywhere anywhere ctstate DNAT 9 22600 1170K OVPN all -- any any anywhere anywhere state NEW Chain other2wan (2 references) num pkts bytes target prot opt in out source destination 1 322 16792 RETURN all -- tun+ any anywhere anywhere 2 0 0 DROP all -- any any anywhere anywhere ``` 從FORWARD Chain的第3條規則可以看出來如果封包來源非br0且想要送往ppp0的話, 就會執行other2wan的策略, 在此策略內又判斷如果是來自tun的話, 封包則不會DROP 接下來往第4條規則看, 發現與第3條相似, 但差別在如果封包是送往eth0的話, 則封包全部DROP, 這就是為什麼vpn client端ping不到小烏龜及其他子網域的原因 既然知道原因了, 那解決的方法就是第4條規則不要執行DROP策略即可 要達到上述目的有好幾種方式, 下面是其中一種做法 使用以下指令更改FORWARD Chain第4條規則, 讓送往eth0的封包與第3條規則使用相同策略 `# iptables -R FORWARD 4 ! -i br0 -o eth0 -j other2wan` 設定完後再檢查一下FORWARD Chain內的規則 `# iptables -L FORWARD -v --line-numbers` ``` num pkts bytes target prot opt in out source destination 1 25052 1170K TCPMSS tcp -- any any anywhere anywhere tcpflags: SYN,RST/SYN TCPMSS clamp to PMTU 2 82942 52M ACCEPT all -- any any anywhere anywhere state RELATED,ESTABLISHED 3 385 20617 other2wan all -- !br0 ppp0 anywhere anywhere 4 2 120 other2wan all -- !br0 eth0 anywhere anywhere 5 0 0 ACCEPT all -- br0 br0 anywhere anywhere 6 93 5167 DROP all -- any any anywhere anywhere state INVALID 7 23951 1233K NSFW all -- any any anywhere anywhere 8 0 0 ACCEPT all -- any any anywhere anywhere ctstate DNAT 9 23951 1233K OVPN all -- any any anywhere anywhere state NEW ``` 確認第4條規則執行other2wan的策略, 現在vpn client應該要可以ping得到其他子網段了 ## 儲存設定 如果沒有把設定儲存寫入至AC68U的話, 每次重開機時上述做的設定都會被重置, 下面的操作可以避免每次重開機都要重新設定的困擾 進入AC68U的設定頁面後把*系統管理->系統設定->Enable JFFS custom scripts and configs* 的選項打開, 接下來同樣以ssh連線至AC86U後進行以下操作: 先建立一個空的自定義script檔案 `# touch /jffs/scripts/firewall-start` 編輯script `# vi /jffs/scripts/firewall-start` 插入以下內容後儲存離開vi ``` bash #!/bin/sh iptables -R FORWARD 4 ! -i br0 -o eth0 -j other2wan ``` 賦予檔案執行的權限 `# chmod a+rx /jffs/scripts/firewall-start` 到這裡就完成了所有設定, 每當AC68U開機時便會自動執行自定義的script 接下來我們可以選擇重新開機, 順便觀察script是否有生效: `# reboot` :diamond_shape_with_a_dot_inside:Cyui