1.基本设置
1. 设置 INPUT 链的默认策略为 DROP
首先,确保默认情况下,所有未明确允许的流量都被丢弃。这是通过将 INPUT 链的默认策略设置为 DROP 实现的:
sudo iptables -P INPUT DROP
这一步骤确保任何未被明确允许的流量都会被拒绝。
2. 允许必要的流量
为了让你能够管理服务器,需要允许必要的流量,例如 SSH(用于远程管理),并且可以根据需要允许 HTTP/HTTPS 流量。
a) 允许已建立和相关的连接
这条规则允许已经建立的连接继续通信,避免因设置防火墙而中断现有的连接:
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
b) 允许本地回环流量
允许本地回环接口(lo)的流量是非常重要的,因为许多服务依赖于与本地回环接口的通信:
sudo iptables -A INPUT -i lo -j ACCEPT
c) 允许 SSH 流量
允许通过 SSH 访问你的服务器(默认端口为22)。如果你使用了不同的端口,请调整端口号:
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
d) 允许 HTTP 和 HTTPS 流量(如果你的服务器提供Web服务)
如果你运行Web服务器并需要外部访问,允许HTTP(端口80)和HTTPS(端口443)流量:
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
- 防止 Ping 请求(ICMP Echo-Request)
如果你不希望服务器响应 ping 请求,可以丢弃 ICMP Echo-Request 包:
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
- 使用 DOCKER-USER 链控制 Docker 流量
你可以在 DOCKER-USER 链中添加规则,进一步限制 Docker 容器的外部访问。例如,禁止所有外部访问,只允许特定子网访问容器:
# 默认拒绝外部访问 Docker 容器
sudo iptables -I DOCKER-USER -i eth0 -j DROP
# 允许来自特定子网的访问
sudo iptables -I DOCKER-USER -s 192.168.1.0/24 -j ACCEPT
- 启用日志记录
启用日志记录可以帮助你监控和审查被拒绝的连接尝试:
sudo iptables -A INPUT -j LOG --log-prefix "IPTables-Dropped: " --log-level 4
日志将记录到系统日志文件中,你可以使用 dmesg 或查看 /var/log/syslog 文件来审查。
- 保存 iptables 配置
在配置完成后,保存 iptables 规则以便在重启后自动加载:
sudo iptables-save | sudo tee /etc/iptables/rules.v4
- 定期审查和更新规则
定期审查防火墙规则以确保它们仍然适合当前的安全需求,并根据实际需要进行调整。例如,如果添加了新服务或改变了端口配置,需要更新相应的 iptables 规则。
要查看已在你的服务器上开放的端口,你可以使用以下几种方法:
3.检查端口配置
ss 命令是 netstat 的替代工具,可以显示系统上所有监听的端口。
查看所有监听的 TCP 端口:
sudo ss -tuln
这个命令的各个参数的含义如下:
-t: 显示 TCP 端口。
-u: 显示 UDP 端口。
-l: 只显示监听状态的端口。
-n: 显示端口号,而不是将其解析为服务名称。
4.关闭防火墙
如果你关闭防火墙(例如,使用 iptables -F 清空所有规则),会发生以下情况:
INPUT DROP 策略依然生效:
即使你使用 iptables -F 清空所有规则,由于 -P INPUT DROP 设置的是链的默认策略,而不是具体的规则,默认策略仍然会保持生效。这意味着除非你设置新的规则,否则所有入站流量仍将被丢弃。
如何正确关闭防火墙:
如果你想关闭防火墙,使所有流量不受限制地访问,你需要做的不仅仅是清空规则,还需要更改链的默认策略。
如何查看现有的 iptables 规则
你可以使用以下命令来查看当前的 iptables 规则:
sudo iptables -L -v -n
参数解释:
-L:列出所有规则。
-v:显示详细信息,包括数据包和字节的计数。
-n:不进行DNS反向解析,直接显示IP地址和端口号,这使得输出更快。
要只清除 INPUT 链的规则而不影响其他链(例如 FORWARD 和 OUTPUT),你可以使用以下命令:
sudo iptables -F INPUT
解释:
-F(或 --flush)是 flush 的缩写,用于清空指定链中的所有规则。
INPUT 指定了你要清空规则的链。
结果:
这个命令将会清除 INPUT 链中的所有规则,但不会更改 INPUT 链的默认策略,也不会影响其他链(如 FORWARD 和 OUTPUT)。
清空后,INPUT 链将变得没有任何规则,只剩下默认策略来处理流量。
检查效果:
在清空规则后,你可以使用以下命令查看 INPUT 链是否已清空:
sudo iptables -L INPUT -v -n
这将列出 INPUT 链中现有的规则。如果你刚刚清空了它,输出应该只显示默认策略,而没有其他规则。
注意事项:
默认策略: 清空规则后,INPUT 链的默认策略(DROP 或 ACCEPT)仍然会生效。所以在清空规则之前,确保你已经配置好了合适的默认策略。例如,如果你清空了所有规则,而默认策略是 DROP,则所有新进的连接都会被阻止,除非你重新添加允许规则。
重启后规则持久化: iptables 的规则在系统重启后不会自动保留。如果你希望持久化这些配置,请使用 iptables-save 和 iptables-restore,或配置 iptables-persistent 工具。
清除全部规则
# 清空所有现有的 iptables 规则
sudo iptables -F
# 将 INPUT 链的默认策略改回 ACCEPT
sudo iptables -P INPUT ACCEPT
# 同样修改 FORWARD 和 OUTPUT 链的默认策略(根据需要)
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT
这样,防火墙实际上就被“关闭”了,因为所有入站、转发和出站的流量都将被默认接受,而没有任何过滤。
潜在风险:
关闭防火墙意味着你的系统将完全开放,任何人都可以连接到你的服务器,这可能导致严重的安全风险,尤其是在公网环境下运行的服务器。
如果你确实需要短暂关闭防火墙,建议你在完成必要操作后,立即重新配置并启用防火墙规则,以保护你的服务器免受外部攻击。
停留在世界边缘,与之惜别