现在每天一场模拟赛,考完还有一堆题目要订正。然而晚上回家后上不了学校 OJ ,要知道自己订正的对不对还得第二天跑来学校测 ......

前置条件

  • 一台位于学校的电脑,能保持长时间开机。
  • 一台位于公网的服务器,不需要太高的配置,推荐学生机。

这篇教程将会教你

  • 如何利用 SSH 建立反向连接
  • 如何利用 nginx 实现端口转发并配置
  • 如何利用 nginx 实现屏蔽特定页面的效果
  • 一些操作来保证安全性

SSH 反向连接

为什么我们可以直接访问公网的服务器,而不能直接访问学校的 OJ 呢。一个原因就是学校 OJ 处于内网防火墙下。

这个时候可以通过 SSH 建立一个反向隧道实现端口转发。

首先我们需要把内网服务器的公钥丢到公网服务器的 authorized_keys 里,成功后应该可以用内网服务器直接连上公网服务器的终端而不需要密码。

接下来了解下 SSH 建立反向连接的语句

ssh -NR <公网服务器 IP>:<公网服务器端口>:<学校 OJ IP>:<端口> <公网服务器用户名>@<公网服务器 IP>

由于 SSH 连接在一段时间后会自动中断,我们可以使用 autossh 工具。

autossh -M <监视端口> -NfR <公网服务器 IP>:<公网服务器端口>:<学校 OJ IP>:<端口> <公网服务器用户名>@<公网服务器 IP>

在公网服务器的终端使用

curl localhost:<端口>

来测试端口转发是否成功。

如果失败,可以排查防火墙是否开放端口、端口是否被占用等,建议使用 curl 等工具,或使用 ssh -v 来查看调试信息。

nginx 端口转发

可以发现 SSH 转发端口后,我们并不能通过直接访问指定端口。可以考虑 nginx 实现端口转发。

最简单的配置方式是

location ~ {
    proxy_pass http://localhost:<端口>;
}

即可把所有请求转发到本机的某个端口。

当然最好保留一下同时转发一下请求头:

location ~ {
    proxy_redirect off;
    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_pass http://localhost:<端口>;
}

nginx 屏蔽指定页面

由于我校 OJ 的内容需要登录后才能查看而又直接开放注册,所以最好屏蔽掉注册页面以免带来不必要的麻烦:

location = /register.php {
    return 404;
}

location = 的含义为精确匹配,这样所有对 /register.php 的请求会直接返回 404 。

其他的一些安全措施

  1. 我并没有把 nginx 里配置的网址 DNS 解析到正确的 IP ,因此我需要手动更改 hosts 文件来访问,当然其他人也不知道我的 IP 和配置的网址是什么所以只能看到 404(

  2. 开了 HTTPS ,由于并没有正确配置 DNS 于是就只能验证域名所有权的方式来申请 SSL 证书,可能会略微麻烦一点 ...

这是 memset0 初学此类内容,也是第一次写这样的教程,如有错误请多多指教。)

none

已有 15 条评论

  1. 可否share一下内网电脑
    我有一台2核4G40+100G硬盘的服务器可以与您共享

    1. emm 出于某些原因不是很方便 QAQ ...

      谢谢您的好意!

  2. %%memset0

  3. 在此跪求杭二外网地址

  4. %%%memset0

    话说 msmset0 大佬的资源站是怎么搭建的呢~

  5. HYX HYX

    memset0 太巨啦!!!