内外网映射访问内网服务器

avatar
作者
筋斗云
阅读量:0

autossh相关知识参考文档:ssh端口转发_allowtcpforwarding-CSDN博客

如果本地有公网ip,比如连接的宽带有公网ip,可以直接通过路由配置转发就行了,如果本地没有公网ip,那就需要通过下面这种方式来访问内网服务器了。

1:首先内网服务器需要连接外网,可以通过网线或者WiFi都可以。

2:准备三台服务,一台是内网服务器A,一台是阿里云公网服务器B(47.96.79.177),一台是其他可以访问外网的设备C

3:内网服务器A和公网服务器B互相同步密匙,准备内网服务器A密匙

#进入内网服务器A,执行下面命令 cd ~/.ssh 或者 cd /.ssh    #如果提示没用该目录,则需要生成该目录和下面的文件,直接在内网服务器A通过执行下面这个命令就可以了 ssh-keygen -t rsa (一直回车,无需配置密码)  #执行完成后,再次cd ~/.ssh,可以发现在该文件下面会出现id_rsa 和id_rsa.pub文件

4:开始同步密匙,配置A ssh到 B的免密登陆

#在内网服务器A执行同步密匙命令,该命令会要求输入外网服务密码,直接输入就行 #ssh-copy-id -i ~/.ssh/id_rsa.pub -p A的某远程端口 A的用户名@A的IP #or #ssh-copy-id -i .ssh/id_rsa.pub A的用户名@A的IP #or #ssh-copy-id  A的用户名@A的IP #or #下面这一步是复制A的~/.ssh/id_rsa.pub内容到B的~/.ssh/authorized_keys中   ssh-copy-id -i ~/.ssh/id_rsa.pub -p 22 root@47.96.79.177  执行完成后,会在内网服务器A ~/.ssh/目录下出现known_hosts文件,里面是外网服务器的信息

同时此时登录到阿里云公网服务器B,也会在B服务器~/.ssh目录下看到authorized_keys文件,里面是内网服务器信息。

5:配置阿里云公网服务器B的ssh参数(尤其是AllowTcpForwarding yes 和 GatewayPorts yes

这2个要开启,其他参数可选配置)

vim /etc/ssh/sshd_config  #连接超时及转发相关: GatewayPorts yes TCPKeepAlive yes ClientAliveInterval 60   ClientAliveCountMax 3  #证书相关: PubkeyAuthentication yes AuthorizedKeysFile      .ssh/authorized_keys  AllowTcpForwarding yes  (如修改参数,修改后重启ssh服务) systemctl restart sshd

6:安装autossh

安装方式一 # 安装autossh # CentOS yum install -y autossh # Ubuntu apt install -y autossh  # 编译安装,安装方式二 官网:https://www.harding.motd.ca/autossh/ $ sudo yum install wget gcc make #下载安装包 $ wget http://www.harding.motd.ca/autossh/autossh-1.4e.tgz #解压 $ tar -xf autossh-1.4e.tgz #进入解压目录 $ cd autossh-1.4e #配置源代码 $ ./configure #配置完成后,编译源代码 $ make #安装 autossh $ sudo make install  $ which autossh /usr/local/bin/autossh 

7:在内网服务器A执行命令进行端口转发(注意此处如果是阿里云这种云服务器,需要对监听的端口开通安全组)

autossh -M 0 -2 -4 -N  root@47.96.79.177 -p 22 -o ServerAliveInterval=5 -o ServerAliveCountMax=3 -o StrictHostKeyChecking=no -o TCPKeepAlive=yes -R 0.0.0.0:22219:localhost:22 -R 0.0.0.0:22220:localhost:8082

该命令执行完成后,会在47.96.79.177上打开22219和22220监听,通过 netstat -anp|grep 22219命令查看22219端口监听情况,注意图1是AllowTcpForwarding yes 和 GatewayPorts yes这2个没用开启执行后的结果,图2是开启后执行的结果

图1

图2

图1这种只能在47.96.79.177本地通过ssh -p22219 root@localhost访问内网,图2已经可以在其他外网服务器C上通过命令ssh -p22219 root@47.96.79.177来访问内网服务器了

关于图1和图2访问不同得原因说明

一般通过netstat -anp|grep 端口查看端口监听信息,监听端口前面如果是127.0.0.1说明只能在该服务器本地访问,如果监听端口前面如果是0.0.0.0 说明可以在外部访问该服务器了

参数说明:

-N 参数告诉 ssh 不要执行任何远程命令。

-o 参数设置 ssh 的选项。ServerAliveInterval 设置为 5,即每 5 秒 autossh 就会通过加密通道向云服务器发送一条消息,以请求其响应。而 ServerAliveCountMax 设置为 3,则当客户端连续 3 次发送消息后仍未收到服务器的响应时,autossh 将断开并重新连接。

-M 参数用于设置监控端口。autossh 会通过这个端口发送测试数据,并期望能从服务器那里收到回应。如果 autosssh 无法通过监控端口收到回应,它会认为 tunnel 已经断开,并尝试重新建立连接。由于已经设置了 -o 选项,因此 -M 为 0 亦可。

注意在守护进程中请不要设置  -f 参数。 -f 参数会让 autossh 在后台运行,这意味着 autossh 会立即返回,而不是一直运行。然而,对于 systemd 服务来说,通常希望服务在前台运行。 在守护进程中,也可以顺便加入  -D 0.0.0.0:7777 实现 socks5 代理。

8:autossh实现开机自启动端口映射

8.1、创建自启动脚本

# cd到该目录 cd /etc/rc.d/init.d # 创建文件 vi autossh_port.sh # 或 touch autossh_port.sh

8.2、创建好后编写自定义启动脚本内容

autossh -M 0 -2 -4 -N  root@47.96.79.177 -p 22 -o ServerAliveInterval=5 -o ServerAliveCountMax=3 -o StrictHostKeyChecking=no -o TCPKeepAlive=yes -R 0.0.0.0:22219:localhost:22 -R 0.0.0.0:22220:localhost:80

8.3、为脚本文件赋予执行权限
使用**chmod +x** 命令标识将该文件设置为可执行文件

chmod +x /etc/rc.d/init.d/jar_auto.sh      #赋予执行权限

8.4、为jar脚本赋予开机自启权限
编辑/etc/rc.d目录下的rc.local文件,将jar启动脚本加入该文件中即可。

vim /etc/rc.d/rc.local

rc.local文件中加入jar启动脚本文件绝对路径,如下:

# rc.local文件

/etc/rc.d/init.d/autossh_port.sh

如图:

8.5、赋予/etc/rc.d/rc.local文件执行权限
将jar脚本文件目录添加到rc.local文件后,需要为文件重新赋予执行权限,执行**chmod -x**命令

chmod +x /etc/rc.d/rc.local

8.6、使用reboot命令重启Linux系统,使用ps -ef | grep buss-admin 命令查看是否启动成功!
# 重启系统

reboot

至此autossh实现开机自启动端口映射成功,可以通过 ps -ef | grep autossh 查看启动情况,如图:

9:为了保证autossh稳定不掉线,可以设置定时杀掉autossh进程,然后再重启

创建定时脚本autossh_sechduled.sh

[root@localhost home]# vi autossh_sechduled.sh

在脚本中写入如下内容,并保存

#!/bin/bash   pids=$(pgrep autossh)  echo $pids  for pid in $pids; do       kill $pid   done  /usr/local/bin/autossh -M 0 -2 -4 -Nf  root@47.96.79.177 -p 22 -o ServerAliveInterval=5 -o ServerAliveCountMax=3 -o StrictHostKeyChecking=no -o TCPKeepAlive=yes -R 0.0.0.0:22219:localhost:22 -R 0.0.0.0:22220:localhost:80  echo "reset success"

给脚本执行权限

[root@localhost home]# chmod +x /home/autossh_sechduled.sh

通过crontab -e 指定定时任务执行脚本

[root@localhost home]# crontab -e

下面这个是指定脚本在6点和12点执行

0 6 * * * sh /home/autossh_sechduled.sh  0 12 * * * sh /home/autossh_sechduled.sh 

填写完成后保存,定时任务指定就好了,到点就会执行定时任务

文章参考:https://zhuanlan.zhihu.com/p/680289253

AutoSSH常用参数解释
官方文档:https://www.harding.motd.ca/autossh/README.txt

https://www.escapelife.site/posts/e6647650.html

https://www.yuque.com/listenstar/ygqknt/go0939

AutoSSH只有三个自己的参数:

参数    解释
-M    -M port[:echo_port] ;指定要使用的监控端口和echo的端口,用于自动重连
-f    使autossh在运行ssh之前进入后台。和ssh的-f冲突,使用此参数需要先配置好公钥登录。
-V    查看版本号
其余参数    其余参数使用的是ssh参数

SSH常用参数:
https://segmentfault.com/a/1190000021888536
https://www.linuxcool.com/ssh
https://wangchujiang.com/linux-command/c/ssh.html

参数    含义说明
-1    强制使用ssh协议版本1
-2    强制使用ssh协议版本2
-4    强制使用IPv4地址
-6    强制使用IPv6地址
-A    开启认证代理连接转发功能
-a    关闭认证代理连接转发功能
-b    使用本机指定地址作为对应连接的源ip地址
-C    请求压缩所有数据
-c    选择所加密的密码型式 (blowfish
-e    设定跳脱字符
-F    指定ssh指令的配置文件
-f    后台运行ssh
-g    允许远程主机连接主机的转发端口
-i    指定密钥对身份文件(预设是在使用者的家目录 中的 .ssh/identity)
-l    指定连接远程服务器登录用户名
-N    不执行远程指令
-n    重定向stdin 到 /dev/null;(要配合 -f 参数使用)
-o    指定配置选项
-p    指定远程服务器上的端口(默认22)
-P    使用非特定的 port 去对外联机(注意这个选项会关掉 RhostsAuthentication 和 RhostsRSAAuthentication)
-q    安静模式运行;忽略提示和错误
-T    不占用shell终端,禁止分配pseudo-tty(伪终端)
-t    强制配置pseudo-tty(伪终端)
-v    打印更详细信息
-X    开启X11转发功能
-x    关闭X11转发功能
-y    开启信任X11转发功能
-L    listen-port:host:port
指派本地的 port 转发到服务器上的 port;
建立本地SSH隧道(本地客户端建立监听端口);
将本地机(客户机)的某个端口转发到远端指定机器的指定端口.
-R    listen-port:host:port
将远程机器上的 port 转发到指定IP的port;
建立远程SSH隧道(隧道服务端建立监听端口);
将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口.
-D    port 指定一个本地机器 “动态的’’ 应用程序端口转发.

    广告一刻

    为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!