【微知】自己有一个云服务器如何配置一个内网穿透功能访问家里的服务器?(ssh -NfR 5505:localhost:22 reverse_proxy@1.2.3.4 -p 22)

背景

内网穿透在淘宝上售卖的比较多,以及常见的花生壳有相关服务。原理技术五花八门。本文记录使用 SSH 反向代理实现内网穿透的方式。前提是有一个拥有公网固定IP的云服务器。

x 详细步骤

x.1 云服务器配置(公网)

创建中转用户(可选但更安全)

# 在云服务器上执行
adduser reverse_proxy  # 创建用户
passwd reverse_proxy   # 设置密码
usermod -aG sudo reverse_proxy  # 添加sudo权限(可选)

修改 SSH 配置

# 编辑云服务器的SSH配置
vim /etc/ssh/sshd_config

添加 / 修改以下内容:

GatewayPorts yes  # 允许远程端口转发被外部访问
PermitRootLogin yes  # 允许root登录(若需使用root)
PasswordAuthentication yes  # 启用密码认证(按需)

重启 SSH 服务:

systemctl restart sshd  # Ubuntu/Debian
# 或
service sshd restart  # CentOS/RHEL

x.2 家庭服务器配置(内网)

# 在家庭服务器上执行(替换IP和端口)
ssh -NfR 5505:localhost:22 reverse_proxy@1.2.3.4 -p 22
# 参数说明:
# -N:不执行远程命令(只转发端口)
# -f:后台运行
# -R:远程转发 [云服务器端口]:[家庭服务器IP]:[家庭服务器端口]
# 1.2.3.4假设是云服务器固定IP
# 这个命令通过 SSH 建立一个反向代理隧道,将内网服务器的服务暴露到公网。
# 将云服务器的 5505 端口流量转发到内网服务器的 22 端口
# 最后一个-p 22是ssh反向代理为了访问当前云服务器的端口,与本实验端口转发无关
# 第一个localhost后面的22,是家里服务器的ssh端口。

(云服务器上执行)
然后云端查看是否开启了5505的监听端口:
netstat -tulpn | grep :5505

家里服务器执行:(如果是后台服务器,可以指定-f)
在这里插入图片描述
云服务器执行查看端口是否已经打开
在这里插入图片描述

x.3 登录访问

可以使用ssh config配置,也可以其他

x.3.1 直接登录

ssh -J reverse_proxy@1.2.3.4:22 beiming@localhost -p 5505

在这里插入图片描述

x.3.2 ssh config配置后简化登录

在这里插入图片描述
具体配置方法参考兄弟篇关于跳板机的文章 ssh config如何配置用host名替代root@1.1.1.1,以及如何配置通过跳板机登录?

# 云服务器配置
Host cloud-server
    HostName 1.2.3.4
    Port 22
    User reverse_proxy

# 内网服务器配置
Host c168
    HostName localhost
    Port 5505
    User beiming
    ProxyJump cloud-server
    IdentityFile ~/.ssh/id_rsa.pub

然后直接ssh c168指定服务器登录
在这里插入图片描述

y 其他

y.1 如何使用autossh保持自动重连?(家里服务器上操作)

y.1.1 安装autossh

autossh通常包含在 EPEL(Extra Packages for Enterprise Linux)源中。如果尚未启用 EPEL,需先安装:

# 安装EPEL仓库(适用于CentOS 7/8)
sudo yum install -y epel-release

# 安装autossh
sudo yum install -y autossh

笔者遇到了比较慢,手动安装的autossh

# 安装编译依赖
sudo yum install -y gcc make openssh-devel

# 下载并解压autossh源码
wget https://www.harding.motd.ca/autossh/autossh-1.4g.tgz
tar -xzvf autossh-1.4g.tgz
cd autossh-1.4g

# 编译并安装
./configure
make
sudo make install
  • 下载
    在这里插入图片描述
  • 解压
    在这里插入图片描述
  • 编译安装
    在这里插入图片描述
    在这里插入图片描述

y.1.2 测试可用性

# 创建持久连接(替换IP和端口)
autossh -M 0 -fNR 8080:localhost:80 reverse_proxy@1.2.3.4 -p 22
# -M 0:不使用监控端口
# -f 后台运行

y.2 如何配置反向代理系统服务支持自动重启

# 创建服务文件(家庭服务器)
vim /etc/systemd/system/autossh.service

添加以下内容:

[Unit]
Description=AutoSSH Tunnel
After=network.target

[Service]
User=root  # 或其他用户
Environment="AUTOSSH_GATETIME=0"
ExecStart=/usr/bin/autossh -M 0 -fNR 5505:localhost:22 reverse_proxy@1.2.3.4 -p 22
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

在这里插入图片描述

启用并启动服务:

systemctl enable autossh
systemctl start autossh
systemctl status autossh  # 检查状态

(不过这里还有点问题 启动老是失败,以后再更新)

另外为了方便自动重启免密输入需要设置下登录免密ssh-copy-id reverse_proxy@1.2.3.4,就是本机免密登录到云服务器的reverse_proxy账户的,具体配置方式参考兄弟篇:【微知】ssh如何指定免密的2种简单方式

在这里插入图片描述
然后试一下autossh或者ssh反向代理是否还需要输入密码:

y.2 如果autossh直接安装yum源没有如何处理?

[root@localhost ~]# yum install autossh  # CentOS/RHEL
Last metadata expiration check: 1:52:41 ago on Sun 18 May 2025 03:18:51 PM CST.
No match for argument: autossh
Error: Unable to find a match: autossh

在这里插入图片描述

需要安装epel-release sudo yum install -y epel-release,autossh通常包含在 EPEL(Extra Packages for Enterprise Linux)源中。
在这里插入图片描述
然后安装autossh:sudo yum install -y autossh
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值