我正在学习如何使用iptables
并在 Ubuntu 上编写一个非常简单的防火墙。
仅使用过滤表,我添加了以下规则
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
因为我只想让我想要的数据包通过。
然后我尝试添加规则来建立简单的 HTTP 连接,因此,作为第一次尝试,我添加了
iptables -A INPUT -p tcp -j ACCEPT
iptables -A INPUT -p udp --sport 53 -j ACCEPT
第一行接受所有 TCP 流量,第二行接受 DNS 应答。
类似地,对于 OUTPUT 链,我添加了
iptables -A OUTPUT -p tcp -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
但当我尝试使用时,lynx
连接却没有建立。
我认为唯一的问题就是 DNS,因为所有 TCP 流量都被接受。但是往返于端口 53 的数据包可以通过防火墙...那么,问题出在哪里?
我添加了以下两条规则,现在它可以正常工作了。
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
使用 Wireshark 我意识到 DNS 请求也来自/发往环回接口。我从来没有想过...为什么?
答案1
只需使用iptables-save
并重新启动计算机即可。这将使您的 iptables 设置生效。
如果您正在设置防火墙,那么为什么要启用所有 tcp 端口。我更愿意仅允许选定的端口。例如,对于 lynx。我会使用:
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables-save
sudo init 6
为什么你使用
sudo iptables -A OUTPUT -j DROP
这将丢弃所有端口的所有传出流量。