理论上来上autossh可以转发任意端口的服务,也支持Windows
现在测试内外网穿透
系统
CentOS7.6.1810
一、首先外网服务器配置修改:
这样可以把监听的端口绑定到任意 IP 0.0.0.0 上,否则只有外网的本机 127.0.0.1 可以访问
注意:如果只让外网的本机访问就不需要修改此项
vim /etc/ssh/sshd_config GatewayPorts yes
重启ssh:systemctl restart sshd
二、内网服务器操作:
1、下载epel源
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
2、 安装autossh
yum -y install autossh
3、编写systemctl管理配置文件
vim /usr/lib/systemd/system/autossh.service
[Unit]
Description=Auto SSH Tunnel
After=network-online.target
[Service]
User=root
Type=simple
PIDFile=/var/run/autossh.pid
ExecStart=/usr/bin/autossh \
-o "StrictHostKeyChecking=false" \
-o "ServerAliveInterval 60" \
-o "ServerAliveCountMax 10" \
-M 2222 \
-NR 5678:172.17.0.41:22 \
root@172.17.0.100 \
-p 22 \
-i /root/.ssh/id_rsa
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
StartLimitIntervalSec=5
StartLimitBurst=12
Restart=always
RestartSec=42s
[Install]
WantedBy=multi-user.target
配置说明:
[Unit] # 区块:启动顺序与依赖关系。
Description=Auto SSH Tunnel # 当前配置文件的描述信息。
After=network-online.target # 表示当前服务是在那个服务后面启动,一般定义为网络服务启动后启动
[Service] # 区块:启动行为
User=root # 定义启动用户
Type=simple # 定义启动类型PIDFile=/var/run/autossh.pid # 服务的pid文件路径
# 定义启动进程时执行的命令
ExecStart=/usr/bin/autossh \
-o "StrictHostKeyChecking=false" \ # 连接新主机时不进行公钥确认
-o "ServerAliveInterval 60" \ # 自动每60秒发送数据,延续ssh会话
-o "ServerAliveCountMax 10" \ # 10次请求后都没能响应,那么SSH客户端就自动断开连接并退出
-M 2222 \ # 在本机2222端口监视 SSH 连接状态
-NR 5678:172.17.0.41:22 \ # -N 意思是不执行远程命令,-R意思是将远程主机(外网服务器)启动5678的端口数据转发到本地(内网服务器)的22端口上root@172.17.0.100 \ # 转发的远程主机(外网服务器)ssh连接信息,root用户@外网IP地址
-p 22 \ # 外网服务器ssh服务的端口
-i /root/.ssh/id_rsa # 本地(内网服务器)的密钥
ExecReload=/bin/kill -HUP $MAINPID # 重启服务时执行的命令
KillMode=process # 定义 systemd 如何停止 autossh 服务
StartLimitIntervalSec=5 # 用于设置时长
StartLimitBurst=12 # 用于设置在一段给定的时长内,最多允许启动多少次
Restart=always # 定义了 autossh 退出后,Systemd 的重启方式RestartSec=42s # 设置在重启服务(Restart=)前暂停多长时间,跟sshd服务一样
[Install] # 区块:定义如何安装这个配置文件,即怎样做到开机启动。
WantedBy=multi-user.target # 表示该服务所在的 Target。multi-user.target表明当系统以多用户方式(默认的运行级别)启动时,这个服务需要被自动运行。
如果不想配置systemctl管理的话,用于测试执行或者命令行执行
这里加上 -f 表示后台执行
autossh \
-o "StrictHostKeyChecking=false" \
-o "ServerAliveInterval 60" \
-o "ServerAliveCountMax 10" \
-M 2222 \
-fNR 5678:172.17.0.41:22 \
root@172.17.0.100 \
-p 22 \
-i /root/.ssh/id_rsa
4、 重新加载systemctl
systemctl daemon-reload
5、设置autossh开机自启并启动
systemctl enable --now autossh
6、检查端口和服务
netstat -untpl
systemctl status autossh
7、检查远程主机(外网服务器)的端口
netstat -untpl | grep 5678
8、远程主机(外网服务器)测试看看是否能连接到内网服务器
ssh 127.0.0.1 -p 5678
至此,测试连接正常,内网穿透部署完成