Skip to content
hev edited this page Apr 13, 2024 · 3 revisions

使用NATMap在NAT-1私网IP宽带上部署FRP服务

通常FRPS需要部署在具有公网IP的主机上向FRPC提供中转服务,通过NATMap在运营商的NAT-1上打洞,分配私网IPv4的宽带也能部署FRPS服务,并能像具有公网IP一样在其它外部主机上轻松访问。

拓扑结构

                   FRPS                NATMap(on gateway)                FRPC

Internal:    (192.168.0.2:7000) <----> (100.65.11.55:7000)
                                               ^
                                               |
                                               v
External:                              (112.24.0.23:6348) <------------>
  • FRPS: FRP服务端运行在内网主机,侦听在192.168.0.2:7000端口。
  • NATMap: NATMap运行在网关,侦听在100.65.11.55:7000端口,打洞使公网地址112.24.0.23:6348映射至100.65.11.55:7000,同时又将100.65.11.55:7000映射至192.168.0.2:7000。从外部访问112.24.0.23:6348等同于访问192.168.0.2:7000。
  • FRPC: FRPC运行在外部主机上,通过NATMap打洞获得的公网地址112.24.0.23:6348访问FRP服务。

域名访问

在具有动态公网IPv4的宽带上部署FRP服务,只有公网IPv4因为重新拨号是在动态变化的,而端口则是固定的。利用动态DNS则可以通过固定的域名作为入口实时解析到动态变化的IP,进而访问到服务。

在NAT-1私网IPv4的宽带上,情况稍微有些不同,不仅打洞后获得的运营商侧公网IPv4是动态变化的,端口同样也是动态变化的。为了同样能够使用固定的域名入口访问服务,推荐一种称为IP4P的方法,该方法利用DNS的AAAA类型记录,将公网IPv4地址和端口同时记录在域名解析记录中。FRPC客户端识别到IP4P类型的域名解析结果后,则能获得实时的公网IPv4地址和端口。IP4P的方法要求客户端增加支持,FRP目前已有支持IP4P的衍生项目。

安装部署

FRPS

安装官方的FRPS即可,没有额外的要求。

$ frps
2022/12/26 17:00:00 [I] [root.go:208] frps uses command line arguments for config
2022/12/26 17:00:01 [I] [service.go:200] frps tcp listen on 0.0.0.0:7000
2022/12/26 17:00:01 [I] [root.go:215] frps started successfully

NATMap

安装

DDNS
Cloudflare

创建文件/usr/bin/ddns写入如下内容,并补充必要的变量值:

#!/bin/sh

ZONE=''
RECORD=''
EMAIL=''
AUTH=''
DOMAIN=''

IP4P=${3}

while true; do
    curl -X PUT "https://api.cloudflare.com/client/v4/zones/${ZONE}/dns_records/${RECORD}" \
        -H "X-Auth-Email: ${EMAIL}" \
        -H "Authorization: Bearer ${AUTH}" \
        -H "Content-Type:application/json" \
        --data "{\"type\":\"AAAA\",\"name\":\"${DOMAIN}\",\"content\":\"${IP4P}\",\"ttl\":60,\"proxied\":false}" > /dev/null 2> /dev/null
    if [ $? -eq 0 ]; then
        break
    fi
done

再增加可执行权限:

chmod +x /usr/bin/ddns
OpenWrt 22.03 or later

从软件仓库安装natmap和luci-app-natmap软件包。

或命令行

opkg install natmap luci-app-natmap
其它系统

从项目发布页下载匹配的版本: https://github.com/heiher/natmap/releases

运行

OpenWrt 22.03 or later
1. 登录OpenWrt管理页面,进入「服务」->「NATMap」页面:

2. 点击「Add」按钮,输入如下配置:
  • Protocol: TCP
  • Interface: wan
  • STUN server: turn.cloudflare.com
  • HTTP server: qq.com
  • Bind port: 7000
  • Forward mode: ☑
  • Forward target: 192.168.0.2
  • Forward target port: 7000
  • Notify script: /usr/bin/ddns

3. 保存后NATMap会显示出打洞后的外部公网IPv4地址和端口记录:

4. 防火墙放行TCP协议目的端口7000的入站:

其它系统

将如下内容写入 /etc/rc.local 开机自动启动,或创建其它服务管理配置:

natmap -d -i pppoe-wan -s turn.cloudflare.com -h qq.com -b 7000 -t 192.168.0.2 -p 7000 -e /usr/bin/ddns

防火墙放行TCP协议目的端口7000的入站。

访问测试

域名解析结果

比如域名为: frp.hev.cc

nslookup frp.hev.cc

当配置正确且运行正常时,应当能够解析类似如下结果:

Server:		192.168.0.1
Address:	192.168.0.1#53

Non-authoritative answer:
Name:	frp.hev.cc
Address: 2001::18cc:7018:0017

FRP客户端访问

支持IP4P客户端

从衍生项目发布页下载匹配的版本: https://github.com/heiher/frp/releases

使用域名访问

$ frpc tcp -s frp.hev.cc:0 -l 6000
2022/12/26 17:01:01 [I] [service.go:298] [6b7a9148614c79f7] login to server success, get run id [6b7a9148614c79f7], server udp port [0]
2022/12/26 17:01:01 [I] [proxy_manager.go:142] [6b7a9148614c79f7] proxy added: []
2022/12/26 17:01:01 [I] [control.go:172] [6b7a9148614c79f7] [] start proxy success