我正在 Debian 上设置 OpenVPN 服务器。
我已经配置了服务器,并且客户端可以连接 - 它们被分配了 10.11.22.0/24 范围内的 IP 地址。
我的 server.conf 文件中有以下内容:
client-to-client
status /var/log/openvpn-status.log
verb 3
server 10.11.22.0 255.255.255.0
# This ensures Internet-bound traffic to-from clients can pass through the VPN
push "redirect-gateway def1"
push "dhcp-option DNS (my DNS address)"
我已开启 IP 转发(设置于/etc/sysctl.conf
)
我认为我需要向 iptables 添加一条 NAT 规则,可能是这样的形式
iptables -t nat -A POSTROUTING -s 10.11.22.0/24 -o eth0 -j MASQUERADE
(欢迎指正!)
我的问题是,这个规则应该放在哪里才能使其持久(以便在重启后继续存在)?
我想,在理想情况下,当 VPN 服务器启动时会添加规则,当 VPN 服务器关闭时会删除规则,但无论如何,服务器在 systemctl 中设置为自动启动,所以这可能无关紧要。
我只是想在正确的地方做这件事,这样另一个系统管理员就不会感到惊讶,并且可以找到它。
答案1
一般而言,防火墙应独立于 VPN。在 Debian 中,可以使用netfilter-persistent
和iptables-persistent
包(两者都是必需的)来管理(保存和恢复)。
但是,OpenVPN 服务器启动或关闭时可以运行任何命令,因为它有一个脚本接口。在这种情况下,不要使用netfilter-persistent
&iptables-persistent
,否则防火墙可能会膨胀(考虑以下场景:脚本添加了规则,然后保存了防火墙,然后脚本删除了规则,重新启动 — 防火墙已加载已保存规则声明,然后脚本运行并添加其他规则;经过几次重复后,您会在防火墙中看到几条相同的规则)。
首先,添加到 OpenVPN 配置:
script-security 2
up /etc/openvpn/add-rule.sh
down sudo /etc/openvpn/remove-rule.sh
script-security
是运行脚本所必需的。
您很可能拥有非 root 权限user
和/或group
服务器配置(这很好!),因此您的down
脚本将以该用户/组权限执行。因此,您需要再次获得权限才能删除该规则。创建一个/etc/sudoers.d/openvpn-remove-rule
包含以下行的文件,这将使该用户能够运行所述命令:
<user> ALL=(ALL) NOPASSWD: /etc/openvpn/remove-rule.sh
(<user>
可能用 OpenVPN 配置中设置的任何用户替换nobody
)。chmod 0400 /etc/sudoers.d/openvpn-remove-rule
否则 sudo 将拒绝加载它。
解释为什么我们需要脚本而不是直接通过 sudo 将 iptables 命令调用放入 OpenVPN 配置中。简而言之:安全。
相反,up
命令在放弃 root 权限之前运行,但为了一致性,我建议也使用脚本。
这些脚本的内容很明显,只需放入需要在服务器启动和关闭时运行的 iptables 命令即可。(原则上,您可以在其中使用任何命令,而不仅仅是 iptables。)使两个脚本都可执行。
阅读man openvpn
以供参考其脚本接口。