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接口访问的默认网关。

相关内容