内网穿透方案大全

  • 内网穿透能解决以下常见问题:
  • 方案一、透过路由器 / 猫路由一体
  • 前提条件
  • 配置方法
  • 方案二、使用SSH隧道
  • 前提条件
  • 配置方法
  • 1、服务器配置(默认CentOS)
  • 2、 本机配置
  • 方案三、使用frp工具
  • 工具下载
  • 1、服务器配置
  • 2、 本机配置
  • 方案四、商用ngrok工具
  • 结语


内网穿透能解决以下常见问题:

  • 开发外网应用时把本地服务映射到外网,加速调试流程;
  • 把你正在开发的本地服务分享给互联网上其它人访问体验;
  • 在任何地方通过互联网控制你家中在局域网里的电脑;

方案一、透过路由器 / 猫路由一体

此方案直接使用本机外网IP穿透,如果IP不固定,可以安装个向日葵、花生壳之类的软件,用的时候查看最新IP。

前提条件

  1. 路由器有外网IP
  2. 路由器配置权限

配置方法

  1. 登录路由器:192.168.X.X,找到《虚拟服务器》,添加映射:外网端口,本机端口,本地IP。
  2. 注意配置允许路由器:端口回流(否则局域网无法访问)
  3. 猫路由一体的可尝试百度查登录账号密码(比如查:猫密码 useradmin)

方案二、使用SSH隧道

前提条件

  1. 一台有外网 IP 的服务器
  2. 本地能通过 ssh 登录服务器

配置方法

1、服务器配置(默认CentOS)

登录服务器:ssh root@XXX.XXX.XXX.XXX -p 22
(1)首先修改服务器 B 的 sshd_config 配置文件:

vi /etc/ssh/sshd_config

(2)打开 GatewayPort(删除前面的 # 号,将其设置为 yes)>: 键盘按i,编辑配置:

GatewayPort yes
键盘按ESC,输入:wq保存退出

(3)修改保存后,执行如下命令将 sshd 服务重启下:

systemctl restart sshd

此项的意思是,SSH 隧道监听的服务的 IP 是对外开放的 0.0.0.0,而不是只对本机的 127.0.0.1。不开 GatewayPorts 的后果是不能通过 外网IP:X 访问,只能在外网服务器上通过 127.0.0.1:XX 访问到本地开发机的服务
(4)使用以上方法还是无法访问 外网IP:XX,请检查你外网服务器的防火墙配置

打开XX端口
    firewall-cmd --zone=public --add-port=XX/tcp --permanent && firewall-cmd --reload
查看已开端口:
    firewall-cmd --list-ports
关闭端口
    firewall-cmd --zone=public --remove-port=XX/tcp --permanent && firewall-cmd --reload
2、 本机配置

(1)使用ssh

ssh -CqTfnN -R :外网映射端口:localhost:本地映射端口 root@外网IP -p 22

(2)查看状态
前往外网服务器,可以看到这个监听是否成功链接:

netstat -anp | grep 外网映射端口

(3)关闭映射
在外网服务器上查看指定端口,对应的sshd进程,Kill相应进程结束转发服务

kill -9 进程ID

(4) 自动重连
SSH 隧道是不稳定的,在网络恶劣的情况下、或因为超时可能随时断开。如果断开就需要手动去本地开发机再次向外网服务器发起连接。
AutoSSH 能让 SSH 隧道一直保持执行,他会启动一个 SSH 进程,并监控该进程的健康状况;当 SSH 进程崩溃或停止通信时,AutoSSH 将重启动 SSH 进程。
为此我们需要结合免密码登录及 AutoSSH 来提供稳定的 ssh 反向代理隧道。
a、在内网主机 B 上产生公钥和私钥

ssh-keygen

然后按三次回车执行默认选项生成公钥和私钥。会生成密钥文件和私钥文件 id_rsa,id_rsa.pub 或 id_dsa,id_dsa.pub
b、拷贝秘钥 在内网主机 B 上继续执行如下命令,将内网主机 B上的秘钥文件 copy 到公网主机 A 中。

ssh-copy-id  user@服务器ip

其中“user”是公网主机 的用户名,ip 为公网主机 A 的 ip,然后按照提示输入公网主机A 的密码就完成了。
(5) 通过源码安装autossh;

$ wget www.harding.motd.ca/autossh/autossh-1.4e.tgz --no-check-certificate
$ tar -xf autossh-1.4e.tgz
$ cd autossh-1.4e
$ ./configure
$ make & make install

(6)启动autossh

只要把 autossh -M XX 替换为 ssh 即可:

autossh -M 外网映射端口 -CqTfnN -R :外网映射端口:localhost:本地映射端口 root@外网IP -p 22

(7)开机自启动

vi /etc/rc.d/rc.local
#将上一步(6)中代码copy到底部,保存并退出
chmod +x /etc/rc.d/rc.local

方案三、使用frp工具

frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp, http, https 协议。
frp 有以下特性:

  • frp 比 SSH 隧道功能更多,配置项更多;
  • frp 也需要一台外网服务器,并且需要在外网服务器上安装 frps,在本地开发机上安装 frpc;
工具下载

frp链接地址

1、服务器配置

先看看服务器是否开启了任务监听对应端口,默认连接端口是7000

netstat -tunlp | grep 7000

如果任务已开始监听,然后看看防火墙是否开放了这个端口,很重要

(1)编辑服务端文件frps.ini:

[common]
bind_port = 7000
#dashboard_port = 7500
#dashboard_user = admin
#dashboard_pwd = admin
#authentication_method = token
#token = 设置密码

(2)启动服务frps

./frps -c frps.ini

(3)登录控制面板查看frp服务状态和已连入主机
服务器IP:7500

2、 本机配置

(1)编辑配置文件frpc.ini

[common]
server_addr = 服务器IP
server_port = 7000
#authentication_method = token
#token = 对应服务器端密码
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 2222

[rdp]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 3389

(2)启动连接frpc
为了方便,建个bat脚本,可设置开机启动

Start frpc.exe -c frpc.ini

方案四、商用ngrok工具

ngrok 是一个商用的内网穿透工具,它有以下特点:

  • 不需要有外网服务器,因为 ngrok 会为你提供;
  • 只需要在本地开发机安装 ngrok 客户端,和注册 ngrok 账户;
  • 按照服务收费;

结语

1、方便远程桌面,打开本机3389,通过远程映射,实现《远程桌面》访问。
2、架设内网服务器,内网ssh远程访问等服务。
3、通过nginx映射,实现域名访问本地服务器,模拟线上环境。

server {
    listen       80;
    server_name 你的外网域名;
    charset utf-8;
    location / {    
        proxy_pass   http://localhost:映射端口;
    }
}