我正在尝试在新的虚拟服务器上配置 VPN,该服务器由 OpenVZ 提供支持。我获取了当前 VPN 的配置(托管在 Xen VPS 上),并将其粘贴到我的新服务器上。经过多次尝试,我查看了不同的主题,发现 OpenVZ 不支持 选项MASQUERADE
。iptables
因此,我尝试创建一个 iptable.sh 文件,方法是:这篇博文。
当我连接到 VPN 时,每个页面都是从我的网络服务器获取(与 VPN 在同一台机器上)...例如,如果我尝试访问http://www.google.com,我看到正在运行的 Apache2 服务器的默认页面“它工作正常”。我不太明白为什么……这是我的配置:
/etc/openvpn/server.conf
mode server
tls-server
port 10735
proto udp
dev tun0
# Certificates, blablah...
# Virtual addr conf
server 172.16.0.0 255.255.255.0
push "route 192.168.0.0 255.255.255.0"
push "dhcp-option DNS 8.8.8.8"
# Log, persitent connections, max clients, blabla..
旧的 iptable 配置(在我之前的服务器上,MASQUERADE 正在运行)
iptables -A FORWARD -s 172.16.0.0/24 -o eth0 -j ACCEPT
iptables -t nat -A POSTROUTING -s 172.16.0.0/24 -o eth0 -j MASQUERADE
新的 iptables 配置(存储在.sh文件中)
/sbin/iptables -F
/sbin/iptables -P OUTPUT ACCEPT
/sbin/iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
/sbin/iptables -A FORWARD -s 172.16.0.0/24 -j ACCEPT
#/sbin/iptables -A FORWARD -j REJECT
# Perform NATing on outgoing packets to change the IP address the packets come from
/sbin/iptables -t nat -A POSTROUTING -s 172.16.0.0/24 -j SNAT --to-source 89.2xx.xxx.xxx <- my public addr
/sbin/iptables -A INPUT -p udp --dport 10735 -j ACCEPT
/sbin/iptables -A INPUT -p icmp -j ACCEPT
/sbin/iptables -A INPUT -i lo -j ACCEPT
/sbin/iptables -A INPUT -i tun0 -j ACCEPT
/sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
提前致谢 :)
附加信息VPS 连接没有问题,我可以 ping 几个域/IP...
~# ping serverfault.com PING serverfault.com (198.252.206.16) 56(84) bytes of data. 64 bytes from stackoverflow.com (198.252.206.16): icmp_req=1 ttl=50 time=58.5 ms [...]
http://<public VPS IP>
返回到我通过 VPN 获得的“它有效”页面。cat /proc/sys/net/ipv4/ip_forward
返回1
(IP 转发已激活)
答案1
SNAT 和 MASQUERADE 之间的区别:前者工作速度更快,但后者使用动态 WAN IP(使用路由表查找)。
许多云 VPS 服务(如 Amazon)为您配置 DMZ:因此您的外部 IP 地址不是您服务器外部接口上的 IP。所有到任何端口的连接都从您的 89.2xx.xxx.xxx(网络硬件实际使用)转发到您的 WAN iface。
因此,http://'public VPS IP' 上的 TCP 请求将由提供商处理并无条件重定向到您的 eth0。这就是您看到“它有效”的原因。
但如果您尝试将所有传出数据包的 SOURCE IP 字段设置为 89.2xx.xxx.xxx - 提供商的网络会将其评估为欺骗数据包并丢弃它。
因此,您应该使用分配给您的 eth0 iface 的 IP 地址进行 SNAT(我猜它与外部不同)。
检查您的 eth0 子网是否与您的 VPN 子网 - 172.16.0.0 不相交
答案2
我通过 VPS 设置了 OpenVPN 服务器,由于 MASQUERADE 无法工作,因此我必须使用以下命令来使 NAT 工作。一旦我将其放入并确保我允许转发规则并在 /etc/sysctl.conf 上打开 ip_forward,我就可以开始了。
/sbin/iptables -t nat -A POSTROUTING -j SNAT --to-source external_ip_of_the_server
答案3
嗯,根据您描述的症状,您的防火墙似乎有 DNAT 规则将访问从外部重定向到内部 IP 地址:80。此规则不考虑传入接口,因此您的所有传出请求也将被 DNAT 化。您必须使用这种仅重定向外部接口的 DNAT。