【小技巧解决大问题】使用 frp 突破阿里云主机无弹性公网 IP 不能用作 Web 服务器的限制
背景
今年 8 月份左右,打折价买了一个阿里云主机,比平常便宜了 2000 多块。买了之后,本想作为一个博客网站的,毕竟国内的服务器访问肯定快一些。满心欢喜的下单之后,却发现 http 服务,外网怎么也无法访问。各种搜,最终在文档中,终于看见:必须要买弹性公网 IP,并且绑定到阿里云主机上,才可以用作web服务器。而且要求,阿里云主机必须是未绑定过 IP 的。不过很不幸,我当时下单时,已经勾选了使用公网IP。本来想着解绑然后重新绑定下,应该就可以了。然而,已经绑定过公网IP的,是不允许再改绑弹性公网IP的。欲哭无泪,这个服务器,也就闲置了几个月。
最近接触了些内网穿透的知识,我突然想到,是不是借助内网穿透,也可以把我的阿里云主机给暴露出来?毕竟内网穿透,使用的是 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
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 要换为自己的域名。
域名泛解析
将泛域名 *.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 环境变量,必须设置,否则报错
参考文章
- 借助 frp 随时随地访问自己的树莓派
- frp 中文文档
- proxy name [ssh] is already in use错误
- A high productivity, full-stack web framework for the Go language.
- 在centos7上使用systemd启动supervisor
- Using environment variables in systemd units
【小技巧解决大问题】使用 frp 突破阿里云主机无弹性公网 IP 不能用作 Web 服务器的限制的更多相关文章
- 阿里云专有网络与弹性公网IP
阿里云服务器经典网络和专有网络究竟有什么区别? 在用户提交订单购买阿里云ECS云服务器时,会面临怎样选择网络类型的烦恼,阿里云服务器定制购买时,网络类型里的经典网络和专有网络(VPC)是什么含义,该怎 ...
- 在阿里云主机上基于CentOS用vsftpd搭建FTP服务器
最近需要在一台阿里云的云服务器上搭建FTP服务器,在这篇博文中分享一下我们根据实际需求进行的一些配置. ftp软件用的是vsftpd. vsftpd是一款在Linux发行版中最受推崇的FTP服务器程序 ...
- VisualVM监控远程阿里云主机
一.前言 使用VisualVM监控远程主机,主要是要在远程主机上部署JMX服务和jstat服务,jstat服务的部署花了我半天的时间,而且,网上的资基本都是缺胳膊少腿的,没有一篇是一个整体(行得通的) ...
- 傻瓜式教学--win10 + frp + rdpwrap + 阿里云服务器 --实现win10 多用户同时远程登录内网机
概述: 使用win10 专业版 + frp + RDPwrap + 阿里云服务器 的组合实现win10 多用户同时远程登录内网机.使用frp 做内网穿透,将内网机的指定端口暴露在外网,通过ip+por ...
- 阿里云主机Nginx下配置NodeJS、Express和Forever
https://cnodejs.org/topic/5059ce39fd37ea6b2f07e1a3 AngularJS中文社区即运行在阿里云主机上,本站使用Nginx引擎,为了AngularJS,我 ...
- 花1台的钱入手2台【最能抗DDoS】阿里云主机【攻略】
花1台的钱入手2台[最能抗DDoS]阿里云主机[攻略]: 第一步:先申请0元半年 http://click.aliyun.com/m/335/:注:0元机器只有新帐号可申请第二步:再买6折37/月 h ...
- 阿里云主机CentOS7设置远程连接MySQL数据库
有一个困扰了我好久的问题,今天终于解决了. 看网上的答案只有一部分.今天把完整的发篇博客纪念一下下. 首先,连接阿里云主机并登录数据库, 1.添加一个Host mysql>select User ...
- 阿里云Open API自动化脚本—ECS公网IP转化弹性公网IP
1.OpenAPI Explorer 记录一下使用阿里云 Open API 自动化/脚本化 “ECS 公网 IP 转化弹性公网 IP”的实现 全过程.原博客地址:https://www.markedi ...
- [linux]阿里云主机的免登陆安全SSH配置与思考
公司服务器使用的第三方云端服务,即阿里云,而本地需要经常去登录到服务器做相应的配置工作,鉴于此,每次登录都要使用密码是比较烦躁的,本着极速思想,我们需要配置我们的免登陆. 一 理论概述 SSH介绍 S ...
随机推荐
- ASP.NET没有魔法——ASP.NET MVC是如何运行的?它的生命周期是什么?
前面的文章我们使用ASP.NET MVC创建了个博客应用,那么它是如何工作的呢?我们都知道ASP.NET的程序需要部署到IIS上才能够通过浏览器来访问,那么IIS与ASP.NET MVC程序之间又是如 ...
- [js高手之路]html5 canvas动画教程 - 自己动手做一个类似windows的画图软件
这个绘图工具,我还没有做完,不过已经实现了总架构,以及常见的简易图形绘制功能: 1,可以绘制直线,圆,矩形,正多边形[已完成] 2,填充颜色和描边颜色的选择[已完成] 3,描边和填充功能的选择[已完成 ...
- spring boot / cloud (十九) 并发消费消息,如何保证入库的数据是最新的?
spring boot / cloud (十九) 并发消费消息,如何保证入库的数据是最新的? 消息中间件在解决异步处理,模块间解耦和,和高流量场景的削峰,等情况下有着很广泛的应用 . 本文将跟大家一起 ...
- 反射型 DDoS 攻击的原理和防范措施
随着僵尸网络的兴起,同时由于攻击方法简单.影响较大.难以追查等特点,分布式拒绝服务攻击(DDoS,Distributed Denial of Service)得到快速壮大和日益泛滥. 成千上万主机组成 ...
- win10 uwp 如何让WebView标识win10手机
本文主要:如何让WebView访问的网页设别为手机,当然这句话我说不好,换个,如何让WebView设别为手机.上面两句话都是错的,因为是服务器识别,不是网页,第二句话应该是让服务器而不是WebView ...
- Ubuntu配置OpenStack 一:主机环境配置以及问题总结
本文包含openstack配置的实验环境的基本步骤.在下面的步骤中将逐步讲解如何操作. 1.准备三台虚拟机 主机名字分别命名为controller.network.computer[desktop版或 ...
- (4.1)Spring MVC执行原理和基于Java的配置过程
一.Spring MVC执行原理和基于Java配置的配置过程 (一)Spring MVC执行过程,大致为7步. 所有的请求都会经过Spring的一个单例的DispacherServlet. Dispa ...
- Ajax中与服务器的通信【发送请求与处理响应】
一.发送请求 Ajax中通过XMLHttpRequest对象发送异步方式的后台请求时.通常有两种方式的请求,一种是GET请求,另一种是POST请求.发送请求一般要经过4个步骤分别是: (1)初始化XM ...
- go 代码的调试---打印调用堆栈
本文介绍如何打印调用堆栈进行go代码的调试. 打印堆栈使用的runtime package中的Stack()函数 func Stack(buf []byte, all bool) int Stack ...
- 本表触发更新modifytime,跨表更新modifytime 触发器
一.每行有改动,则触发更新modifytime SQL> create table test(id int, name varchar(10), crdate date, udate date) ...