我使用以下指南将我的树莓派设置为接入点:
我正在转发wlan0
并eth0
NAT 我的所有流量。效果很好!
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
接口访问的默认网关。