我是新手。我发现了以下设置防火墙的规则(摘自《Linux 工作原理》一书)
iptables -P INPUT DROP # the default policy
iptables -A INPUT -s 127.0.0.1 -j ACCEPT
iptables -A INPUT -p tcp '!' --syn -j ACCEPT # accepting incoming
connections from everywhere except those initiating a connection hence syn
到目前为止一切顺利(或看起来如此)。当我尝试添加 DNS 规则时,问题就出现了,以下是我尝试过的方法,但似乎没有成功(一次一个):
INPUT -p udp --dport 53 --sport 1024:65535 -j ACCEPT
iptables -A INPUT -p udp --source-port 53 -s 127.0.1.1 -j ACCEPT
iptables -A INPUT -p udp --source-port 53 -j ACCEPT
期望结果: 防止任何从外部初始化连接(ssh,icmtp,...),启用 DNS 查找和 Web 浏览(curl,wget,telnet...),我认为在本地运行 Web 服务器或数据库服务器无关紧要...
任何帮助,将不胜感激。
答案1
我建议您创建一些输入规则,允许所有已建立和相关的流量,例如:
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
您还应该始终允许您的环回设备:
# 允许环回接口执行任何操作。 $IPTABLES -A 输入 -i lo -j 接受 $IPTABLES -A 输出 -o lo -j 接受
如果你的默认输出策略是接受,那么大多数问题应该会消失。否则你还应该添加:
$IPTABLES -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
并打开 HTTP(s)、DNS、ICMP 或任何您需要的端口。
https://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers
https://en.wikibooks.org/wiki/Communication_Networks/IP_Tables
答案2
允许建立会话 我们可以允许已建立的会话接收流量:
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
如果上面这行代码不起作用,那么你可能使用的是劣质 VPS,其提供商没有提供该扩展,在这种情况下,可以使用劣质版本作为最后的手段:
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
允许特定端口上的传入流量
sudo iptables -A INPUT -p tcp --dport ssh -j ACCEPT
阻断交通
sudo iptables -A INPUT -j DROP
通过编辑 iptables 启用环回:
sudo iptables -I INPUT 1 -i lo -j ACCEPT
记录不需要的流量:
sudo iptables -I INPUT 4 -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
确认更改已成功完成:
iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
LOG all -- anywhere anywhere limit: avg 5/min burst 5 LOG level debug prefix "iptables denied: "
DROP all -- anywhere anywhere
使用iptables -L -v
以获取更多详细信息:
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- lo any anywhere anywhere
0 0 ACCEPT all -- any any anywhere anywhere state RELATED,ESTABLISHED
0 0 ACCEPT tcp -- any any anywhere anywhere tcp dpt:ssh
0 0 LOG all -- any any anywhere anywhere limit: avg 5/min burst 5 LOG level debug prefix "iptables denied: "
0 0 DROP all -- any any anywhere anywhere
清空 iptables:
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
保存 iptables
如果你现在重启机器,你的 iptables 配置就会消失。不过,你不必每次重启时都输入这些配置,而是可以保存配置并让它自动启动。
将防火墙规则保存到文件中
sudo sh -c "iptables-save > /etc/iptables.rules"
脚本 /etc/network/if-pre-up.d/iptablesload 将包含:
#!/bin/sh
iptables-restore < /etc/iptables.rules
exit 0
并且 /etc/network/if-post-down.d/iptablessave 将包含:
#!/bin/sh
iptables-save -c > /etc/iptables.rules
if [ -f /etc/iptables.downrules ]; then
iptables-restore < /etc/iptables.downrules
fi
exit 0
然后确保赋予两个脚本执行权限:
sudo chmod +x /etc/network/if-post-down.d/iptablessave
sudo chmod +x /etc/network/if-pre-up.d/iptablesload