![将流量从 VPN 路由到不同的网络设备](https://linux22.com/image/799166/%E5%B0%86%E6%B5%81%E9%87%8F%E4%BB%8E%20VPN%20%E8%B7%AF%E7%94%B1%E5%88%B0%E4%B8%8D%E5%90%8C%E7%9A%84%E7%BD%91%E7%BB%9C%E8%AE%BE%E5%A4%87.png)
我终于让 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,因此它们也会直接通过默认网关路由。解决此问题的唯一方法是使用基于端口的路由,其设置如下:
创建一个新的路由表(只需做一次):
echo 1 vpn >> /etc/iproute2/rt_table
通过 VPN 使用这个新表来路由所有内容:
ip route add default via 10.8.0.1 table vpn
告诉内核对所有具有特定防火墙标记的数据包使用这个新表:
ip rule add fwmark 0x01 lookup vpn
设置防火墙规则来标记您想要通过 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
。