使用SSH进行内网穿透

什么是内网穿透

通俗的讲,就是能让外网的电脑找到处于内网的电脑
百度百科-内网穿透

直接进行端口映射行不行

一般情况下,我们个人用的宽带网络,都是运营商分配的动态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

你可能感兴趣的:(使用SSH进行内网穿透)