首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当机器本身运行openvpn服务器时,如何通过openvpn服务器路由机器上的所有通信量?

问当机器本身运行openvpn服务器时,如何通过openvpn服务器路由机器上的所有通信量?
EN

Unix & Linux用户
提问于 2017-09-13 17:32:31
回答 1查看 2.4K关注 0票数 1

高级信息

代码语言:javascript
复制
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广域网网关路由数据包。

失败尝试1

我试图用以下方式标记从vpn服务器发送的数据包:

代码语言:javascript
复制
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。

代码语言:javascript
复制
**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

失败2

我还试图由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。

代码语言:javascript
复制
ip route add table 14 default via WAN_IP
ip rule add to machine_C_IP table 14

文摘

也许标记的数据包被正确地路由失败了,因为iptables的输出链在实际路由之后应用?还是我在标记包的时候遗漏了什么?是否有其他方式将传出的vpn服务器数据包路由到我的广域网网关?

电流状态

路线

代码语言:javascript
复制
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 tun1

IP规则

代码语言:javascript
复制
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 
EN

回答 1

Unix & Linux用户

发布于 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单元文件中指定用户或组。即:

  1. 创建用户或组adduser vpnserver
  2. 然后将用户或组添加到/etc/openvpn/server.conf user vpnserver
  3. 验证vpn服务器进程是否以ps -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的链。

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/392046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档