一、申请服务器作为反向代理
这里申请的是阿里云服务器(其他云服务器均可)
二、配置阿里云反向代理服务器 + 内网服务器
1、登陆阿里云服务器配置ssh
- 打开 /etc/ssh/sshd_config, 将GatewayPorts设为yes
- 执行 sudo service sshd restart 重启sshd服务
2、配置阿里云服务器的防火墙
2.1 登录阿里云服务器的控制台, 将要映射的外网端口(如4501)加入安全组
2.2 设置阿里云服务器防火墙
首先开放要映射的外网端口
# 检查端口是否已开放
sudo firewall-cmd --query-port=4501/tcp
# 开放端口
sudo firewall-cmd --permanent --add-port=4501/tcp
# 在上一条命令之后,即便开放了,还是需要重新加载才会生效
sudo firewall-cmd --reload
# 列出防火墙已经放行的端口
sudo firewall-cmd --list-ports
3、配置内网服务器实现免密登录
在做完映射之后, 为了保证连接不会中断, 两台服务器间需要经常相互通信, 所以免密登录是必须的
# 在内网服务器上生成公钥私钥对
# 需要免密登陆,则在生成公钥私钥对时不输入任何密码串,直接回车,如下图所示
ssh-keygen -t rsa
# 将内网服务器的公钥复制到外网服务器
ssh-copy-id -i ~/.ssh/id_rsa.pub user@remote_ip
# 上述两步可以简化为在~/.ssh/目录下执行
ssh-keygen
ssh-copy-id user@remote-ip
4、配置端口映射
登陆内网服务器配置两台服务器的端口映射, 映射后用户便通过上面设置的 “外网服务器IP(阿里云服务器) + 指定端口” 来访问访问内网服务器。
需要安装autossh,以防止ssh断掉,autossh更稳定
# 安装autossh
centos: sudo yum install autossh
ubuntu: sudo apt-get install autossh
# autossh -M [内网端口] -fCNR [外网IP或省略]:[外网端口]:[内网IP]:[内网端口] [外网用户]@[外网IP]
autossh -M 2223 -fCNR 4501:192.168.3.65:22 root@182.xx.xx.xxx
登陆阿里云服务器查看端口是否可监听
netstat -anp | grep 4501
如果上述过程之后无法得到端口映射, 可更改autossh后面的内网端口,再执行一次命令。
参数说明
-M 指定一个内网端口来监视ssh连接状态,连接中断时自动重连
-f 后台执行ssh指令
-C 允许压缩数据
-N 不执行远程指令
-R 将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口
-L 将本地机(客户机)的某个端口转发到远端指定机器的指定端口
5、配置内网服务器设置开机自启
# autossh -M [内网端口] -fCNR [外网IP或省略]:[外网端口]:[内网IP]:[内网端口] [外网用户]@[外网IP]
autossh -M 2223 -fCNR 4501:192.168.3.65:22 root@182.xx.xx.xxx
- 将上面的命令写入文件 /etc/rc.d/rc.local
- 执行 sudo chmod +x /etc/rc.d/rc.local
三、将个人PC切换为外网后连接服务器
1、Windows使用xshell工具连接
不需要再添加代理,直接创建新的SSH连接
协议:SSH
主机:阿里云服务器的IP
端口:阿里云服务器映射的端口(4501)
2、Mac配置ssh的config文件连接
# 配置Mac本地ssh的~/.ssh/config文件,添加如下内容
## 阿里云服务器的连接配置(已配置免密)
Host aliyun
Hostname 182.xx.xxx.xxx #Aliyun-server IP
User root
Port 22
## 内网服务器1的连接配置
Host proxy65
Hostname 182.xx.xxx.xxx #Aliyun-server IP
User root
Port 4501
## 内网服务器2的连接配置
Host proxy66
Hostname 182.xx.xxx.xxx #Aliyun-server IP
User root
Port 4502
# 配置服务器的免密登陆
## 先在内网服务器~/.ssh/目录下上生成公钥私钥对(生成公钥私钥对时不输入任何密码串,直接回车)
ssh-keygen
## 将公钥配置到外网服务器的~/.ssh/authorized_keys文件中,直接使用如下命令
ssh-copy-id user@remote-ip
## 因为我们已配置了ssh的config文件,因此可以直接ssh-copy-id + [host别名]
ssh-copy-id aliyun
ssh-copy-id proxy65
ssh-copy-id proxy66
# 连接
ssh aliyun
ssh proxy65
ssh proxy66