重庆邮电大学内网外入

By on

为了让校内的资源能够在校外使用,我搭建了这个内网外入的代理来绕过学校防火墙的限制。

声明: 该项目仅用于学习和研究目的,项目中的所有资源都被 Cloudflare Access 和 Origin Pull 保护。

Screenshot

如何使用?

  • 如果有域名: 将域名中的 cqupt.edu.cn 替换为 endpoint.domain1 即可。
  • 如果只有 IP 地址: 将 IP 地址放在 .endpoint.domain 域名之前。

举个例子

  • 如果你要访问 jwzx.cqupt.edu.cn,则在外网访问 jwzx.endpoint.domain
  • 使用 127.20.0.1.endpoint.domain 来访问 127.20.0.1
Advanced Notices
  1. Some destination server requires an TLS connection, and *.secure.endpoint.domain is aimed to do that. Otherwise, *.endpoint.domain will initiate a plain HTTP request to the destination.
  2. Considering there will be many direct IP forwards, and there is no need to acquire a certificate for them. Thus, any domain access like jwzx.endpoint.domain is provided with a valid wildcard certificate, while IP accesses are not.
  3. Destinations with unusual port(other than 80 and 443) are not supported and their link will not be overridden.

原理

我选择了树莓派 4 来作为最终网关。

NGINX 配置文件 ➡︎

覆盖重定向

对于使用 cqupt.edu.cn 为结尾的域名:

proxy_redirect 		~^https?://cqupt.edu.cn/(.*) https://endpoint.domain/$1;
proxy_redirect 		~^http://(.*).cqupt.edu.cn/(.*) https://$1.endpoint.domain/$2;
proxy_redirect		~^https://(.*).cqupt.edu.cn/(.*) https://$1.secure.endpoint.domain/$2;

对于 IP 地址:

proxy_redirect		~^http://([0-9.]+)/(.*) http://$1.endpoint.domain/$2;
proxy_redirect		~^https://([0-9.]+)/(.*) http://$1.secure.endpoint.domain/$2;

替换页面中的链接

nginx_substitutions_filter 是增强版的 sub_filter,它可以实现多个正则表达式同时进行替换
访问 Substitutions | NGINX 来查看更多信息。

subs_filter		'https?://cqupt.edu.cn' https://endpoint.domain gir;
subs_filter		'http://(.*).cqupt.edu.cn' https://$1.endpoint.domain gir;
subs_filter		'https://(.*).cqupt.edu.cn' https://$1.secure.endpoint.domain gir;
subs_filter		'http://([0-9.]+)' http://$1.endpoint.domain gir;
subs_filter		'https://([0-9.]+)' http://$1.secure.endpoint.domain gir;

因为接下来会配置防火墙,我们不需要在此匹配到精确的 IP 地址,也不需要做过多检查。

使用下面的语句来从校内的 DNS 服务器解析内部专用的域名

resolver [ns1.ip] [ns2.ip] valid=3600s;

最后配置 iptables 防火墙来过滤非正常请求

# Generated by xtables-save v1.8.3 on Thu Dec 19 03:26:35 2019
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -d [network/mask] -p tcp -m owner --uid-owner 33 -j ACCEPT
...
-A OUTPUT -d [ns1.ip] -p udp -m owner --uid-owner 33 -j ACCEPT
-A OUTPUT -d [ns2.ip] -p udp -m owner --uid-owner 33 -j ACCEPT
-A OUTPUT -m owner --uid-owner 33 -j REJECT --reject-with icmp-port-unreachable
COMMIT
# Completed on Thu Dec 19 03:26:35 2019
  1. endpoint.domain 仅在本文中代表内网外入的入口域名。当您需要使用内网外入时,请将其替换为真实的入口域名。 ↩︎