我有两个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标记数据包进行策略路由 在MANGLE表MANGLE具有端口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 ) 这些规则执行以下操作:
mangle桌子(只需要清除任何以前定义的规则) MARK到特定端口(80) MARK (先前的规则)设置为连接的所有数据包的CONNMARK ( conntrack mark )的值。 OUTPUT链中的CONNMARK 。 CONNMARK为0x1的OUTPUT链中MARK传出数据包。 这个MARK可以用来将策略路由中的数据包与fwmark 0x1匹配。 我终于解决了我的问题。 这是我如何做到的。 在OpenVPN接入服务器的networkingpipe理设置,在VPN设置的路由部分,我检查
没有
问题
“客户的互联网stream量应该通过VPN路由吗?”
然后,我回到了客户端,刷新了在mangle表中添加的所有规则。 然后,来了魔法! 我现在可以连接到我的VPN,而我的Apache仍然可以公开。