什么是内网穿透?

内网穿透(NAT Traversal)是一种通过公网服务器访问内网服务的技术。由于校园网、企业局域网等内部网络通常采用NAT(网络地址转换)隔离外部互联网,导致外部用户无法直接访问内网资源。内网穿透通过建立加密隧道,将内网服务的端口映射到公网服务器的指定端口,从而实现外部访问。

SSH与内网穿透

SSH(Secure Shell)不仅是安全的远程登录协议,还支持端口转发功能(SSH Tunnel),使其成为实现轻量级内网穿透的理想工具。通过SSH的本地端口转发(Local Port Forwarding)和远程端口转发(Remote Port Forwarding),可以安全地将内网服务暴露到公网。


实践:将校内教务系统映射至阿里云服务器

场景描述

  • 目标内网服务:教务系统(194.168.4.17:80,假设为HTTP服务)
  • 公网服务器:阿里云(182.92.83.1:30226
  • 使用工具:SSH(需一台可访问校内服务的机器和公网服务器)

步骤1:建立SSH远程端口转发

在能访问校内教务系统的机器(如实验室电脑)上执行:

1
ssh -R 30226:194.168.4.17:80 root@182.92.83.1-N
  • -R 30226:194.168.4.17:80:将公网服务器的30226端口转发到内网服务的80端口
  • root@182.92.83.1:公网服务器的登录账号和地址
  • -N:不执行远程命令,仅建立隧道

步骤2:通过公网访问服务

此时通过浏览器访问 http://182.92.83.1:30226 即可间接访问校内教务系统。


解决资源加载失败问题:额外端口转发

若教务系统页面加载时出现CSS/JS等静态资源失败(可能因为资源使用绝对路径指向其他内网端口),需进一步转发相关端口。

示例:资源端口为8080

假设发现资源请求指向 194.168.4.17:8080,需额外映射该端口到公网(如30227):

1
ssh -R 30226:194.168.4.17:80 -R 30227:194.168.4.17:8080 root@182.92.83.1-N

优化方案:反向代理

若资源端口不固定,可在公网服务器配置Nginx反向代理,统一将请求转发到内网:

nginx

Nginx配置示例(公网服务器)

1
2
3
4
5
6
7
server {
listen 30226;
location / {
proxy_pass http://194.168.4.17:80;
proxy_set_header Host $host;
}
}

随后通过SSH建立基础隧道即可:

1
ssh -L 本地端口:194.168.4.17:80 root@182.92.83.1-N

注意事项

  1. 网络安全:暴露内网服务到公网需获得授权,并配置防火墙限制访问IP。
  2. 稳定性:SSH隧道可能因网络波动中断,建议使用autossh等工具自动重连。
  3. 性能:公网服务器带宽和延迟会影响访问速度。

总结

通过SSH端口转发,可快速实现内网穿透,但需注意资源路径和端口问题。对于复杂场景,结合反向代理能更灵活地解决多端口或协议转换需求。