authssh反向代理

场景

1、资源:

  • 内网服务器A:1台(内网IP:192.168.100.115)
  • 公网服务器B:1台(公网IP:1.2.3.4)
  • 其他笔记本C:1台,能访问公网即可
服务器 位置 地址 账户 ssh端口 是否允许sshd
内网服务器A 内网 192.168.100.115 usera 22
公网服务器B 公网 1.2.3.4 userb 22
其他笔记本C 能访问公网即可 / / / /

 

 

 

 

 

2、内网服务器A的操作系统: Ubuntu 16.04.5 LTS

3、目标:实现外网穿透到局域网的服务器,免密访问内网服务器A。

4、解决方法:内网服务器A通过autossh,与公网服务器之间建立稳定的端口映射关系。

具体的步骤如下:

一、内网服务器A

免密认证:配置SSH免密登录公网服务器B

即:使内网服务器A,能够免密登陆到公网服务器B(建议使用单独新建的账号做认证,比如autosshvpn)

将内网服务器A的公钥,追加到公网服务器B的~/.ssh/authorized_keys文件

1 ssh-keygen -t rsa -b 4096 -f autossh_test -C "autossh_test"
2 mv autossh_test* /root/.ssh/
3 chmod 600 /root/.ssh/autossh_test
4 ssh-copy-id -i /root/.ssh/autossh_test.pub userb@1.2.3.4

 

安装AUTOSSH

1 sudo apt-get install autossh

配置autossh

1 autossh -p 22 -i /root/.ssh/autossh_test -NR *:22315:192.168.100.115:22 userb@1.2.3.4 -f

备注:

  • -p 22:公网服务器B的ssh端口
  • 5678端口:负责通过这个端口监视连接状态,连接有问题时就会自动重连
  • 22345端口:公网服务器B的监听端口(可随机填写)
  • 192.168.6.115:22: 本地或内网IP地址监听的端口
  • -f : 后台运行

如果想要断开AUTOSSH的隧道连接,只需要把 AUTOSSH监听端口的进程 kill 掉就可以了:

1 ps -ef | grep 22345
root    5022     1  0 16:01 ?        00:00:00 /usr/lib/autossh/autossh -NR *:22315:192.168.100.115:22 userb@1.2.3.4
root    5023  5022  0 16:01 ?        00:00:00 /usr/bin/ssh -L 59176:127.0.0.1:59176 -R 59176:127.0.0.1:59177 -NR *:22345:192.168.100.115:22 userb@1.2.3.4
1 kill -9 5022

如果想同时开多个隧道,则 AUTOSSH的监听端口必须也开多个,监听端口不能一样。

 

优化操作:

建议新建一个用户,用于服务器A与服务器B免密认证。

新建用户运行程序,以保证安全

udo useradd -m autosshvpn //新建一用户来只负责运行 systemctl start autossh.service
sudo passwd autosshvpn

 

supervisor方案

安装supervisor

1 sudo apt-get install supervisor

配置autossh

创建自定义脚本,名字、路径均可以自定义

1 touch /opt/autossh.sh

写入以下内容

autossh -p 22 -i /root/.ssh/autossh_test -NR *:22315:192.168.100.115:22 userb@1.2.3.4

#注:/root/.ssh/autossh_test是内网服务器A登陆公网服务器B使用的key,建议单独生成

在/etc/supervisor/conf.d/中添加配置文件,以.conf结尾(名字自定义即可,如autossh22345.conf)

1 touch /etc/supervisor/conf.d/autossh.conf

写入以下内容

[program:autossh]
directory=/opt/
command=bash /opt/autossh.sh
autostart=true
autorestart=true
startsecs=5
stopasgroup=true
stopsignal=QUIT

启动服务

1 supervisorctl start autossh

 

 

service服务方案:

建立service服务

1 vim /lib/systemd/system/autossh.service

写入以下内容

[Unit]
Description=Auto SSH Tunnel
After=network-online.target
[Service]
User=autosshvpn
Type=simple
ExecStart=/usr/bin/autossh -p 22 -i /root/.ssh/autossh_test -NR *:22315:192.168.100.115:22 userb@1.2.3.4
ExecReload=/bin/kill -HUP $MAINPID 
KillMode=process 
StartLimitIntervalSec=5 
StartLimitBurst=12 
Restart=always 
[Install] 
WantedBy=multi-user.target 
WantedBy=graphical.target

启动并设置开机自启服务

sudo systemctl enable autossh.service //开机启动
sudo systemctl start autossh.service //启动服务

二、公网服务器B

修改公网服务器的sshd配置

配置完AUTO SSH之后,发现还是无法穿透,解决方法是配置下ssh, 开启 GatewayPorts 参数即可。

#修改配置
1 vim /etc/ssh/sshd_config
追加以下内容
GatewayPorts yes

重启ssh服务

Centos 7

1 systemctl restart sshd.service

Centos 6

1 /etc/init.d/sshd restart

 

GatewayPorts原理:

当请求一个TCP端口的时候,默认情况下,SSH只监听本机地址,这就导致AUTOSSH虽然穿透到公网服务器,但是外网还是无法通过映射的端口 访问局域网资源。

 

三、自己笔记本C

完成步骤一、二之后,使用以下命令,即可登录内网服务器A

1 ssh -p 22315 usera@1.2.3.4

如果要免密登陆,需要将笔记本c的公钥追加到内网服务器A的~/.ssh/authorized_keys文件中。

 

posted @ 2019-05-29 16:50  orzs  阅读(894)  评论(0编辑  收藏  举报