我已启动并运行 OpenVPN 服务器,目前允许路由 VPN (10.8.0.0/24) 和 LAN (192.168.2.0/24) 网络之间的所有流量。我的 iptables 如下所示:
iptables -t filter -F
iptables -t nat -F
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i tun0 -j ACCEPT
iptables -A FORWARD -i eth0 -j ACCEPT
iptables -A FORWARD -j REJECT
iptables -t nat -A POSTROUTING -s '10.8.0.0/24' -j MASQUERADE
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j SNAT --to-source 192.168.2.26
iptables -t nat -A POSTROUTING -s '192.168.2.0/24' -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o tun0 -j SNAT --to-source 10.8.0.1
192.168.2.26 和 10.8.0.1 是 VPN-Server 上的接口。
我现在希望将其缩小一点,只允许特定用户的特定目标。一个例子:
我希望 IP 为 10.8.0.10 的用户只能访问 192.168.2.100 的 8080 端口,而不能访问 LAN 子网中的其他任何内容。经过大量 Google 搜索后,我尝试了一些 SNAT 和 DNAT 的疯狂组合,但没有找到解决方案。
我该如何实现上述场景?
答案1
因此,我找到了解决我的问题的方法,如果有人有需要并且偶然发现这一点:
我放弃了 iptables 而选择了 ufw。
/etc/sysctl.conf:
net.ipv4.ip_forward=1
在 /etc/default/ufw 中:
DEFAULT_FORWARD_POLICY="DROP"
/etc/ufw/before.rules:
# START OPENVPN RULES
# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
# Allow traffic between OpenVPN and LAN
-A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
-A POSTROUTING -s 192.168.2.0 -o tun0 -j MASQUERADE
COMMIT
# END OPENVPN RULES
这样,一切都已设置好路由和转发,但由于默认的“丢弃”策略,目前还不需要转发任何内容。
为了将单个 IP 路由到问题中所述的不同子网的另一个 IP 上的端口,我只需要运行以下规则集:
sudo ufw route allow in on tun0 out on eth0 to 192.168.2.100 proto tcp port 8080 from 10.8.0.10