更多精彩内容请访问我的新博客站点
前言
前几天在一台具有公网IP的 vultr 云服务器上实现了 frp 内网穿透(参考链接),可以从寝室 ssh 登录到教研室的服务器,但是由于 vultr 的云服务器位于国外的节点,连接速度太慢了,导致连接 ssh 登录的体验很差。今天又弄了一台阿里云的云服务器 ECS,所以现在来介绍如何在阿里云上实现 frp 内网穿透。
配置 ssh 访问内网机器
之前使用的 vultr 的VPS是 CentOS 系统的,这次阿里云服务器是 Ubuntu 的操作系统,但其实不同操作系统的云服务器在使用 frp 时操作都是一样的,就是下载,配置,运行。可能有区别的地方就是防火墙相关的配置,不同云服务厂商的镜像不同可能也有一些差别。下面来说明在阿里云的公网服务器的 frp 实现步骤:
下载
在阿里云的公网服务器和内网机器上都要下载安装包并解压:
$ wget /fatedier/frp/releases/download/v0.21.0/frp_0.21.0_linux_amd64.tar.gz$ tar -xzvf frp_0.21.0_linux_amd64.tar.gz
解压之后的文件夹中既包含了服务端的文件又包括客户端的文件,所以可以分别在两个机器上删除掉不必要的文件,也可以不删,都没有影响。强迫症还是来删一下,在解压后的文件夹中:
在公网服务器上删除客户端相关的文件,只保留一下两个文件:
frps frps.ini
在内网机器上删除服务端相关的文件,只保留以下两个文件:
frpc frpc.ini
配置
就是需要修改配置文件frps.ini
及frpc.ini
。
修改公网服务器上的服务端配置文件frps.ini
,如下:
[common]bind_port = 7000 #frp服务端端口(必须)
修改内网目标主机的客户端配置文件frpc.ini
,如下:
[common]server_addr = xxx.xxx.xxx.xxx #frp服务端地址,必须是公网ip或者域名,这里假设为xxx.xxx.xxx.xxxserver_port = 7000#frp服务端端口,即填写服务端配置中的 bind_port[ssh]type = tcp #连接类型,填tcp或udplocal_ip = 127.0.0.1 #填127.0.0.1或内网ip都可以local_port = 22 #需要转发到的端口,ssh端口是22remote_port = 6000#frp服务端的远程监听端口,即你访问服务端的remote_port就相当于访#问客户端的 local_port,如果填0则会随机分配一个端口
运行
在公网服务器上运行服务端程序:
$ nohup ./frps -c frps.ini &
查看 nohup.out 的信息,success
$ tail -f nohup.out/09/17 21:34:01 [I] [service.go:130] frps tcp listen on 0.0.0.0:7000/09/17 21:34:01 [I] [root.go:207] Start frps success/09/17 22:06:02 [I] [service.go:319] client login info: ip [125.71.229.32:60516] version [0.21.0] hostname [] os [linux] arch [amd64]/09/17 22:06:02 [I] [proxy.go:217] [7940291c148c2fca] [ssh] tcp proxy listen port [6000]/09/17 22:06:02 [I] [control.go:335] [7940291c148c2fca] new proxy [ssh] success
在内网目标主机上运行客户端程序:
$ nohup ./frpc -c frpc.ini &
查看 nohup.out 的信息,success
$ tail -f nohup.out/09/17 22:42:22 [I] [proxy_manager.go:300] proxy removed: []/09/17 22:42:22 [I] [proxy_manager.go:310] proxy added: [ssh1]/09/17 22:42:22 [I] [proxy_manager.go:333] visitor removed: []/09/17 22:42:22 [I] [proxy_manager.go:342] visitor added: []/09/17 22:42:23 [I] [control.go:246] [0624b332c3465118] login to server success, get run id [0624b332c3465118], server udp port [0]/09/17 22:42:23 [I] [control.go:169] [0624b332c3465118] [ssh1] start proxy success
配置多个内网主机
错误的多客户端配置
使用一台阿里云的公网服务器,我们可以配置很多内网机器的 frp 内网穿透,公网服务器上只需要按照上述的配置一次即可,但是内网机器的配置稍有不同,如果使用了一样的配置则后添加的内网机器是无法连接上公网服务器的。这里假设另一台内网机器2的 frpc.ini 配置如下,来说明会遇到的问题:
$ vi frpc.ini[common]server_addr = xxx.xxx.xxx.xxx <==这里还是按照上面的假设,公网服务器的ip为xxx.xxx.xxx.xxxserver_port = 7000[ssh]type = tcp local_ip = 127.0.0.1local_port = 22remote_port = 6001<==remote_port设置为另一个值
两个内网主机的配置除了 remote_port 不一样之外,都是一样的。但是在内网机器2上运行 frpc 后,公网服务器的 nohup.out 中会记录一下的错误:
[W] [control.go:332] [280d36891a6ae0c7] new proxy [ssh] error: proxy name [ssh] is already in use
后来发现,frp 中是通过 [ssh] 这个名字来区分不同客户端的,所以不同的客户端要配置成不同的名字。
正确的多客户端配置
内网机器1和内网机器2的配置应该区分如下:
内网机器1:[ssh] <==不同点type = tcp local_ip = 127.0.0.1local_port = 22remote_port = 6000 <==不同点内网机器2:[ssh1] <==不同点type = tcp local_ip = 127.0.0.1local_port = 22remote_port = 6001 <==不同点
在两个内网机器上分别运行 frpc 客户端程序后,一般就可以通过以下的方法 ssh 登录:
内网机器1:$ ssh -p 6000 user_name1@server_addr内网机器2:$ ssh -p 6001 user_name2@server_addr
以上参数中,server_addr是公网服务器的公网ip;user_name1、user_name2 分别是内网机器1、2的用户名,之后分别使用登录密码就可以登录。
connection timed out 解决
但是有时候会发现按照以上的配置还是使 frp 的服务端与客户端建立连接,在客户端上会出现以下错误:
/09/17 22:02:23 [W] [control.go:113] login to server failed: dial tcp xxx.xxx.xxx.xxx:7000: connect: connection timed outdial tcp xxx.xxx.xxx.xxx:7000: connect: connection timed out
仔细检查了一下云服务器上面的防火墙设置,发现并没有任何过滤规则,那应该不是防火墙的问题
# iptables -vnLChain INPUT (policy ACCEPT 46165 packets, 28M bytes)pkts bytes targetprot opt inoutsourcedestination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)pkts bytes targetprot opt inoutsourcedestination Chain OUTPUT (policy ACCEPT 42223 packets, 3001K bytes)pkts bytes targetprot opt inoutsourcedestination
然后又仔细想了一下我以前在做关于 OpenStack 的项目中也碰到了类似的问题,就是创建了云实例,发现无法通过 ssh 来登录,就是因为 OpenStack 有安全组规则相关的设置。
想到了这里就有一种熟悉的感觉,还是原来的配方,hahaha。。。
登录到阿里云对应云服务器的管理控制台,如下找到左上方的本实例安全组:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Tun0BAfr-1612859329577)(/cao0507/My-Pictures-Repository/master/blog/aliyun%20instance%20info.jpg)]
然后点击右上角的配置规则:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8ZhP1IfJ-1612859329578)(/cao0507/My-Pictures-Repository/master/blog/aliyun%20group%20rules.jpg)]
再点击右上角的添加安全组规则:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GKvNLe1q-1612859329579)(/cao0507/My-Pictures-Repository/master/blog/aliyun%20groups%20rules%20setting.jpg)]
最后在添加安全组规则的界面添加相应的规则:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zkx1nfaH-1612859329581)(/cao0507/My-Pictures-Repository/master/blog/aliyun%20group%20rules%20adding.jpg)]
主要有两个配置项,端口范围和授权对象
端口范围就是你要开放的端口的范围,需要将
server_port
和remote_port
都添加进去,可以分成两条规则分别添加;授权对象是你要授权的对象,一般设为0.0.0.0/0
表示允许所有IP的访问。
以上就是针对阿里云的云服务器的安全组设置,其他厂商如果有安全组规则也应该是类似的。