🤖 Assistant

好的,如果你想在 Ubuntu 或 Debian 系统上,不使用 ufw,而是直接使用 iptables 来丢弃(DROP)某个 IP 地址的所有流量(包括入站和出站),你需要针对 INPUTOUTPUT 链添加规则。

理解 iptables 链:

  • INPUT 链: 处理所有目的地是本地机器的数据包。
  • OUTPUT 链: 处理所有源自本地机器的数据包。
  • FORWARD 链: 处理所有通过本地机器转发的数据包(如果你的机器是路由器或网关)。对于大多数服务器,通常只关心 INPUTOUTPUT

1. 丢弃来自特定 IP 的所有入站流量

这个命令会阻止该 IP 地址的任何数据包进入你的服务器。

sudo iptables -A INPUT -s 192.168.1.100 -j DROP
  • -A INPUT: 将规则添加到 INPUT 链的末尾。
  • -s 192.168.1.100: 指定源 IP 地址为 192.168.1.100
  • -j DROP: 动作是 DROP,即悄悄丢弃数据包,不发送任何响应。

2. 丢弃发往特定 IP 的所有出站流量

这个命令会阻止你的服务器向该 IP 地址发送任何数据包。

sudo iptables -A OUTPUT -d 192.168.1.100 -j DROP
  • -A OUTPUT: 将规则添加到 OUTPUT 链的末尾。
  • -d 192.168.1.100: 指定目标 IP 地址为 192.168.1.100
  • -j DROP: 动作是 DROP

示例:完整封禁 IP 192.168.1.100

# 1. 丢弃所有来自 192.168.1.100 的入站流量
sudo iptables -A INPUT -s 192.168.1.100 -j DROP

# 2. 丢弃所有发往 192.168.1.100 的出站流量
sudo iptables -A OUTPUT -d 192.168.1.100 -j DROP

3. 查看当前的 iptables 规则

添加规则后,务必检查以确认它们已生效:

sudo iptables -L -n -v
  • -L: 列出所有规则。
  • -n: 不解析 IP 地址和端口的服务名,直接显示数字,提高速度。
  • -v: 显示详细信息,包括数据包和字节计数。

如果你想查看规则的编号,方便删除:

sudo iptables -L -n --line-numbers

4. 删除 iptables 规则

你可以根据规则内容删除,或者根据规则编号删除。推荐使用编号删除,更精确。

a. 根据规则编号删除 (推荐):

首先,使用 sudo iptables -L -n --line-numbers 找到你要删除的规则在 INPUTOUTPUT 链中的编号。

假设 INPUT 链中封禁 192.168.1.100 的规则编号是 5

sudo iptables -D INPUT 5

假设 OUTPUT 链中封禁 192.168.1.100 的规则编号是 3

sudo iptables -D OUTPUT 3

b. 根据规则内容删除:

如果你忘记了规则编号,或者规则较少,可以直接使用添加规则时完全相同的命令,但把 -A 换成 -D

sudo iptables -D INPUT -s 192.168.1.100 -j DROP
sudo iptables -D OUTPUT -d 192.168.1.100 -j DROP

5. 使 iptables 规则持久化 (非常重要!)

iptables 规则默认在系统重启后会丢失。 你需要安装 iptables-persistent 包来保存它们。

  1. 安装 iptables-persistent

    sudo apt update
    sudo apt install iptables-persistent

    在安装过程中,它会询问你是否保存当前的 IPv4 和 IPv6 规则。选择 Yes

  2. 手动保存规则 (当规则有更改后):

    每次你添加、修改或删除 iptables 规则后,都需要运行以下命令来保存更改,以便它们在重启后仍然有效:

    sudo netfilter-persistent save
    # 或者
    sudo service netfilter-persistent save

    这会将当前生效的 iptables 规则保存到 /etc/iptables/rules.v4 (IPv4) 和 /etc/iptables/rules.v6 (IPv6) 文件中。系统启动时,netfilter-persistent 服务会自动加载这些规则。

重要提示和注意事项:

  • 小心不要封禁自己的 IP 地址! 在执行任何封禁命令之前,请确保你知道自己在做什么,并有一个备用的访问方式(例如,通过物理控制台或另一个 IP 地址)。
  • 允许 SSH (如果你通过 SSH 连接): 如果你的服务器默认策略是 DROP (例如,iptables -P INPUT DROP),或者你添加了会广泛阻挡流量的规则,请务必在这些规则之前添加允许 SSH 端口的规则,否则你会把自己锁在外面。

    # 允许 SSH (默认端口 22)
    sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
    # 如果这条规则在封禁 IP 规则之后,你需要用 -I (insert) 把它插到前面
    # sudo iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT # 插入到 INPUT 链的第一条
  • 规则顺序: iptables 规则是按顺序处理的。如果你的链中有一条 ACCEPT 规则在你的 DROP 规则之前匹配了流量,那么 DROP 规则将不会生效。通常,更具体的 DROP 规则应该放在更通用的 ACCEPT 规则之前,或者放在链的开头(使用 -I)。
  • DROP vs REJECT DROP 会悄悄丢弃数据包,攻击者不会收到任何响应,这使得他们更难判断端口是否开放或主机是否存在。REJECT 会发送一个错误信息(例如 ICMP Port Unreachable),这会暴露一些信息。对于恶意 IP,通常推荐使用 DROP
最后修改:2025 年 06 月 18 日
如果觉得我的文章对你有用,请随意赞赏