Linux服务器出口流量审计与非法外连端口阻断,核心在于“看见”和“控制”:先精准识别异常外连行为,再基于策略实时拦截。不依赖第三方商业设备,用系统原生工具即可构建轻量、可控的防护闭环。

用conntrack + iptables 实时捕获可疑出向连接
conntrack 是内核连接跟踪模块的用户态接口,比 netstat/ss 更底层、更实时,适合持续审计出口连接。
- 监控新建立的TCP外连(排除本地回环和内网地址):
conntrack -E -e NEW -p tcp | awk '$NF ~ /dst=([0-9]{1,3}\.){3}[0-9]{1,3}/ && !/dst=127\.|dst=10\.|dst=172\.(1[6-9]|2[0-9]|3[0-1])\.|dst=192\.168\./ {print $NF}' - 配合日志归档:将输出通过 logger 写入 /var/log/audit/egress.log,并用 logrotate 管理周期
- 重点盯住非常用端口(如 4444、5555、6666、8080、8888)或非标准 TLS 端口上的外连,这些常被恶意程序用于C2通信
用iptables OUTPUT链按目标端口动态阻断
OUTPUT链作用于本机发起的连接,在连接建立前即可丢弃,比应用层代理更底层、更可靠。
- 封禁指定高危端口的外连(例如禁止所有到 4444 的 TCP 出口):
iptables -A OUTPUT -p tcp --dport 4444 -j DROP - 按IP段+端口组合封禁(如某云厂商黑产IP段 + 非法端口):
iptables -A OUTPUT -p tcp -d 185.143.224.0/21 --dport 5555 -j DROP - 建议搭配 ipset 使用,便于批量管理黑名单IP和端口,避免规则爆炸:
ipset create egress_block hash:ip,port timeout 3600
iptables -A OUTPUT -m set --match-set egress_block dst,dst -j DROP
结合systemd服务实现自启+自动恢复
避免重启后规则丢失,也不依赖网络服务就绪时机。
- 编写 /etc/systemd/system/egress-guard.service,Type=oneshot,ExecStart 执行 iptables 加载脚本
- 设置 After=network.target,WantedBy=multi-user.target
- 在脚本中加入 conntrack -F 清空旧连接跟踪表(防止已有非法连接绕过新规则)
- 添加定时任务(如每5分钟)扫描 /var/log/audit/egress.log,自动提取高频异常目标并追加进 ipset 黑名单
补充验证与低侵入性原则
避免误伤业务,所有阻断策略必须可观察、可回滚、不影响正常运维通道。
- 始终保留 SSH(22)、DNS(53)、NTP(123)、HTTPS(443)等必要端口放行规则,且放在 DROP 规则之前
- 使用 iptables -L -n -v 查看各规则命中数,确认拦截是否生效;用 tail -f /var/log/audit/egress.log 实时核对日志与拦截一致性
- 临时调试时,可用 LOG target 替代 DROP 先记录再决策:
iptables -A OUTPUT -p tcp --dport 6666 -j LOG --log-prefix "EGRESS_BLOCK:"
iptables -A OUTPUT -p tcp --dport 6666 -j DROP

















