一:在外网机器上设置
1.打开 /etc/ssh/sshd_config,将GatewayPorts参数设为yes
2.systemctl restart sshd.service,重启ssh服务
注意:较低版本的Linux服务器 重启命令为 service sshd restart
3.centos7上没有默认安装autossh
的,所以使用一下命令安装,两台机器都装上autossh
yum install autossh -y
4.具体的autossh的指令为
autossh -M 7281 -fCNR 20122:localhost:22 root@123.123.123.123
autossh
的参数与ssh的参数是一致的,但是不同的是,在隧道断开的时候,autossh会自动重新连接而ssh不会。另外不同的是我们需要指出的-M参数,这个参数指定一个端口这个端口随意(不够建议1024-65000区间),这个端口是外网的B机器用来接收内网A机器的信息,如果隧道不正常而返回给A机器让他实现重新连接。
5.最后配置在Linux上配置开机自动启动autossh,免去了重启Linux后要自己启动的autossh的麻烦
输入:vi /etc/rc.d/rc.local
添加内容:autossh -M 7281 -fCNR 20122:localhost:22 root@123.123.123.123
因为centos7之后,原来直接修改
/etc/rc.d/rc.local
启动脚本自动生效的功能因为修改了需要重新赋予可执行权限
再输入 chmod +x /etc/rc.d/rc.local
总结:内网、外网分别安装autossh
内网主机上配置:
autossh -M 5678 -CNR 1234:localhost:22 root@123.207.121.121(外网ip),需要输入外网ip登录密码
可以实现将访问主机123.207.121.121的1234端口的数据,通过隧道转发到内网主机的22端口。
外网主机上配置:
/etc/ssh/sshd_config 加入 GatewayPorts yes
sudo service sshd restart
在外网主机上测试:
ssh root@localhost -p 1234 需要输入内网ip登录密码
就可以访问到内网主机
如果嫌输入密码麻烦,可以设置免密登录,方法如下:
使用A机器登录B机器
一、在A上使用 ssh-keygen -t rsa命令生成公私钥,然后一直回车把公私钥存在默认路径就行
二、A执行 ssh-copy-id B ,执行完该命令,会默认把A的公钥加到B的authorized_keys文件下(如果没有该文件,会创建并修改权限为使登录用户拥有rw权限)。。这样A以后ssh登录B就不用密码了
注意:
ssh-copy-id默认是使用root用户。如果要其他用户,则按照如下格式:
ssh-copy-id -i /home/.ssh/id_rsa.pub -p 22 用户名@ip
表示把A机器的/home/.ssh/id_rsa.pub公钥发送到B机器(B机器的.ssh目录下)。
6.第六步:开启自启动
配置 AutoSSH 开机自启动,输入
vi /etc/rc.d/rc.local
添加如下内容
autossh -M 5678 -CNR 1234:localhost:22 root@123.207.121.121
chmod +x /etc/rc.d/rc.local
centos7 之后,修改/etc/rc.d/rc.local 启动脚本需要重新赋予可执行权限。
注:因为外网直接到不了内网,可以直接复制公网生成的公钥给内网的authorized_keys文件中,并chmod 600 authorized_keys 赋予权限。
利用AutoSSH建立SSH隧道,实现内网穿透
当我们使用公司或家中电脑搭建了 Web 服务时,一般不能直接从外网访问,为了实现从外网直接访问到内网的服务,一般会需要用到 内网穿透 技术。常用的内网穿透工具有 NAT 转发、DMZ 主机、AutoSSH、ngrok、frp、花生壳等。下面将会介绍如何通过 SSH 端口转发,使内网主机 A 的服务转发至公网主机 B 上。
1.需要条件
一台内网主机 A,一台 Linux 公网主机 B。下文以 CentOS7 系统为例。
2.第一步:公网服务器配置
修改公网主机 B 的 SSH 配置文件/etc/ssh/sshd_config
GatewayPorts yes
这样可以把监听的端口绑定到任意 IP 0.0.0.0 上,否则只有本机 127.0.0.1 可以访问。
重启 sshd 服务
sudo service sshd restart
第二步:安装 AutoSSH 服务
在内网主机 A 上,执行以下命令安装 AutoSSH
yum install autossh
第三步:断线免密登录自动重连
ssh 反向链接会因为超时而关闭,如果关闭了那从外网连通内网的通道就无法维持,为此我们需要结合免密码登录及 AutoSSH 来提供稳定的 ssh 反向代理隧道。
1、在内网主机 A 上产生公钥和私钥
ssh-keygen
然后按三次回车执行默认选项生成公钥和私钥。会生成密钥文件和私钥文件 id_rsa,id_rsa.pub 或 id_dsa,id_dsa.pub
2、拷贝秘钥 在内网主机 A 上继续执行如下命令,将内网主机 A 上的秘钥文件 copy 到公网主机 B 中。
ssh-copy-id username@ip
其中“username”是公网主机 B 的用户名,ip 为公网主机 B 的 ip,然后按照提示输入公网主机 B 的密码就完成了。
第四步:利用 AutoSSH 实现端口转发
在内网主机 A 上,利用 AutoSSH 建立一条 SSH 隧道
autossh -M 4010 -NR 80:localhost:4000 username@xxx.xxx.xxx.xxx (-p xxxx)
参数解释:
“-M 4010”意思是使用内网主机 A 的 4010 端口监视 SSH 连接状态,连接出问题了会自动重连
“ -N”意思是不执行远程命令
“-R”意思是将远程主机(公网主机 B)的某个端口转发到本地指定机器的指定端口
代码解释:
“80:localhost:4000”意思是将内网主机 A 的 4000 号端口转发至公网主机 B 的 80 号端口上
“username@xxx.xxx.xxx.xxx”意思是公网主机 B 的用户名和 IP
“-p xxxx”意思是公网主机 B 的 SSH 端口,如果是默认的 22 号端口,则可以不输入.
第五步:监听端口检查
分别检查本地主机 A 及公网主机 B 的端口监听情况,出现如下进程则为正常。
本地主机 A:
[root@localhost ~]# lsof -i:4010
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ssh 6710 lixl 5u IPv6 0x15699cecfe8a4995 0t0 TCP localhost:altserviceboot (LISTEN)
autossh 46984 lixl 3u IPv4 0x15699cece41d5e95 0t0 TCP localhost:altserviceboot (LISTEN)
远程主机 B:
[root@localhost ~]# lsof -i:8080
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 9762 root 10u IPv4 473994 0t0 TCP *:webcache (LISTEN)
sshd 9762 root 11u IPv6 473995 0t0 TCP *:webcache (LISTEN)
第六步:开启自启动
配置 AutoSSH 开机自启动,输入:
vi /etc/rc.d/rc.local
添加内容:
autossh -M 4010 -fCNR 80:localhost:4000 username@xxx.xxx.xxx.xxx (-p xxxx)
chmod +x /etc/rc.d/rc.local
centos7 之后,修改/etc/rc.d/rc.local 启动脚本需要重新赋予可执行权限。
至此完成了端口转发,在相应的应用(如浏览器)中输入公网服务器 B 的 IP+端口即相当于直接访问内网主机 A 的相应服务,大功告成!
常见问题
配置完通过外网 IP 加端口无法访问: 请检查公网服务器防火墙是否开放响应端口。
本地服务重启后,通过外部端口无法访问:这种情况是由于没有检测到通道之前已经断开,AutoSSH 应该有类似的机制,还没有仔细研究。