🤖 Assistant
好的,如果你想在 Ubuntu 或 Debian 系统上,不使用 ufw
,而是直接使用 iptables
来丢弃(DROP)某个 IP 地址的所有流量(包括入站和出站),你需要针对 INPUT
和 OUTPUT
链添加规则。
理解 iptables
链:
INPUT
链: 处理所有目的地是本地机器的数据包。OUTPUT
链: 处理所有源自本地机器的数据包。FORWARD
链: 处理所有通过本地机器转发的数据包(如果你的机器是路由器或网关)。对于大多数服务器,通常只关心INPUT
和OUTPUT
。
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
找到你要删除的规则在 INPUT
或 OUTPUT
链中的编号。
假设 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
包来保存它们。
安装
iptables-persistent
:sudo apt update sudo apt install iptables-persistent
在安装过程中,它会询问你是否保存当前的 IPv4 和 IPv6 规则。选择
Yes
。手动保存规则 (当规则有更改后):
每次你添加、修改或删除
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
vsREJECT
:DROP
会悄悄丢弃数据包,攻击者不会收到任何响应,这使得他们更难判断端口是否开放或主机是否存在。REJECT
会发送一个错误信息(例如 ICMP Port Unreachable),这会暴露一些信息。对于恶意 IP,通常推荐使用DROP
。