通过 ssh 访问内网

1,172 阅读4分钟

前言

为了满足外网访问内网的需求,所以研究了下如何利用 ssh 实现反向代理。

说明

下文称A为内网服务器,B为外网服务器,C为操作的电脑。

示例图

image.png

工具

  • ssh - 一种网络协议,用于计算机之间的加密登录
  • autossh - 监控ssh连接,自动进行重连

安装

autossh

CentOS, Fedora 或 RHEL 系统中从源码编译安装autossh 安装

创建安装脚本文件

vim autossh.sh
  • 复制的内容
#!/bin/bash
sudo yum install wget gcc make;
wget http://www.harding.motd.ca/autossh/autossh-1.4e.tgz;
tar -xf autossh-1.4e.tgz;
cd autossh-1.4e;
./configure;
make;
sudo make install;

设置文件权限并执行

chmod 777 autossh.sh && ./autossh.sh

更多安装方式

正文

建立A机器到B机器的反向代理

命令

# A 执行
# ssh -NCfR [B机器端口]:[A机器的IP]:[A机器的端口] [登陆B机器的用户名]@[服务器IP]
ssh -NCfR 2021:localhost:22 root@11.111.11.111

作用

内网服务22端口,监听公网的2021端口

参数说明

-f 后台执行ssh指令
-C 允许压缩数据
-N 不执行远程指令
-R 将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口
-L 将本地机(客户机)的某个端口转发到远端指定机器的指定端口
-p 指定远程主机的端口

ssh免密登录B

生成 ssh 公钥

已生成可忽略

一路回车

cd ~/.ssh && ssh-keygen -t rsa;

将公钥推送到B

ssh-copy-id 外网用户名@外网IP 

此操作实际的作用是将本地的~/.ssh/id_rsa.pub文件内容,添加到远程服务器的~/.ssh/authorized_keys

测试连接是否成功

ssh 外网用户名@外网IP 

失败的可能原因

  1. ssh 公钥认证登录的配置未打开

    执行

    vim /etc/ssh/sshd_config
    

    检查以下相关配置是否正确,若被注释,请打开。

    RSAAuthentication yes     # RSA认证
    PubkeyAuthentication yes  # 公钥认证
    AuthorizedKeysFile .ssh/authorized_keys  # 公钥认证文件路径
    
  2. root用户登录有失败

    同样的检查问题1描述的文件

    PermitRootLogin yes # 是否允许root登录
    

开机自启动ssh反向代理

以下操作是在A上执行

打开开机启动命令文件

vi /etc/rc.d/rc.local

添加

autossh -M 8888 -NCfR 2021:localhost:22 root@11.111.11.111

授权

chmod +x /etc/rc.d/rc.local

在B服务器连接A

查看端口是否监听

# B 机器
netstat -anp | grep 2021

结果示例

tcp        0      0 0.0.0.0:2021                0.0.0.0:*                   LISTEN      2392/sshd 

测试登录

ssh root@localhost -p 2021

在客户端连接A

# 客户端执行
ssh 11.111.11.111 -p 2021

可能的失败原因

  1. B服务器sshGatewayPorts 配置

    打开配置文件

    # B 执行
    vi /etc/ssh/sshd_config
    

    GatewayPorts 的设置改为 true

    重启ssh服务

    # B 执行
    systemctl restart sshd
    # 或执行
    service sshd restart
    

    GatewayPorts 的作用:
    是否允许远程主机连接本地的转发端口。默认值是"no"
    sshd默认将远程端口转发绑定到loopback(回环地址)地址。这样将阻止其它远程主机连接到转发端口。
    GatewayPorts 指令可以让 sshd 将远程端口转发绑定到非loopback地址,这样就可以允许远程主机连接了。

  2. B服务器端口被禁止连接

    问题1

    服务器防火墙禁止端口连接(自行搜索谷歌解决)。重启防火墙可能导致一些未知问题,小心操作。

    问题2

    购买的云服务器管理页面中安全组的入站规则配置

    image.png

更多

管理ssh进程

查看所有ssh进程

ps -Afl | grep ssh

关闭某个ssh进程

kill PID

localhost、127.0.0.1和0.0.0.0

localhost 其实是域名,一般系统默认将localhost指向127.0.0.1localhost指向的IP地址是可以配置的,可通过cat /etc/hosts查看配置。

开头以127开头的IP地址,都是回环地址(Loop back address)。所谓的回环地址,就是我们在主机上发送给127开头的IP地址的数据包会被发送的主机自己接收,根本传不出去,外部设备也无法通过回环地址访问到本机。

0.0.0.0并不是一个真实的的IP地址,它表示本机中所有的IPV4地址。监听0.0.0.0的端口,就是监听本机中所有IP的端口。