FRP和Apache实现内网穿透和泛域名网站发布

本文结合 Apache、FRP 实现内网穿透,并在 Apache 端设置代理代码,同时携带 HTTP 消息报头中的域名信息,通过 FRP 转发到穿透后的网站服务器的具体步骤。对于无论是否有固定IP的客户来说,这样的解决方案都非常有用,因为对于动态IP来说,好多情况下,使用的是SDN(Software Define Network),很难做到在路由器端做端口穿透;而即使你有固定IP,到运营商那里做网站备案,也是很麻烦的事情,因为你需要开发80和443端口,这跟在云服务器提供商那里比起来,例如阿里云、腾讯云、百度云、华为云、AWS等,电信运营商的网站备案流程还不成熟。

20250220120328

整体思路

  • 公网服务器部署 FRP 服务端,监听特定端口。
  • 内网服务器部署 FRP 客户端,将内网服务端口映射到公网服务器。
  • Apache 服务器(可以是公网服务器或其他具备公网访问条件的服务器)配置代理,将请求转发到 FRP 服务端端口,并携带原始域名信息。

具体步骤

1. 公网服务器部署 FRP 服务端

  • 下载并解压 FRP
    1
    2
    3
    wget https://github.com/fatedier/frp/releases/download/v0.48.0/frp_0.48.0_linux_amd64.tar.gz
    tar -zxvf frp_0.48.0_linux_amd64.tar.gz
    cd frp_0.48.0_linux_amd64
  • 配置 frps.ini
    1
    2
    3
    4
    5
    6
    [common]
    bind_port = 7000 # FRP 服务端监听的端口,客户端会连接此端口
    dashboard_port = 7500 # 仪表盘端口,可通过浏览器查看 FRP 状态
    dashboard_user = admin # 仪表盘用户名
    dashboard_pwd = admin # 仪表盘密码
    token = your_token # 用于客户端和服务端通信的认证令牌,自定义
  • 启动 FRP 服务端
    1
    ./frps -c frps.ini
    可使用 nohup 让其在后台持续运行:
    1
    nohup ./frps -c frps.ini &

2. 内网服务器部署 FRP 客户端

  • 下载并解压 FRP
    操作同公网服务器。
  • 配置 frpc.ini
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [common]
    server_addr = your_public_ip # 公网服务器的 IP 地址
    server_port = 7000 # 对应公网服务器的 bind_port
    token = your_token # 与服务端的 token 保持一致

    [web]
    type = http
    local_ip = 127.0.0.1 # 内网网站服务器的 IP
    local_port = 80 # 内网网站服务器监听的端口
    custom_domains = your_domain.com # 自定义域名,需要解析到公网服务器 IP
  • 启动 FRP 客户端
    1
    ./frpc -c frpc.ini
    使用 nohup 让其在后台持续运行:
    1
    nohup ./frpc -c frpc.ini &

3. 配置 Apache 代理

  • 启用 Apache 代理模块
    在 Apache 服务器上,执行以下命令启用必要的代理模块:

    1
    sudo a2enmod proxy proxy_http
  • 创建 Apache 虚拟主机配置文件

    1
    sudo nano /etc/apache2/sites-available/your_domain.conf

    在文件中添加以下内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <VirtualHost *:80>
    ServerName your_domain.com # 你的域名

    # 开启代理请求的日志记录
    LogLevel debug proxy:debug

    # 代理配置
    ProxyPreserveHost On # 保留原始请求的 Host 头信息
    ProxyPass / http://your_public_ip:7000/ # 将请求转发到 FRP 服务端端口
    ProxyPassReverse / http://your_public_ip:7000/ # 处理反向代理响应

    # 日志配置
    ErrorLog ${APACHE_LOG_DIR}/your_domain_error.log
    CustomLog ${APACHE_LOG_DIR}/your_domain_access.log combined
    </VirtualHost>

    说明

    • ProxyPreserveHost On:此配置会保留客户端请求中的 Host 头信息,确保该信息能被正确转发到内网服务器。
    • ProxyPassProxyPassReverse:将所有请求转发到 FRP 服务端监听的端口。
  • 启用虚拟主机配置

    1
    sudo a2ensite your_domain.conf
  • 重新加载 Apache 配置

    1
    sudo systemctl reload apache2

4. 域名解析

将域名 your_domain.com 解析到 Apache 服务器的公网 IP 地址。可在域名解析服务提供商的管理界面添加一条 A 记录,将域名指向 Apache 服务器的 IP。

测试访问

在浏览器中输入配置的域名 your_domain.com,如果所有配置无误,请求会经过 Apache 代理,携带原始域名信息通过 FRP 转发到内网的网站服务器,你应该能够看到内网网站的内容。

注意事项

  • 端口冲突:确保公网服务器和 Apache 服务器上的端口未被其他服务占用。
  • 安全设置:可考虑为 Apache 配置 SSL/TLS 加密,保障数据传输安全。同时,合理设置防火墙规则,仅开放必要的端口。

FRP和Apache实现内网穿透和泛域名网站发布
https://jycpp.github.io/24-04-23-FRP和Apache实现内网穿透和泛域名网站发布.html
作者
Jet Yan
发布于
2024年4月23日
许可协议