异地内网服务器互通,直接通过路由器映射也可以做到,但是由于公网IP并不是固定的,因此这里介绍通过 SSH 端口转发,实现的固定IP访问

场景:内网机器 A、无固定IP机器B、固定IP机器C,其中 B 机器中运行有 SVN 服务,端口 6060,现在需要 A 访问 B 机器上的 svn 服务

方案一:通过非固定 IP:6060 直接访问,显然,这里的IP是可变的,不指定哪一刻IP变化后导致无法访问,需要更新链接地址

方案二:(推荐)
通过 ssh 本地端口转发实现,具体命令,在 C 机器上执行:

ssh -L 0.0.0.0:7070:localhost:6060 root@B

接下来,通过 svn://C:7070 即可访问 B 机器端口为 6060 的 svn 服务

注:方案二需在 B 机器上通过脚本实现自动获取公网IP并重启转发服务即可

方案三:(强烈推荐)
通过远程端口转发实现,在 B 机器上执行以下命令:

ssh -N -f -R 7070:localhost:6060  root@C

注:经实验,发现如果类似本地转发将 0.0.0.0 绑定后,在 C 机器上并不是绑定在 0.0.0.0 ,而是仍然绑定在了 127.0.0.1 ,这种情况下,仍然无法通过 svn://C:7070 访问,解决办法是修改 sshd 配置文件,将 GatewayPorts 设置成 yes 并重启即可。如图:

cat /etc/ssh/sshd_config


此时,通过 netstat -antp | grep 7070 可以观察端口监听情况

  • 未启用 GatewayPorts 之前
netstat -antp | grep 7070
tcp        0      0 127.0.0.1:7070              0.0.0.0:*                   LISTEN      9078/sshd
tcp        0      0 ::1:7070                    :::*                        LISTEN      9078/sshd
  • 启用 GatewayPorts 之后
netstat -anpt | grep 7070
tcp        0      0 0.0.0.0:7070                0.0.0.0:*                   LISTEN      13165/sshd
tcp        0      0 192.168.100.26:7070         112.232.19.3:50718          ESTABLISHED 13165/sshd
tcp        0      0 :::8055                     :::*                        LISTEN      13165/sshd

最后:
1、如果不想修改服务器本身的配置文件,可以先通过反向代理 -R 的方式,监听 127.0.0.1:7070,然后通过正向代理 -L 的方式,将本地的 7070 转发到 0.0.0.0:7071,这时可以通过 svn://C:7071 来访问B的服务
在 B 机器执行命令

ssh -R 7070:localhost:6060 root@C

在 C 机器执行命令

ssh -L 0.0.0.0:7071:localhost:7070 localhost

2、由于 ssh 会因为超时自动断开链接,这样端口转发就会失效,因此推荐使用 autossh 进行设置


2018-07-29 更新
方案四:
场景:机器A,运行一个WEB服务,机器B为要访问机器A上WEB服务的客户机,机器C为一个公网服务器,由于某些原因机器A的WEB服务不能直接发布到机器C,且机器A无固定IP,要求机器B能访问机器A上的WEB服务(假定端口为8888)
方案:

// ssh -R 目标端口:目标主机:本地端口 root@C
// 目标主机是相对机器C的,如果是与机器C同在的一个网段的其他机器,则需要写内网IP,如果是同一台机器,则为 localhost
ssh -R 8099:localhost:8888 root@C

由于通常情况下,GatewayPorts 默认不启用,因此,这里可以在机器C上借用 nginx 做一次反代处理,将其反向代理到 127.0.0.1:8099,如

listen 8011;
location /{proxy_pass http://127.0.0.1:8099;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Real-PORT $remote_port;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header REMOTE-HOST $remote_addr;#持久化连接相关配置#proxy_connect_timeout 30s;#proxy_read_timeout 86400s;#proxy_send_timeout 30s;#proxy_http_version 1.1;#proxy_set_header Upgrade $http_upgrade;#proxy_set_header Connection "upgrade";add_header X-Cache $upstream_cache_status;expires 12h;}

此时,通过 C:8011 即可访问

通过 SSH 端口转发实现异地内网服务器互通相关推荐

  1. 【vscode】ssh通过跳板机连接内网服务器

    以防自己忘记.. 跟着下面的步骤 step 1 本地生成密钥 生成自己电脑的公钥和私钥 ssh-keygen -t ed25519 会跳出几个步骤,第一个是指定路径用的,可以直接回车:后两个步骤是设置 ...

  2. 【环境配置】反向SSH——家中电脑连接校园内网服务器

    1. 需求描述 1.1 具体情境 实验室有一台校园内网GPU服务器,校园内网的特点是只允许内网机器主动访问外网机器,而不允许外网机器主动访问内网机器. 现在需要使用家中的电脑(无公网IP的机器,其可能 ...

  3. github访问不了_用ssh套娃翻到大陆公网给校园内网服务器装R包以及使用GitHub

    碎碎念... 某学校的服务器装R包真把我搞吐了! 最近我用的学校某计算服务器平台除了ssh登录,竟然连curl www.baidu.com都给封了,离谱 好,既然你给我留ssh还让我用,那我就用ssh ...

  4. 内网服务器无法直接连接外网时需进行端口代理的解决方案

    功能介绍 使用nginx,CCproxy,windows,linux进行网络代理的方案 Nginx 反向代理方案 内网访问外网或外网访问内网 配置 server {listen 80; #监听80端口 ...

  5. 使用跳板机在Pycharm上配置内网服务器

    使用跳板机在Pycharm 上使用内网服务器环境 ​ 最近遇到一个问题:实验室服务器仅限内网访问,无法在家(外网)访问实验室的所有内部服务器,但同时实验室又提供了一个外网可以访问的跳板机,虽然可以先s ...

  6. 使用Pycharm 连接内网服务器

    使用Pycharm 连接内网服务器 最近遇到一个问题,实验室服务器仅限内网访问,同时实验室也提供了一个跳板机,可以先ssh到跳板机再从跳板机ssh到内网服务器.然而这种方式不方便传输文件,也没法用py ...

  7. 访问学校图书馆资源和内网服务器

    之前有写过一篇利用端口转发来使得内网可以访问外网,以及用外网访问内网有限的几个端口.但这一次我们的需求升级了.因为放假在家,所以不能很方便的访问实验室的服务器做实验而且相应的图书馆资源比如知网和SCI ...

  8. 利用公有云cvm 公网IP实现内网穿透,远程登录内网服务器

    公有云服务 生成公私钥文件 ssh-keygen && cp ~/.ssh/id_rsa.pub  ~/.ssh/authorized_keys 将生成的私钥文件 id_rsa 复制到 ...

  9. 内网服务器使用docker安装应用

    备注:本文在内网服务器上安装 redis.elasticsearch.kibana 1.在可以连接外网的机器上操作: (1)使用 docker pull 命令拉取需安装应用的 docker 镜像 在d ...

最新文章

  1. 双十一,程序员前女友发来消息。。。
  2. 边缘检测算法及各自优缺点
  3. ML之XGBoost:XGBoost案例应用实战(原生接口实现+Scikit-learn接口实现)
  4. C语言创建指针需要给大小吗,如何用c语言创建一个指针(示例代码)
  5. 构造函数= default;_Python Collections之defaultdict 和 default_factory关系
  6. java实现可选形参_Java:可选的可选实现
  7. java.util接口_函数接口– Java 8中java.util.function包中的函数接口
  8. 云原生数据库崛起,阿里云POLARDB当选世界互联网领先科技成果
  9. awk命令和grep命令的使用
  10. git 分支管理策略(7)
  11. Wallpaper Engine软件——html做为壁纸
  12. C++异常处理底层机制详解
  13. 我的大学十年 -- 林锐
  14. mysql sql explain_MYSQL explain是用来分析sql语句
  15. Halcon学习-算子学习-映射/傅里叶变换/gen_grid_region/rft_generic例程
  16. 使用UE4开发VR项目_性能优化(三)_思路和方法
  17. JS实现倒计时动画效果
  18. duplicate symbol _OBJC_CLASS 错误处理方法
  19. android 加载动画素材,八种APP启动界面的Loading进度条设计动效方案
  20. c++——ignore()函数

热门文章

  1. 车联网大数据框架_FEV:基于最新网关技术管理车联网大数据
  2. 二维gabor滤波器matlab,matlab中实现Gabor滤波器 | 学步园
  3. cass高程点内插插件_聊聊CASS土方计算那些事-DTM法
  4. 均匀白噪声的定义及特点_职业卫生噪声布点与检测实务
  5. 区块链中的数学 - EdDSA签名机制
  6. JAVAEE框架之Spring AOP
  7. 河南智游科技 超市管理系统
  8. nginx会话保持值sticky模块
  9. 设计模式之适配器模式--java描述
  10. 关于LBS坐标系与精度的问题