如何使用 iptables 仅允许流量通过一个特定的 VPN

如何使用 iptables 仅允许流量通过一个特定的 VPN

我正在尝试允许运行 Lubuntu 的 Banana PI 的所有流量仅进入我的 LAN 或通过 VPN 服务器。我遵循以下指南:http://joelslowik.blogspot.co.uk/2013/05/setup-iptables-for-vpn-and-local.html

本质上它说我应该使用这些规则:

#Allow loopback device (internal communication)
iptables -A INPUT -i lo -j 
iptables -A OUTPUT -o lo -j ACCEPT
#Allow all local traffic.
iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT
iptables -A OUTPUT -d 192.168.1.0/24 -j ACCEPT
#Allow VPN establishment
iptables -A OUTPUT -p udp --dport 1194 -j ACCEPT
iptables -A INPUT -p udp --sport 1194 -j ACCEPT
#Accept all TUN connections (tun = VPN tunnel)
iptables -A OUTPUT -o tun+ -j ACCEPT
iptables -A INPUT -i tun+ -j ACCEPT
#Set default policies to drop all communication unless specifically allowed
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

但据我了解,这将允许流量通过任何 VPN(或任何具有以“tun”开头的网络接口的东西)。

我尝试使用

iptables -A INPUT -s XXX.XXX.XXX.XXX -j ACCEPT
iptables -A OUTPUT -d XXX.XXX.XXX.XXX -j ACCEPT

使用 VPN 服务器的 IP 地址,但这似乎也不起作用,它根本无法连接到 VPN。

那么我该怎么做呢?我在 Windows 上使用 Windows 防火墙做了同样的事情(如下指南中提到的所有方法都适用于阻止除本地 IP 地址和 VPN 服务器 IP 地址之外的任何 IP 地址,这样就可以完美地运行。

答案1

因为看起来您正在使用 OpenVPN,所以您可以轻松做的一件事就是给您的 VPN tun 设备一个明确的名称,而不是使用 tunN。

dev tun_home在 OpenVPN 配置中输入类似 的内容是完全有效的。这将导致隧道设备被命名为tun_home。然后您可以在防火墙规则中使用它,而不是使用通配符设备名称匹配tun+

答案2

我假设您希望所有非本地流量都通过 VPN(例如互联网访问)。如果这是真的,我认为使用路由表而不是防火墙来做您想做的事情会更容易、更好。您可以定义默认路由以使用 VPN 而不是当前默认路由。

route add default dev tun0

或类似的东西并删除当前的默认路由。

另一方面,如果您真正想要的是阻止任何非本地或来自 VPN 的内容,那么使用 iptables 是正确的选择。

相关内容