ssh反向代理实现内网穿透【亲测可用】

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

常用内网穿透方式

1、网卡层映射包括购买公网ip

推荐指数👍🏻👍🏻👍🏻👍🏻👍🏻。

缺点主要申请困难。

2、自己搭建内网穿透服务。

推荐指数👍🏻👍🏻👍🏻👍🏻。

非常的实用自己需要一台公网ip的主机可以购买阿里云服务器、腾讯云服务器推荐这款45元一年的

3、使用三方平台提供的端口映射、内网穿透服务

推荐指数👍🏻👍🏻👍🏻

使用cpolarngrok花生壳等三方提供的服务。

缺点复杂场景问题排查困难不是很稳定我这边主要用了这3款打包服务器每天凌晨3点老是容易断开与官方排查了一周未解决。

本文在文镜老哥的指导下使用第2种ssh反向代理的方式通过内网打包服务器借助外网服务器实现在家访问我们的打包服务。

一、实现打包机器无密码登录到外网机器

1、添加打包机器ssh公钥到外网服务器

在打包服务器上生成公钥 (一路回车即可生成)

ssh-keygen 

会生成id_rsa.pub文件这是打包服务器smb服务截图

image-20220127202810611

这是打包服务器ssh服务截图

image-20220127202810611

复制打包机器的公钥

cat id_rsa.pub
image-20220127202810611

添加到外网机器的authorized_keys中。

终端切换到外网服务器

cd ../../
cd root/.ssh/
image-20220127202810611

使用vim命令粘贴上去保存

vim authorized_keys
image-20220127202810611

esc退出然后wq保存

验证在打包机器上登录外网服务器看是否需要输入密码

ssh root@81.68.175.xx
image-20220127202810611

这里打包机器不用输入密码就可登录这步验证成功

2、ssh远程连接一段时间会失效的问题

光不输入密码就能登录仍然存在一个问题我们的远程登录终端是有超时时间的这里我们在打包机器上设置重连。

在本地客户端操作
1.进入/etc/ssh/中cd /etc/ssh/
2.修改ssh_config文件sudo vim ssh_config在末尾添加ServerAliveInterval 30意思是30s会发送一次向服务器连接的请求以保持会话始终在线。
3.保存退出(:wq)

image-20220127202810611 image-20220127202810611

验证: 放一段时间不操作我们的终端仍然是保持链接状态这步就成功了。

二、在打包服务器上建立打包机器到外网机器的反向代理

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 
image-20220127202810611

查看外网服务异常

然后我们再访问可能出现访问失败的问题如下

curl http://81.68.175.xx:9000/
image-20220127202810611

linux解决ssh tunnels端口不能转发问题

我们需要打开公网服务器网管开关/etc/ssh/sshd_config 修改 GatewayPorts yes

vi /etc/ssh/sshd_config 
image-20220127202810611

PasswordAuthentication yes 是否可以密码认证也修改成yes

image-20220127202810611

同时我们需要在后台打开公网ip的防火墙我这里使用的是腾讯云服务器的如下

image-20220127202810611

重启sshd

service sshd restart

3、进程管理

ps查看进程

image-20220127202810611

如果进程不对杀掉进程 (注意9719为PID)

kill -9 9719

备注linux查看进程命令区别

1、Jobs命令:主要用于显示系统中的任务列表及其运行状态注意只在当前终端有效。

2、fg命令用于将后台作业在后台运行的或者在后台挂起的作业放到前台终端运行。

3、bg命令用于将作业放到后台运行使前台可以执行其他任务。该命令的运行效果与在指令后面添加符号&的效果是相同的都是将其放到系统后台执行。

4、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的变动我这边需要重启内网穿透服务以维持稳定

新建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 &

再建一个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

四、验证

内网

http://192.168.1.114:8080/jenkins/
image-20220127202810611

外网

http://81.68.175.xx:9000/jenkins/
image-20220127202810611
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6