如何设置这些iptables规则以在启动时运行


20

每当登录时,我通常都会运行iptables规则。从终端我输入;

sudo sh firewall.sh

设置姐姐的计算机,我想给她一些基本的防火墙保护。她不会以管理员身份登录,而只是一个标准帐户。如何在她每次登录时都运行防火墙脚本而无需输入任何密码?

我为姐姐的计算机编写的脚本包含;

#!/bin/sh

modprobe ip_conntrack
iptables -F
iptables -X
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

iptables -I OUTPUT -p tcp --dport 80 --sport 32768:61000 -j ACCEPT
iptables -I OUTPUT -p udp --dport 53 --sport 32768:61000 -j ACCEPT
iptables -I OUTPUT -p tcp --dport 443 --sport 32768:61000 -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -I OUTPUT -p icmp -j DROP

iptables -I INPUT -p icmp -j DROP
iptables -I INPUT -p udp -j DROP
iptables -I INPUT -p tcp -m tcp --syn -j DROP
iptables -I INPUT -i lo -j ACCEPT
iptables -I INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

我将其放置在她的主文件夹中,名为firewall.sh,并将其设置为可执行文件(右键单击该文件,然后在权限选项卡中选中“允许将文件作为程序执行”选项)。

以root身份从终端运行此脚本可以正常工作。

打字后;

sudo sh firewall.sh

我输入终端

sudo iptables -L -v

我得到

Chain INPUT (policy DROP 0 packets, 0 bytes)  pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     all  --  any    any     anywhere             anywhere             ctstate RELATED,ESTABLISHED
    0     0 ACCEPT     all  --  lo     any     anywhere             anywhere            
    0     0 DROP       tcp  --  any    any     anywhere             anywhere             tcpflags: FIN,SYN,RST,ACK/SYN
    0     0 DROP       udp  --  any    any     anywhere             anywhere            
    0     0 DROP       icmp --  any    any     anywhere             anywhere            

Chain FORWARD (policy DROP 0 packets, 0 bytes)  pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy DROP 0 packets, 0 bytes)  pkts bytes target     prot opt in     out     source               destination         
    0     0 DROP       icmp --  any    any     anywhere             anywhere            
    0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp spts:32768:61000 dpt:https
    0     0 ACCEPT     udp  --  any    any     anywhere             anywhere             udp spts:32768:61000 dpt:domain
    0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp spts:32768:61000 dpt:http
    0     0 ACCEPT     all  --  any    lo      anywhere             anywhere

如何在登录时自动运行此脚本,或者可能将这些规则永久保存在姐妹计算机上?您能否提供一些详细的代码,因为我第一次尝试rc.local方法和iptables-save并不是很成功。每次重新启动时,所有的INPUT,OUTPUT和FORWARD链都会重置为ACCEPT,在我键入时未列出任何策略sudo iptables -L -v


差不多两年后,但有一条重要的评论:ip6tables由于IPv6是由ip6tables和而不是来处理的,因此请确保在一天内获得v6连接时有规则iptables
托马斯·沃德

Answers:


38

您可能要使用该iptables-persistent软件包,而不要弄乱您的启动脚本。首先,运行脚本以设置防火墙规则。其次,运行sudo apt-get install iptables-persistent,然后按照提示进行操作。当它要求保存当前规则时,在两个提示符处均单击“是”。现在,重新启动后,您的iptables规则将恢复。


注意:如果此后更改了规则,则更改后将需要执行以下命令:

要保存您的IPv4 iptables规则: sudo su -c 'iptables-save > /etc/iptables/rules.v4'

要保存您的IPv6 ip6tables规则: sudo su -c 'ip6tables-save > /etc/iptables/rules.v6'


谢谢,那很有效。如果确实要临时更改规则,我可以从终端运行脚本,是吗?
Mikelane

是的,或者您可以直接直接操作iptables系统。但是,如果您计划永久使用临时规则,则除非您执行我在回答中指出的命令,否则不能保证会保存新规则。
托马斯·沃德

sudo dpkg-reconfigure iptables-persistent更改规则后运行是个坏主意。
souravc

@souravc回答的问题是“为什么需要或想要?” 这个想法是,您将不必,也可以只手动重写(或覆盖(rules.v4或)rules.v6文件,以便在下次启动时对它们进行索引,或者在您运行时立即对其进行索引,iptables-restore < /etc/iptables/rules.v4或者ip6tables-restore < /etc/iptables/rules.v6
Thomas Ward

2

假设您具有以下防火墙规则:

/etc/iptables.up.rules

也许最明显的答案是在以下位置创建一个名为iptables的文件:

/etc/network/if-pre-up.d

内容:

#!/bin/bash
/sbin/iptables-restore < /etc/iptables.up.rules

并使其可执行

sudo chmod +x /etc/network/if-pre-up.d/iptables

这样,在激活网络接口之前,将加载规则。


谢谢,它会把日志丢到任何地方吗?这不起作用,我怀疑这是由于我的主机启动时使用的dns服务器的解析器尚未启动。
Dimitri Kopriwa's
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.