{"id":15141628,"url":"https://github.com/kkkgo/paopaogateway","last_synced_at":"2026-02-20T08:04:03.140Z","repository":{"id":168249419,"uuid":"643916420","full_name":"kkkgo/PaoPaoGateWay","owner":"kkkgo","description":"PaoPao GateWay是一个体积小巧、稳定强大的FakeIP网关","archived":false,"fork":false,"pushed_at":"2024-09-15T18:10:37.000Z","size":1827,"stargazers_count":454,"open_issues_count":4,"forks_count":35,"subscribers_count":5,"default_branch":"main","last_synced_at":"2025-04-09T06:09:47.108Z","etag":null,"topics":["clash","fakeip","gateway","openwrt","paopao","paopaodns","paopaogateway"],"latest_commit_sha":null,"homepage":"https://blog.03k.org/post/paopaogateway.html","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kkkgo.png","metadata":{"files":{"readme":"ReadMe.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-05-22T12:26:09.000Z","updated_at":"2025-04-05T11:51:08.000Z","dependencies_parsed_at":"2023-12-29T05:30:46.278Z","dependency_job_id":"47e1b0e7-2b9b-486f-bf5b-2f87f1628fcd","html_url":"https://github.com/kkkgo/PaoPaoGateWay","commit_stats":null,"previous_names":["kkkgo/paopaogateway"],"tags_count":30,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kkkgo%2FPaoPaoGateWay","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kkkgo%2FPaoPaoGateWay/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kkkgo%2FPaoPaoGateWay/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kkkgo%2FPaoPaoGateWay/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kkkgo","download_url":"https://codeload.github.com/kkkgo/PaoPaoGateWay/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247987285,"owners_count":21028895,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["clash","fakeip","gateway","openwrt","paopao","paopaodns","paopaogateway"],"created_at":"2024-09-26T09:01:13.939Z","updated_at":"2026-02-20T08:04:03.131Z","avatar_url":"https://github.com/kkkgo.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"## PaoPao GateWay\n\u003cimg src=\"https://raw.githubusercontent.com/kkkgo/PaoPaoGateWay/main/paopaogateway.png\" width=\"200\"\u003e\n\n\nPaoPao GateWay是一个体积小巧、稳定强大的FakeIP网关，核心由clash/mihomo驱动，支持`Full Cone NAT` ，支持多种方式下发配置，支持多种出站方式，包括自定义socks5、自定义openvpn、自定义yaml节点、订阅模式和自由出站，支持节点测速自动选择、节点排除等功能，并附带web面板可供查看日志连接信息等。PaoPao GateWay可以和其他DNS服务器一起结合使用，比如配合[PaoPaoDNS](https://github.com/kkkgo/PaoPaoDNS)的`CUSTOM_FORWARD`功能就可以完成简单精巧的分流。   \n\n你可以从Github Release下载到最新的镜像：[https://github.com/kkkgo/PaoPaoGateWay/releases](https://github.com/kkkgo/PaoPaoGateWay/releases)   \n##### 如果对你有帮助，欢迎点`Star`，如果需要关注更新，可以点`Watch`。\n## [→详细说明《FakeIP网关的工作原理》](https://blog.03k.org/post/paopaogateway.html)\n\n### 运行要求和配置下发\n类型|要求\n-|-\n虚拟机CPU|x86-64，推荐3核心或更多\n内存|最低512MB，推荐1024MB或更多\n硬盘|不需要\n网卡|1\n光驱|1  \n\n*注意：如果节点数量很多或者连接数很多或者你的配置文件比较复杂的话，建议适当增加内存和CPU核心数*\n  \n#### 方式一：使用docker内嵌配置\n你可以使用Docker一键定制ISO镜像，其中包括为ISO**配置静态IP**、替换Clash/mihomo核心、替换Country.mmdb、内嵌ppgw.ini等功能，**详情见使用Docker定制ISO镜像一节**。   \n\n#### 方式二：使用DHCP下发配置\nPaoPao GateWay是一个iso镜像，为虚拟机运行优化设计，你只需要添加一个网络接口和一个虚拟光驱塞iso即可。虚拟机启动之后，会自动使用DHCP初始化eth0接口，因此你需要在路由器里为这个虚拟机**绑定静态的IP地址**，如果你在路由器里面找不到哪个是PaoPao GateWay的话，他的主机名是PaoPaoGW，虚拟机也会滚动显示获取到的eth0接口的IP地址和MAC信息。  \n为了实现配置和虚拟机分离，达到类似docker的效果，PaoPaoGateWay采用了配置下发的方式进行配置，你需要把配置文件放在对应位置，假设系统启动后通过DHCP获取到以下信息：  \n```shell\nIP: 10.10.10.3\nDNS1: 10.10.10.8\nDNS2: 10.10.10.9\n网关： 10.10.10.1\n```\n系统会依次尝试以下方式获取配置，并记忆最后一次成功的连接，下次循环优先使用：  \n- 1 从`http://paopao.dns:7889/ppgw.ini`下载配置。使用此方式，你需要配合你的DNS服务，把`paopao.dns`这个域名解析到你的静态文件服务IP，服务端口是7889。如果配合[PaoPaoDNS](https://github.com/kkkgo/PaoPaoDNS)使用，你只需要设置`SERVER_IP`参数和设置`HTTP_FILE=yes`，映射7889端口即可，你可以直接把配置文件`ppgw.ini`放在`PaoPaoDNS`的`/data`目录。`paopao.dns`会从网卡DNS解析获取解析结果，如果结果不可用并且之前有ppgw.ini指定的dns会再尝试获取。      \n- 2 从`http://10.10.10.1:7889/ppgw.ini`下载配置。使用此方式，你可以在主路由上映射7889端口到你的静态文件服务。\n- 3 从`http://10.10.10.8:7889/ppgw.ini`下载配置。如果你直接使用PaoPaoDNS作为你的DNS服务IP，那么你只需要设置PaoPaoDNS的`HTTP_FILE=yes`，映射7889端口即可。\n- 4 从`http://10.10.10.9:7889/ppgw.ini`下载配置。同上。  \n\n系统会不停尝试直到成功获取到配置文件为止，并在后续定期获取新配置（默认值是30秒），当配置的值发生变化的时候将会重新加载网关。你也可以手动进入虚拟机本地终端输入`reload`回车强制马上重载所有配置。\n### ppgw.ini配置说明\nppgw.ini的所有配置项如下：  \n```ini\n#paopao-gateway\n\n# mode=socks5|ovpn|yaml|suburl|free\n# default: free\nmode=free\n\n# Set fakeip's CIDR here\n# default: fake_cidr=7.0.0.0/8\nfake_cidr=7.0.0.0/8\n\n# Set your trusted DNS here\n# default: dns_ip=1.0.0.1\ndns_ip=10.10.10.8\n# default: dns_port=53\n# If used with PaoPaoDNS, you can set the 5304 port\ndns_port=5304\n\n# Clash's web dashboard\nclash_web_port=\"80\"\nclash_web_password=\"clashpass\"\n\n# default：openport=no\n# socks+http mixed 1080\nopenport=no\n#openport_auth=\"username:password\"\n\n# default: udp_enable=no\nudp_enable=no\n\n# default:30\nsleeptime=30\n\n# socks5 mode settting\n# default: socks5_ip=gatewayIP\nsocks5_ip=\"10.10.10.5\"\n# default: socks5_port=\"7890\"\nsocks5_port=\"7890\"\n#socks5_username=\"username\"\n#socks5_password=\"password\"\n\n# ovpn mode settting\n# The ovpn file in the same directory as the ppgw.ini.\n# default: ovpnfile=custom.ovpn\novpnfile=\"custom.ovpn\"\novpn_username=\"\"\novpn_password=\"\"\n\n# yaml mode settting\n# The yaml file in the same directory as the ppgw.ini.\n# default: yamlfile=custom.yaml\nyamlfile=\"custom.yaml\"\n\n# suburl mode settting\nsuburl=\"https://...\"\nsubtime=1d\n#subcron=5\n\n# fast_node=check/yes/no\nfast_node=yes\ntest_node_url=\"https://www.youtube.com/generate_204\"\next_node=\"Traffic|Expire| GB|Days|Date\"\ncpudelay=\"3000\"\nfall_direct=\"no\"\n# dns burn setting\n# depend on fast_node=yes \u0026 mode=suburl/yaml\ndns_burn=yes\nex_dns=\"223.5.5.5:53,1.0.0.1:53\"\n\n# Network traffic records\nnet_rec=no\nmax_rec=5000\n#net_cleanday=15\n```\n下面逐项来解释选项的用法：\n- 1 配置文件第一行必须以`#paopao-gateway`开头。配置格式为`选项=\"值\"`。\n- 2 `mode`是网关的运行模式，也就是当静态路由的流量到达网关之后，怎么出去。一共有五种模式可以选择（`socks5`,`ovpn`,`yaml`,`suburl`,`free`）:\n    - `socks5`:配置为socks5代理出站，这是最简单也是最通用的配置方式，如果其他模式不能满足你的需求，你可以把能满足你需求的服务程序开一个`socks5`代理给网关使用。\n    - `ovpn`:配置为openvpn出站，适用于一些专线场景。\n    - `yaml`：自定义clash的yaml配置文件出站。你可以自己写一个clash格式的yaml配置文件，clash支持多种出站协议，具体写法请看官方wiki。只写`proxies:`字段即可，也可以包含`rules:`字段。如果只有`proxies:`字段，在网关启动后你可以在web端选择节点；如果有`rules:`字段，则会按照你写的规则来执行。注意，网关使用开源的官方clash核心，如果你的`rules:`包含闭源Premium core的规则，则无法加载并报错，导致clash无法启动。使用开源的Clash核心是因为功能已经可以满足需求，网关本身也不适合加载过于复杂的规则，Premium core的功能会降低稳定性、增加崩溃的几率，比如`RULE-SET`功能在启动的时候下载远程url文件失败的话可能会导致clash无法正常启动，而clash无法启动的时候文件可能不能被正常下载，进入了死循环。此外，由于网关也不适用GEOIP规则，请勿写入任何GEOIP规则，因为GEOIP规则依赖GEOIP库更新，而稳定的网关不适合依赖更新运行，此外碰到GEOIP规则会触发DNS解析，降低了处理效率。如果有更复杂的规则需求，建议单独跑一个docker配置你所需的规则，开放socks5端口，让网关使用`socks5`模式，或者参考**使用docker定制ISO镜像**一节更换定制的clash核心。选择该模式，你需要把配置文件放在和`ppgw.ini`同一目录，系统将会在指定的`sleeptime`内循环检测配置值的变化并重载网关。\n   - `suburl`：自定义远程订阅clash配置，不过是从给定的url下载配置。注意事项与`yaml`模式基本一样，不能使用包含开源clash功能之外的规则的订阅，或者参考**使用docker定制ISO镜像**一节更换定制的clash核心。推荐nodelist类型订阅，或者使用subconverter等程序转换订阅。\n    - `free`: 自由出站模式，选择此模式的场景是，假定你在IP层面把虚拟机IP出口走了专线，流量直接出站处理。\n- 3 `fake_cidr`是指定你的FakeIP地址池范围。比如默认值是`7.0.0.0/8`，你需要在主路由上设置一条静态路由`7.0.0.0/8`到PaoPaoGateWay。你应该使用一些看起来是公网但实际上不是（或者不会被实际使用）的地址段，比如实验用地址段、DoD网络地址段。如果你有其他真实的公网IP段需要被网关处理，直接写对应的静态路由即可（比如某些聊天软件走的是IP直连而不是域名），除了指定的`fake_cidr`段会被建立域名映射，其他公网IP地址段都会被网关按普通流量处理分流。[【ROS用户看这里】](https://github.com/kkkgo/PaoPaoGateWay/discussions/48#discussioncomment-7978269)  [【爱快用户看这里】](https://github.com/kkkgo/PaoPaoGateWay/discussions/26) 除了静态路由，[或者你可以顺便添加DHCP option 121优化](https://github.com/kkkgo/PaoPaoGateWay/discussions/25#discussioncomment-7221895)。\n不建议使用`198.18.0.0/15`作为`fake_cidr`段，Chrome会认为这个是局域网段并警告，请参考：\n  - https://developer.chrome.google.cn/blog/local-network-access?hl=zh-cn \n  - https://wicg.github.io/local-network-access/\n- 4 `dns_ip`和`dns_port`用于设置可信任的DNS服务器，“可信任”意味着真实无污染的原始解析结果。如果你配合PaoPaoDNS使用，可以把`dns_ip`设置成PaoPaoDNS的IP，把`dns_port`设置成映射的5304端口，详情可参见PaoPaoDNS的可映射端口说明。该DNS服务在代理出站的时候实际上不会被用到，流量还是会以域名发送到远端，更多的是用于其他模式的节点解析、规则匹配。\n- 5 `clash_web_port`和`clash_web_password`是clash web仪表板的设置，分别设置web的端口和访问密码，默认值为`80`和`clashpass`。网页登录地址为`http://网关IP:端口/ui`。你可以在web端查看流量和日志，以及选择节点等。不要忘了登录地址是`/ui`。`clash_web_password`选项兼容除特殊字符外所有字符串（比如可以设置clash_web_password=\"一去二三里烟村四五家\"）。  \n- 6 `openport`设置是否向局域网开启一个1080端口的socks5+http代理，默认值为`no`，需要开启可以设置为`yes`。如果你想为代理增加额外的用户密码验证，可以设置`openport_auth=\"username:password\"`，格式为`\"用户名:密码\"`。\n- 7 `udp_enable`: 是否允许UDP流量通过网关，默认值为no，设置为no则禁止UDP流量进入网关。（此选项只影响路由，不影响`openport`选项）注意：如果你的节点不支持UDP或者不稳定不建议开启，开启UDP将会导致QUIC失败导致网站有时候上不去的现象。   \n- 8 `sleeptime`是拉取配置检测更新的时间间隔，默认值是30，单位是秒。`sleeptime`在第一次成功获取到配置后生效，如果配置的值发生变化，将会重载网关配置。如果设置sleeptime低于30会被赋值为30。   \n- 9 `socks5_ip`和`socks5_port`: socks5运行模式的专用设置，指定socks5的服务器IP和端口。如果socks5有用户验证，可以指定`socks5_username`和`socks5_password`。\n- 10 `ovpnfile`，`ovpn_username`和`ovpn_password`: ovpn运行模式的专用设置，`ovpnfile`指定ovpn的文件名，系统将会从`ppgw.ini`的同一目录下载该文件。如果你的ovpn需要用户名和密码认证，可以指定`ovpn_username`和`ovpn_password`。\n- 11 `yamlfile`: yaml运行模式的专用设置，指定yaml的文件名，系统将会从`ppgw.ini`的同一目录下载该文件，并使用`sleeptime`的值循环刷新检测配置文件变化，值发生变化则重载网关。\n- 12 `suburl`和`subtime`和`subcron`: suburl运行模式的专用配置，`suburl`指定订阅的地址（记得加英文半角双引号），而`subtime`则指定刷新订阅的时间间隔，单位可以是m（分钟），h（小时）或者d（天），默认值为1d。与yaml模式不同，suburl模式使用单独的刷新间隔而不是`sleeptime`，因为订阅一般都是动态生成，每次刷新都不一样，会导致刷新网关必定重载。需要注意的是`subtime`仅配置订阅的时间间隔，检测配置变化仍然是由`sleeptime`进行。注意如果开了`fast_node`功能，检测不通的时候会主动拉新订阅。`subcron`参数支持指定每天0-23时刷新订阅，比如`subcron=5`每天凌晨5点内刷新订阅。该参数启用的时候`subtime`参数会失效。    \n- 13 `fast_node`、`test_node_url`和`ext_node`：测试最快的节点并自动选择该节点的功能。`fast_node`默认值为no。如果`fast_node`值为空，并且yaml模式或者suburl的配置文件中不包含rules，则会被设置为yes。`test_node_url`是用于测速的网址，将会使用clash的api测试延迟，默认值是`https://www.youtube.com/generate_204`。`ext_node`是排除测速的节点，多个关键字用竖线隔开，默认值是`ext_node=\"Traffic|Expire| GB|Days|Date\"`。`fast_node`的行为如下：\n  - 当`fast_node=yes`或者`fast_node=check`，系统将会在`sleeptime`间隔检测`test_node_url`是否可达，若可达，则不进行任何操作；若不可达，则立即停止clash并秒重载网关配置，如果是suburl模式，还会在重载前拉新订阅配置。\n  - 仅当`fast_node=yes`，在网关重载后对所有节点（不包括`ext_node`）进行测速，并自动选择延迟最低的节点。***`fast_node=yes`会忽略加载`rules：`规则并开启`global`模式***。  \n  - 当`fast_node=yes`仅会在`test_node_url`不可达的时候主动切换节点，不会影响你在Web手动选择节点使用。因此强烈建议习惯单节点使用的开启该项功能。或者可以使用`fast_node=check`来实现当`test_node_url`不可达的时候主动拉新订阅而不主动选择节点。\n  - 注意，设置为`check`不会测速，设置为`yes`测速失败到阈值会杀死进程并终止应用网关并重载，而`check`不会杀死进程，仅重载所有配置并关闭所有现有的旧连接。  \n  - 如果你的所有的节点都延迟过高不稳定，建议设置为`no`避免增加意外的断流的情况，同时你需要手动切换节点。  \n  - `cpudelay`选项是设定如果CPU处理延迟大于指定值则放弃本次测速。该选项是防止低性能设备负载过高导致死机，默认值为3000。设置更小的值可能会放弃更多测速，设置更高的值可能会让低性能设备负载过高。    \n  - `fall_direct`选项设置为`yes`在`fast_node`测试全部节点失败的时候，若互联网路由可达，则尝试切换到`DIRECT`直连。（仅在开启`fast_node=yes`的时候生效）        \n- 14 `dns_burn`选项和`ex_dns`选项：`dns_burn`功能可以把所有节点的域名解析成所有可能的IP结果，把server字段替换为解析的IP结果，以`节点名@IP最后一位`的名称作为新节点加入，临时硬编码到配置文件中。上面设置的`dns_ip`和`dns_port`，和`ex_dns`选项会被用于`dns_burn`功能，`ex_dns`选项用于指定额外的DNS用于解析节点，建议设置为境内DNS以获得不同的结果，如果为空默认值为`223.5.5.5:53`，如果配合PaoPaoDNS使用，则可以设置为PaoPaoDNSIP:53。你也可以设置多个`ex_dns`，格式为逗号分隔，比如`ex_dns=223.5.5.5:53,1.0.0.1:53`。适用于`suburl`模式和`yaml`模式，依赖于`fast_node=yes`。该功能的优点和应用场景如下：\n    - 1、节点使用了分区域解析，只有使用了境内DNS才能连接，参见[issue](https://github.com/kkkgo/PaoPaoGateWay/issues/20)，`dns_burn`功能可以额外对节点进行解析。\n    - 2、节点DNS解析存在多个解析入口，`dns_burn`功能会把所有可能的入口都作为新节点加入到配置文件中，在测速的时候就可以选择到速度最好的入口，而不是随机选择。\n    - 3、节点的所有可能的解析结果都会被临时硬编码到配置文件中，除非所有节点都测速失败或者订阅更新，该配置文件不会变化，可以减少节点的DNS查询，使用IP直连，并有效避免节点临时出现可能的DNS污染或者DNS故障的情况，比如节点域名忘记续费导致解析失败。\n- 15 `net_rec`选项：网络流量记录功能，可以记录网关连接了哪些域名、上传下载消耗了多少流量、客户端IP，并默认按照消耗流量的大小排序，该功能可以根据实际情况方便地调整分析自己的域名规则列表。设置为`yes`开启该功能后可以在web界面点击[记录]，选择下载表格或者在线加载。其中`max_rec`选项指定最大记录数，默认为5000，当记录的内容超过`max_rec`的2倍后，仅保留前`max_rec`项记录。注意事项：  \n    - 1、重启或者修改ppgw的密码、Web端口、`max_rec`选项、调整任何和`net_rec`相关选项会导致数据清空。\n    - 2、如果流量太小连接持续时间过短，有可能在记录之前连接已经关闭，流量有可能会显示为0B。\n    - 3、理论上会略微增加资源占用，取决于你的并发连接数量以及`max_rec`，可适当增加运行资源。\n`net_cleanday=1-31`选项，指定每个月某一天清空网络流量数据记录，比如`net_cleanday=15`每月15日清空网络流量数据记录。如果指定值大于当月有效天数，比如2月份指定31，将会取该月最大值执行，该值为空的时候只有达到了max_rec限制才会清理。    \n## PPSUB 组合订阅使用指南\n\n#### 基本使用流程\n\n1. 从左侧菜单 PPsub 编辑器开始，编辑你的订阅提供商、节点组、规则组后，导出 json 文件。也可以下载离线编辑器：https://github.com/kkkgo/PaoPaoGateWay/blob/main/ppsub_offline.html\n2. 导出了 json 配置后，设置 `ppgw.ini` 的 `mode=suburl`， 设置 `suburl=\"ppsub@http://.../ppsub.json\"`（suburl 前面加 `ppsub@`）\n\n#### 全局健康监测\n开启全局健康监测，可以在指定url监测失败的时候，重新处理和拉取所有PaoPaoGateway配置。\n\n#### 订阅提供商\n\n提供订阅的 url，相当于 suburl。假设你有多个订阅，你可以添加多个订阅提供商。\n\n- 勾选强制依赖的属性会要求必须下载到该订阅，否则当处理失败，全部重来\n- 当没有订阅提供商被勾选强制依赖，则至少需要一个订阅提供商被下载成功\n- 如果节点组依赖的订阅提供商没有下载成功，则跳过生成节点组。\n\n\u003e **注意**：请不要把这个区域和第三方的 `proxy-providers` 功能混淆，PPsub 不使用这个功能，PPSub有专用的处理过程。\n\n#### 节点组\n\n根据关键字、排除关键字、订阅提供商的组合，组合出你的节点组，用于规则分流。  \n节点组可以嵌套其他节点组，但关键字筛选仅对来自订阅提供商的节点生效。\n**示例**：你想筛选了某些节点用于访问 openai 网站，命名为\"AI 专用\"，则后续在规则中可以使用 `geosite,openai,AI专用` 这样的规则。\n\n**模式说明**：\n- **手动选择模式**：需要在配置加载后你自己选择一个节点组里的节点\n- **测速模式**：这个节点组会根据提供的测速 url 来自动选择节点，例如填写 `https://openai.com/`\n\n#### 规则组\n\n在规则组可以编写你的分流规则，也可以选择从指定url下载规则（要求正常yaml格式，会提取下载yaml文件的`rules`字段），或者下载`RULE-SET`订阅。\n\n**格式**：规则类型,匹配内容,节点组名称（或者内置策略：`REJECT`、`DIRECT`）\n\n**示例**：`GEOSITE,openai,ai专用`\n\n**参考资料**：\n- 规则语法参考：https://wiki.metacubex.one/config/rules/\n- geosite 参考：https://github.com/v2fly/domain-list-community/tree/master/data\n\n**提示**：\n- 如果规则引用的节点组不存在或者没有处理成功，则跳过该条规则。\n- 请尽量使用域名规则，使用 IP 相关规则会触发额外的 DNS 解析动作\n- **重要**：请不要忘记最后使用 match 规则兜底，比如 `match,all`（假设你有一个节点组叫 all）\n- **重要**：部分规则语法（如geosite）需要替换clash/mihomo核心才支持。\n\n\n#### PPSUB 模式下的配置项说明\n\n**被禁用的选项**：\n- fast_node 相关选项（fast_node/test_node_url/ext_node/cpudelay/fall_direct）\n- 相关功能请在节点组中定义\n\n**参考使用的选项**：\n- `dns_burn=yes`：当节点是域名，会把节点再次额外解析成 IP 节点，以节点名@+IP最后一位增加到节点组\n- `ex_dns`：当 `dns_burn=yes`，此处的 DNS 服务器会被再次使用解析，如有额外结果会增加到节点组\n\n**生效的选项**：\n- `subtime`、`subcron` 和 `suburl` 一样定时刷新订阅\n\n## 使用docker定制ISO镜像:ppgwiso  \n![pull](https://img.shields.io/docker/pulls/sliamb/ppgwiso.svg) ![size](https://img.shields.io/docker/image-size/sliamb/ppgwiso)   \n\n默认的ISO是通过DHCP下发配置的，这个通常能满足大部分场景需求，然而一些企业内部的服务器网段也许只能设置静态IP，或者通过公开的http端口拉取配置觉得不够安全，或者自带的标准开源clash核心支持的功能和协议不够多等等，现在你可以通过docker镜像`sliamb/ppgwiso`，来定制你的专属ISO镜像。  \n### 使用方法\n现在，你可以准备一个文件夹，根据需求，选择性放入以下文件，或者不放：\n#### 配置网络：`network.ini`\n如果你要配置静态IP等信息，可以新建一个`network.ini`如下：\n```ini\nip=10.10.10.3\nmask=255.255.255.0\ngw=10.10.10.1\ndns1=10.10.10.8\ndns2=10.10.10.9\n```\n如果`ip`值为空或者无有效值，则忽略以上设置，IPv4将使用dhcp进行分配。  \n如果要开启IPv6特性，请加入以下配置：\n```ini\nip6=auto\n```\n该配置将会使用`DHCPv6 + SLAAC`获取IPv6地址。  \n如果需要配置静态IPv6地址，配置示例如下：  \n```ini\nip6=240e:3b6:2333:4444:215:5dff:fe0a:e200/64\ngw6=fe80::2a3c:8ff:fe47:28e7\n```\nIPv4配置和IPv6配置可以同时写入。当缺少IPv4配置的时候默认使用dhcpv4，当缺少IPv6配置的时候默认删除IPv6功能。  \n*注：IPv6功能仅用于出口，不支持静态路由到网关*   \n**虚拟机网卡分配的dns仅用于拉取`ppgw.ini`无其他作用。只有一个dns就只填dns1。*    \n###### 特殊场景高级配置：自定义局域网属性地址\n*如果你看不懂下面这段文字，说明你没有这个场景需求，请不要配置它。*\n如果你的局域网CIDR是由非标准局域网地址组成的，或者代理目标含有局域网地址，那么你可以增加以下配置到`network.ini`来重定义局域网属性地址，可以增删示例配置中的CIDR段，以逗号分隔：\n```ini\nlocalnet=\"10.0.0.0/8,169.254.0.0/16,172.16.0.0/12,192.168.0.0/16\"\n```\n#### 指定`ppgw.ini`的下载地址：`ppgwurl.ini`\n如果你要指定ppgw.ini的下载地址而不是按上面的规则来寻找，比如你弄了一个带鉴权的http服务器提高安全性，防止配置泄露，你可以新建一个`ppgwurl.ini`如下：\n```ini\nppgwurl=\"http://....\"\n```\n#### 内嵌`ppgw.ini`\n如果你想固定`ppgw.ini`的配置而不是通过http远程拉取，你可以直接在当前目录放入`ppgw.ini`。   \n注意：内嵌`ppgw.ini`优先级比`ppgwurl.ini`高，同时内嵌`ppgwurl.ini`不生效。\n\n#### 内嵌`custom.ovpn`\n你可以把节点信息`custom.ovpn`放入当前目录，当`mode=ovpn`的时候将会强制使用该文件。    \n注意：你仍然需要在`ppgw.ini`中指定`mode=ovpn`才会使用到该文件。\n\n#### 内嵌`custom.yaml`\n你可以把节点信息`custom.yaml`放入当前目录，当`mode=yaml`的时候将会强制使用该文件。    \n注意：你仍然需要在`ppgw.ini`中指定`mode=yaml`才会使用到该文件。\n\n#### 内嵌`ppsub.json`\n你可以把`ppsub.json`放入当前目录，当`mode=suburl`的时候将会强制使用该文件。    \n注意：你仍然需要在`ppgw.ini`中指定`mode=suburl`才会使用到该文件。\n\n#### 替换clash/mihomo核心\n你可以把你的amd64的clash/mihomo二进制文件重命名为clash放到当前目录即可。通过替换clash核心，你可以支持更多的协议和规则功能，比如替换为[mihomo](https://github.com/MetaCubeX/mihomo/releases)。   \n常见问题： [我应该下载哪一个文件？](https://github.com/MetaCubeX/mihomo/wiki/FAQ)   \n你应该下载类似mihomo-linux-amd64-v3-xxx.gz的文件并解压重命名为clash   \n如果你的虚拟机平台不支持v3 CPU（比如PVE，默认类型不支持，你需要把CPU类别设置为host）或者不确定你应该下载什么，那么你应该下载类似mihomo-linux-amd64-compatible-xxx.gz的文件并解压重命名为clash   \n\n*快捷测试*：使用`-e MI=y`，可以便捷使用内置下载好的mihomo内核（不一定是最新版本）。如果你的CPU和虚拟机平台支持v3，可以使用`-e MI=3`。该选项仅当前目录没有clash核心的时候生效。\n#### 替换Geo数据文件\n默认的GEOIP数据仅包含`CN`和`PRIVATE`地址（在没有替换核心的情况下）。    \n默认替换核心下，会引入额外的自带Geo完整数据文件（占用一定体积），避免初次拉取数据文件时启动失败。  \n如果规则不含或者不需要Geo数据，可以设置`-e GEO=no`。默认为yes。该选项依赖替换了clash/mihomo核心，如果没有替换核心将不会包含Geo数据文件。      \n支持引入任意Geo数据文件，当目录下存在mmdb\\dat\\metadb格式文件的时候会自动复制进镜像。当复制了任意Geo数据文件时，将会删除所有自带的数据文件。  \n\n#### 最后一步：一键生成ISO\n你只需要在放好文件的当前目录执行以下命令即可一键生成镜像。  \n确保在每次进行操作之前，使用`docker pull`拉取最新的镜像（不同于release版本，docker版本会每天同步最新所有上游代码）。    \n在Linux上或者Windows上操作均可(在Linux路径错误的话，`.:/data`可以换成`$(pwd):/data`)：\n```shell\ndocker pull sliamb/ppgwiso\ndocker run --rm -v .:/data sliamb/ppgwiso\n```\n如果你的网络环境访问Docker Hub镜像有困难，***可以尝试使用public.ecr.aws镜像:***    \n- 示例： `docker pull public.ecr.aws/sliamb/ppgwiso`  \n- 示例： `docker run -d public.ecr.aws/sliamb/ppgwiso`  \n\n只需等待十几秒，你就可以在当前目录看到你定制的`ppgw-version-[hash].iso`。  \n\n#### 可选：物理网卡直通\n镜像因为是虚拟机专用默认仅包含虚拟网卡驱动，如果有物理网卡直通需求，你可以把定制的docker镜像切换成`fullmod`版本，增加驱动(还包含qemu-ga/open-vm-tools)：  \n```shell\ndocker pull sliamb/ppgwiso:fullmod\ndocker run --rm -v .:/data sliamb/ppgwiso:fullmod\n```\n*注：`fullmod`附带了所有可能支持的网卡驱动和相关模块，生成的镜像会大20M左右，可适当增加运行内存。*\n\n#### 可选：生成前置嗅探的ISO\n生成前置嗅探的ISO，流量到达网关后先尝试嗅探出域名再使用FAKEIP，更适合企业环境使用：  \n\n优点：\n- 即使FAKE DNS缓存出错也能正确连接常见协议（http/tls），可以避免因网站使用了QUIC不稳定导致网页断流；   \n- 禁用bt协议\n- 重启虚拟机也不会因FAKE IP映射不正确而引起无法访问的短暂故障、对DNS TTL处理不正常的客户端兼容更好；   \n\n缺点： \n- 需要占用更多内存和CPU\n\n使用该功能，只需要在生成的时候加入环境变量参数`SNIFF=yes`即可：  \n*2026版本起该选项默认为yes，如不需嗅探请设置为`SNIFF=no`*  \n```shell\ndocker pull sliamb/ppgwiso\ndocker run --rm -e SNIFF=yes -v .:/data sliamb/ppgwiso\n```\n## 与DNS服务器配合完成分流\nPaoPao GateWay启动后会监听53端口作为FAKEIP的DNS服务器，所有域名的查询到达的话这里都会解析成`fake_cidr`内的IP。当你在主路由添加`fake_cidr`段到PaoPao GateWay的静态路由后，你只需要把需要走网关的域名解析转发到PaoPao GateWay的53端口即可，能实现这个功能的DNS软件很多，比如有些系统自带的dnsmasq就可以指定某个域名使用某个DNS服务器。   \n配合[PaoPaoDNS](https://github.com/kkkgo/PaoPaoDNS)的`CUSTOM_FORWARD`功能就可以完成简单精巧的分流，以下是一个简单的非CN IP的域名转发到PaoPao GateWay的docker compose配置：  \n假设PaoPaoDNS容器IP是10.10.10.8。PaoPao GateWay的IP是10.10.10.3，还开启了`openport`功能：\n```yaml\nversion: \"3\"\n\nservices:\n  paopaodns:\n    image: sliamb/paopaodns:latest\n    container_name: PaoPaoDNS\n    restart: always\n    volumes:\n      - /home/paopaodns:/data\n    environment:\n      - TZ=Asia/Shanghai\n      - UPDATE=weekly\n      - DNS_SERVERNAME=PaoPaoDNS,blog.03k.org\n      - DNSPORT=53\n      - CNAUTO=yes\n      - CNFALL=yes\n      - CN_TRACKER=yes\n      - USE_HOSTS=no\n      - IPV6=no\n      - SOCKS5=10.10.10.3:1080\n      - SERVER_IP=10.10.10.8\n      - CUSTOM_FORWARD=10.10.10.3:53\n      - AUTO_FORWARD=yes\n      - AUTO_FORWARD_CHECK=yes\n      - USE_MARK_DATA=yes\n      - HTTP_FILE=yes\n    ports:\n      - \"53:53/udp\"\n      - \"53:53/tcp\"\n      - \"5304:5304/udp\"\n      - \"5304:5304/tcp\"\n      - \"7889:7889/tcp\"\n```\n需要注意的是，一小部分应用不走域名而是IP直连，比如某些聊天软件应用（比如[tg](https://core.telegram.org/resources/cidr.txt)、 [网飞](https://github.com/kkkgo/PaoPaoGateWay/discussions/32#discussioncomment-7447476)），你只需要网上搜索一下对应的IP段，添加少量对应的的静态路由即可。  \n***如果配合`PaoPaoDNS`使用，强烈建议开启`PaoPaoDNS`的`USE_MARK_DATA`功能，提升分流精准度。***     \n注：[抓取跳过域名参考](https://github.com/kkkgo/PaoPaoDNS/discussions/47#discussioncomment-7217219)\n\n## 更多教程\n由于每个人的网络拓扑平台和路由系统不一样，可能没有通用的详细教程，你可以在论坛查看其他人的[配置分享](https://github.com/kkkgo/PaoPaoGateWay/discussions/categories/%E9%85%8D%E7%BD%AE%E5%88%86%E4%BA%AB)，如果你成功部署了网关，欢迎在论坛分享你的相关过程或者解决方案给其他人参考。  \n\n## 构建说明\n`PaoPao GateWay`iso镜像由Github Actions自动构建仓库代码构建推送，你可以在[Actions](https://github.com/kkkgo/PaoPaoGateWay/actions)查看构建日志并对比下载的镜像sha256值。\n\n## 附录\nPaoPaoDNS： https://github.com/kkkgo/PaoPaoDNS   \nmihomo releases: https://github.com/MetaCubeX/mihomo/releases  \nmihomo config: https://github.com/MetaCubeX/mihomo/blob/Alpha/docs/config.yaml    \nmihomo wiki: https://wiki.metacubex.one/config/proxies/    \nYacd： https://github.com/haishanh/yacd  \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkkkgo%2Fpaopaogateway","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkkkgo%2Fpaopaogateway","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkkkgo%2Fpaopaogateway/lists"}