所以我现在有的是:
- 客户端可以连接到运行在 ubuntu 22.04 下的 VPN 服务器
ip_forward
在服务器上启用
我没有的是客户端能够使用 VPN 服务器上的 NAT 访问互联网。换句话说,如果我使用redirect-gateway
选项,客户端可以访问专用网络内的资源,但无法访问互联网。
这是网络配置(替换了前两个八位字节):
root:~# ifconfig
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
tun0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1500
inet 10.42.0.1 netmask 255.255.255.0 destination 10.42.0.1
inet6 fe80::dd0b:2f12:6907:258d prefixlen 64 scopeid 0x20<link>
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 500 (UNSPEC)
venet0: flags=211<UP,BROADCAST,POINTOPOINT,RUNNING,NOARP> mtu 1500
inet 127.0.0.1 netmask 255.255.255.255 broadcast 0.0.0.0 destination 127.0.0.1
inet6 ::2 prefixlen 128 scopeid 0x80<compat,global>
inet6 2a02:7b40:6deb:474e::1 prefixlen 128 scopeid 0x0<global>
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 0 (UNSPEC)
venet0:0: flags=211<UP,BROADCAST,POINTOPOINT,RUNNING,NOARP> mtu 1500
inet 555.777.71.78 netmask 255.255.255.255 broadcast 555.777.71.78 destination 555.777.71.78
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 0 (UNSPEC)
venet0:1: flags=211<UP,BROADCAST,POINTOPOINT,RUNNING,NOARP> mtu 1500
inet 666.777.71.78 netmask 255.0.0.0 broadcast 666.255.255.255 destination 666.777.71.78
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 0 (UNSPEC)
现在,我尝试根据我在 Web 上找到的内容设置 NAT 的 iptables 规则。我当前的 iptables 设置与我获得 VPS 时一样:
root:~# iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
root:~# iptables -t nat -S
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
我试过了:
-A POSTROUTING -s 10.42.0.0/24 -o venet0 -j SNAT --to-source 555.777.71.78
我也尝试过这个规则集
-A FORWARD -i tun0 -j ACCEPT
-A FORWARD -i tun0 -o venet0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i venet0 -o tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-t nat -A POSTROUTING -s 10.42.0.0/24 -o venet0 -j MASQUERADE
似乎都没有效果。如果我理解正确的话,规则应该在添加后立即生效,但除非明确保存,否则在重启后不会保留。那么有没有涵盖这种特殊情况的最新教程,如果没有,我应该从哪里开始阅读以解决这个问题?
答案1
好的,有两件事对我有帮助。首先,我切换到旧版iptables
:
update-alternatives --set iptables /usr/sbin/iptables-legacy
update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
这可能不是最聪明的想法,但在行为上肯定存在一些我无法弄清楚的差异。
然后我使用了以下规则:
iptables --table nat --append POSTROUTING --out-interface venet0 -j MASQUERADE
iptables --append FORWARD --in-interface venet0 --out-interface tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables --append FORWARD --in-interface tun0 --out-interface venet0 -j ACCEPT
这有效。