教育网内无外网的服务器,使用校园内网客户机上的代理服务器,连接外网(骚断腿的操作)

概述

您遇到的情况

  • 设备
    • S(Server): 114.x.x.x 服务器, 位于教育网内, 有公网IP, 无法访问外网, 科研用途
    • C(Client): 172.x.x.x 服务器, 位于校园内网的一个子网, 无公网IP, 可以访问外网
  • 需求
    • 让S能够通过C提供的代理服务器, 使用C的外网连接, 完成指定操作
  • 关键约束
    • ICMPing
      • C -> S: 通
      • S -> C: 断
      • 原因未知, 应该可以认为路由表配置存在问题, 或链路上有NAT, 或防火墙限制
    • 服务器不能在无人在线时, 存在与外网的连接, 安全限制

解决思路

  • 某一外网请求的路径
    • S上某程序发出请求Q
    • S上配置代理服务器export ALL_PROXY=http://localhost:abcd, Q到达S:abcd
    • C在连接SSH到S时, 设置SSH端口转发, 从S:abcdC:efgh, Q到达C:efgh
    • C上安装代理服务器, 监听于C:efgh, Q到达代理服务器
    • 代理服务器从设定的出站NIC将Q递入外网
  • 软件准备
    • C端
      • 代理服务器软件, 按需选用
      • SSH客户端
    • S端
      • SSH服务端
      • 默认该服务器使用bash作为终端, 其配置文件为.bashrc, 其他终端按需调整

配置步骤

  • S端配置
    • 通过SSH连接到S
    • 添加export ALL_PROXY=http://localhost:abcd.bashrc
      • 这里假设您选用的是http代理, 如果其他, 请修改协议, 例如改为sock5://localhost:abcd
      • 这里abcd为您选定的端口号, 尽量选择大一些但不超上限的值, 端口冲突将引发匪夷所思的故障查找
      • 您也可以暂时不添加到.bashrc, 但我强烈推荐这么做
  • 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
      • 测试该连接选项, 确认能够成功连接, 并能够成功访问外网

这有什么好处

  • 方便: 无需因C端DHCP问题而修改任何东西, 包括远端的代理配置和本地的任何配置
  • 安全: 代理服务器随SSH同时连通和断开, 保证没有合法人员使用时, 服务器不存在外网连接
  • 安全: C端代理服务器无需对局域网开放, 只需监听localhost即可
  • 安全: SSH将加密和保护该转发端口的数据, 即使本地代理服务器不设置授权或使用不加密通信, 也能够保证安全