前言
为了满足外网访问内网的需求,所以研究了下如何利用 ssh 实现反向代理。
说明
下文称A为内网服务器,B为外网服务器,C为操作的电脑。
示例图
工具
- 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
失败的可能原因
-
ssh 公钥认证登录的配置未打开
执行
vim /etc/ssh/sshd_config检查以下相关配置是否正确,若被注释,请打开。
RSAAuthentication yes # RSA认证 PubkeyAuthentication yes # 公钥认证 AuthorizedKeysFile .ssh/authorized_keys # 公钥认证文件路径 -
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
可能的失败原因
-
B服务器ssh的GatewayPorts配置打开配置文件
# B 执行 vi /etc/ssh/sshd_config将
GatewayPorts的设置改为true重启
ssh服务# B 执行 systemctl restart sshd # 或执行 service sshd restartGatewayPorts的作用:
是否允许远程主机连接本地的转发端口。默认值是"no"
sshd默认将远程端口转发绑定到loopback(回环地址)地址。这样将阻止其它远程主机连接到转发端口。
GatewayPorts 指令可以让 sshd 将远程端口转发绑定到非loopback地址,这样就可以允许远程主机连接了。 -
B服务器端口被禁止连接问题1
服务器防火墙禁止端口连接(自行搜索谷歌解决)。重启防火墙可能导致一些未知问题,小心操作。
问题2
购买的云服务器管理页面中安全组的入站规则配置
更多
管理ssh进程
查看所有ssh进程
ps -Afl | grep ssh
关闭某个ssh进程
kill PID
localhost、127.0.0.1和0.0.0.0
localhost其实是域名,一般系统默认将localhost指向127.0.0.1。localhost指向的IP地址是可以配置的,可通过cat /etc/hosts查看配置。
开头以
127开头的IP地址,都是回环地址(Loop back address)。所谓的回环地址,就是我们在主机上发送给127开头的IP地址的数据包会被发送的主机自己接收,根本传不出去,外部设备也无法通过回环地址访问到本机。
0.0.0.0并不是一个真实的的IP地址,它表示本机中所有的IPV4地址。监听0.0.0.0的端口,就是监听本机中所有IP的端口。