Linux 内网服务无法访问的原因分析

1次阅读

内网访问失败通常由防火墙规则、服务绑定地址、网络路由、SElinux 四层限制叠加导致;需依次验证 iptables/nftables 规则顺序、ss -tlnp 查监听地址、ping/arp/ip route 排查连通性、ausearch 审计 SELinux 拒绝日志。

Linux 内网服务无法访问的原因分析

防火墙规则拦截了内网流量

Linux 主机默认启用 iptablesnftables,即使服务进程正常监听,也可能因规则未放行内网网段(如 192.168.0.0/1610.0.0.0/8)而拒绝连接。

实操建议:

  • 检查当前规则:sudo iptables -L -n -v(或 sudo nft list ruleset),重点关注 input 链中是否有 REJECTDROP 策略
  • 临时放行内网访问(以 iptables 为例):sudo iptables -I INPUT -s 192.168.0.0/16 -p tcp --dport 8080 -j ACCEPT
  • 注意规则顺序:ACCEPT 规则必须在 REJECTDROP 之前生效,否则无效
  • 若使用 firewalld,确认区域(如 trusted 或自定义 zone)已包含内网接口或源地址

服务绑定地址不是 0.0.0.0 或内网 IP

很多服务(如 nginxpython -m http.serverredis-server)默认只监听 127.0.0.1,导致其他内网机器无法访问,哪怕端口是开放的。

实操建议:

  • ss -tlnpnetstat -tlnp 查看监听状态,重点看 Local Address:Port 列:
    — 若显示 127.0.0.1:8080,说明仅限本地;
    — 若显示 *:80800.0.0.0:8080,表示全网卡监听;
    — 若显示 192.168.1.100:8080,则仅限该 IP 所在网卡
  • 修改服务配置:例如 nginxlisten 指令改为 listen 0.0.0.0:8080redis.conf 中设置 bind 0.0.0.0(并确保 protected-mode no
  • 某些工具(如 http.server)需显式指定地址:python3 -m http.server 8000 --bind 0.0.0.0:8000

路由或网络设备隔离了内网通信

服务所在主机可能处于不同子网,或中间交换机/路由器未配置静态路由,也可能因 VLAN 划分、ACL 策略、ARP 表异常等导致二层/三层不通。

实操建议:

  • 从客户端执行 ping 192.168.x.x 测试连通性;失败则先排查网络层,而非服务本身
  • arp -n 查看目标 IP 是否有对应 mac 地址;若为空,说明 ARP 请求未响应,可能是网关/交换机拦截或主机禁用了 ICMP/ARP 响应
  • 检查主机路由表:ip route get 192.168.x.x 确认出接口是否正确;若返回 RTNETLINK answers: No such process,说明无直连或静态路由
  • 跨网段时,确认网关设备是否允许该源→目的的转发,并检查其 ACL 是否放行对应端口

SELinux 限制了网络绑定或端口访问

centos/RHEL 系统中,SELinux 默认策略可能阻止非标准端口的网络监听,或限制服务进程绑定到非保留端口(如 80809000),即使 iptables 和服务配置都正确。

实操建议:

  • 临时禁用 SELinux 测试:sudo setenforce 0;若此时内网可访问,基本可定位为此问题
  • 查看拒绝日志:sudo ausearch -m avc -ts recent | audit2why,常见报错如 avc: denied { name_bind } for ... port=8080
  • 为端口打标签:sudo semanage port -a -t http_port_t -p tcp 8080(若该端口类型已存在,用 -m 修改)
  • 注意:某些服务(如 nginx)需要额外策略包(nginx-policy)或手动启用布尔值:setsebool -P httpd_can_network_connect 1

内网访问问题往往不是单点故障,而是多个控制层叠加作用的结果——网络层通了不等于防火墙放行,端口监听了不等于 SELinux 允许,服务启动了也不代表绑定了正确的地址。逐层验证比“重启服务”更有效,尤其当改动过系统安全策略或网络拓扑后。

text=ZqhQzanResources