利用阿里云ECS跳板机内网穿透- ssh

开发中经常需要外网服务映射到服务器内网服务的需要,便于调试。原来使用的映射服务器使用的供应商提供的,现在服务到期,需要自己配,第一搞本来以为分分钟的事情,结果发现踩了这么多坑。。
最初老想不明白一件事,为什们外网服务器能够找到我的内网机器,现在才明白原来走的是 ssh 隧道。
需求:客户的内网机器公网IP地址为10.153.102.211, 我的阿里云外网公网IP地址为 120.24.210.14,现在需要所有对阿里云 120.24.210.14 80 端口的访问都映射到 10.153.102.211 的 80 端口。这样就有办法通过访问外网阿里云的80端口来访问内网的80端口服务了,这样就实现了内网穿透。
显然阿里云外网机器 120.24.210.14 访问不到客户的内网机器10.153.102.211, 但是内网能访问到阿里云外网的机器的 , 所以很简单 ssh 建立一个远程端口转发就行了。
- 可选;我为了以后方便维护,启动快捷,将客户的内网机器ssh key 添加到阿里云机器的信任名单里,这样启动ssh 远程端口转发时就可以免密码直接启动,而且可以通过创建一个 sh 脚本来监听这个端口转发服务是否断掉,如果断掉还可以自启动。
如果内网机器没有创建 ssh 公私密钥
那么使用下面的命令将会在用户目录.ssh文件夹下创建公私钥
ssh-keygen -t rsa
cd ~/.ssh
ls
创建两个密钥:
id_rsa (私钥)
id_rsa.pub (公钥)
上传公钥到服务器
ssh-copy-id -i ~/.ssh/id_rsa.pub root@120.24.210.14
这条命令就可以将内网的ssh 公钥添加到目标外网的.ssh/authorized_keys文件中。
测试免密登录
客户端通过ssh连接远程服务器,就可以免密登录了。
ssh root@120.24.210.14
在内网机器上通过 ssh命令 建立一个远程端口转发
ssh -N -v -R 8088:127.0.0.1:80 root@120.24.210.14
-R 表示远程转发,这句话的意思是 通过 ssh 连接到 120.24.210.14,让外网机器 120.24.210.14 监听自己的 8088 端口, 所有通过 8088 端口的数据都通过 ssh 转发到 127.0.0.1 的 80 端口上。
这里 127.0.0.1 就是 10.153.102.211 这个内网机器。 在 ssh 连接的时候通道就建立了, 以后所有的通信都走的是这个通道。比较特别的是,因为我们的阿里云外网机器的80端口还在使用,所以我通过外网的8088端口进行转发,这样外网其他常用端口仍然可以正常使用。
脚本自动启动,常驻后台
在/opt/sh/中创建一个脚本lisent_remote.sh 脚本。
#!/bin/bash
p8088=`ps afx | grep ssh | grep 120.24.210.14 | grep 8088 | wc | awk '{print $1}'`
if [ $p8088 == 0 ];
then
echo "port 8088 doesn't listened, let's start it"
ssh -gfnNTR 8088:127.0.0.1:80 root@120.24.210.14 -o ServerAliveInterval=30
fi
然后通过crontab -e 在cronta其中添加命令进行每分钟自动检查,是否启动,没有的话自动启动
* * * * * /opt/sh/lisent_remote.sh
nginx创建反向代理
既然 120.24.210.14 已经监听在 8088 端口了, 接下来就非常简单了,外网服务器上用 nginx 做一个反向代理, 把指定域名的域名的 80 端口代理到 8088 端口就行了。这样的话,通过指定的测试域名就可以访问内网的80服务了
120.24.210.14 上 nginx 配置如下
location / {
root /usr/share/nginx/html;
index index.html index.htm;
server_name test.********.cn
proxy_pass http://127.0.0.1:8088;
proxy_set_header Host $host:80;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Via "nginx";
}
这样当你访问test.********.cn 时就相当于访问了内网的80端口服务了。
ssh 功能还有很多强大的功能,通过 ssh 可以在家里随便访问公司内网电脑,在公司内网电脑也可以远程操作家里的内网电脑。
ps; 完成之后某些情况下还有另一个问题,比如说就是客户的内网的某个80端口服务也是指定域名的服务,所以我们外网的测试域名 test.********.cn 访问时会有js, css等静态文件无法加载的错误。
下一回记录,我安装配置 Squid 代理的踩坑。