引言

我实在是馋学校的 vpn, 所以决定搞一搞内网穿透。

关于校外使用不在 vpn 白名单端口的方式,可以只查看:二级标题 - 校外使用服务器服务方法。

关于利用单端口代理多个服务的使用方式,可以只查看:二级标题 - 单端口代理多个服务过程。

效果展示

SwitchyOmega 使用代理

校外使用服务器服务方法

目前有两种方案。

一种是自搭的 zerotier 服务,效果是把电脑拉到一个局域网,然后重新分配一个 ip 号,好处是软件很轻型,很适合把自己的设备全拉进去,但是缺点是不适合团队使用,而且偶尔会不稳定。

另一个是学校买的软件 easyconnect, 效果是创造一个 vpn 可以直接连上校内服务,但是学校服务器只有用来 ssh 的 22 端口能用。

EasyConnect + ssh

根据第二种方案,连接 ssh 创造一条自建隧道,就可以使用服务器的网络上网了,自然就可以连接 22 以外的服务了。

通过 SSH 隧道在 EasyConnect VPN 上实现不受限制的访问 - Nativus’ Space

SSH,安全外壳协议,应该大家都用过,但大部分情况下只是使用它连接远程的 Shell。这里我们利用他的另一个特性,实现隧道。

-D $ProxyPort 指定 SSH 在本地开启的端口。我们后面通过这个端口开启的代理实现无限制的访问。

完整代码如下(注意将命令中的信息替换为自己的):

1
2
3
4
5
6
7
ProxyPort=57890
User=tenney
Host=10.9.65.31
RemoteSSHPort=22
# unset all_proxy && unset ALL_PROXY
# ssh -o "ProxyCommand=ncat --proxy-type socks5 --proxy 127.0.0.1:22 %h %p" -D $ProxyPort $User@$Host -p $RemoteSSHPort
ssh $User@$Host -p $RemoteSSHPort -D $ProxyPort

注意:

  1. ProxyPort 是本机打开用于连接的 socks5 代理
  2. User, Host, RemoteSSHPort 是目标服务器的 ssh 信息
  3. 原文使用的是 docker 版本的 EasyConnect 所以需要使用-o 参数跳板登录,非必须。

连接代理上网

两种方案,一种是使用浏览器插件,一种是直接设置系统代理。

浏览器插件

配置 SwitchyOmega 实现网页访问,在谷歌浏览器下载插件 SwitchyOmega, 并新建情景模式,如图:

SwitchyOmega 新建情景模式

图中的 57890 即为刚刚设置的 $ProxyPort。

使用的方式是在目标网页点击插件,选择创建的目标代理。

SwitchyOmega 使用代理

系统代理

各系统大同小异,都在网络设置里面,注意选择 socks5 代理。

在设置了代理之后,就等于使用服务器的网络进行连接,自然就可以使用服务器服务了。

单端口代理多个服务过程[1-6]

首先,单端口代理多个服务成功了,但是学校提供的 vpn 并不支持直接 http 协议转发,所以本部分无实际意义,可以跳过。

学校的 EasyConnect 只开通了 22 端口,所以难点有两个,一是在 22 端口实现多服务反向代理,二是浏览器访问 22 端口。

我很懒,所以我创建网页和反向代理是通过 1panel 直接添加的,然后自己再改细节。1panel 使用的是 OpenResty, 和 nginx 配置方式一致。

本部分演示服务器 ip 地址为 10.9.65.33,ssh 端口已修改为 50022。

主配置

在 nginx 主配置中将 stream 块添加到与 http 同级的部分以代理 tcp 流量。注意 upstream 和 proxy_pass 后的词需要保持一致。stream 块的作用是把 80 端口的所以流量代理到 22 端口。

1panel 配置修改方式:网站 - 网站 - 设置 - 配置修改。

1
2
3
4
5
6
7
8
9
10
11
stream{
upstream http{
server 10.9.65.33:80 max_fails=2 fail_timeout=5s weight=2;
}
server{
listen 22; # 任意不占用的端口
proxy_connect_timeout 10s;
proxy_timeout 300s;
proxy_pass http; # 注意写法,不带 http://
}
}

反向代理网站搭建

主域名:10.9.65.33

代理地址:10.9.65.33:8787

网站配置文件部分展示:

1
2
3
server {
listen 80 ;
server_name 10.9.65.33;

1panel 配置修改方式:网站 - 网站 - 创建网站 - 反向代理。

RStudio servers

1
2
3
4
5
6
7
8
9
10
11
12
location ^~ / {
proxy_pass http://10.9.65.33:8787/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
add_header Cache-Control no-cache;
}

浏览器设置[7]

因 22 端口属于安全端口,一般浏览器默认禁用访问,推荐使用火狐 (firefox) 浏览器。

打开 firefox 浏览器,在地址栏输入about:config,搜索network.security.ports.banned.override, 点击添加,选择string, 输入22-10000.

登录

而后地址栏输入http://10.9.65.33:22/即可。

如显示 OpenResty 默认窗口可尝试多关掉刷新几次或使用http://10.9.65.33/auth-sign-in试试。

hexo 博客

因为只有一个端口可以使用,所以一看是的设想是使用:22/r访问 RStudio servers, 使用:22/server访问其他的应用,但是由于二级路径转不明白,就直接使用:22/(根) 来代理 RStudio servers 了。但是依然在探索的过程中明白了一些 nginx 的应用。比如使用:22/zhishanc204来代理其他服务器搭建的博客。

最主要的部分在于前端请求路径和后端代理地址的对应关系。

匹配规则统一用^~就可以,但两种路径最好的/非常重要,简单的说 nginx 发送到后端的地址是会将前端请求路径替换为后端代理地址进行请求。因此关于/的规则是:

  1. 可以都不带
  2. 可以都带
  3. 可以上面带下面不带
  4. 不能上面不带下面带
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
location ^~ /zhishanc204/ {
proxy_pass http://10.9.65.31:80/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
add_header Cache-Control no-cache;
}
location ^~ /202 {
proxy_pass http://10.9.65.31:80/202;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
add_header Cache-Control no-cache;
}

最后,因为没啥用所以把 22 代理了 50022 继续 ssh, 把 80 代了一下 50204,但是 80 还是继续使用,所以直接打开 10.9.65.33 也可以看到 RStudio-servers 的内容。

结论

总之玩了一天我还挺开心的,对 nginx 和 ssh 的理解都加深了一层。

引用

  1. openresty(nginx) 配置 stream 转发 - 哈喽哈喽 111111 - 博客园
  2. Nginx 反向代理 TCP 协议【反代 SSH 端口】 - 知乎
  3. Nginx 增加二级目录的反向代理时,最常见的两个问题 - 知乎
  4. Nginx 路由转发和反向代理 location 配置「建议收藏」- 腾讯云开发者社区 - 腾讯云
  5. 如何解决 Nginx 实现动静分离或反向代理时资源路径不匹配 - 知乎
  6. Nginx 反向代理之路径替换 - 钟小嘿 - 博客园
  7. 解决火狐浏览器的(此网址已被限制,此网址使用了一个通常用于网络浏览以外目的的端口,出于安全原因,Firefox 取消了该请求)问题
  8. Download the Free Nmap Security Scanner for Linux/Mac/Windows
  9. Ncat 跨网络读写数据 - 知乎
  10. 利用 SSH 搭建隧道 - 流量伪装 - 知乎
  11. MAC VsCode 跳板机 远程连接服务器_vscode 跳板机连服务器 macos-CSDN 博客