SSH反向代理实现内网穿透
SSH反向代理实现内网穿透
在日常工作中,我们常常需要在内网环境中访问外网资源,或者在外网环境中访问内网资源。本文将介绍如何使用SSH反向代理实现内网穿透,通过内网打包服务器,借助外网服务器,实现在家访问我们的打包服务。
常用内网穿透方式
- 网卡层映射,包括购买公网IP
- 推荐指数:👍🏻👍🏻👍🏻👍🏻👍🏻
- 缺点:主要申请困难
- 自己搭建内网穿透服务
- 推荐指数:👍🏻👍🏻👍🏻👍🏻
- 非常实用,需要一台公网IP的主机,可以购买阿里云服务器、腾讯云服务器
- 使用三方平台提供的端口映射、内网穿透服务
- 推荐指数:👍🏻👍🏻👍🏻
- 使用cpolar、ngrok、花生壳等三方提供的服务
- 缺点:复杂场景问题排查困难,不是很稳定
本文将采用第二种方式,使用SSH反向代理实现内网穿透。
一、实现打包机器无密码登录到外网机器
1. 添加打包机器SSH公钥到外网服务器
在打包服务器上生成公钥(一路回车即可生成):
ssh-keygen
会生成id_rsa.pub
文件,这是打包服务器SSH服务截图:
复制打包机器的公钥:
cat id_rsa.pub
添加到外网机器的authorized_keys
中。终端切换到外网服务器:
普通Linux服务器SSH一般位于
root/.ssh/
:cd ../../ cd root/.ssh/
群辉Linux的SSH一般位于用户目录:
/var/services/homes/username/.ssh
使用vim
命令粘贴上去保存:
vim authorized_keys
按esc
退出,然后wq
保存
验证:在打包机器上登录外网服务器看是否需要输入密码:
ssh root@81.68.175.xx
这里打包机器不用输入密码就可登录,这步验证成功
2. SSH远程连接一段时间会失效的问题
光不输入密码就能登录,仍然存在一个问题,我们的远程登录终端是有超时时间的,这里我们在打包机器上设置重连。
在本地客户端操作:
- 进入
/etc/ssh/
中:cd /etc/ssh/
- 修改
ssh_config
文件(sudo vim ssh_config
),在末尾添加ServerAliveInterval 30
,意思是30s会发送一次向服务器连接的请求,以保持会话始终在线。 - 保存退出(
:wq
)
验证:放一段时间不操作,我们的终端仍然是保持链接状态,这步就成功了。
二、在打包服务器上建立打包机器到外网机器的反向代理
1. 内网端口映射到外网 [核心]
映射打包机器的8080端口到外网服务器9000端口:
ssh -CqTnN -R 81.68.175.xx:9000:127.0.0.1:8080 root@81.68.175.xx &
备注:末尾的&
表示后台执行
2. 打开公网服务器网管开关
查看内网服务:正常
启动打包机器的Jenkins服务(端口号8080),然后查看本地服务是否存在:
curl http://127.0.0.1:8080
查看外网服务:异常
然后我们再访问可能出现访问失败的问题如下:
curl http://81.68.175.xx:9000/
我们需要打开公网服务器网管开关/etc/ssh/sshd_config
修改GatewayPorts yes
vi /etc/ssh/sshd_config
PasswordAuthentication yes
是否可以密码认证,也修改成yes
同时我们需要在后台打开公网IP的防火墙,我这里使用的是腾讯云服务器的如下
重启sshd
:
service sshd restart
3. 进程管理
ps
查看进程
如果进程不对,杀掉进程(注意9719为PID):
kill -9 9719
备注:Linux查看进程命令区别
Jobs
命令:主要用于显示系统中的任务列表及其运行状态(注意:只在当前终端有效)。fg
命令:用于将后台作业(在后台运行的或者在后台挂起的作业)放到前台终端运行。bg
命令:用于将作业放到后台运行,使前台可以执行其他任务。该命令的运行效果与在指令后面添加符号&
的效果是相同的,都是将其放到系统后台执行。ps
命令:查看前后台服务,不区分终端
4. nohup后台运行
现在基本成功,如果你需要退出终端仍能运行,在命令前面加上nohub
即可。
nohup
英文全称no hang up
(不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行
nohup ssh -CqTnN -R 81.68.175.xx:9000:127.0.0.1:8080 root@81.68.175.xx &
如果发现当关闭终端时,发现程序也跟着停止,nohup
并没有生效:nohup
命令执行后,不要直接关闭终端,使用logout/exit
命令退出终端会话
logout
三、重启服务解决失效问题
由于局域网IP的变动,我这边需要重启内网穿透服务以维持稳定
3.1. SSH服务重启脚本
新建ssh_connect.sh
脚本:
#!/bin/bash
APP_NAME=81.68.175.xx:9000:127.0.0.1:8080
echo "try to stop service..."
PID=$(ps -ef | grep $APP_NAME | grep -v grep | awk '{ print $2 }')
if [ -z "$PID" ]; then
echo Application is already stopped
else
echo kill $PID
kill -9 $PID
fi
echo "start service..."
nohup ssh -CqTnN -R 81.68.175.xx:9000:127.0.0.1:8080 root@81.68.175.xx &
3.2. 定时任务
那么这就需要一个定时任务了,以下定时任务二选一即可
3.2.1. Jenkins定时任务
新建一个Jenkins定时任务
内网穿透定时检查脚本
配置半小时定时任务,Jenkins定时构建时间设置参考
H/30 * * * *
执行shell脚本
其中$BUILD_ID
是为了解决Jenkins 解决构建成功后进程消失的问题
OLD_BUILD_ID=$BUILD_ID
BUILD_ID=dontKillMe
cd /Users/mac/Desktop
sh ssh_connect.sh
BUILD_ID=$OLD_BUILD_ID
exit
3.2.2. crontab定时任务
crontab是Mac、Linux系统自带的定时任务
创建定时任务,终端输入
crontab -e
此时会打开一个vim编辑器,输入定时任务
以下定时任务设置的意思是:在上午8点到11点的第3和第15分钟执行,更多crontab定时任务语法参考这里
3,15 8-11 * * * myCommand cd /Users/mac/Desktop&&sh ssh_connect.sh
然后wq
保存退出即可。
备注:另外再次打开终端可能收到定时任务的邮件,查看邮件终端输入
mail
,然后输入对应的序号,退出exit
四、验证
内网
http://192.168.1.114:8080/jenkins/
外网
http://81.68.175.xx:9000/jenkins/