Sử dụng FRP để public localhost hỗ trợ SSL

Có khá nhiều feature, tốt hơn ngrok, localtunnel, nhưng ở đây chỉ bắt đầu với việc sử dụng frp để expose localhost dưới một subdomain bất kỳ, có SSL.

Cài đặt bao gồm 3 phần:

  1. Cài đặt domain
  2. Cài đặt frps trên server
  3. Cài đặt frpc trên máy local

Cài đặt domain

Tạo 2 record như sau, với value là IP của server mà bạn muốn dùng để cài đặt frp:

  1. frp.duocnguyen.dev.
  2. *.frp.duocnguyen.dev.

Cài đặt FRP server

Download file từ Github

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

Giải nén nó:

tar -zxvf frp_0.42.0_linux_amd64.tar.gz

Di chuyển vào thứ mục vừa giải nén:

cd frp_0.42.0_linux_amd64

Chép file frps vào thư mục bin:

cp frps /usr/bin

Chép file service:

cp systemd/frpc.service /etc/systemd/system/.
chmod 754 /etc/systemd/system/frps.service

Chép file config:

mkdir /etc/frp
cp frps.ini /etc/frp/.

Config file /etc/frp/frps.ini

[common]
bind_port = 7000
kcp_bind_port = 7000
vhost_http_port = 8090
token = 2J6R3xfPBeHyKX
tcp_mux = true
subdomain_host = frp.duocnguyen.dev
dashboard_port = 7500

dashboard_user = admin
dashboard_pwd = ipIf08D3a42

Enable service:

systemctl enable frps.service

Chạy service

systemctl start frps.service

Cài nginx

sudo apt update
sudo apt install nginx

Tạo config:

touch /etc/nginx/sites-available/frp.duocnguyen.dev.conf

Link nó qua bên enabled:

sudo ln -s /etc/nginx/sites-available/frp.duocnguyen.dev.conf /etc/nginx/sites-enabled/

Config file:

server {
    server_name *.frp.duocnguyen.dev;
    listen 80;
    location / {
        proxy_pass http://127.0.0.1:8090;
        proxy_set_header    Host            $host;
        proxy_set_header    X-Real-IP       $remote_addr;
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/frp.duocnguyen.dev/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/frp.duocnguyen.dev/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}
server {
    if ($host = .frp.duocnguyen.dev) {
        return 301 https://$host$request_uri;
    }
    listen 80;
    return 404;
}

Cài đặt certbot

Certbot là một công cụ nguồn mở và miễn phí được phát triển bởi Electronic Frontier Foundation (EFF) để tự động hóa việc lấy và gia hạn chứng chỉ SSL/TLS.

sudo apt install python3 python3-venv libaugeas0
sudo python3 -m venv /opt/certbot/
sudo /opt/certbot/bin/pip install --upgrade pip
sudo /opt/certbot/bin/pip install certbot certbot-nginx
sudo ln -s /opt/certbot/bin/certbot /usr/bin/certbot

Explanation

The first step is to install the necessary Python and system dependencies. This is achieved by running the command sudo apt install python3 python3-venv libaugeas0. Here, sudo grants administrator permissions, apt install is the package management command, and python3, python3-venv, and libaugeas0 are the packages to be installed.

Next, we create a Python virtual environment in the directory /opt/certbot/ using the command sudo python3 -m venv /opt/certbot/. This isolates our Certbot installation and its dependencies from the rest of the system.

Once the virtual environment is set up, we need to install and upgrade the Python package installer pip to the latest version. We do this by invoking pip directly from the virtual environment using the command sudo /opt/certbot/bin/pip install --upgrade pip.

With our virtual environment and pip set up, we can now install Certbot and its Nginx plugin. This is done by running sudo /opt/certbot/bin/pip install certbot certbot-nginx.

Finally, we create a symbolic link to the Certbot executable in the /usr/bin directory. This allows us to run the certbot command from any location within the terminal. This is achieved by running sudo ln -s /opt/certbot/bin/certbot /usr/bin/certbot.

Config cert bot và nginx

sudo certbot -d *.frp.duocnguyen.dev -d frp.duocnguyen.dev --manual --preferred-challenges dns-01 certonly

Cài đặt DNS theo như hướng dẫn là được.

Cài đặt client

Cài đặt client:

brew install frp

Hoặc tải tại trang Releases · fatedier/frp · GitHub

Config client:

[common]
server_addr = 128.199.148.122
server_port = 7000
protocol = kcp
token = 2J6R3xfPBeHyKX
admin_addr = 127.0.0.1
admin_port = 7400
admin_user = admin
admin_pwd = admin

[fireass]
type = http
local_port = 8080
subdomain = fireass
use_compression = true

Run client:

frpc -c ./frpc.ini

Sử dụng

Chạy server của mình:

go run ./cmd/server/...

Chạy frp:

frpc -c ./frpc.ini

Truy cập vào trang:

https://fireass.frp.duocnguyen.dev/ping