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

  1. 防止 Ping 请求(ICMP Echo-Request)
    如果你不希望服务器响应 ping 请求,可以丢弃 ICMP Echo-Request 包:

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

  1. 使用 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
  1. 启用日志记录
    启用日志记录可以帮助你监控和审查被拒绝的连接尝试:

sudo iptables -A INPUT -j LOG --log-prefix "IPTables-Dropped: " --log-level 4
日志将记录到系统日志文件中,你可以使用 dmesg 或查看 /var/log/syslog 文件来审查。

  1. 保存 iptables 配置
    在配置完成后,保存 iptables 规则以便在重启后自动加载:

sudo iptables-save | sudo tee /etc/iptables/rules.v4

  1. 定期审查和更新规则
    定期审查防火墙规则以确保它们仍然适合当前的安全需求,并根据实际需要进行调整。例如,如果添加了新服务或改变了端口配置,需要更新相应的 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

这样,防火墙实际上就被“关闭”了,因为所有入站、转发和出站的流量都将被默认接受,而没有任何过滤。

潜在风险:

关闭防火墙意味着你的系统将完全开放,任何人都可以连接到你的服务器,这可能导致严重的安全风险,尤其是在公网环境下运行的服务器。
如果你确实需要短暂关闭防火墙,建议你在完成必要操作后,立即重新配置并启用防火墙规则,以保护你的服务器免受外部攻击。