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

防火墙规则拦截了内网流量
Linux 主机默认启用 iptables 或 nftables,即使服务进程正常监听,也可能因规则未放行内网网段(如 192.168.0.0/16、10.0.0.0/8)而拒绝连接。
实操建议:
- 检查当前规则:
sudo iptables -L -n -v(或sudo nft list ruleset),重点关注input链中是否有REJECT或DROP策略 - 临时放行内网访问(以
iptables为例):sudo iptables -I INPUT -s 192.168.0.0/16 -p tcp --dport 8080 -j ACCEPT - 注意规则顺序:
ACCEPT规则必须在REJECT或DROP之前生效,否则无效 - 若使用
firewalld,确认区域(如trusted或自定义 zone)已包含内网接口或源地址
服务绑定地址不是 0.0.0.0 或内网 IP
很多服务(如 nginx、python -m http.server、redis-server)默认只监听 127.0.0.1,导致其他内网机器无法访问,哪怕端口是开放的。
实操建议:
- 用
ss -tlnp或netstat -tlnp查看监听状态,重点看Local Address:Port列:
— 若显示127.0.0.1:8080,说明仅限本地;
— 若显示*:8080或0.0.0.0:8080,表示全网卡监听;
— 若显示192.168.1.100:8080,则仅限该 IP 所在网卡 - 修改服务配置:例如
nginx的listen指令改为listen 0.0.0.0:8080;redis.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 默认策略可能阻止非标准端口的网络监听,或限制服务进程绑定到非保留端口(如 8080、9000),即使 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 允许,服务启动了也不代表绑定了正确的地址。逐层验证比“重启服务”更有效,尤其当改动过系统安全策略或网络拓扑后。