内网穿透 (NAT 穿透,NAT Penetration),是指通过流量转发/代理,使得没有公网IP的内网服务器能够被外网访问。为了实现内网穿透,我们需要一台内网服务器和一台公网中转服务器。公网中转服务器是用来做流量转发的。
通过内网穿透,我们还可以绕过跳板机,访问内网服务。
内网穿透的基本原理就是:
- 首先,内网服务器向公网服务器主动建立一条持续的TCP通路,用于内网和公网服务器之间的数据传输;
- 然后,外网机器如果需要访问内网服务器,那么可以先连接到公网中转服务器,然后公网服务器通过上一步建立的TCP通路,把请求转发到内网服务器。
常见的内网穿透工具有autossh、ngrok、frp、花生壳等。
1. autossh
autossh 是用来监听、重启 SSH 会话的工具。内网服务器可以通过 autossh 与公网服务器建立一个持续的 SSH 的数据通路。
通过 autossh,我们可以几分钟就搭建好一个 SSH 反向隧道,也是本人使用最多的一种方法。
下面简单介绍一下搭建步骤。
1.1 在内网服务器上安装 autossh
1 | $ yum install autossh # Centos, RedHat, Fedora |
1.2 配置免密登录
- 在内网服务器生成 SSH RSA公、密钥
1 | ssh-keygen -q -t rsa -N '' -f ~/.ssh/id_rsa |
- 将内网服务器的
~/.ssh/id_rsa.pub
的内容写入到公网服务器~/.ssh/authorized_keys
1 |
|
- 检查内网服务器是否可以免密登录到公网服务器
1.3 在公网服务器上启动 sshd
1 | service ssh restart |
1.4 在内网服务器启动 autossh
1 |
|
然后,可以在公网服务器上检查一下SSH方向隧道是否成功建立。
1 | netstat -panlt | grep ${PUBLIC_PROXY_PORT} |
1.5 外网机器登录到内网服务器
1 | PUBLIC_IP='XXX.XXX.XXX.XXX' # 公网服务器IP |
把外网机器的 ~/.ssh/id_rsa.pub
添加到内网服务器的 ~/.ssh/authorized_keys
中,可以实现外网机器到内网服务器的免密登录。
autossh 有时候会出现莫名的中断,很难受,不知道是为啥?可能是ssh/sshd_condig
的配置问题吧。最好是配一个tmux吧,不然程序跑一半就中断了,会奔溃的!
2. Ngrok
Ngrok 官网:https://ngrok.com/
Ngrok Github主页:https://github.com/inconshreveable/ngrok
Ngrok 2.x 的版本都不开源了,Ngrok 官网注册,就可以免费使用。而且不需要自己的公网服务器(Ngrok官方免费了提供公网服务器)就可以实现内网穿透,但是只对免费用户开放一个反向隧道。去官网注册一下就可以使用了。
但是,我感觉免费的 Ngrok 2.x 有点卡啊,所以我一般就用来临时代理一下 HTTP 服务。
当然,Github 上有 1.7.1 版本的 Ngrok,我们也可以在自己的公网服务器上搭建一个 Ngrok 服务器,但是,过程相对于 autossh 会稍微麻烦一些。
但是相比autossh,Ngrok 应该是功能更完善的内网穿透工具了,它可以反向代理 HTTP,TCP 端口。
1 | (base) [xingw@localhost ~]$ ./ngrok --help |
3. ssh 远程转发
通过 ssh 远程转发,可以通过公网服务器,将内网的服务转发出去。
比如:在内网服务器执行下面的命令,就可以通过公网服务器的PUBLIC_PORT
访问到内网服务器的的 LOCAL_PORT
服务了。
1 | $ ssh -fN -R <PUBLIC_PORT>:localhost:<LOCAL_PORT> <PUBLIC_IP> |
其他的穿透工具,我就没有使用过了。