访问VPN以外的服务,同时隧道OpenVPN访问服务器

我有两个VPS,其中一个在第二个上安装了OpenVPN Access Server和vpn客户端。 当我将客户端连接到OpenVPN AS时,我无法从其公共IP地址访问安装在客户端上的apache。 我的愿望是在客户端服务器上使用公共互联网上的某些服务,例如apache和postfix,同时在本机上安装其他服务。 我怎样才能做到这一点 ?

这里是我的/etc/iproute2/rt_tables

 # # reserved values # 255 local 254 main 253 default 0 unspec # # local # #1 inr.ruhep 1 inet 

当客户端断开时, ip route show给出:

 default via <router_ip> dev <ext_if> <netw_addr> via <router_ip> dev <ext_if> <netw_addr> dev <ext_if> proto kernel scope link src <public_ip> 

当客户端连接时, ip route show给出:

 0.0.0.0/1 via <private_router_ip> dev <vpn_if> default via <router_ip> dev <ext_if> 128.0.0.0/1 via <private_router_ip> dev <vpn_if> <vpn_addr> dev <vpn_if> proto kernel scope link src <private_ip> <vpn_server_public_ip> via <router_ip> dev <ext_if> <netw_addr> via <router_ip> dev <ext_if> <netw_addr> dev <ext_if> proto kernel scope link src <public_ip> 

当客户端连接时, ip addr show给出

 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: <ext_if>: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether XX:XX:XX:XX:XX:XX brd ff:ff:ff:ff:ff:ff inet <public_ip>/<netmask> brd <ext_broadcast_ip> scope global <ext_if> valid_lft forever preferred_lft forever inet6 XXXX:XXXX:XXXX:XXXX::XX scope global valid_lft forever preferred_lft forever inet6 XXXX::XX:XXXX:XXXX:XXXX/XX scope link valid_lft forever preferred_lft forever 18: <vpn_if>: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100 link/none inet <private_ip>/<netmask> brd <private_broadcast_ip> scope global <vpn_if> valid_lft forever preferred_lft forever 

在客户端使用策略路由来做到这一点。

策略路由

示例策略路由HTTP服务(端口80)通过互联网:

 echo "1 inet" >> /etc/iproute2/rt_tables 

将默认路由添加到inet路由表

 ip route add default via <router_ip> dev <if> table inet 
  • <if> :replace为直接连接到互联网的接口的名称(即eth0
  • <router_ip> :replace路由器(网关)在互联网侧子网的IP地址。 这是定义为默认网关的路由器,而客户端服务器不是通过VPN连接的。 要得到这个IP,断开/closuresVPN客户端并且input: ip route show | grep default ip route show | grep default

添加路由规则,将标记为fwmark 0x1所有内容发送到路由表inet

 ip rule add from all fwmark 0x1 table inet 

使用iptables标记数据包进行策略路由

MANGLEMANGLE具有端口80数据包标记为目的地(对于任何其他服务/端口重复... --dport 80 ...行)。

 iptables -t mangle -F iptables -t mangle -A PREROUTING -i <if> -p tcp --dport 80 -j MARK --set-mark 0x1 iptables -t mangle -A PREROUTING -j CONNMARK --save-mark iptables -t mangle -A OUTPUT -j CONNMARK --restore-mark iptables -t mangle -A OUTPUT -m connmark --mark 0x1 -j MARK --set-mark 0x1 
  • <if> :replace为直接连接到互联网的接口的名称(即eth0

这些规则执行以下操作:

  1. 冲洗mangle桌子(只需要清除任何以前定义的规则)
  2. 将外部接口上的传入数据包MARK到特定端口(80)
  3. 将初始数据包的MARK (先前的规则)设置为连接的所有数据包的CONNMARKconntrack mark )的值。
  4. 恢复OUTPUT链中的CONNMARK
  5. 在连接CONNMARK0x1OUTPUT链中MARK传出数据包。 这个MARK可以用来将策略路由中的数据包与fwmark 0x1匹配。

我终于解决了我的问题。 这是我如何做到的。 在OpenVPN接入服务器的networkingpipe理设置,在VPN设置的路由部分,我检查

没有

问题

“客户的互联网stream量应该通过VPN路由吗?”

然后,我回到了客户端,刷新了在mangle表中添加的所有规则。 然后,来了魔法! 我现在可以连接到我的VPN,而我的Apache仍然可以公开。