我的 iptables 脚本阻止了传入/传出 DNS

我的 iptables 脚本阻止了传入/传出 DNS

这是 iptables 脚本:

echo 1 > /proc/sys/net/ipv4/conf/eth0/rp_filter
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo 1 > /proc/sys/net/ipv4/conf/all/log_martians

iptables -F
iptables -X
iptables -Z

iptables -P INPUT DROP
iptables -P FORWARD DROP

iptables -A INPUT -p icmp -m icmp --icmp-type echo-request -j DROP

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

iptables -N TCPIN
iptables -N UDPIN
iptables -N TCPOUT
iptables -N UDPOUT
iptables -N VALIDTCP
iptables -N LOGDROP

iptables -A INPUT -p tcp -j VALIDTCP
iptables -A INPUT -p tcp -j TCPIN
iptables -A INPUT -p udp -j UDPIN
iptables -A OUTPUT -p tcp -j VALIDTCP
iptables -A OUTPUT -p tcp -j TCPOUT
iptables -A OUTPUT -p udp -j UDPOUT

iptables -A TCPIN -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A TCPIN -p tcp -m state --state NEW --dport 2122 -j ACCEPT
iptables -A TCPIN -p tcp -m state --state NEW --dport 80 -j ACCEPT
iptables -A TCPIN -p tcp -m state --state NEW --dport 443 -j ACCEPT

iptables -A UDPIN -p udp --dport 53 -j ACCEPT
iptables -A TCPIN -p tcp -m state --state NEW --dport 53 -j ACCEPT

iptables -A LOGDROP -j LOG --log-ip-options --log-tcp-options --log-level debug --log-prefix IPTABLES:
iptables -A LOGDROP -j DROP

iptables -A VALIDTCP -p tcp --tcp-flags ALL NONE -j LOGDROP
iptables -A VALIDTCP -p tcp --tcp-flags ACK,FIN FIN -j LOGDROP
iptables -A VALIDTCP -p tcp --tcp-flags ACK,PSH PSH -j LOGDROP
iptables -A VALIDTCP -p tcp --tcp-flags ACK,URG URG -j LOGDROP
iptables -A VALIDTCP -p tcp --tcp-flags SYN,RST SYN,RST -j LOGDROP
iptables -A VALIDTCP -p tcp --tcp-flags SYN,FIN SYN,FIN -j LOGDROP
iptables -A VALIDTCP -p tcp --tcp-flags FIN,RST FIN,RST -j LOGDROP

一旦我应用它,我的 DNS 查找就会全部失败...这是怎么回事?:/

答案1

iptables -A 输入 -p tcp -j VALIDTCP

iptables -A 输入 -p tcp -j TCPIN

规则按顺序进行比较,并且 -j 表示“跳转到” - 因此没有任何东西会跳转到 TCPIN 链,因为所有 tcp 数据包都被重定向到其他地方。

此外,对于这么小的防火墙来说,这看起来是一个非常复杂的设置。保持简单:-)

这是未经测试的,但这本质上不是在做同样的事情吗(我放弃了 tcp 标志检查,但可以随意重新添加它)


echo 1 > /proc/sys/net/ipv4/conf/eth0/rp_filter
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo 1 > /proc/sys/net/ipv4/conf/all/log_martians

iptables -F
iptables -X
iptables -Z

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW --dport 2122 -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW --dport 443 -j ACCEPT
iptables -A INPUT -j LOG --log-ip-options --log-tcp-options --log-level debug --log-prefix IPTABLES:

即:允许流量出站(包括 DNS 请求)- 然后通过“相关、已建立”规则允许该流量返回。同时还允许端口 80、443、2122 上的新连接(从那时起,这些连接将与相同的相关端口匹配)。其他所有内容都由默认的 -P DROP 规则抛弃。

相关内容