@LijinLiu头像
运维笔记:服务器访问 IP 排查、定位与封禁封面图

运维笔记:服务器访问 IP 排查、定位与封禁

运维笔记:访问 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

十、安全建议

  1. 不需要公网开放的端口不要保留 ALLOW IN Anywhere。
  2. 管理后台尽量只允许固定可信 IP 访问,而不是先全部开放再逐个封禁异常 IP。
  3. SSH 建议使用密钥登录,并关闭密码登录和 root 直接登录。
  4. 定期检查 UFW、FRP 和系统日志;必要时使用 Fail2ban 自动限制高频恶意访问。
  5. 云服务器还应检查云厂商安全组。安全组和 UFW 是两层独立控制,任意一层拒绝都会导致端口无法访问。

这套方法适合临时排查和小规模维护。如果服务长期暴露在公网,更稳妥的做法是采用 IP 白名单、VPN 或零信任访问,而不是只依靠黑名单逐个封禁。

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/weixin_70043030/article/details/169368251

文章来源转载

评论

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--