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文件中。