如何在 Linux 中通过不同的 OpenVPN 隧道路由不同的用户?

如何在 Linux 中通过不同的 OpenVPN 隧道路由不同的用户?

设置:

我有多个静态密钥 OpenVPN 客户端/服务器配置,标记为“client1”、“client2”和“client3”,服务器/客户端 IP 分别为 10.10.1.1/10.10.1.2、10.10.2.1/10.10.2.2 和 10.10。 3.1/10.10.3.2 分别托管在一台 Linux 服务器和一台 Linux 客户端上(每个都有三个 openvpn 进程,每个进程都有不同的 tunX 接口)。我的 Linux 客户端计算机上有三个用户,用户“client1”、“client2”和“client3”。我的服务器设置为执行 NAT,以便来自 10.10.1.2 上的 client1 的传入流量从一个 IP 传出到 Internet(通过 iptables 中的 -j SNAT),10.10.2.2 上的 client2 传出另一个 IP,等等。

问题:

我没有办法让客户端 Linux 机器通过 OpenVPN 隧道将每个用户的流量正确路由到正确的 OpenVPN 服务器 IP。本质上,我希望所有来自 client1 的互联网流量都从 OpenVPN 服务器上的一个面向互联网的 IP 发出,来自 client2 的流量从另一个 IP 发出,依此类推,对于我想添加的用户数量,以此类推。 。但这一切都必须在托管所有不同客户端用户的一台计算机上完成。我知道 iptables 功能涉及通过用户 ID 标记数据包,然后根据这些标记设置 IP 路由,但我不知道如何实际实现它。

有没有 iptables/netfilter/etc 的专家可以在这件事上帮助我?

答案1

您可以iptables根据创建进程的 UID 来标记数据包。您可以将此 Netfilter 标记用于(高级)路由(ip rule:man ipman ip-rule; 关键字“fwmark”)和 DNAT。我不确定哪一个更容易/更好。

编辑1 对于每个用户:

iptables -t mangle -A PREROUTING -m owner --uid-owner $user -j MARK --set-mark $usermark
# one line in /etc/iproute2/rt_tables (numbers don't matter)
ip route add default via $user_gw_ip dev $user_if src $user_if_local_ip table $user_table
ip rule add type unicast fwmark $usermark priority 100 table $user_table

相关内容