SSH反向代理

来源:互联网 发布:sftp自定义端口号 编辑:程序博客网 时间:2024/05/04 14:19

应用场景

相信很多同学会遇到这样的场景:公司的办公机器处于内网环境,家里的电脑也处于内网环境,有时公司有急事,人又不便立马赶去公司,这时SSH反向代理就能派上用场。下面介绍一种SSH反向代理解决方案,在Ubuntu14.04 LTS环境中实验成功。

机器情况

机器号 IP 用户名 备注 A A.A.A.A user_a 代理服务器,在外网,无法访问B/C B B.B.B.B user_b 目标服务器,在局域网,可以访问A C C.C.C.C user_c 可直接访问A,无法直接访问B

期望目标

C机器通过SSH访问B机器。

准备工作

  • 在A/B/C机器上装SSH客户端
  • 在A/B机器上装SSH服务端,安装步骤sudo apt-get install openssh-server
  • 在B机器上安装autossh,安装步骤sudo apt-get install autossh

解决方案

利用ssh建立的隧道会超时关闭,而利用autossh,超时之后会自动重新建立SSH隧道。

->1. 建立B机器到A机器的反向代理【在B机器上操作】

autossh -fCNR <port_A1>:localhost:22 user_a@A.A.A.A

<port_A1>为A机器上的端口,用来与B机器上的22端口绑定。
<port_A1>只能在A机器上进行本地访问。

->2. 建立A机器上的正向代理【在A机器上操作】

autossh -fCNL '*:<port_A2>:localhost:<port_A1>' localhost

<port_A2>为本地转发端口,用于和外网通信,并将数据转发到<port_A1>
其中*标识接受任意机器的访问。

->3. 通过A机器SSH到B机器【在C机器上操作】

ssh -p <port_A2> user_b@A.A.A.A

开机启动

为了使得B机器重启后,C机器仍然可以访问到B,可以给B机器设置开机启动SSH隧道,在B机器上进行如下操作:

  1. 生成公私钥对

执行以下命令,一路回车即可,提示输入密码时,不要输入。

su - user_bssh-keygen -t 'rsa'
  1. 将公钥安装到A机器
su - user_bssh-copy-id -i ~/.ssh/id_rsa user_a@A.A.A.A
  1. 开机启动脚本

编辑/etc/init.d/autossh_tunnel.sh,输入以下内容,并添加执行权限

#!/bin/sh# A.A.A.A可以是其他B机器可以ping通的IP,用于验证网络准备好了until ping -nq -c3 A.A.A.A; do    # waiting for network    sleep 5done/usr/bin/autossh -fCNR <port_A1>:localhost:22 user_a@A.A.A.A -i ~/.ssh/id_rsa
  1. 添加开机启动

编辑/etc/rc.local添加以下内容,在exit之前

su - user_b -s /bin/bash /etc/init.d/autossh_tunnel.sh &

autossh_tunnel.sh脚本中会一直等待网络,为了不影响rc.local中其他命令的执行,因此在后台执行了该脚本。

SSH 参数解释

-f 后台运行
-C 允许压缩数据
-N 不执行任何命令
-R 将端口绑定到远程服务器,反向代理
-L 将端口绑定到本地客户端,正向代理

0 0
原创粉丝点击