开始

相信总会有小伙伴苦恼如何登录上公司或学校的内网服务器,为了解决这个问题我近期也是踩了不少坑,终于有一套方案是可行的。

原理

如图,我们的目的是从D连接到A,但是由于A在内网中,并不具备公网ip,因此实际上D无法主动建立D->B->A的通路。但是还有一种方案是:

  • A主动建立A->B->C的双向通路
  • D主动建立D->C的双向通路
  • C负责转发来自A->B->CD->C的数据

这样,我们建立起来了A<->B<->C<->D的通路。

准备

  1. 一台你的具备公网ip的服务器
  2. 两台可能都在内网的电脑、服务器

步骤

配置公网服务器

  1. 首先,开放一个公网服务器的空闲端口,假设为8022

  2. 修改/etc/ssh/sshd_configGatewayPortsAllowAgentForwardingyes,并重启sshd服务:

    1
    systemctl restart sshd
  3. 从防火墙 | 路由表开放8022端口:

    • 如果使用firewall:
    1
    2
    3
    4
    5
    systemctl start firewalld
    firewall-cmd --add-port=8022/tcp --permanent
    firewall-cmd --add-port=8022/udp --permanent
    firewall-cmd --reload
    firewall-cmd --zone=public --query-port=8022/tcp
    • 如果使用iptables:
    1
    2
    3
    4
    iptables -A INPUT -p udp -d 0/0 -s 0/0 --dport 8022  -j ACCEPT
    iptables -A INPUT -p tcp -d 0/0 -s 0/0 --dport 8022 -j ACCEPT
    netfilter-persistent save
    netfilter-persistent reload

建立SSH隧道

  1. 在需要被访问的内网服务器上执行

    1
    2
    3
    4
    nohup ssh -fR 8022:127.0.0.1:内网服务器SSH端口 root@远程服务器IP -p 远程服务器SSH端口 "vmstat 30"
    # 内网服务器SSH端口默认值: 22
    # 远程服务器SSH端口默认值: 22
    # vmstat 30 是防止远程服务器主动断开长时间未通信的链接
  2. 可能需要输入密码建立连接

登录内网服务器

1
ssh -p 8022 内网用户名@公网服务器IP