什么是内网穿透
通俗的讲,就是能让外网的电脑找到处于内网的电脑
百度百科-内网穿透
直接进行端口映射行不行
一般情况下,我们个人用的宽带网络,都是运营商分配的
动态IP
,如果使用端口映射的方式进行内网穿透
的话,需要经常变动出口IP,不是很方便。说到底还是IP地址少啊,IPv6
时代这个问题应该会小很多。
需要哪些东西我们才能实现用SSH进行内网穿透
- VPS:用来接收网络请求,转发请求与相应数据(一般VPS,都会赠送一个相对稳定的
IP
) - 域名:有没有都可以,没有的话需要使用
IP
进行访问 - 内网SSH工具:只要内网的设备可以通过
SSH命令
连接到VPS
即可
实践过程
0. 内网设备中启动一个网站
$ python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...
1. 内网设备通过SSH连接到VPS
# sp***w @ localhost in ~/Documents/*/*/*
$ ssh -NR 30000:127.0.0.1:8000 username@vps_ip
参数 | 参数说明 |
---|---|
-N | 表示不开启shell |
-f | 表示后天运行 |
-R | 表示端口映射,这里会把vps_ip:30000 映射到127.0.0.1:8000 |
-L | 也表示端口英树,不过这个命令表示把端口映射出去 |
2. VPS上使用curl
命令测试是否能访问
- 使用
curl
命令,测试30000端口
# 此时有成功返回
curl 127.0.0.1:30000
......
-
但是,在浏览器中使用
IP
进行访问
好吧,使用
curl
通过外网IP+端口
访问试一试
$ curl *.*.*.*:30000
curl: (7) Failed to connect to 47.98.62.75 port 30000: Connection refused
- 所以这个端口是
VPS
内部可以访问,但是外网是访问不了的,那就看一下这个端口是个什么情况
$ sudo netstat -tunlp |grep 30000
tcp 0 0 127.0.0.1:30000 0.0.0.0:* LISTEN 505/sshd: ****
好吧,端口前面清楚的写着127.0.0.1
,通过IP
当然是无法访问的
- 怎么办呢?用
Nginx
转发一下就了
如果VPS中没有
Nginx
,需要先安装,之后修改配置文件,新增一个Server
配置
$ sudo vim /etc/nginx/nginx.conf
......
http{
......
server {
listen 30001;
location / {
proxy_pass http://127.0.0.1:30000;
}
}
.....
}
.....
# 最后需要reload一下nginx的配置
$ sudo nginx -s reload
- 使用浏览器访问
vps_ip:30001
更多问题:如何持久化SSH连接
SSH连接后,一段时间之后,就会自动断开,所以需要借助一些额外的工具重新连接,很多方法都能实现,其中使用
Autossh
自动重新连接,是一种比较简单的方法
Autossh Automatically restart SSH sessions and tunnels