我为没有状态的 IPTABLES 编写了这个脚本。我需要阻止除 SSH、DNS、ICMP 和 Ubuntu 存储库之外的任何输出连接
#! /bin/bash
#Objetivo del script:
#Descartar paquetes excepto ssh y DNS
#FIREWALL DE HOST SIN ESTADO Servidor
#Cleanup Rules
iptables -t filter -P INPUT DROP
iptables -t filter -P OUTPUT DROP
iptables -t filter -P FORWARD DROP
#allow loopback
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
#DNS resolution input and output
iptables -A INPUT -p udp --dport 53 -d 8.8.8.8,8.8.4.4 -j ACCEPT
iptables -A INPUT -p udp --sport 53 -s 8.8.8.8,8.8.4.4 -j ACCEPT
#updates since ubuntu repositories
iptables -A INPUT -p tcp -d archive.ubuntu.com,security.ubuntu.com -m multiport --dports 80,443 -j ACCEPT
iptables -A OUTPUT -p tcp -s archive.ubuntu.com,security.ubuntu.com -m multiport --sports 80,443 -j ACCEPT
#allow ssh
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
#allow ICMP
iptables -A INPUT -p icmp -j ACCEPT
iptables -A OUTPUT -p icmp -j ACCEPT
结果是这样的:
iptables v1.8.7 (nf_tables): host/network `archive.ubuntu.com' not found
Try `iptables -h' or 'iptables --help' for more information.
iptables v1.8.7 (nf_tables): host/network `archive.ubuntu.com' not found
Try `iptables -h' or 'iptables --help' for more information.
答案1
乍一看,您只允许接收 DNS 响应,并且没有在 OUTPUT 链中创建任何 DNS 相关规则来实际允许发送 DNS 查询。
您当前的规则:
#DNS resolution input and output
iptables -A INPUT -p udp --dport 53 -d 8.8.8.8,8.8.4.4 -j ACCEPT
^^^^^
iptables -A INPUT -p udp --sport 53 -s 8.8.8.8,8.8.4.4 -j ACCEPT
^^^^^
另外,DNS也可以使用TCP进行传输。
答案2
问题似乎出在 DNS 解析上。
iptables -A INPUT -p udp --dport 53 -d 8.8.8.8,8.8.4.4 -j ACCEPT
它允许 8.8.8.8 和 8.8.4.4 主机通过目标端口 53 到达您的服务器。如果您的站点/服务器上运行任何 DNS 服务。
iptables -A INPUT -p udp --sport 53 -s 8.8.8.8,8.8.4.4 -j ACCEPT
上述规则规定,如果 8.8.8.8 或 8.8.4.4 主机的源端口是 53,则允许它们访问您的站点/服务器。
我会采用如下的一般规则,允许从您的站点到任何 DNS 服务器的所有 DNS 查询。还建议打开 TCP,因为必须使用 TCP 来交换大于 512 字节的信息。
iptables -A OUTPUT -p udp -m udp --dport 53 -j ACCEPT