OpenVPN + iptables / NAT 路由

Mik*_*age 5 linux iptables openvpn

我正在尝试设置一个 OpenVPN VPN,它将通过 OpenVPN 服务器将一些(但不是全部)流量从客户端传输到互联网。

我的 OpenVPN 服务器在 eth0 上有一个公共 IP,并且正在使用 tap0 创建本地网络 192.168.2.x。我有一个从本地 IP 192.168.1.101 连接并获取 VPN IP 192.168.2.3 的客户端。

在服务器上,我运行:

iptables -A INPUT -i tap+ -j ACCEPT
iptables -A FORWARD -i tap+ -j ACCEPT

iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eth0 -j MASQUERADE
Run Code Online (Sandbox Code Playgroud)

在客户端,默认设置仍然是通过 192.168.1.1 进行路由。为了将它指向 HTTP 的 192.168.2.1,我跑了

ip rule add fwmark 0x50 table 200
ip route add table 200 default via 192.168.2.1
iptables -t mangle -A OUTPUT -j MARK -p tcp --dport 80 --set-mark 80
Run Code Online (Sandbox Code Playgroud)

现在,如果我尝试访问客户端上的网站(例如 wget google.com),它就会挂在那里。在服务器上,我可以看到

$ sudo tcpdump -n -i tap0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on tap0, link-type EN10MB (Ethernet), capture size 96 bytes
05:39:07.928358 IP 192.168.1.101.34941 > 74.125.67.100.80: S 4254520618:4254520618(0) win 5840 <mss 1334,sackOK,timestamp 558838 0,nop,wscale 5>
05:39:10.751921 IP 192.168.1.101.34941 > 74.125.67.100.80: S 4254520618:4254520618(0) win 5840 <mss 1334,sackOK,timestamp 559588 0,nop,wscale 5>
Run Code Online (Sandbox Code Playgroud)

其中 74.125.67.100 是它为 google.com 获得的 IP。

为什么 MASQUERADE 不起作用?更准确地说,我看到源显示为 192.168.1.101——难道不应该有什么东西表明它来自 VPN?

编辑:一些路线[来自客户]

$ ip route show table main
192.168.2.0/24 dev tap0  proto kernel  scope link  src 192.168.2.4
192.168.1.0/24 dev wlan0  proto kernel  scope link  src 192.168.1.101  metric 2
169.254.0.0/16 dev wlan0  scope link  metric 1000
default via 192.168.1.1 dev wlan0  proto static

$ ip route show table 200
default via 192.168.2.1 dev tap0
Run Code Online (Sandbox Code Playgroud)

Mik*_*age 1

有两件事是错误的:

首先,在客户端,我需要将源 SNAT 到实际 IP。

其次,反向路径过滤器阻止返回数据包,因为它认为这些数据包是被欺骗的。echo 0 > /proc/sys/net/ipv4/conf/tun0/rp_filter修正了这个