目前我运行一个 openvpn 服务器,它根据每个客户端推送一条路由(不同的客户端接收不同的路由和静态 ip)。
ccd/client1
push "route 172.16.236.0 255.255.255.0"
ifconfig-push 10.8.0.29 255.0.0.0
然后我将流量从 vpn tun 接口路由到客户端特定的 docker 网络接口(多个)。
sudo iptables -A FORWARD -i tun0 -o br-6b1cd32adc27 -j ACCEPT
sudo iptables -A FORWARD -i br-6b1cd32adc27 -o tun0 -m state --state ESTABLISHED,RELATED -j ACCEPT
sudo iptables -t nat -A POSTROUTING -o br-6b1cd32adc27 -j MASQUERADE
然而,如果一个客户端只是通过 ip 添加路由,那么他就可以访问为另一个客户端提供的接口。
ip route add 172.16.236.0/24 via 255.0.0.0
我想限制这种行为,并以某种方式过滤仅向特定客户端 IP 地址访问某些接口。
我怎样才能实现这一点?
答案1
要将对特定 Docker 网络接口的访问限制为仅限某些客户端 IP 地址,您可以使用 iptables 规则根据客户端的源 IP 地址过滤流量。以下是设置规则的示例:
- 为想要限制访问的每个客户端创建一个新的 Docker 网络:
docker network create --subnet=172.16.236.0/24 client1_network
docker network create --subnet=172.16.237.0/24 client2_network
- 设置 iptables 规则,根据客户端 IP 地址限制 VPN 隧道接口和 Docker 网络接口之间的流量:
iptables -A FORWARD -i tun0 -o br-client1_network -s 10.8.0.29 -d 172.16.236.0/24 -j ACCEPT
iptables -A FORWARD -i br-client1_network -o tun0 -s 172.16.236.0/24 -d 10.8.0.29 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -o br-client1_network -s 172.16.236.0/24 -j MASQUERADE
iptables -A FORWARD -i tun0 -o br-client2_network -s 10.8.0.30 -d 172.16.237.0/24 -j ACCEPT
iptables -A FORWARD -i br-client2_network -o tun0 -s 172.16.237.0/24 -d 10.8.0.30 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -o br-client2_network -s 172.16.237.0/24 -j MASQUERADE
在此示例中,第一组规则仅当源 IP 地址为 10.8.0.29 且目标 IP 地址为 172.16.236.0/24 时才允许 VPN 隧道接口 (tun0) 和客户端 1 的 Docker 网络接口 (br-client1_network) 之间的流量。第二组规则对客户端 2 执行相同操作。
通过设置这些规则,您可以根据客户端的源 IP 地址限制对特定 Docker 网络接口的访问。任何来自其他客户端 IP 地址试图访问受限制的 Docker 网络接口的流量都将被 iptables 规则阻止。
我希望这个解决方案能够解决您的问题!
答案2
唯一的选择是防火墙。无论如何,如果你要使用 VPN 服务,最好安装防火墙。
理论上,防火墙可以通过插件的方式内置到 OpenVPN 中,但文档记录非常糟糕,因此实际上没有人使用。通常,每个客户端的防火墙都是在防火墙主机上使用客户端连接/客户端断开连接脚本进行管理的,或者如果您可以提前知道客户端封装地址,则可以静态管理(我相信您就是这种情况,因为您提到了“静态 IP”)。