如何通过特定 VPN 客户端路由特定 VPN 流量?

如何通过特定 VPN 客户端路由特定 VPN 流量?

我有基于 OpenVPN 软件的 VPN 网络。我需要通过此 VPN 网络上的一个特定客户端(VPN 客户端 IP 地址)路由 VPN 网络中的所有网络流量,其中目标 IP 来自特定国家/地区 - Mikrotik 路由器,其中为主互联网接口 (PPPoE) 配置了 NAT (MASQUERADE)。我需要为所有这些流量获取此 VPN 客户端(Mikrotik 路由器 - PPPoE 接口)拥有的公共动态 IP 地址。所以在 VPN 服务器上我创建了 iptables mangle 规则并使用 geoip iptables 模块:

iptables -A PREROUTING -t mangle -i tun0 -m geoip --destination-country COUNTRY_CODE -j MARK --set-mark 1

因此,我标记了来自具有来自该特定国家/地区的目标 IP 的客户端的所有流量。接下来我尝试使用这个解决方案:创建特定路由表并添加默认路由。但默认路由只能是本网络的下一跳。所以当我使用这个命令时:

ip route add default via specific_VPN_client dev tun0 table CountryRoute 

我收到此错误:

RTNETLINK answers: Network is unreachable

是否可以将特定流量路由到特定客户端,但不能路由到下一跃点?

我也尝试过这个 iptables 规则:

iptables -A PREROUTING -i tun0 -m geoip --destination-country COUNTRY_CODE -j DNAT --to-destination Mikrotik_VPN_IP

但流量在 Mikrotik 路由器上结束。也许可以在该路由器上解决这个问题?

OpenVPN服务器(10.1.1.1)路由表:

default via PUBLIC_IP_VPN_SERVER dev eth0
10.1.1.0/24 via 10.1.1.2 dev tun0
10.1.1.2 dev tun0  proto kernel  scope link  src 10.1.1.1
PUBLIC_IP_VPN_SERVER/24 dev eth0  proto kernel  scope link  src PUBLIC_IP_VPN_SERVER

更新

我用过这个解决方案用于在 CountryRoute 表中添加默认路由。所以 CountryRoute 表有以下内容:

default via 10.1.1.30 dev tun0 

我有活动的 iptables mangle 规则(上面提到的)和 ip 路由规则:

ip rule show
0:      from all lookup local
32765:  from all fwmark 0x1 lookup CountryRoute
32766:  from all lookup main
32767:  from all lookup default

但标记的流量仍然在 10.1.1.1 - OpenVPN 服务器上结束,它不会继续到 Mikrotik 路由器。

更新2

当前值:

default via PUBLIC_IP_VPN_SERVER dev eth0
10.0.0.0/24 dev veth0  proto kernel  scope link  src 10.0.0.1
10.0.1.0/24 dev veth3  proto kernel  scope link  src 10.0.1.2
10.1.1.0/24 via 10.1.1.30 dev tun0
10.1.1.30 dev tun0  proto kernel  scope link  src 10.1.1.1
PUBLIC_IP_VPN_SERVER/24 dev eth0  proto kernel  scope link  src PUBLIC_IP_VPN_SERVER

tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:10.1.1.1  P-t-P:10.1.1.30  Mask:255.255.255.255
          inet6 addr: PUBLIC_IP_VPN_SERVER/64 Scope:Global
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:141437 errors:0 dropped:0 overruns:0 frame:0
          TX packets:230785 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:14693683 (14.0 MiB)  TX bytes:240387315 (229.2 MiB)

ip route show table CountryRoute
default via 10.1.1.30 dev tun0

更新3

ip -4 route show table all
default via 10.0.0.2 dev veth0 table CountryRoute
default via PUBLIC_IP_VPN_SERVER_gateway dev eth0 onlink
10.0.0.0/24 dev veth0 proto kernel scope link src 10.0.0.1
10.0.1.0/24 dev veth3 proto kernel scope link src 10.0.1.2
10.1.1.0/24 via 10.1.1.30 (Mikrotik_VPN_IP) dev tun0
10.1.1.30 dev tun0 proto kernel scope link src 10.1.1.1
PUBLIC_IP_VPN_SERVER/24 dev eth0 proto kernel scope link src PUBLIC_IP_VPN_SERVER
broadcast 10.0.0.0 dev veth0 table local proto kernel scope link src 10.0.0.1
local 10.0.0.1 dev veth0 table local proto kernel scope host src 10.0.0.1
broadcast 10.0.0.255 dev veth0 table local proto kernel scope link src 10.0.0.1
broadcast 10.0.1.0 dev veth3 table local proto kernel scope link src 10.0.1.2
local 10.0.1.2 dev veth3 table local proto kernel scope host src 10.0.1.2
broadcast 10.0.1.255 dev veth3 table local proto kernel scope link src 10.0.1.2
local 10.1.1.1 dev tun0 table local proto kernel scope host src 10.1.1.1
broadcast PUBLIC_IP_VPN_SERVER_networkIP dev eth0 table local proto kernel scope link src PUBLIC_IP_VPN_SERVER
local PUBLIC_IP_VPN_SERVER dev eth0 table local proto kernel scope host src PUBLIC_IP_VPN_SERVER
broadcast PUBLIC_IP_VPN_SERVER_broadcastIP dev eth0 table local proto kernel scope link src PUBLIC_IP_VPN_SERVER
broadcast 127.0.0.0 dev lo table local proto kernel scope link src 127.0.0.1
local 127.0.0.0/8 dev lo table local proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo table local proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo table local proto kernel scope link src 127.0.0.1

更新4

ip netns exec Mikrotik ip -4 route show table all
default via 10.0.1.2 dev veth2
10.0.0.0/24 dev veth1 proto kernel scope link src 10.0.0.2
10.0.1.0/24 dev veth2 proto kernel scope link src 10.0.1.1
10.1.1.30 via 10.0.1.2 dev veth2
broadcast 10.0.0.0 dev veth1 table local proto kernel scope link src 10.0.0.2
local 10.0.0.2 dev veth1 table local proto kernel scope host src 10.0.0.2
broadcast 10.0.0.255 dev veth1 table local proto kernel scope link src 10.0.0.2
broadcast 10.0.1.0 dev veth2 table local proto kernel scope link src 10.0.1.1
local 10.0.1.1 dev veth2 table local proto kernel scope host src 10.0.1.1
broadcast 10.0.1.255 dev veth2 table local proto kernel scope link src 10.0.1.1

更新5

# ip netns exec Mikrotik traceroute -I 10.1.1.30
traceroute to 10.1.1.30 (10.1.1.30), 30 hops max, 60 byte packets
 1  10.0.1.2 (10.0.1.2)  0.053 ms  0.016 ms  0.013 ms
 2  10.1.1.30 (10.1.1.30)  18.868 ms  38.147 ms  98.549 ms

# ip netns exec Mikrotik traceroute 10.1.1.30
traceroute to 10.1.1.30 (10.1.1.30), 30 hops max, 60 byte packets
 1  10.0.1.2 (10.0.1.2)  0.056 ms  0.019 ms  0.016 ms
 2  10.1.1.30 (10.1.1.30)  19.044 ms  37.808 ms  56.347 ms

# ip netns exec Mikrotik traceroute COUNTRY_PUBLIC_IP_MARKED_TRAFFIC
traceroute to COUNTRY_PUBLIC_IP_MARKED_TRAFFIC (COUNTRY_PUBLIC_IP_MARKED_TRAFFIC), 30 hops max, 60 byte packets
 1  10.0.1.1 (10.0.1.1)  3052.269 ms !H  3052.212 ms !H  3052.185 ms !H

# ip netns exec Mikrotik traceroute -I COUNTRY_PUBLIC_IP_MARKED_TRAFFIC
traceroute to COUNTRY_PUBLIC_IP_MARKED_TRAFFIC (COUNTRY_PUBLIC_IP_MARKED_TRAFFIC), 30 hops max, 60 byte packets
 1  * * *
 2  * * *
 3  * * *
 4  * * *
 5  * * *
 6  * 10.0.1.1 (10.0.1.1)  3067.929 ms !H  3067.883 ms !H

感谢您的帮助。

答案1

我认为设置一个网络命名空间来接收 Mikrotik 流量,并通过 NAT 将其路由回实际的 Mikrotik 可以通过以下方式完成,使用 10.0.0.0/24“进入”命名空间并使用 10.0.1.0/24 返回出,然后通过 Mikrotik_VPN_IP 路由

ip netns add Mikrotik
ip link add veth0 type veth peer name veth1
ip link set veth1 netns Mikrotik
ip link add veth2 type veth peer name veth3
ip link set veth2 netns Mikrotik
ifconfig veth0 10.0.0.1/24 up
ifconfig veth3 10.0.1.2/24 up
ip netns exec Mikrotik ifconfig veth1 10.0.0.2/24 up
ip netns exec Mikrotik ifconfig veth2 10.0.1.1/24 up
ip netns exec Mikrotik iptables -t nat -A POSTROUTING -o veth2 -j MASQUERADE
ip netns exec Mikrotik ip route add Mikrotik_VPN_IP via 10.0.1.2
ip netns exec Mikrotik ip route add default via Mikrotik_VPN_IP dev veth2 onlink
ip netns exec Mikrotik iptables -A PREROUTING -t mangle -j MARK --set-mark 0

这样,您就可以通过 10.0.0.2 路由来获得往返 Microtek 路由器的流量路径。您还需要基于规则的路由来通过 10.0.0.2 传递选定的流量,并通过“正常”/默认路由传递其余流量。

相关内容