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

版权声明:本文为大事龙原创文章,未经允许不得转载。 https://blog.csdn.net/w_yunlong/article/details/77947880

异地内网服务器互通,直接通过路由器映射也可以做到,但是由于公网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 即可访问

猜你喜欢

转载自blog.csdn.net/w_yunlong/article/details/77947880