SSH隧道穿越内网访问局域网内主机
内网中的服务器一旦离开局域网就没有办法进行访问了,这里就需要一个公网可以访问到的服务器作为SSH的端口转发,我这里注册了一个阿里云的服务器作为代理服务器
一、配置代理服务器
1. 开放端口
我会用到端口10022进行转发,所以需要在阿里云上开放这个端口,进入安全-防火墙,添加一条访问规则,如下所示:
2. 修改SSH配置文件
编辑/etc/ssh/sshd_config文件
vim /etc/ssh/sshd_config
在sshd_config中添加一条配置,打开转发功能,如下:
GatewayPorts yes
wq保存好以后,重启ssh
systemctl restart sshd
二、配置目标主机
执行如下的命令
ssh -T -f -N -g -R :10022:127.0.0.1:22 (你的公网服务器的名称)@(你的公网服务器的地址)
这条命令的作用是:
- 建立一条ssh连接,目标主机地址连接上代理服务器地址
- 如果有其他ssh客户端连接到代理服务器地址的10022端口上时,则代理服务器会将这条连接转发到目标主机地址上
三、通过代理服务器连接内网服务器
打开XShell,新建一个SSH连接,地址填写代理服务器的地址,然后端口填写10022(这个端口可以自己设置,只要是在可用范围内就可以),然后会提示你输入用户名和密码,这个就填写内网服务器的即可。
SSH转发命令知识点
ssh -T -f -N -g -R :10022:127.0.0.1:22 (你的公网服务器的名称)@(你的公网服务器的地址)
- -T 不分配伪终端;
- -f 使 ssh 进程在用户输入密码之后转入后台运行;
- -N 不执行远程指令,即代理服务器不需执行指令,只作端口转发;
- -g 允许代理服务器连接到本地转发端口;
- -R 将代理服务器指定端口上的连接转发到本机端口;
- (你的公网服务器的名称)@(你的公网服务器的地址) 表示使用代理服务器的用户来连接
- :10022:127.0.0.1:22
表示本机回环接口(127.0.0.1,也可使用本机其他网络接口的地址,比如以太网 IP 或 WiFi IP)的 22 端口连接到远程主机的 10022 接口,因远程主机 10022 绑定的地址为空,所以远程主机会监听其所有网络接口的 10022 端口。
如果总是掉线请尝试如下解决办法
报错:client_loop: send disconnect: Broken pipe
配置/etc/ssh/ssh_config,添加如下内容
Host *
# 断开时重试连接的次数
ServerAliveCountMax 5
# 每隔5秒自动发送一个空的请求以保持连接
ServerAliveInterval 5
IPQoS=throughput
重启SSH
systemctl restart sshd
如果报错:
sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist
另一个类似的问题:解决ssh的"Write failed: Broken pipe"问题
- 如果您有多台服务器,不想在每台服务器上设置,只需在客户端的 ~/.ssh/ 文件夹中添加 config 文件,并添加下面的配置:
ServerAliveInterval 60
- 如果有多个人管理服务器,不想在每个客户端进行设置,只需在服务器的 /etc/ssh/sshd_config 中添加如下的配置:
ClientAliveInterval 60
- 如果只想让当前的 ssh 保持连接,可以使用以下的命令:
ssh -o ServerAliveInterval=60 user@sshserver