iptables 將流量轉送到 VPN 隧道(如果開啟)

iptables 將流量轉送到 VPN 隧道(如果開啟)

我使用以下指南將我的樹莓派設定為接入點:

Raspberry Pi 3 作為 WiFi 接入點

我正在轉送wlan0eth0NAT 我的所有流量。效果很好!

sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE  
sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT  
sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT 

現在我想設定相同的規則,除了使用介面tun0-00和轉發全部我的流量通過我的 VPN 隧道。我確實想發送所有內容,不希望任何內容洩漏到主機網路中。想想事情是這樣的:

sudo iptables -t nat -A POSTROUTING -o tun0-00 -j MASQUERADE
sudo iptables -A FORWARD -i tun0-00 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i wlan0 -o tun0-00 -j ACCEPT

不幸的是,我知道這些 iptables 規則並不完整……問題在於它eth0一直存在;原來的轉送流量的規則仍然eth0存在。

如果隧道打開,我想透過隧道發送所有流量;如果沒有,我很擅長使用eth0.

更新:

使用 -I 標誌插入我的規則:

sudo iptables -t nat -I POSTROUTING 1 -o tun0-00 -j MASQUERADE
sudo iptables -I FORWARD 1 -i tun0-00 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -I FORWARD 1 -i wlan0 -o tun0-00 -j ACCEPT

FORWARD 鏈:

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 ACCEPT     all  --  wlan0  tun0-00  0.0.0.0/0            0.0.0.0/0           
2        0     0 ACCEPT     all  --  tun0-00 wlan0   0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
3        0     0 ACCEPT     all  --  eth0   wlan0   0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
4        0     0 ACCEPT     all  --  wlan0  eth0    0.0.0.0/0            0.0.0.0/0           
5        0     0 ACCEPT     all  --  wlan1  wlan0   0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
6        0     0 ACCEPT     all  --  wlan0  wlan1   0.0.0.0/0            0.0.0.0/0           

還是不高興,轉發好像不行。

用戶端 VPN 配置

我已經刪除了看起來敏感的內容:

dev tun
persist-tun
persist-key
cipher AES-256-CBC
auth SHA1
tls-client
client
resolv-retry infinite
remote XXX.XXX.XXX.XXX PORT_NUM udp
lport XXX
verify-x509-name "VPN_Certificate" name
pkcs12 CERT_NAME.p12
tls-auth CERTIFICATE-tls.key 1
ns-cert-type server
redirect-gateway local def1

pi 連接得很好並且反映了不同的公共 IP。客戶端仍然將 pi 顯示為其網關,但無法再連線。

解決方案

首先,我需要加入redirect-gateway def1到 pi 上的 .ovpn 檔案中。

然後我需要正確輸入我的介面名稱......呃。我覺得自己像個瘋子,但顯然我tun0-00在一開始就看到了,那是它唯一存在的一次。介面其實只是tun0.

所以適當的 iptables 指令是:

sudo iptables -t nat -I POSTROUTING 1 -o tun0 -j MASQUERADE
sudo iptables -I FORWARD 1 -i tun0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -I FORWARD 1 -i wlan0 -o tun0 -j ACCEPT

現在效果很好!

答案1

您將需要 中的兩組規則iptables。這兩個規則集確保對指定介面離開的流量進行適當的偽裝。這是我的建議,比你的簡單一點:

# Masquerade outgoing traffic
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

# Allow return traffic
iptables -A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT

# Forward everything
iptables -A FORWARD -j ACCEPT

謎題中缺少的部分是路線。如果隧道已啟動,您希望「所有」傳出流量都使用它。否則使用正常路線。

這是處理的在 OpenVPN 內使用redirect-gateway def1客戶端配置中的參數。

答案2

方便的工具是列出現有有行號的規則:

iptables --line-numbers -t filter -L FORWARD

您可以使用以下選項刪除規則-D

iptables -t filter -D FORWARD 1

您可以使用選項在指定位置插入新規則-I

iptables -t filter -I FORWARD 0 blah-blah-blah

這將在表的最開頭插入一條新規則,因此將在第一輪中查閱該規則。

編輯:

一般來說,您只需要FORWARD表格中的一條規則符合-m state --state RELATED,ESTABLISHED

-I FORWARD 1 -m state --state RELATED,ESTABLISHED -j ACCEPT

因為連接追蹤將允許路由所有已知的連接。

是的,你需要設定策略路由將您的wlan流量轉送到最有可能透過您的ethernet 介面存取但透過vpn介面存取的預設閘道。

相關內容