阿里云服务器上配置ssh反向代理
- 使用autossh来让目的主机在公网主机上建立这个端口映射
- 通过frp实现点对点的代理
- frp公网主机配置(服务器)
- frp目标主机的配置(客户机)
本文的内容可能偏运维,不是因为搞这个方向,而是确实存在一些坑,而且这些坑可能会被很多人踩。可能之前很多人在阿里云上配置个ssh反向代理,简单的装个autossh,然后一条命令就搞定了。但是我最近在使用了阿里云的轻应用服务器。但是配置好autossh命令之后,在服务器的防火墙上配置了安全规则之后,发现奇怪的一幕。就是autossh已经配置成功了,在云服务器上使用本地地址和端口可以访问目的主机的ssh了,但是无法通过外网访问。
首先还是从普通的配置ssh反向代理开始,为了让目的(学校或者家里)的主机能够被其他地方的主机访问,但是目的主机一般都没有公网ip,也就是能够被公网所看到的的ip。但是我们有一台有公网ip的主机(从云服务供应商那里获得的),这个时候我们需要让我们租来的这个公网服务器做一个反向代理。
如果我们要连接目的主机的ssh服务,但是目的主机的ssh可以开启,还是没有公网ip,主机所使用的的ip早都被路由器过滤掉了。这个时候想要连接,也是通过公网服务器做这个反向代理。
通俗来说,就是我们让目的主机主动告诉公网主机,我在什么什么地方。因为有公网ip,公网主机是可以被目的主机访问到的。不光告诉你,我在哪,我还用公网主机的一个端口来映射我的一个端口。这样就能建立一个隧道,访问公网主机的这个端口,相当于就是访问目的主机映射的这个端口。
显然如果目的主机映射的这个端口是ssh端口的时候(一般是22),这样访问公网主机对应的端口,就相当于访问目的ssh端口了。这个隧道可以通过ssh命令+参数来建立,但是又弊端,这里直接越过ssh配置的细节和ssh的原理跳到autossh。
使用autossh来让目的主机在公网主机上建立这个端口映射
这里假设目的主机已经安装好autossh,这个时候就可以使用autossh -M 12345 -gfnNTR 公网主机ip:映射端口:localhost:ssh端口 公网主机登录用户名@公网主机ip -o ServerAliveInterval=300
。大致解释一下命令的含义公网主机ip就是上面提到的,可以通过任意联网主机访问的主机,一般从云服务提供商那里获得。映射端口表示在公网主机上映射ssh使用的端口。因为是在目的主机上输入这个命令,所以使用的localhost。ssh端口表示要开启ssh服务的主机端口,这个可以设置(默认22)。后面就是和ssh登录一样使用的 登录用户名@公网主机ip
。
至于命令中的参数,大部分都是ssh的参数,大家可以不用理会。最后的-o ServerAliveInterval=300
表示300秒监听一次,如果这个命令没执行,则运行这个命令。具体原理不细讲。一般这个时候就需要输入公网主机的登录密码了。但是每次执行的时候需要输入密码不方便。
ssh登录可以免密登录,因为是目的主机请求公网主机代理自己,所以目的主机需要对公网主机有免密登录权限。如何实现,只需要把目的主机的 id_rsa.pub
,这个文件一般在各个用户的 ~/.ssh/
目录下,需要把这个文件中的内容写入到公网主机的对应用户的~/.ssh/authorized_keys
的文件中去。当然也可以通过一条命令,就是ssh-copy-id 公网主机用户名@公网主机ip -p:公网主机ssh对应的端口
。执行成功后,可以ssh连接公网主机,看是否配置成功。
免密登录只需要配置一次,但是每次启动主机之后都需要输入一次autossh命令,当然还有更好的解决方式,就是将autossh放在目的主机的启动命令中。为了开机启动,autossh命令可以写在/etc/init.d/autossh
中配置开机启动服务,也可以写在/etc/rc.local
脚本文件中,但是这两种方式涉及系统的启动,新手可以跳过。也可以写在crontab中,使用crontab -e
写入,不过这里写入就要加执行的时间设置。这个命令不能被写在bashrc或者profile等文件中,因为需要先于这些脚本的执行。
以下给出一种crontab的配置,不是最优配置,但是可以满足需求的。具体配置参数含义大家自行学习。
autossh -M 12345 -gfnNTR 公网主机ip:映射端口:localhost:ssh端口 公网主机登录用户名@公网主机ip -o ServerAliveInterval=300
但是autossh命令是通过直接对端口服务进行代理的,这种方式可能会被阿里云禁止,即便代理成功,也是无法通过外网访问相应的服务,这就是我踩的坑了。
通过frp实现点对点的代理
因为这些端口并非是真的无法对外开放,只是被做了限制。autossh无法有效穿透内网把服务端口暴露出来。但是可以通过给服务加一层壳的方式,使得服务端口能够暴露出来。至于frp还可以做web服务器的穿透,以及局域网的穿透之类的功能原理类似,这里不详细讲解。建议查阅官方文档。
要使用frp,首先就是公网服务器和目标服务器都需要安装,安装的过程也是很简单。找好版本,然后直接下载即可。下面给出ubuntu上命令行操作的流程。
首先在github页面的版本页面,查看相应的版本。事实上这里可以直接在这个页面复制下载地址了。如果是ubuntu系统,则复制_linux_amd64.tar.gz后缀的下载文件。然后得到这样一个地址:https://github.com/fatedier/frp/releases/download/v0.33.0/frp_0.33.0_linux_amd64.tar.gz
,变化的只是中间的两个版本号。
然后到服务器上,可以创建一个/etc/frp目录,通常需要权限。然后执行以下命令进行下载。之后对下载的文件进行解压。
mkdir /etc/frp
wget https://github.com/fatedier/frp/releases/download/v0.33.0/frp_0.33.0_linux_amd64.tar.gz
sudo tar xzvf frp_0.33.0_linux_amd64.tar.gz
cd frp_0.33.0_linux_amd64 #进入解压的目录
接下来就是配置环节。
frp公网主机配置(服务器)
公网主机也就是我们的服务器,主要关注frps和frps.ini这两个文件,需要配置的地方就是frps.ini这个配置文件。配置内容如下。
# frps.ini
[common]
bind_port = 7000
注意这个7000,表示frp服务运行的端口,这个端口需要是对外开放的,也就是能够被目标服务器所访问的端口。陪之后之后,然后执行./frps -c ./frps.ini
命令,表示在公网主机上启动frps服务,让其作为服务器。
需要注意的是这个命令执行后,如果遇到断网等情况就会断开连接,还是用到我们后台运行任务的老技术,nohup 或者其他命令行管理工具,如tmux完成。
frp目标主机的配置(客户机)
安装是同样的过程,但是在配置上有所差异。这里主要关注frpc和frpc.ini两个文件。配置同样是ini文件,修改他即可。
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 8000
这里的 server_addr和 server_port写的就是我们的公网主机的地址,和frps服务所运行的端口。然后我们建立一个ssh连接,ssh的协议类型是tcp。我们需要代理的是本机的ssh,下面就写本机的地址,和需要代理的端口。之后remote_port 表示使用公网主机的这个端口来代理我们的服务,这里就是ssh服务。
然后执行./frpc -c ./frpc.ini``就可以把客户机的frp服务也启动起来,这样就可以通过访问公网主机的8000端口,来访问目标主机的22端口。
整个配置过程也比较简单,同样是上面的frpc命令可以改为后台任务。防止断掉。
需要配置web服务或者内网代理也是同样的操作,区别就在于端口的配置上,操作起来也是比较简单,大家有需要可以自行查阅相关文档完成。而且好像有些功能nginx也可以完成。
文中涉及到的一些linux基础可能详略不当,欢迎大家指出。