我正在使用 Ubuntu 16.04 Server。
我想在启动时使用 iptables 的 Bash 脚本,但我不想使用 crontab 或 init.d。有没有可能不使用它们来实现这一点?
#!/bin/bash
IPT="/sbin/iptables"
$IPT --flush
$IPT --delete-chain
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT ACCEPT
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT*
答案1
如果您不想安装其他软件,在 Ubuntu 16.04 上可行的一个解决方法是创建两个脚本,一个用于保存 Iptables 当前配置,另一个用于恢复配置。这些脚本必须放在(或 sim 链接到)/etc/network/if-post-down.d/
和中/etc/network/if-pre-up.d/
。还必须是可执行文件,并且不能有任何扩展名,例如.sh。这些脚本在我的系统上的样子如下:
$ cat /etc/network/if-post-down.d/iptables-save
#!/bin/sh
/sbin/iptables-save > /root/iptables-current-state.dat
exit 0
$ cat /etc/network/if-pre-up.d/iptables-restore
#!/bin/sh
/sbin/iptables-restore < /root/iptables-current-state.dat
exit 0
答案2
在我的 16.04 服务器上我使用/etc/network/interfaces
文件方法:
$ cat /etc/network/interfaces
# interfaces file for smythies.com 2016.01.30
# attempt to set local DNS herein, as the method
# used with the old 12.04 server no longer works.
#
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
pre-up /home/doug/init/doug_firewall
dns-nameservers 127.0.0.1
# The primary interface (d-link PCI card)
auto enp4s0
iface enp4s0 inet dhcp
# Local network interface (uses built in ethernet port)
auto enp2s0
iface enp2s0 inet static
address 192.168.111.1
network 192.168.111.0
netmask 255.255.255.0
broadcast 192.168.111.255
您可以看到我使用pre-up
本地接口定义中的指令来执行我的(主要)iptables 脚本。
注意:此方法不适用于使用 netplan 而不是 ifup ifdown 的后续版本。
答案3
您可以将启动脚本添加到 Ubuntu 启动应用程序中。这里有详细说明(https://help.ubuntu.com/stable/ubuntu-help/startup-applications.html.en)。请记住,在将脚本添加到启动应用程序之前,请确保该脚本是可执行的。