Posts 校园网下基于DDNS+端口转发, 实现内网穿透的困局
Post
Cancel

校园网下基于DDNS+端口转发, 实现内网穿透的困局

一、 前言

实现内网穿透, 前文中使用了frp反向代理的方法, 这种方法稳定可靠、时效性好, 但是有明显的缺点:

  • 成本较高: 需要云服务器
  • 带宽有限: 一般来说, 住户的带宽明显大于低价买来的云服务器的带宽

于是催生了DDNS+端口转发, 实现内网穿透的方法—-这种方法的最大限制就是需要住户有一个公网ip

在我试图用这个方案做内网穿透的时候, 我查了宿舍路由器WAN口的ip, 是公网ip. 等到我去花生壳买好域名开始DDNS的时候, 才发现事情并没有那么简单

二、 操作纪实和问题分析

这部分大致还原了我的操作过程, 和我对遇到问题的分析

1. 令人困惑的开始

我在花生壳买到了一个壳域名: reina.ticp.io, 在路由器的DDNS功能下设置好

看起来非常顺利

DDNS页面

觉着差不多到TTL的时候, 我去ping了一下我的域名, 得到的却是另一个公网ip: 111.20.226.7

2. 排查问题

ip怎么就错了呢? 按道理说, 既然它是公网ip, 就一定可以在茫茫互联网中指向我的宿舍

路由器获取ip → DNS服务器对应修改解析记录 → 通过DNS动态获取ip → 通过ip访问宿舍

我回想了一下我们宿舍的网络环境, 以下我们宿舍的网络套餐情况:

  • 基础校园网: 100元四年, 每月20G流量, 5M带宽, 访问外网需认证, 是其他套餐的基础
  • 移动50M包月: 40元一个月, 无限流量, 50M带宽, 访问外网无需认证, 需要前置购买基础校园网套餐

查一下ip:

  • 路由器WAN口的ip (115.154.**.**): 教育网 - 陕西省西安市-西安交通大学 **舍
  • ping到的公网ip (111.20.226.7): 中国移动 - 陕西省西安市-碑林区
  • 百度直接查本机ip (111.20.226.7)

基于查到的ip和网络套餐, 我对学校宿舍网的大致网络架构进行了一个猜想:

互联网
电信移动联通
教育网防火墙
教育网
校园网外网认证(防火墙)
校园网

我得到的错误ip应该就是由移动套餐产生的、 “从外向内”看到的ip

真的是DNS服务器出错了吗?

鉴于ping到的ip不一定是真实ip, 为了获取真实的DNS信息, 我使用nslookup, 在花生壳查询解析记录

1
2
3
4
5
6
reina@LAPTOP-CISSPIC4:/mnt/c/Users/Reina$ nslookup reina.ticp.io ns1.oray.net
Server:         ns1.oray.net
Address:        103.46.128.52#53

Name:   reina.ticp.io
Address: 111.20.226.7

得到的仍不是我所期望的ip, 可以确定DNS服务器的记录出了问题

是上传DDNS信息受阻了吗? 应该不是, 解析到的ip有一定的合理性, 应该是路由过程中的网关

不妨做一个假设: DNS在收到解析记录更改的请求时, 会验证连接的可用性, 如果不可用、就更改IP为能到达的最远的网关

在这个条件下, 由于教育网/校园网的防火墙机制, DNS服务器无法直接访问到教育网的ip, 其最远只能到达中国移动的网关, 而在下一站—-教育网/校园网, 被防火墙拦截而无法访问ip, 于是修改记录为网关的ip

当然, 以上的内容属于我的猜想, 实际情况可能复杂得多; 但抛开原理不谈, 在校园网的环境下, 实现DDNS的阻力确实存在

3. 端口转发的尝试

相比DDNS, 只在宿舍局域网中实现的端口转发就简单、稳定得多

方便起见, 我启用了DMZ(一种简单暴力的端口转发: 把所有试图访问内网的请求转发到一个设备)

把目的ip指向了树莓派

DMZ

在校园网的环境下, 我使用宿舍的ip成功访问了树莓派的web service

4. 一种折中的实现

校内访问是达成了, 那么校外呢? 我突然想到一个好东西: 学校的WebVpn

WebVpn欢迎页

让我感到惊喜的是, WebVpn不仅可以访问web服务, 还可以使用一些常用的工具

WebVpn功能

由于宿舍断网的情况很少, 所以ip一般都是固定的; 如果需求比较刚性, 还可以去网信办申请静态ip

动态ip (+ 校园VPN) + 端口转发是一个折中的、不够可靠的校园网内网穿透方案 静态ip (+ 校园VPN) + 端口转发可以作为一个可靠的校园网内网穿透方案

5. 另一种想法

如果拥有一台服务器, 不如让它变相地提供DDNS服务:

路由器周期性将wan口IP上传至服务器 -> 客户端通过脚本, 从服务器中获得最新的ip -> 通过校园VPN访问ip

有人可能会问, 放着公网ip的服务器, 不如直接用frp搭vpn来得方便

确实, 有服务器的话用frp是最方便的, 但是frp会让走的流量都会通过服务器, 如果我们需要大规模地转移数据—-这里产生的成本就不容忽视了; 但如果让服务器只提供DDNS, 服务器基本不走流量; 又由于学校的VPN不限流量、 宿舍的套餐也不限流量, 在考虑到流量成本的时候, 最好不要使用frp

可能上两张图能够更好地说明问题

frp方案:

frp方案

自建DDNS方案:

自建DDNS方案

三、 总结

四种校园网内网穿透方案, 根据应用场景权衡/混合使用:

方案描述可靠性服务器成本流量成本部署/使用便利性特殊要求
frp反向代理
自建DDNS+端口转发××
静态IP+端口转发××申请静态ip
动态IP+端口转发×××
This post is licensed under CC BY 4.0 by the author.