如何通過特定的 VPN 客戶端路由特定的 VPN 流量?
我有基於 OpenVPN 軟體的 VPN 網路。我需要通過此 VPN 網路上的一個特定客戶端(VPN 客戶端 IP 地址)路由目標 IP 來自特定國家/地區的 VPN 網路中的所有網路流量 - 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 route 規則:
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
感謝您的幫助。
我認為設置用於接收 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 傳遞所選流量,其餘通過“正常”/預設路由傳遞。