【小技巧解决大问题】使用 frp 突破阿里云主机无弹性公网 IP 不能用作 Web 服务器的限制


声明:本文转载自https://my.oschina.net/ios122/blog/1576400,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

背景

order.png

今年 8 月份左右,打折价买了一个阿里云主机,比平常便宜了 2000 多块。买了之后,本想作为一个博客网站的,毕竟国内的服务器访问肯定快一些。满心欢喜的下单之后,却发现 http 服务,外网怎么也无法访问。各种搜,最终在文档中,终于看见:必须要买弹性公网 IP,并且绑定到阿里云主机上,才可以用作web服务器。而且要求,阿里云主机必须是未绑定过 IP 的。不过很不幸,我当时下单时,已经勾选了使用公网IP。本来想着解绑然后重新绑定下,应该就可以了。然而,已经绑定过公网IP的,是不允许再改绑弹性公网IP的。欲哭无泪,这个服务器,也就闲置了几个月。

config.png

最近接触了些内网穿透的知识,我突然想到,是不是借助内网穿透,也可以把我的阿里云主机给暴露出来?毕竟内网穿透,使用的是 Linux 一些基础知识,算不上很极客的技术,应该是具有通用性的。经验证,竟然真的可行! 特记录下来,献给有同样遭遇的有缘人。

使用 revel 搭建一个简单的 Web 服务器

需要先搭建一个 Web 服务器,以供测试用。如果你选择其他方式搭建 web 服务器,可直接跳过这一节。

下载最新版本 go

可以在 Go 下载页,查看最新的稳定版本,来替换 go1.9.2.linux-amd64.tar.gz :

wget https://redirector.gvt1.com/edgedl/go/go1.9.2.linux-amd64.tar.gz  tar -C /usr/local -xzf go1.9.2.linux-amd64.tar.gz 

如果已经安装过 Go,可能需要先移除:

apt remove golang-go 

在 ~/.profile 中,添加:

export PATH=$PATH:/usr/local/go/bin 

在 ~/.bash_profile 中,添加:

export GOPATH=$HOME/go 

$HOME/go 表示你想用作 $GOPATH 的文件夹。

设置完后,最好重启下 shell 终端,以使信息生效。

直接从 github 下载 golang.org/x/sys 和 golang.org/x/net 源码

golang.org下的包,直接安装,在无法科学上网时,有极大概率会失败。作为一种替代手段,我们可以直接从 github 下载对应的源码到 $GOPATH 对应路径。

# 创建包存储路径 mkdir $GOPATH/src/golang.org/x  #安装git apt install git  #下载 revel 依赖的包源码。 git clone https://github.com/golang/net $GOPATH/src/golang.org/x/net git clone https://github.com/golang/sys $GOPATH/src/golang.org/x/sys  # 安装 revel go get -u github.com/revel/cmd/revel  # revel 命令,需要在 $GOPATH 中执行 cd $GOPATH/src  # 创建并运行一个web应用 revel new hello-go-web revel run hello-go-web 

web.png

frp 配置

有关 frp 配置的细节,请参考 借助 frp 随时随地访问自己的树莓派。此处只贴出关键配置文件。

在公网能访问的服务器上配置 frps 服务器端

[common] bind_port = 7000 vhost_http_port =80 dashboard_port = dashboard_port_number dashboard_user = dashboard_user_name dashboard_pwd = dashboard_pwd_value privilege_token = privilege_token_value subdomain_host = example.com 

注意: example.com 要换为自己的域名。

域名泛解析

dns.png

将泛域名 *.example.com 解析到 frps 所在服务器的 IP 地址。这样,你不需要频繁修改 DNS 配置了。此处我们是打算把某个子域名解析到我们的阿里云主机上。如果你想直接把根域名解析到服务器上,参考:通过自定义域名访问部署于内网的 web 服务

在只能内网访问的阿里云主机上配置 fprc 客户端

[common] server_addr = your_server_IP server_port = 7000 privilege_token = privilege_token_value login_fail_exit = false  [ssh-aliyun] type = tcp local_IP = 127.0.0.1 local_port = 22 remote_port = remote_port_number use_encryption = true use_compression = true  [web-show] type = http local_port = 9000 subdomain = show 

注意:9000 表示web服务器的本地端口,请根据需要替换;show,表示子域名,配置成功后,可以通过 show.example.com 访问自己的 web 网页了。

使用 Systemd 实现自动启动 revel

使用 Systemd 实现自动启动 frp,可以直接看 借助 frp 随时随地访问自己的树莓派 相关部分,不再赘述。此处着重说下 revel 自启动的配置:

 # 编写 frp service 文件,以 centos7 为例,适用于 debian mkdir /usr/lib/systemd/system/ vim /usr/lib/systemd/system/revel-hello-go-web.service  # 内容如下  变更内容: [Unit] DescrIPtion=/revel-hello-go-web After=network.target  [Service] Environment=PATH=$PATH:/usr/local/go/bin Environment=GOPATH=/root/go TimeoutStartSec=30 ExecStart=/root/go/bin/revel run hello-go-web ExecStop=/bin/kill $MAINPID Restart=on-failure RestartSec=42s  [Install] WantedBy=multi-user.target  # 启动 revel-hello-go-web 并设置开机启动 systemctl enable revel-hello-go-web systemctl start revel-hello-go-web systemctl status revel-hello-go-web  # 部分服务器上,可能需要加 .service 后缀来操作,即: systemctl enable revel-hello-go-web.service systemctl start revel-hello-go-web.service systemctl status revel-hello-go-web.service  # 重新加载:  systemctl daemon-reload 

注意:

  • /root/go 要替换为自己电脑 $GOPATH 的真实路径。
  • 此处的 sytemd 的配置中, Environment 环境变量,必须设置,否则报错

参考文章

本文发表于2017年11月21日 10:33
(c)注:本文转载自https://my.oschina.net/ios122/blog/1576400,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 2293 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1