Machines involved:
A := vpn server inet 10.9.0.1 peer 10.9.0.2 tun0
B := vpn server inet 10.8.0.1 peer 10.9.0.2 tun2
vpn client inet 10.9.0.6 peer 10.9.0.5 tun1
C := vpn client inet 10.8.0.6 peer 10.9.0.5 tun0有三台机器。机器B同时运行openvpn服务器和客户端。现在,当机器A将redirect-gateway def1推送到机器B时,机器C显然无法连接到机器B上的openvpn-服务器,因为由于0.0.0.0/1 via 10.9.0.5, 128.0.0.0/1 via 10.9.0.5路由,vpn-服务器应答包被路由到机器A。现在,我需要策略路由,通过机器的B广域网网关路由数据包。
我试图用以下方式标记从vpn服务器发送的数据包:
iptables -t mangle -A OUTPUT -p tcp -m multiport --sports 1194 -j MARK --set-xmark 14
ip route add table 14 default via WAN_IP
ip rule add fwmark 14 table 14但是它们仍然被路由到机器A上,我可以观察到机器B上的tcpdump -i tun1和机器A上的tcpdump -i tun0。
**machine B**
eth0:
22:22:33.734511 IP machine_C_IP.54089 > machine_B_IP.1194: UDP, length 86
tun1:
22:32:42.713371 IP 10.9.0.6.1194 > machine_C_IP.34514: UDP, length 94
**machine A**
tun0:
20:47:47.769628 IP machine_A_IP.openvpn > machine_C_IP.40287: UDP, length 94我还试图由openvpn进程的所有者标记数据包。我添加了openvpn@.service Group = vpnserver,然后:
iptables -t mangle -A -m owner --gid-owner vpnserver -j MARK --set-xmark 14 ip路由通过WAN_GATEWAY ip规则添加表14默认值
但是包仍然被传送到机器A。
下面是工作,但这是我想避免使用的东西,因为它不方便,因为我将不得不为每个客户端添加其IP路由。有些客户端也有动态IP,因此我必须使用脚本来通过域名检索正确的IP。
ip route add table 14 default via WAN_IP
ip rule add to machine_C_IP table 14也许标记的数据包被正确地路由失败了,因为iptables的输出链在实际路由之后应用?还是我在标记包的时候遗漏了什么?是否有其他方式将传出的vpn服务器数据包路由到我的广域网网关?
路线
default via WAN_GATEWAY dev eth0 table 42
0.0.0.0/1 via 10.9.0.5 dev tun1
default via WAN_GATEWAY dev eth0 onlink
10.1.1.0/24 dev veth0 proto kernel scope link src 10.1.1.2
10.8.0.0/24 via 10.8.0.2 dev tun0
10.8.0.2 dev tun0 proto kernel scope link src 10.8.0.1
10.9.0.0/24 via 10.9.0.5 dev tun1
10.9.0.5 dev tun1 proto kernel scope link src 10.9.0.6
WAN_SUBNET/26 via WAN_GATEWAY dev eth0
WAN_SUBNET/26 dev eth0 proto kernel scope link src WAN_IP
MACHINE_A_IP via WAN_GATEWAY dev eth0
128.0.0.0/1 via 10.9.0.5 dev tun1IP规则
0: from all lookup local
32760: from all fwmark 0xe lookup 42
32761: from all fwmark 0xa lookup 42
32764: from all to WAN_IP lookup 42
32765: from WAN_IP lookup 42
32766: from all lookup main
32767: from all lookup default 发布于 2017-09-15 10:45:33
失败的尝试1和失败的尝试2不能工作,因为iptables的链在路由决定之后运行,请参阅iptables的http://inai.de/images/nf-packet-flow.png。
此外,失败的尝试2使用错误的方法设置vpn服务器实例的用户/组。您需要在/etc/openvpn/server.conf中而不是在systemd单元文件中指定用户或组。即:
adduser vpnserveruser vpnserverps -A o pid,cmd,user,group|grep vpn用户/组的形式运行。只有当进程设置套接字选项时,才能标记本地进程的数据包。OpenVPN支持这一点:https://community.openvpn.net/openvpn/wiki/Openvpn23ManPage
您可以在/etc/openvpn/server.conf中使用选项--mark value标记数据包,然后在ip routes default via WAN_GATEWAY table 42中使用ip rule add fwmark value table 42。
然后,机器C可以连接到机器的B服务器。
或者,您可以为vpn服务器和客户端使用netns名称空间,然后使用iptables的链。
https://unix.stackexchange.com/questions/392046
复制相似问题