iptables只允许互联网连接

让我解释一下我以前做过的事情;

# Only INPUT policy DROP, others are ACCEPT sudo iptables -P INPUT DROP sudo iptables -A INPUT -p tcp --sport 80 -j ACCEPT 

我也试试这个; 这些端口为443和8080

 sudo iptables -A INPUT -p tcp --sport 80 -m state --state NEW,ESTABLISHED -j ACCEPT 

然后我意识到,我应该允许dns服务器,

 sudo iptables -A INPUT -p udp --sport 53 -j ACCEPT sudo iptables -A INPUT -p tcp --sport 53 -j ACCEPT 

应用此规则,但我无法连接互联网,

但是,当我允许所有udp端口时,我可以连接。

我忘了什么吗? 或做错了什么?

您的计算机如何获取其IP地址? 如果它是通过DHCP,那么你需要允许UDP回复到端口68(或从端口67,见稍后):

 sudo iptables -A INPUT -p udp --sport 67 --dport 68 -m state --state RELATED,ESTABLISHED -j ACCEPT 

如果您的目标是仅允许网站浏览,那么将始终从您的终端启动连接,因此您只需要允许相关的流量回来(在此示例中假设e​​th0是您的NIC名称):

 sudo iptables -A INPUT -i eth0 -p tcp -m multiport --sport 80,443,8080 -m state --state ESTABLISHED,RELATED -j ACCEPT 

现在,您可能需要也可能不需要允许本地界面(取决于您对计算机的操作):

 sudo iptables -A INPUT -i lo -j ACCEPT 

最后,您可以结合其中的一些内容,最终得到:

 sudo iptables -A INPUT -i lo -j ACCEPT sudo iptables -A INPUT -i eth0 -p udp -m multiport --sport 53,67 -m state --state ESTABLISHED,RELATED -j ACCEPT sudo iptables -A INPUT -i eth0 -p tcp -m multiport --sport 53,80,443,8080 -m state --state ESTABLISHED,RELATED -j ACCEPT 

我在我的一台测试计算机上对此进行了编码,并且工作正常(SSH端口22的东西适合我,因为我实际上并不坐在那台计算机上):

 #!/bin/sh FWVER=0.01 # # test extremely basic 2015.06.10 Ver:0.01 # # run as sudo # echo "Loading test rule set version $FWVER..\n" # The location of the iptables program # IPTABLES=/sbin/iptables #Setting the EXTERNAL and INTERNAL interfaces and addresses for the network # EXTIF="eth0" EXTIP="192.168.111.140" UNIVERSE="0.0.0.0/0" #Clearing any previous configuration # echo " Clearing any existing rules and setting default policy to ACCEPT.." $IPTABLES -P INPUT DROP $IPTABLES -F INPUT $IPTABLES -P OUTPUT ACCEPT $IPTABLES -F OUTPUT $IPTABLES -P FORWARD ACCEPT $IPTABLES -F FORWARD $IPTABLES -t nat -F # Delete user defined chains $IPTABLES -X # Reset all IPTABLES counters $IPTABLES -Z echo about to load rules. $IPTABLES -A INPUT -i lo -j ACCEPT $IPTABLES -A INPUT -i $EXTIF -p udp -m multiport --sport 53,67 -m state --state ESTABLISHED,RELATED -j ACCEPT $IPTABLES -A INPUT -i $EXTIF -p tcp -m multiport --sport 53,80,443,8080 -m state --state ESTABLISHED,RELATED -j ACCEPT $IPTABLES -A INPUT -i $EXTIF -p tcp --dport 22 -j ACCEPT echo Test rule set version $FWVER done. 

我通过/etc/network/interfaces文件自动启动:

 # 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/test_iptables_06 # The primary network interface auto eth0 iface eth0 inet dhcp 

请注意,更典型的情况是,用户只允许返回任何相关的流量,使用更通用的规则(使用上面我的脚本的变量名称):

 $IPTABLES -A INPUT -i $EXTIF -s $UNIVERSE -d $EXTIP -m state --state ESTABLISHED,RELATED -j ACCEPT 

编辑:

有时帮助理解/调试添加一些日志记录可以提供帮助。 例如:

 echo about to load rules. $IPTABLES -A INPUT -i lo -j LOG --log-prefix "ILO:" --log-level info $IPTABLES -A INPUT -i lo -j ACCEPT $IPTABLES -A INPUT -i $EXTIF -p udp -m multiport --sport 53,67 -m state --state ESTABLISHED,RELATED -j ACCEPT $IPTABLES -A INPUT -i $EXTIF -p tcp -m multiport --sport 53,80,443,8080 -m state --state ESTABLISHED,RELATED -j ACCEPT $IPTABLES -A INPUT -i $EXTIF -p tcp --dport 22 -j ACCEPT $IPTABLES -A INPUT -j LOG --log-prefix "IDROP:" --log-level info echo Test rule set version $FWVER done. 

然后观察/var/log/syslog中的条目。 请注意日志记录,以免泛洪日志文件。