透過 Forwarding 設定轉送 VPN
- #vpn
這兒用樹莓派搭配 Raspberry Pi OS 當作跳板安裝 openfortivpn 為範例,開發環境使用 Mac,期望結果是使用的連線請求中如果有包含需要跳 VPN 的 IP 則透過樹莓派進行轉送,其餘則依照原來的方式進行網路溝通,避免資安疑慮或風險。
樹莓派 & openfortivpn 流程
除了安裝 openfortivpn 也會依序設定 route、IP Forwarding 與 nftables,另外稍加解釋名詞或套件,參考一下指令進行安裝
- tcpdump: 查看網路流量
- IP Forwarding: 允許 Linux 核心收到封包進行轉送
- nftables / iptables: 轉送封包(NAT),nftables 與 iptables 擇一安裝使用即可,推薦使用 nftables 因 debian 系列預設是使用 nftables
apt install openfortivpn tcpdump nftables iptables -y
openfortivpn & route 設定
設定 openfortivpn host 跟 port 是服務開出來的網址,username 與 password 是帳密,而 trusted-cert 是金鑰,如果是第一次使用未填寫則會生成,填入後再使用一次即可,set-routes 則是避免所有流量都走 VPN,得另外設定 route 才使用。
nvim /etc/openfortivpn/config
host = example.com
port = 443
uesrname = amu
password = 0000
trusted-cert = 1234abcd
set-routes = 0
openfortivpn
使用後只要內容裡有包含 INFO: Tunnel is up and running. 即完成 openfortivpn 的設定,緊接著新增需要轉跳的 IP 進入 route 內,
ip route add {IP} dev ppp0
查看是否新增成功
ip route get {IP}
需要啟用時直接啟動 openfortivpn 則設定一下 systemctl
systemctl enable openfortivpn
systemctl start openfortivpn
IP Forwarding 設定
開啟功能並允許 Mac 流量透過機器作為 route 轉送,如果只需要暫時生效可以使用 sysctl -w net.ipv4.ip_forward=1,下方則是永久性設定,
nvim /etc/sysctl.conf
解除內容註解,
net.ipv4.ip_forward=1
套用修改內容,
sysctl -p
若要永久生效也可以使用 sh -c “iptables-save > /etc/iptables/rules.v4”
驗證 IP forwarding 是否生效,如果為 1 則是開啟,反之 0 則是關閉,
cat /proc/sys/net/ipv4/ip_forward
nftables 設定
需搭配 IP Forwarding,也使用暫時性方式使用,如要要永久性則要把 ruleset 匯出至檔案或編輯新增檔案選擇一個即可
暫時
sudo nft add table ip nat
sudo nft add chain ip nat POSTROUTING { type nat hook postrouting priority 100\; }
sudo nft add rule ip nat POSTROUTING oifname "ppp0" masquerade
匯入
nft list ruleset > /etc/nftables.conf
systemctl enable nftables
新增檔案建立規則檔案
nvim /etc/nftables.conf
#!/usr/sbin/nft -f
flush ruleset
table ip nat {
chain postrouting {
type nat hook postrouting priority 100;
oif "ppp0" masquerade
}
}
啟用 nftables
systemctl enable nftables
systemctl start nftables
測試 NAT 規則
nft list ruleset
驗證
接著驗證看看是否設定沒問題
ifconfig ppp0
netstat -rn
ping {ip} # 要連線的 IP
curl { url or IP }
Mac 開發環境
先整理出需要連線的 url 路徑 IP,可以用以下其中一個測試出來
dig +short example.com
nslookup example.com
ping example.com
traceroute example.com
curl example.com
操作路由轉導,前面是上述查出的 IP,而後面則是 openfortivpn 服務的 IP,-n 不要做名稱解析(no DNS lookup),只顯示數字,不做解析會更快。
# 新增
route add -n {IP} {openfortivpn Client IP}
# 刪除
route delete -n {IP} {openfortivpn Client IP}
OK 現在設定完成了,接者驗證是否走的路徑是正確的
netstat -rn
# 過濾出特定 IP
netstat -rn | grep { ip }
route -n get default
# 看看第一個出去的是否是通過 openfortivpn 跳板的機器
traceroute {url or ip}
後記
route 是揮發性的重新開機後就會消失,以流程上是蠻方便的不會忘記關閉,另外如果只有特定軟體才使用 VPN 也可以試試 SOCKS Proxy 也很好用。
自動啟用
如果重新開機需要一次就執行完需要設定的內容可以使用腳本,例如設定成 sh
Mac 新增檔案 vpn-routes.sh
#!/bin/bash
IP=192.168.0.2
sudo route add -n 10.10.0.1 $IP
sudo route add -n 10.10.0.2 $IP
執行 bash vpn-routes.sh,也可以把腳本加入到常用的 shell e.g .zshrc,路徑記得調整
alias vpnroutes="sudo vpn-routes.sh"
linux 查看目前 route
ip route show
監控連線 e.g ppp0
tcpdump -i ppp0
# 過濾出經過 ppp0 的 IP
tcpdump -i ppp0 host {IP}