假设我在 DigitalOcean 有几台服务器,我希望它们能够相互通信。
DigitalOcean 提供 WAN 连接和 LAN 连接。问题是两者都没有安全感。 WAN 是互联网,LAN 是由在 DigitalOcean 拥有计算机 (VPS) 的每个人共享的。
所以我想阻止除了 WAN 上的 53、80、443 等少数端口之外的所有端口。这是标准程序。
然后,也许我在另一台计算机上有 MySQL,所以我想为 IP 地址 10.1.1.1 打开端口 3306(示例 IP,在 DigitalOcean 中实际上无效。)
现在我的问题是我希望在任一接口启动之前防火墙规则就位。
auto eth0 eth1
iface eth0 inet static
address 8.8.8.2 # some Internet address
netmask 255.255.255.255
gateway 8.8.8.1 # some Internet address
dns-nameservers 8.8.8.8 8.8.4.4
pre-up /etc/network/firewall
iface eth1 inet static
address 10.1.1.1
netmask 255.0.0.0
pre-up /etc/network/firewall
我想出的是将其添加pre-up
到两个接口中。这样我就可以确定它在任一脚本之前启动,这也意味着脚本将运行两次。
是这样做的方法吗?或者是否有更好的方法来实现pre-up
所有接口的全局等效功能?
注意:操作系统是 Ubuntu 16.04.1,最新可用。
答案1
我实际上找到了一个解决方案,因为我使用的是 Ubuntu 16.04 并且我们有 systemd,我只是创建了一个脚本snapinitfirewall.service
并将其安装在我的防火墙代码中。
# Documentation available at:
# https://www.freedesktop.org/software/systemd/man/systemd.service.html
[Unit]
Description=Snap! Websites firewall initialization
Before=network.target
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/etc/network/firewall
#ExecStop=... -- why would you ever want to remove your firewall rules?
[Install]
WantedBy=multi-user.target
# vim: syntax=dosini
/etc/network/firewall
是一个在启动时立即恢复所有规则的脚本。
因为我有该一个包的另一个服务文件(即一个包提供两种服务),所以我必须包含以下行以确保启用初始化并在重新启动时运行:
systemctl -q enable snapinitfirewall
这是比使用该功能更好的方法,pre-up
因为您可以确保它在网络启动之前运行。
对于那些对更多感兴趣的人来说,快照防火墙项目在 github 上。