背景
如果我们希望在家里搭建一台服务器,并且能够被外网访问,那可以行的方案有两种:1、向宽带运营商申请家庭的公网ip,然后配置防火墙,开放端口,就直接可以被外网访问了。2、通过内网穿透,所谓内网穿透其实就是利用代理服务器进行转发,假设你现在有一台存在有公网ip的服务器(比如租一台阿里云服务器,就会有公网ip)A,然后已有一台本地的内网服务器B。我们通过B连接A,然后我们向A请求数据时,A会将请求转发给B进行请求处理,最后在将结果返回给用户。这样用户就能间接通过A来访问B了。
在可能的情况下通过第一种方式实现自己搭一台服务器是最好的,但是由于公网ip本身就很紧张(数量有限,不够分)以及其他的一些不可控因素,往往第一种方式是行不通的,这个时候就需要方法二:内网穿透了。内网穿透也分两种方式:1、自己搭建第三方服务器。2、使用第三方服务商的服务器。即上面说的服务器A(有公网ip的这台服务器)是我们自己搭建还是直接使用第三方服务商的,这种第三方服务商(比如花生壳,nat123,ngork)都会收取一定费用,而且费用跟映射(端口映射)数有关。其中nat123如果充值50元,可以体验到无限端口的免费服务,但是那个网速真的感人(如果实在是舍不得钱,这也是将就着用的)。在衡量了第三方服务商的价格和自己买云服务器后,还是自己购买云服务器划算(前提是可以通过各种优惠方式购买到低价服务器的,直接购买服务器也是不便宜的)。
frp实现内网穿透
基于以上的背景,下面来讲如何自己来搭建第三方服务器实现本地内网穿透,首先需要有一台有公网ip的服务器(阿里云,百度云,华为云等等,自行购买吧),然后利用内网穿透的软件来搭建(frp,ngrok),我们这里选择frp来进行实现。
下载
我们从github上下载frp,下载地址:https://github.com/fatedier/frp/releases 。如果我们在linux安装可以直接通过wget下载,当然也可以本地现在之后上传上去:
wget https://github.com/fatedier/frp/releases/download/v0.36.2/frp_0.36.2_linux_amd64.tar.gz
如果windows的话直接下载到本地。下载的压缩包里既有frp的客户端部分也有服务端部分,看我们自己选择。
服务端搭建
所谓服务端就是进行转发的第三方服务器,我们这里是基于阿里云linux服务器。
-
解压frp
tar -zxvf frp_0.36.2_linux_amd64.tar.gz
-
进入frp文件
cd frp_0.36.2_linux_amd64
-
修改服务端的配置文件
vi frps.ini
编辑内容如下:
[common] # frp监听的端口,默认是7000,可以改成其他的 bind_port = 7000 # 授权码,请改成更复杂的,这个token之后在客户端会用到 token = dsfsgefgsfwe # frp管理后台端口,请按自己需求更改 dashboard_port = 7500 # frp管理后台用户名和密码,请改成自己的 dashboard_user = admin dashboard_pwd = admin enable_prometheus = true # frp日志配置 log_file = /var/log/frps.log log_level = info log_max_days = 3
-
启动frp
如果只是单次启动的话,我们直接利用frp文件下的frps可执行的二进制文件就可以启动一个frp服务端:./frps -c ./frps.ini
启动之后我们可以打开服务端的admin后台查看,打开时需要我们输入账号密码,就是我们配置文件中配置的admin,admin。
可以看到上面tcp模块已经有四个服务在进行转发服务了,如果我们客户端还没有配上对应的服务,这里应该还是啥也没有。
-
服务化配置
我们肯定不希望每次通过这种方式来启动,想着能linux一启动就能自动启动。所以这里还需要做一些配置,仍然在frp的目录下执行一下命令:mkdir -p /etc/frp cp frps.ini /etc/frp cp frps /usr/bin cp systemd/frps.service /usr/lib/systemd/system/ systemctl enable frps systemctl start frps
客户端搭建
这里所说的客户端就是我们的本地服务器。本地我们是window系统,同样我们将前载到本地的zip文件解压,然后点击进入解压后的文件夹,我们对客户端的配置文件进行修改;
# 客户端配置
[common]
server_addr = 服务器ip
# 与frps.ini的bind_port一致
server_port = 7000
# 与frps.ini的token一致
token = dsfsgefgsfwe
# 配置ssh服务
[ssh]
type = tcp
local_ip = 192.168.0.5
local_port = 22
# 这个自定义,之后再ssh连接的时候要用
remote_port = 6000
# 配置http服务,可用于小程序开发、远程调试等,如果没有可以不写下面的
[web]
type = http
local_ip = 192.168.0.5
local_port = 8080
# web域名
subdomain = test.hijk.pw
自定义的远程服务器端口,例如8080
remote_port = 8080
可以注意到我配置文件中的local_ip写的不是127.0.0.1或者localhost或者192.168.0.1。这是因为我的服务器并不是我的window,而是电脑里的一台虚拟机,虚拟机配置了局域网可访问,ip即是:192.168.0.5。而local_port也不是window的端口,而是虚拟机里的每个服务的端口。所以我们这里不仅可以配置当前主机进行内网穿透,而且可以配置局域网里任意一台主机进行内网穿透。前提是局域网里的这个服务对应的这些端口都是可访问的(防火墙开放了这些端口)。
配置好之后就可以启动客户端了,在cmd中执行:
frpc.exe -c frpc.ini
启动之后,我么你就可以在前面服务端的那个控制台上看到对应的服务了。
服务端防火墙设置
最后我们就可以进行测试了,记住我们访问的是第三方服务器的ip和端口,比如我的阿里云ip是50.0.0.2,然后我要访问本地服务器的ssh服务,这是需要指定的端口则是上麦你的6000,而不是22:
ssh -P 6000 root@50.0.0.2
最后的最后要提一下,云服务器的安全组打开,比如这里我们就要打开6000端口,最终才能调的通。