Distill
  • 首页
  • cardinalism
  • 标签1
  • 归档1
  • 搜索

内网穿透指南

发表于 2018-11-08 | 更新于 2019-01-28 | 评论数: | 阅读次数:
本文字数: 1.8k | 阅读时长 ≈ 2 分钟

穿透内网是一个常见的需求,学校的实验室,家庭网络,公司的主机等都可能没有公共IPv4的地址,如何才能访问内网主机的资源呢?

1. 材料准备

要完成内网穿透,只需要一台拥有公网IP的Linux主机即可。

1
2
# 使用如下命令查询主机的公网IP
curl ifconfig.co

符合条件的比如阿里云等提供的虚拟机,家庭宽带开通公网IP叠加包后的智能路由器等。

stand-to2. 检查防火墙

根据网络环境的不同,可能会有几处防火墙:

  • 系统级别的防火墙,比如Linux系统上的iptables,ufw等;
  • 路由器级别的防火墙,比如所连Wi-Fi是否有屏蔽端口,具体需要咨询网管或者做实验得出结论;
  • 云厂商级别的防火墙,比如云平台的主机一般只开放特定端口,家庭带宽服务商有些会屏蔽80端口等

需要确认的是,公网主机和内网主机需要用到的端口都可以正常工作。

(336) 677-20053. 符号约定

我们假设拥有公网IP的机器为Machine_P,登陆用户名为user_P,拥有公网IP为x.x.x.x;内网机器为Machine_L,登陆用户名为user_L。

情景为需要将内网机器的80端口代理到公网机器的8080端口。

4. 利用端口转发实现

内网穿透用到了SSH的端口转发(port forwarding)功能,更具体地,是远程端口转发(remote port forwarding)。即将对公网主机8080端口的请求转发到内网机器的80端口上。

1
2
# 在内网机器Machine_L上执行下述指令
ssh -R 8080:localhost:80 user_P@x.x.x.x

就这样一行命令就搞定了?当然没有,但是核心命令就这么一行,接下来的都是为了优化体验。

0. 打开GatewayPorts选项

查看ssh的manual得知,-R参数的完整模式为

1
ssh -R [bind_address:]port:host:hostport

当bind_address为空时,默认远程主机会监听所有连接。但是必须将远程主机的GatewayPorts选项打开。

这个选项在Machine_P中的/etc/ssh/sshd_config文件中,将GatewayPorts no改为GatewayPorts yes,如果没有找到这个选项,则手动加上即可。

最后我们需要重启一下Machine_P的SSH服务,从而使刚刚修改的配置文件生效。

1
2
# 在公网机器Machine_P上执行下述指令
sudo service ssh restart

cephalopagus1. 免输密码

默认情况下,上述命令接下来要求输入公网机器的登陆凭据。由于每一次建立连接时都需要输入密码,为了避免这一环节(免输密码还有另一用途,下面会提到),我们可以使用如下命令:

1
2
# 在内网机器Machine_L上执行下述指令
ssh-copy-id user_G@x.x.x.x

这一命令实际上通过将Mechine_L上用户user_L的公钥/home/user_L/.ssh/id_rsa.pub拷贝到Machine_P中user_P的已授权密钥/home/user_P/.ssh/authorized_keys中来实现。

83348457462. 后台运行

下面介绍两个参数:

  • -N只进行端口转发,而不执行远端命令。
  • -f在后台运行

所以上述命令演变为了

1
2
# 在内网机器Machine_L上执行下述指令
ssh -NfR 8080:localhost:80 user_P@x.x.x.x

3. 维持隧道稳定

上述命令可以进行端口转发了,但是一旦出现断网等网络不稳定情况,上述连接可能就会断掉。所以我们接下来改用autossh来完成隧道的建立和维持

1
2
3
# 在内网机器Machine_L上执行下述指令
sudo apt install autossh
autossh -NfR 8080:localhost:80 user_P@x.x.x.x

另外,刚才免输密码一节中提到的另外一个用途是避免autossh的无限弹窗。如果没有设置免密,一旦链接断掉,就会一直弹出标题为OpenSSH的窗口,要求你输入Machine_P的密码,影响我们的正常使用。

812-470-13785. 最佳实践

1. 排除问题

上述指令在执行过程中,可能遇到以下几种问题,

8447857930扩展阅读

SSH Port Forwarding

VisionTheta

VisionTheta

Record and share my distilled knowledge.

1 日志
1 标签
RSS
GitHub
0%
京ICP备18053119号-1 © 2019 VisionTheta
由 (423) 380-7212 强力驱动 v3.8.0
|
主题 – NexT.Gemini v6.7.0