讓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