将流量从 VPN 路由到不同的网络设备

将流量从 VPN 路由到不同的网络设备

我终于让 OpenVPN 运行起来了,但现在我真的很怀念通过 VPN 服务器访问我的所有 Web 服务(apache、ftp、ssh 等)。有没有简单的路由所有来自我的流量的方式WLAN1设备tap0

服务器.conf:

port 1193
proto tcp
dev tap0
ca ca.crt
cert server.crt
key server.key  # This file should be kept secret
dh dh1024.pem
ifconfig-pool-persist ipp.txt
server 10.8.0.0 255.255.255.0
keepalive 10 120
;tls-auth ta.key 0 # This file is secret
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
status openvpn-status.log
verb 3
script-security 2

我实际上希望这个转发能够解决问题,但事实并非如此:

/sbin/iptables -t nat -A POSTROUTING -o wlan1 -j MASQUERADE
/sbin/iptables -A FORWARD -i wlan -o tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT
/sbin/iptables -A FORWARD -i tun0 -o eth0 -j ACCEPT

设置:

这基本上是我的设置:DSL router -> Wireless router -> Ubuntu server

Ubuntu server托管了 apache、ssh 和其他服务器应用程序和服务。当客户端通过 VPN 访问我的服务器时,我希望访问所有这些服务。

答案1

您仍未提供太多细节,因此我猜测您的设置如下。您通常通过其公共 IP(或解析为它的主机名)访问服务器上的服务,例如http://1.2.3.4/。启动 VPN 时,OpenVPN 会连接到相同的公共 IP 1.2.3.4,当 VPN 启动时,您可以使用服务器的私有 VPN IP 访问服务,例如http://10.8.0.1/。无论 VPN 是否启动,您都希望能够使用公共 IP。

最好的解决方案是为 OpenVPN 服务器使用单独的 IP,因为它可以大大简化路由。不过我假设你没有这个选项。

问题是,即使你通过 VPN 路由所有流量,到 VPN 服务器公共 IP 的流量也必须通过默认网关路由,以便加密的 VPN 数据包真正到达那里。路由表如下所示:

192.168.0.0/24 dev eth0
1.2.3.4/32 via 192.168.0.1
10.8.0.1/32 dev tun0
default via 10.8.0.1

由于您尝试访问的其他服务使用与 VPN 服务器相同的 IP,因此它们也会直接通过默认网关路由。解决此问题的唯一方法是使用基于端口的路由,其设置如下:

  1. 创建一个新的路由表(只需做一次):

    echo 1 vpn >> /etc/iproute2/rt_table
    
  2. 通过 VPN 使用这个新表来路由所有内容:

    ip route add default via 10.8.0.1 table vpn
    
  3. 告诉内核对所有具有特定防火墙标记的数据包使用这个新表:

    ip rule add fwmark 0x01 lookup vpn
    
  4. 设置防火墙规则来标记您想要通过 VPN 路由的数据包:

    iptables -t mangle -A OUTPUT -p tcp -j MARK --set-mark 0x01
    iptables -t mangle -A OUTPUT -p udp ! --dport 1193 -j MARK --set-mark 0x01
    

您可能希望在客户端的脚本中设置它up,然后在脚本中将其拆除down

相关内容