需要:

  • 一台云服务器(或者你的设备有公网ip地址)

  • 一台本地的机器(我用的是oect)

  • 一个域名

本地机器

frpc

首先,我的oect刷的是Debian13(其他的也刷过,armbian jammy也蛮好用的但是因为我的usb-WIFI驱动好像在其他的地方无法使用最后只能作罢),装好系统后

sudo apt update 
sudo apt upgrade

接上互联网(我想用无线互联网所以我先要装下驱动

sudo dpkg -i ../UX9H\(免驱版\)\ V1.1\ Linux系统驱动程序20250319/aic8800d80fdrvpackage.deb
sudo apt install -y usb-modeswitch

下载根据系统架构frp

Releases · fatedier/frp

注意,现在网上很多教程都是ini格式的配置文件,新版换了toml没有办法使用,我的文件如下,可以作为参考

# 服务端地址与端口
serverAddr = "××××××"
serverPort = ××××××

# 认证方式与token(与frps.toml保持一致)
auth.method = "token"
auth.token = "×××××××"

# 开启 TLS(有服务需要)
transport.tls.enable = true

# SSH 映射
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = ××××  # 公网访问端口,按需修改

# 1Panel 映射
[[proxies]]
name = "1panel"
type = "tcp"
localIP = "127.0.0.1"
localPort = ×××××××
remotePort = ××××××  # 公网访问端口,可自定义

# code-server
[[proxies]]
name = "code-server"
type = "http"
localIP = "127.0.0.1"
localPort = ×××××××
customDomains = ["×××××××"]

最后启动frpc(服务器要先部署frps

sudo ./frpc -c frpc.toml

最后最好配一个自启动(方便一开机就不用知道ip地址直接ssh)

这个改下frpc的地址就可以啦,好用

sudo tee /etc/systemd/system/frpc.service >/dev/null <<'EOF'
[Unit]
Description=Frp Client
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=root
WorkingDirectory=/root/frp
ExecStart=/root/frp/frpc -c /root/frp/frpc.toml
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now frpc
sudo systemctl status frpc

之后你可以试试

ssh -p <你的ssh端口号> <用户名>@<公网ip>

链接ssh

之后你就可以用1panel等管理你的服务器

frpc进阶配置

对于一些特殊的应用,可能必须走http甚至https,为了方便还是在云服务器端放个反向代理(如nginx之类的)

例如http的code-server(docker)

配置如图

# code-server
[[proxies]]
name = "code-server"
type = "http"
localIP = "127.0.0.1"
localPort = ×××××××
customDomains = ["×××××××"]

服务器端也得特殊设置

云服务器

frps

因为刚刚说了要启动http甚至https(不过本人比较懒除了重要的网站配了ssl其他懒得配,显示不安全就不安全吧哈哈哈)

具体的frps的配置如下

bindPort = **** #与frpc的serverPort一致
vhostHTTPPort = ××××      # 有http需求,且这个安装了nginx之后不要用标准的80口了,换一个
vhostHTTPSPort = ××××    # https需求
webServer.port = ××××  # 如不需要,可注释掉
auth.token = "***"

nginx

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占用内存小并发能力强,在我现在的浅显的理解,他能监听80端口是由哪个特定网址或对应的唯一性标识,从而唯一重定向到对应端口下,这样我们就可以通过访问域名而访问我们的服务。而且有些特定服务就必须使用http协议,不能通过访问端口得到服务(浏览器一般只用80端口访问?(我了解还不是很深))

首先是一般的服务(这里用我云服务器运行的Halo)

nginx配置比较简单:

# ===== 80 统一跳转 =====
server {
    listen 80;
    server_name ********;
    return 301 https://$host$request_uri;
}

# ===== 443 统一反代 =====
server {
    listen 443 ssl http2;
    server_name *******;

    # 证书
    ssl_certificate      /etc/nginx/ssl/cert.pem;
    ssl_certificate_key  /etc/nginx/ssl/cert.key;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers off;

    # 反代到 Docker 里的 Halo
    location / {
        proxy_pass http://127.0.0.1:*******;
        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 X-Forwarded-Proto $scheme;
    }
}

其次,是用frpc转的服务:

server {
    listen 80;
    server_name *******;

    location / {
        proxy_pass http://127.0.0.1:8011;
        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 X-Forwarded-Proto $scheme;
    }
}

只需端口号这里是(8011)与frpc中的remotePort一致即可

最后是特殊的frpc中转的需要http或https的服务:

[root@******* conf.d]# cat frpc-http.conf 
server {
    listen 80;
    server_name *** *** *** ****;
    
    client_max_body_size 200m;   # 200 MiB 够用

    location / {
        proxy_pass http://127.0.0.1:××;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $http_connection;
        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 X-Forwarded-Proto $scheme;
    }
}

通过命名你会发现这个没有针对特定服务,而是以http为文件名,是因为frp其实充当了nginx的作用形成了

域名->frp的http端口->本地服务器上的http转发端口->对应服务。

本地服务器怎么知道我是想要哪个服务呢,答案是在frpc中的配置customDomains = ["×××××××"] 中这个与nigix配置接可以实现这个神奇的效果,当然我不知道还有什么更好的办法,哈哈哈

最后就先写到这里吧。