0x00
正常的 ssh 是本地连接远程的设备 A - B ,反向代理的意义是 A - B C-B 然后,A - C连接,连接时候使用的 B 的端口和地址。前提是 B 是个在公网的机器,A 和 C 都能够访问到 B,B有独立的 ip 地址。本来这种需求使用 FRP 是最好的方式,但是有奇葩的中国移动的存在,让 FRP 都不好使了,最后验证 ssh 的反向代理还可以,下面记录一下设置的过程.
0x01
下面举例说明 下面假设上面有公网 ip 的服务 B 的 ip 地址为 35.35.35.35,用户名为 userB 。
1. A - B SSH 免密登录
首先我们要先让 A 能够通过密钥自动登录到 B。这需要先生成 一对密钥1
# 在 A 上 :使用ssh-keygen生成一对rsa公私钥,生成的密钥对会存放在~/.ssh目录下。
ssh-keygen -t rsa
# 在 B 上 :相应用户目录下创建~/.ssh目录,一般如果以前用过会有这个 .ssh 的目录
mkdir -p .ssh
# 将 A 的公钥拷贝给 B
cat .ssh/id_rsa.pub 复制里面的内容,然后粘贴在 .ssh/authorized_keys 里面
如果没有设置只使用 密钥登陆 那么可以用下面的命令来实现
# 在 A 机器上面
cat .ssh/id_rsa.pub | ssh -p 端口 userB@35.35.35.35 'cat >> .ssh/authorized_keys'
# -p 后面是 ssh 的端口,如果内有更改。那么可以不写这个直接写 ssh userB@35.35.35.35
然后需要更改 B 机器的配置文件,/etc/ssh/sshd_config
2
GatewayPorts yes
这样可以把监听的端口绑定到任意IP 0.0.0.0上,否则只有本机127.0.0.1可以访问。
2. 配置 autossh
这里我们使用 autossh 来进行端口转发,最大的好处在于断了会自动的重联。 以下是配置的文档1
autossh -M 9987 -fN -o PubkeyAuthentication=yes -o StrictHostKeyChecking=false -o PasswordAuthentication=no -o ServerAliveInterval 60 -o ServerAliveCountMax 3 -R 9988:localhost:22 ivo@35.35.35.35 -p 25214
# -M:在 9987 端口上监听连接的变化,只要断开就重连。
# -p:25214 是35.35.35.35 的 ssh 端口,如果自己没有更改使用的 22 端口,这个参数可以不加。
# -R 9988:localhost:22,将本地的22端口转发到远端的9988端口,这里千万不要写成35.35.35.35:9988:localhost:22 ,虽然这样易于理解但是实际使用过程中因为 ssh autossh 各种版本的原因回造成转发不成功。
# -N:只建立连接,不打开shell
# -f:建立成功后在后台运行
# -R:建立远程SSH隧道,指定远程主机上的某端口转发到本地的某端口
# -o XXXX 选项:
# PubkeyAuthentication=yes 使用密钥验证。
# PasswordAuthentication=no 不使用密码验证
# StrictHostKeyChecking=falsessh连接时避免首次连接时让输入yes/no部分的提示,自动接受(未知)SSH 主机密钥。
# ServerAliveInterval 60 每 60 秒交换 keep-alive 消息。
# ServerAliveCountMax 3 没有收到任何响应时最多发送 3 条 keep-alive 消息。
# 如果你想系统启动时自动运行 SSH 隧道,你可以将上面的 autossh 命令添加到 /etc/rc.local。
3.使用过程
在 B 机器上
ssh root@localhost -p 9988
在 C 机器上面
ssh root@35.35.35.35 -p 9988
参考文章