运维笔记:访问 IP 排查、定位与封禁
在使用 FRP 将内网服务映射到公网后,有时需要确认哪些 IP 正在访问服务,并对异常 IP 进行限制。这篇笔记记录一套适用于 Ubuntu/Debian、FRPS 和 UFW 的常用排查方法。
以下命令应在运行 公网服务器上执行。文中统一使用演示端口
6000,请按实际情况替换。
一、查看当前正在访问端口的 IP
查看 6000 端口当前已经建立的 TCP 连接:
sudo ss -ntp 'sport = :6000'
典型输出:
ESTAB 0 0 [::ffff:198.51.100.10]:6000 [::ffff:203.0.113.42]:49152 users:(("frps",pid=1234,fd=18))
这里:
198.51.100.10:6000是示例服务器地址和被访问的端口;203.0.113.42:49152是示例访问者 IP 和临时源端口;frps表示连接由 FRP 服务接收;ESTAB表示连接目前仍然处于建立状态;::ffff:是 IPv4 映射为 IPv6 的显示形式,真正的访问 IP 仍是后面的 IPv4 地址。
持续刷新查看:
watch -n 1 "ss -ntp 'sport = :6000'"
ss 只能看到当前尚未断开的连接。如果访问很短,可能来不及观察到,这时可以使用抓包。
二、用 tcpdump 捕获短连接
监听所有进入 6000 端口的 TCP 数据包:
sudo tcpdump -n -i any 'tcp dst port 6000'
只观察新连接的 SYN 包,输出更清楚:
sudo tcpdump -n -i any 'tcp dst port 6000 and tcp[tcpflags] & tcp-syn != 0'
把结果同时显示并保存到日志:
sudo tcpdump -n -l -i any 'tcp dst port 6000 and tcp[tcpflags] & tcp-syn != 0' | sudo tee -a /var/log/frp-6000-access.log
按 Ctrl+C 可以停止抓包。
注意,正确的过滤语法是 tcp dst port 6000,port 后面没有冒号。
三、查询 IP 的大致归属
查到 IP 后,可以查询其运营商和大致地区:
curl "https://ipinfo.io/203.0.113.42/json"
也可以把 IP 写成变量,避免反复修改整条命令:
ip_to_check="203.0.113.42"
curl "https://ipinfo.io/${ip_to_check}/json"
IP 定位通常只能反映运营商出口或大致城市,不能据此确认具体个人。访问者如果使用 VPN、代理或云主机,查询结果显示的也只是其出口节点。
四、确认 UFW 是否启用
sudo ufw status verbose
如果显示 Status: active,说明 UFW 正在工作。查看带编号的完整规则:
sudo ufw status numbered
在修改防火墙前,必须确认 SSH 使用的端口已经有 ALLOW 规则,以免把自己的远程连接挡在服务器外。
五、禁止某个 IP 访问指定端口
禁止示例 IP 203.0.113.42 访问 6000/tcp:
sudo ufw insert 1 deny from 203.0.113.42 to any port 6000 proto tcp
这里使用 insert 1,是为了把拒绝规则插入到已有的 6000/tcp ALLOW IN Anywhere 之前。UFW 按规则顺序匹配,如果允许规则在拒绝规则之前,封禁可能不会生效。
添加后立即检查:
sudo ufw status numbered
这条规则只禁止该 IP 访问 6000,不会影响它访问其他端口。
封禁该 IP 对所有端口的访问
如果确认该 IP 完全不可信,可以禁止它访问服务器的所有端口:
sudo ufw insert 1 deny from 203.0.113.42
这比只封禁一个端口影响更大,执行前应确认 IP 无误。
六、解除封禁
解除针对 6000 端口的精确封禁规则:
sudo ufw delete deny from 203.0.113.42 to any port 6000 proto tcp
如果不确定规则内容,先查看编号:
sudo ufw status numbered
再按编号删除,例如:
sudo ufw delete 1
删除编号前要重新查看一次规则,因为每次添加或删除规则后,编号都可能变化。
七、关闭一个公网端口
如果 UFW 的默认入站策略是 deny,删除端口的允许规则即可关闭公网访问。例如关闭演示端口 7000/tcp:
sudo ufw delete allow 7000/tcp
检查规则:
sudo ufw status
输出中不再出现 7000/tcp 和 7000/tcp (v6) 即可。
检查程序是否仍在监听端口:
sudo ss -lntp 'sport = :7000'
这里需要区分两个概念:
- 删除 UFW 的允许规则:程序可能仍在监听,但公网流量会被防火墙阻止;
- 停止 FRP 映射:需要在对应的
frpc.toml中删除或停用remotePort = 7000的代理配置,然后重启frpc。
不要为了关闭单个映射直接停止 frps,否则其他 FRP 映射也会一起中断。
八、为什么封禁后连接可能还存在
新增 UFW 规则主要阻止后续连接。已经建立的连接可能暂时继续存在,可以先查看:
sudo ss -ntp 'sport = :6000'
如需立即清理连接状态,可以使用 conntrack:
sudo conntrack -D -s 203.0.113.42 -p tcp --dport 6000
如果提示找不到命令,可安装:
sudo apt update
sudo apt install conntrack
重启 frps 也会断开连接,但会同时影响其他 FRP 服务,不建议仅为踢掉一个 IP 而这样操作。
九、常用命令速查
# 查看当前访问者
sudo ss -ntp 'sport = :6000'
# 捕获进入端口的新连接
sudo tcpdump -n -i any 'tcp dst port 6000 and tcp[tcpflags] & tcp-syn != 0'
# 查询 IP 大致归属
curl "https://ipinfo.io/203.0.113.42/json"
# 查看 UFW 状态和规则编号
sudo ufw status numbered
# 禁止一个 IP 访问指定端口
sudo ufw insert 1 deny from 203.0.113.42 to any port 6000 proto tcp
# 解除精确封禁
sudo ufw delete deny from 203.0.113.42 to any port 6000 proto tcp
# 删除端口的公网允许规则
sudo ufw delete allow 7000/tcp
十、安全建议
- 不需要公网开放的端口不要保留
ALLOW IN Anywhere。 - 管理后台尽量只允许固定可信 IP 访问,而不是先全部开放再逐个封禁异常 IP。
- SSH 建议使用密钥登录,并关闭密码登录和 root 直接登录。
- 定期检查 UFW、FRP 和系统日志;必要时使用 Fail2ban 自动限制高频恶意访问。
- 云服务器还应检查云厂商安全组。安全组和 UFW 是两层独立控制,任意一层拒绝都会导致端口无法访问。
这套方法适合临时排查和小规模维护。如果服务长期暴露在公网,更稳妥的做法是采用 IP 白名单、VPN 或零信任访问,而不是只依靠黑名单逐个封禁。
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/weixin_70043030/article/details/169368251




