教育网内无外网的服务器,使用校园内网客户机上的代理服务器,连接外网(骚断腿的操作)
概述
您遇到的情况
- 设备
- S(Server): 114.x.x.x 服务器, 位于教育网内, 有公网IP, 无法访问外网, 科研用途
- C(Client): 172.x.x.x 服务器, 位于校园内网的一个子网, 无公网IP, 可以访问外网
- 需求
- 让S能够通过C提供的代理服务器, 使用C的外网连接, 完成指定操作
- 关键约束
- ICMPing
- C -> S: 通
- S -> C: 断
- 原因未知, 应该可以认为路由表配置存在问题, 或链路上有NAT, 或防火墙限制
- 服务器不能在无人在线时, 存在与外网的连接, 安全限制
- ICMPing
解决思路
- 某一外网请求的路径
- S上某程序发出请求Q
- S上配置代理服务器
export ALL_PROXY=http://localhost:abcd
, Q到达S:abcd
- C在连接SSH到S时, 设置SSH端口转发, 从
S:abcd
到C:efgh
, Q到达C:efgh
- C上安装代理服务器, 监听于
C:efgh
, Q到达代理服务器 - 代理服务器从设定的出站NIC将Q递入外网
- 软件准备
- C端
- 代理服务器软件, 按需选用
- SSH客户端
- S端
- SSH服务端
- 默认该服务器使用bash作为终端, 其配置文件为
.bashrc
, 其他终端按需调整
- C端
配置步骤
- S端配置
- 通过SSH连接到S
- 添加
export ALL_PROXY=http://localhost:abcd
至.bashrc
- 这里假设您选用的是http代理, 如果其他, 请修改协议, 例如改为
sock5://localhost:abcd
- 这里
abcd
为您选定的端口号, 尽量选择大一些但不超上限的值, 端口冲突将引发匪夷所思的故障查找 - 您也可以暂时不添加到
.bashrc
, 但我强烈推荐这么做
- 这里假设您选用的是http代理, 如果其他, 请修改协议, 例如改为
- C端配置
- 修改ssh配置文件
- 在您的
~/.ssh/config
文件中, 添加S的信息, 必须包括别名(Host), 主机名(HostName), 用户(User), 端口(Port) - 测试该连接选项, 确认能够成功连接, 之后将所有使用您的User连接的ssh会话关闭
- 在该选项下, 与主机名(HostName)同级, 添加端口转发
RemoteForward abcd localhost:efgh
- 该命令的含义为, 监听S端的
abcd
, 转发至C端的efgh
- 如果您不想使用
~/.ssh/config
, 而是直接使用命令行工具ssh连接, 相应的参数为-R abcd:localhost:efgh
- 该命令的含义为, 监听S端的
- 测试该连接选项, 确认能够成功连接, 并能够成功访问外网
- 在您的
- 修改ssh配置文件
这有什么好处
- 方便: 无需因C端DHCP问题而修改任何东西, 包括远端的代理配置和本地的任何配置
- 安全: 代理服务器随SSH同时连通和断开, 保证没有合法人员使用时, 服务器不存在外网连接
- 安全: C端代理服务器无需对局域网开放, 只需监听localhost即可
- 安全: SSH将加密和保护该转发端口的数据, 即使本地代理服务器不设置授权或使用不加密通信, 也能够保证安全