frp 与免费 SSL证书实现内网穿透并支持 HTTPS 访问

2019年11月2日


准备工作

  1. 一个域名(以下以阿里云为例)
  2. 一台有公网IP的服务器
  3. 一台可以上网的PC
  4. 下载 frp 软件(服务器和局域网 PC 分别下载与操作系统相对应的版本)

域名解析

阿里云控制台》域名》域名列表》解析》域名解析,添加记录:

主机记录 记录类型 解析线路 记录值 TTL
@ A 默认 5.5.5.5(填写服务器实际IP) 默认
www CNAME 默认 sample.cn(填写实际域名) 默认

上面两条记录实现 sample.cnwww.sample.cn 指向同样的内容页面。

申请免费 SSL 证书

阿里云控制台》域名》域名列表》管理》基本信息》免费开启 SSL 证书,申请证书:

  1. 选择Symantec证书,然后申请
  2. 选择免费型 DV SSL,然后立即购买
  3. 证书列表页面,选择申请,填写域名等必要信息,一般几分钟内就可以看到证书申请成功了
  4. 下载证书到局域网 PC ,选择Nginx类型证书,解压缩后放入PC 端frp程序目录

配置 frp

frps.ini frp 公网服务器端配置文件 frpc.ini frp 局域网 PC 端配置文件

下载 frp

wget https://github.com/fatedier/frp/releases/download/v0.29.0/frp_0.29.0_linux_amd64.tar.gz

frps.ini

# frps.ini
[common]
bind_port = 5001
# 设置转发端口
vhost_http_port = 80
vhost_https_port = 443

服务器端启动 frps:

  • linux 操作系统下:
./frps -c ./frps.ini
  • Windows 操作系统下
frps -c frps.ini

frpc.ini

# frpc.ini
[common]
# 填写服务器实际IP
server_addr = 5.5.5.5
server_port = 5001

[[email protected]]
type = http
local_port = 80
# 填写实际域名
custom_domains = sample.cn

[http-www.sample.cn]
type = http
local_port = 80
# 填写实际域名
custom_domains = www.sample.cn

[[email protected]]
type = https
# 填写实际域名
custom_domains = sample.cn
plugin = https2http
plugin_local_addr = 127.0.0.1:80

# HTTPS 证书相关的配置
plugin_crt_path = ./sample.cn.pem
plugin_key_path = ./sample.cn.key
plugin_host_header_rewrite = 127.0.0.1
plugin_header_X-From-Where = frp

[https-www.sample.cn]
type = https
# 填写实际域名
custom_domains = www.sample.cn
plugin = https2http
plugin_local_addr = 127.0.0.1:80

# HTTPS 证书相关的配置
plugin_crt_path = ./sample.cn.pem
plugin_key_path = ./sample.cn.key
plugin_host_header_rewrite = 127.0.0.1
plugin_header_X-From-Where = frp

局域网 PC 端启动 frpc:

  • linux 操作系统下:
./frpc -c ./frpc.ini
  • Windows 操作系统下
frpc -c frpc.ini

自定义 404 页面

/frp/frps.ini文件增加配置:

# frps.ini
[common]
custom_404_page = ./404.html

/frp/404.html文件内容定制:

<!DOCTYPE html>
<html>
<head>
<title>Not Found</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>The page you visit not found.</h1>
<p>Sorry, the page you are looking for is currently unavailable.<br/>
Please try again later.</p>
<p>The server is powered by <a href="https://github.com/fatedier/frp">frp</a>.</p>
<p><em>Faithfully yours, frp.</em></p>
</body>
</html>

验证效果

正常情况下,下面几种方式均可访问:

frp 设置为系统服务

ubuntu 系统中基于 systemd 把程序设置为服务,每次系统重启后自动加载。

server systemd ubuntu 配置

在具备公网IP的服务器中,新建文件:/etc/systemd/system/frp-server.service

vi /etc/systemd/system/frp-server.service
or
sudo gedit /etc/systemd/system/frp-server.service

内容如下:

[Unit]
Description=frp-server daemon
Wants=NetworkManager-wait-online.service network-online.target
After=NetworkManager-wait-online.service network.target network-online.target
#After=network.target
[Service]
Type=simple
#User=root
Restart=on-failure
RestartSec=5s
WorkingDirectory=/root/frp
ExecStart=/root/frp/frps -c /root/frp/frps.ini
[Install]
WantedBy=multi-user.target

然后:

sudo systemctl daemon-reload
sudo systemctl enable frpc.service
sudo systemctl disable frpc.service
sudo systemctl start frpc.service
sudo systemctl stop frpc.service
sudo systemctl restart frpc.service
sudo systemctl status frpc.service

client systemd ubuntu 配置

在局域网PC端,新建文件:/etc/systemd/system/frp-client.service

vi /etc/systemd/system/frpc.service
or
sudo gedit /etc/systemd/system/frpc.service

内容如下:

[Unit]
Description=frp-client daemon
Wants=NetworkManager-wait-online.service network-online.target
After=NetworkManager-wait-online.service network.target network-online.target
#After=network.target
[Service]
Type=simple
#User=root
Restart=on-failure
RestartSec=5s
WorkingDirectory=/home/username/frp
ExecStart=/home/username/frp/frpc -c /home/username/frp/frpc.ini
ExecReload=/home/username/frp/frpc reload -c /home/username/frp/frpc.ini
[Install]
WantedBy=multi-user.target

备忘

Linux 解压缩 tar.gz 文件

tar.gz 使用tar命令进行解压

tar -zxvf java.tar.gz

解压到指定的文件夹

tar -zxvf java.tar.gz  -C /usr/java

Linux 重命名文件夹

linux下mv命令既可以重命名,又可以移动文件或文件夹.

例子:将目录a重命名为b

mv a b
慢读 慢生活

Slow Rhythm of Life.