将网络流量重新路由至 VPN

将网络流量重新路由至 VPN

我有一台 ubuntu 服务器作为路由器。现在我想通过 vpn 连接路由来自子网 1 (192.168.1.0) 的所有流量。这仅在我让 vpn 服务器将路由推送到我的路由器时才有效,但现在子网 2 (192.168.2.0) 和来自路由器本身的流量也通过 vpn 隧道传输。

谁能告诉我如何设置路由,以便只有来自子网 1 的流量进入 vpn 连接,而来自子网 2 和服务器本身的流量直接进入互联网?

无vpn的路由表:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         31.19.38.254    0.0.0.0         UG    0      0        0 eth0
31.19.38.0      0.0.0.0         255.255.255.0   U     0      0        0 eth0
192.168.1.0     0.0.0.0         255.255.255.128 U     0      0        0 p1p1
192.168.2.0     0.0.0.0         255.255.255.128 U     0      0        0 p1p2

启用 VPN 推送网关

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.9.0.41       128.0.0.0       UG    0      0        0 tun0
0.0.0.0         31.19.38.254    0.0.0.0         UG    0      0        0 eth0
10.9.0.1        10.9.0.41       255.255.255.255 UGH   0      0        0 tun0
10.9.0.41       0.0.0.0         255.255.255.255 UH    0      0        0 tun0
31.19.38.0      0.0.0.0         255.255.255.0   U     0      0        0 eth0
128.0.0.0       10.9.0.41       128.0.0.0       UG    0      0        0 tun0
192.168.1.0     0.0.0.0         255.255.255.128 U     0      0        0 p1p1
192.168.2.0     0.0.0.0         255.255.255.128 U     0      0        0 p1p2
209.95.51.97    31.19.38.254    255.255.255.255 UGH   0      0        0 eth0

接口:

eth0      Link encap:Ethernet  HWaddr d0:50:99:26:c9:62  
          inet addr:31.19.38.94  Bcast:31.19.38.255  Mask:255.255.255.0
          inet6 addr: fe80::d250:99ff:fe26:c962/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1

p1p1      Link encap:Ethernet  HWaddr 00:15:17:94:4c:16  
          inet addr:192.168.1.1  Bcast:192.168.1.127  Mask:255.255.255.128
          inet6 addr: fe80::215:17ff:fe94:4c16/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

p1p2      Link encap:Ethernet  HWaddr 00:15:17:94:4c:17  
          inet addr:192.168.2.1  Bcast:192.168.2.127  Mask:255.255.255.128
          inet6 addr: fe80::215:17ff:fe94:4c17/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
          inet addr:10.9.0.54  P-t-P:10.9.0.53  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1

答案1

Zoredache 为您指明了正确的方向。答案的详细信息如下:

  1. 保持 VPN 原样,这将设置称为的默认路由表main

  2. 现在我们设置第二个路由表,用于必须不是通过 VPN。我们称新的路由表为novpn(我同意,这不是什么奇思妙想):

    echo 200 novpn >> /etc/iproute2/rt_tables
    ip route add 31.19.38.0/24 dev eth0 src YourIP table novpn
    ip route add default via 31.19.38.254 table novpn
    ip route add 192.168.1.0/24 dev p1p1 table novpn
    ip route add 192.168.2.0/24 dev p1p2 table novpn
    

    上面的YourIP是你的接口的IP地址eth0

  3. 现在我们设置规则来区分哪些可以通过 VPN,哪些不能:

    ip rule add from 192.168.1.0/24 table main
    ip rule add from 192.168.2.0/24 table novpn
    

    记住使用关键规则,

    iptables -t nat -A POSTROUTING -j MASQUERADE
    

    并允许 ipv4 转发,您就完成了。

相关内容