如果在 OpenVZ 下运行,如何配置 iptables 以允许 OpenVPN 客户端通过服务器访问互联网?

如果在 OpenVZ 下运行,如何配置 iptables 以允许 OpenVPN 客户端通过服务器访问互联网?

所以我现在有的是:

  • 客户端可以连接到运行在 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

这有效。

相关内容