原文地址: https://yojigen.tech/30.html
哪个男孩不想要一个可以自由驰骋互联网的网络呢?
关于家中的互联网建设这一块,已经不知道有多少博主聊过,自己也是来来回回折腾了很多种方案。
最近终于找到了我直到目前为止我认为可能是最完美的方案——PaoPaoDNS+PaoPaoGateWay 。然后就在自己家的软路由系统里部署了起来,目前也是稳定用了一个月感觉非常的舒适。
但是我家里面用的是软路由+虚拟机的方案,本身全套机器下载价格要 400 元左右了,而且机器也是做了一点点硬改,没有改机能力的人恐怕用起来也会比较麻烦。
于是我就在想,能不能用比较便宜的方案,和较低的功耗,用一些市面上常见的设备来实现这一套方案呢?
在尽可能保证正常网络不会受到影响的情况下,实现网内透明代理,以用于科学上网。
附赠功能: 去广告,虚拟局域网组网等
于是经过我的思考,最后做出了如下的设备方案:
以上设备各位读者可以根据自身的经济条件和现有的设备来决定如何选择,比如全放进虚拟机里之类。而我这次选择的设备是下面这几个。
这个价格不算特别的大众,这是一台天线坏掉的机器,而我的家里面因为还有三个其他的无线路由器当做 AP 使用,所以我不需要无线网络功能。
这台机器的芯片是联发科的 mt7981 ,内存是 256m(也有 512m 的版本),性能较好,可以轻松跑满千兆。而且这款机器还是被 OpenWRT 和 immortalwrt 官方支持的型号,可以直接刷主线版的固件,这样也可以避免一些网上所谓的“大神”编译的固件中的各种坑。
机器怎么刷机我这里就不说了,网上有一些现成的资料,在这里说会导致教程太过于复杂,而且也许你的设备也不需要刷机,对吧。
其实我个人目前比较推荐的机器是爱快 IK-Q3000 ,不用刷机就能享受官方的爱快的系统固件,机身自己支持 AX3000 ,如果没有其他无线组网,一台机器就能解决大部分人家中的路由和 WiFI 了。现在这个机器京东售价 159 ,同样所谓 mt7981 芯片的机器,他也就比别的机器贵了 20-30 。30 块钱买个免刷机带售后的爱快系统我觉得还是挺香的。(不过不清楚这台机器有没有硬件转发,如果没有的话还是不要用了)
玩客云算是我们垃圾佬应该非常熟悉的一个东西了,他本身是一个拿来做 PCDN 的所谓的“挖矿”设备,后续随着 PCDN 的收益越来越低,运营商对 PCDN 的打击等等原因,现在网上有着大量的机器在流通。而且由于存世量多,玩的人也多,这机器在价格便宜的同时,机器的玩法也开发的比较全面,很多系统都能刷入进去。
我们这里选择给它刷入 Armbian ,以用来部署 Docker 容器,刷机方法大家也可以参考网络资料。
这个小机器是之前无意中发现的,机身外壳的做工还不错,虽然是塑料但是很厚实。这个机器由于只有一个千兆网口,不好做软路由,且只有一个无法更换 4g 硬盘,所以对于垃圾佬来说,可玩性就有点差了,导致价格一直不高。但是这台机器的 CPU 是小主机里面不太常见的 AMD GX-218GL ,这块 CPU 性能和 J1900 差不太多,功耗也都是在 10w 左右,但是他有一个 J1900 没有的优势: 支持 AES 硬解。
大家都知道 AES 硬解意味着什么,加上小尺寸,低功耗,所以这台机器非常适合拿来做我们的网关机。
注意: 这个机器只有 VGA 输出,需要你准备支持 VGA 的显示器和线,或者转换线。
首先要保证你的网络是正常的,你需要了解如何使用你的路由器正确的设置上网功能。 我这里以最常见的网络地址作为演示,你可以根据你的需求来设置自己的网段。
路由器 IP: 192.168.1.1
DHCP 范围: 192.168.1.101-192.168.1.200
局域网段: 192.168.1.0/24
子网掩码: 255.255.255.0
网关机 IP: 192.168.1.2
Docker 容器机 IP: 192.168.1.3
首先要准备一下 PaoPaoGateWay 的系统镜像,由于是在物理机运行,所以需要全网卡驱动的支持。官方 Github 上的镜像是默认不带全网卡驱动的,需要我们用官方的 docker 来定制一下 ios 镜像。 定制方式非常简单,随便找一台 x86 的装有 docker 的机器(官方容器不支持 arm),运行下面两条命令,就能在当前目录获得一个具有全部网卡的 ios 镜像了。
docker pull sliamb/ppgwiso:fullmod
docker run --rm -v .:/data sliamb/ppgwiso:fullmod
如果你不方便定制,也可以下载我定制好的镜像文件(记得解压)。
paopao-gateway-x86-64-custom-364b136.zip
准备一个写磁盘的工具,Rufus 、balenaEtcher 、UltraISO 之类的都可以,我这里使用 Rufus 。 准备一个 U 盘,将镜像文件写入到 U 盘里。
然后将 U 盘插入 x86 小主机,在 Bios 里设置为从 U 盘启动系统,通电自动启动系统,最后用网线将网口和路由器的 Lan 口进行连接。
这样网关机这里就算设置完成了。
注:
首先搭建好 Docker 环境,这里根据不同的设备和系统会有不同的方法,请根据网络上的教程自行操作。
创建目录 DNS ,并且在其中创建docker-compose.yaml
文件,用于配置容器。
docker-compose.yaml
文件内容参考如下。
services:
paopaodns_china:
image: sliamb/paopaodns:latest
container_name: PaoPaoDNS-China
restart: always
volumes:
- ./PaoPaoDNS-China:/data
networks:
dns:
ipv4_address: 172.30.1.10 # IP 地址为 Docker 内网分配地址,用于内网访问
environment:
- TZ=Asia/Shanghai
- UPDATE=weekly
- DNS_SERVERNAME=PaoPaoDNS-China
- DNSPORT=53
- CNAUTO=no
paopaodns _global:
image: sliamb/paopaodns:latest
container_name: PaoPaoDNS-Global
restart: always
volumes:
- ./PaoPaoDNS-Global:/data
networks:
dns:
ipu4_address: 172.30.1.20 # IP 地址为 Docker 内网分配地址,用于内网访问
environment:
- TZ=Asia/Shanghai
- UPDATE=weekly
- DNS_SERVERNAME=PaoPaoDNS-Global
- DNSPORT=53
- CNAUTO=yes
- CNFALL=yes
- CN_TRACKER=yes
- USE_HOSTS=no
- IPU6=no
- SOCKS5=192.168.1.2:1080 # IP 地址为网关机的 IP 地址
- SERVER_IP=192.168.1.3 # IP 地址为本台宿主机的 IP 地址
- CUSTOM_FORWARD=192.168.1.2:53 # IP 地址为网关机的 IP 地址
- AUTO_FORWARD=yes
- AUTO_FORWARD_CHECK=yes
- USE_MARK_DATA=yes
- HTTP_FILE=yes
ports:
- "5304:5304/udp"
- "5304:5304/tcp"
- "7889:7889/tcp"
adguard_home:
image: adguard/adguardhome:latest
container_name: AdGuardHome
restart: always
depends_on:
- paopaodns_china
- paopaodns_global
volumes:
- ./AdGuardHome:/opt/adguardhome/work
- ./AdGuardHome:/opt/adguardhome/conf
networks:
dns:
ipv4_address: 172.30.1.2 # IP 地址为 Docker 内网分配地址,用于内网访问
environment:
- TZ=Asia/Shanghai
ports:
- "53:53/udp"
- "53:53/tcp"
- "80:80/tcp" # 如果不是使用 80 端口作为网页端口则需要添加对应的端口映射
- "3000:3000/tcp" # 安装成功后可以删除
networks:
dns:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.30.1.0/24
gateway: 172.30.1.1
解释一下这个配置文件。
这个配置文件定义了三个容器。
两个 PaoPaoDNS ,用来作为 AdguardHome 的上游 DNS ,其中一个容器没有做特殊的配置,仅当做本地递归 DNS 服务器使用。而另一台则添加了分流相关的设置,用于对需要出国的设备进行 DNS 分流处理。
AdguardHome ,用于提供本地 DNS 服务,给不同的客户端配置不同的上游 DNS ,以及去广告(虽然是他的本职,但是这里反而成了附赠的功能了)。
注: 爱快官方之前在论坛中提到,系统更新到 3.7.12 后,DHCP 设置将支持对不同的客户端配置不同的 DNS ,所以用爱快系统的可以根据需求不使用 AdguardHome 。
接下来启动容器。
docker compose up -d
容器正常启动后,则可以使用本机 IP:3000
访问 AdguardHome 的安装页面了,设置一下用户名和密码,以及 WebUI 的端口(建议 80)即可。
因为我文章里是使用的 OpenWRT 作为路由系统,所以这里也是用 OpenWRT 来演示。
启动网关机和 Docker 容器机,让他们的信息出现在你的路由器里面。
首先要固定一下 IP 。
打开 网络→DHCP/DNS→静态地址分配,将网关机的 IP 固定为192.168.1.2
,将 Docker 机的 IP 固定为192.168.1.3
。
然后将 DHCP 默认的 DNS 设置为192.168.1.3
(如果需要输入两个地址就都填一样的)。
接下来要设置网内设备的 DNS 。
打开 网络→接口→lan→DHCP 服务器→高级设置,在 DHCP 选项中添加。
6,192.168.1.3
这个值就是你的 Docker 机的 IP 。
然后重启一下网关机和 Docker 机,让他们可以获取到新的 IP 和 DNS 。
接下来网页打开 AdguardHome 的后台http://192.168.1.3,在 DNS 设置中,将上游 DNS 设置为172.30.1.10
,并且关闭缓存。
这时我们可以试一下我们的 DNS 能否正常使用。
nslookup whoami.03k.org 192.168.1.3
服务器: Unknown
Address: 192.168.1.3
非权威应答:
名称: whoami.03k.org
Address: 123.234.123.234 #连接权威 DNS 服务器的 IP=你的宽带 IP
返回的地址如果是你的公网 IP 网段,就说明递归 DNS 已经生效了。
接下来是设置静态路由,我们回到 OpenWRT 的界面。
打开 网络→路由→静态 IPv4 路由,添加一条新的静态路由,类型unicast
,目标11.0.0.0/8
,网关192.168.1.2
。
最后要屏蔽掉对 FakeIP 的 NAT 。
打开 网络→防火墙→通信规则,添加一条新的规则,源区域为lan
,目标区域为wan
,目标地址为11.0.0.0/8
,操作为丢弃
。
注:
如果有使用一些纯靠 IP 访问的软件(例如网飞、Telegram),还需要把他们的 IP 端也设置相同的静态路由和通信规则中,比较长这里我就不写了,有需求的可以自行添加。
到这里网络路由相关内容设置完毕。
网关配置文件在 Docker 机器的DNS/PaoPaoDNS-Global
目录中的ppgw.ini
。
#paopao-gateway
# mode=socks5|ovpn|yaml|suburl|free
# default: free
# free: 直接出站不走代理
# socks5: 使用 socks5 代理出站
# ovpn: 使用 ovpn 代理出站
# yaml: 使用 yaml 配置文件,yaml 配置文件在同目录下,文件名参考下面的 yamlfile
# suburl: 使用订阅地址,最常见的应该就是这种了
mode=suburl
# Set fakeip's CIDR here
# default: fake_cidr=7.0.0.0/8
# FakeIP 的网段,如果要修改,请修改成看似是外网的空 IP 网段
fake_cidr=11.0.0.0/8
# Set your trusted DNS here
# default: dns_ip=1.0.0.1
# 这里需要和 Docker 机,也就是 DNS 的 IP 匹配
dns_ip=192.168.1.3
# default: dns_port=53
# If used with PaoPaoDNS, you can set the 5304 port
# 这是网关获取配置的端口,如果没有修改过端口映射,请使用默认值
dns_port=5304
# Clash's web dashboard
# 这是网页管理面板的端口和密码
clash_web_port="80"
clash_web_password="clashpass"
# default:openport=no
# socks+http mixed 1080
openport=no
# default: udp_enable=no
udp_enable=no
# default:30
sleeptime=30
# socks5 mode settting
# default: socks5_ip=gatewayIP
# 这里需要填入网关 IP ,用于开启局域网内的 socks5 代理
socks5_ip="192.168.1.2"
# default: socks5_port="7890"
socks5_port="7890"
# ovpn mode settting
# The ovpn file in the same directory as the ppgw.ini.
# default: ovpnfile=custom.ovpn
ovpnfile="custom.ovpn"
ovpn_username=""
ovpn_password=""
# yaml mode settting
# The yaml file in the same directory as the ppgw.ini.
# default: yamlfile=custom.yaml
# 这里是 yaml 模式时,网关获取的配置文件的文件名
yamlfile="custom.yaml"
# suburl mode settting
# 这里填入你的订阅地址
suburl="https://..."
# 这里是订阅自动更新时间
subtime=1d
# fast_node=check/yes/no
# check: 代表会自动检查下面的 URL 能否访问,如果不能访问则自动重启服务并重新拉取订阅
# yes: 代表会自动根据延迟切换到延迟最低的节点,同时具有 check 的功能
# no: 代表不检查延迟与连通性
fast_node=yes
test_node_url="https://www.youtube.com/generate_204"
ext_node="Traffic|Expire| GB|Days|Date"
cpudelay="3000"
# dns burn setting
# depend on fast_node=yes & mode=suburl/yaml
dns_burn=no
# If used with PaoPaoDNS, you can set the PaoPaoDNS:53
# 这里需要设置成 DNS 的 IP
ex_dns="192.168.1.3:53"
# Network traffic records
net_rec=no
max_rec=5000
更详细的参数解释,以及自定义规则等等,请参考官方的文档,如果没有特殊需求,按本文的配置即可。
我的教程中的方案,是建立在网内只有一部分设备出国,另一部分正常用网的场景,所以需要针对不同的设备,设置不同的上游 DNS 服务器。
如果你没有这种需求,可以直接在网络配置那一步中,将上游 DNS 设置为172.30.1.20
,就不用继续往下看了。
如果你也像我一样,只需要部分的设备走出国规则,那就还需要在多一步设置。
打开 AdguardHome 的后台http://192.168.1.3。
打开客户端设置,添加客户端。
添加需要出国的设备的 IP 或者 IP 段,然后在下面的自定义上游的地方,将上游 DNS 设置为172.30.1.20
,然后保存即可。
至此系统全部搭建完毕。
可以使用 Speedtest ,分别选择国内和国外的测速节点,看一下带宽能否跑满。
可以在https://ip111.cn或者https://ip.skk.moe检查一下 IP 分流是否正常。
可以用 NatTypeTester 检查一下 Nat 等级。
整套设备花费是 59+28+50=137 元,这里是没有计算 U 盘和交换机的价格。
U 盘作为一个搞机佬,我相信各位家里一定会有的,而交换机要看自己网内具体有多少需要网线的设备,所以我就没有算在内。
这里面路由器的价格可能会有一些上下波动,比如你需要一款可以跑满千兆的路由器,又不想刷机,所以可能买了我推荐的爱快 Q3000 ,那价格就一下多了 100 元了,但是你买了更好的路由器就算不玩这套系统,那也可以让网络体验变好,也是不亏。而如果你家的网络没有达到千兆,比如只有 500M 甚至 100M ,那你大可买一些 mt7621 的路由器,刷个 OP 或者爱快的固件,这种路由器咸鱼 50 以内可以随便买。
希望这篇文章可以帮助到一直想要一套舒适的网络的你。
1
qzydustin 45 天前 1
有一个疑问,搭建 Paopao dns 目的是什么?直接用运营商+污染的交给服务器不行吗
|
2
walkbox 45 天前
哎 技术值好几百 羡慕有技术的人
|
3
michaeljackson 45 天前
太复杂了,果断不看了
|
4
Charkey 45 天前 1
牛的,我的折腾就只有一个 iStoreOS
|
5
Cheons 45 天前 via Android
只用最简单的,需要的设备单独跑服务
|
7
molezznet 45 天前
adguard + 缓存为什么关闭, 我挺喜欢用缓存的,之后解析不是更快吗? 爱快我记得也有缓存的功能。
|
10
xiaoke 45 天前
比 op 少一个 adguard ,用了近一年 ,纵享丝滑
|
12
ixinshang 45 天前
为什么你的 DHCP/DNS 有这么多选项? 是自编译的吗? 看到其他的一些没这么多选项。
|
15
xdeng 45 天前
这么长的文章 你们看完了?
|
16
ronyin 45 天前
太复杂,一般家庭用不上。。
|
19
niaohongC 45 天前
高技术力折腾
|
22
xuhengjs 45 天前
这种只能对应 dns 污染,ip 被封的还是没戏
|
23
mouyase OP |
24
cuicuiv5 45 天前
还是加点钱 all in boom 吧
|
25
iamwin 45 天前
整个一套搞那么复杂,还用 fakeip 来污染 dns 解析,透明代理你可以在网关设备的防火墙里面配置
openvpn 、wireguard 和其他你也可以直接在网关设备部署,AdguardHome 这东西你也可以直接在网关设备部署 完成你这些需求其实只需要一台物理设备,完全不需要 3 台设备和配置多个半虚拟机,你搞那么复杂,没太大的意义,徒增故障点 |
26
mouyase OP @iamwin
> 整个一套搞那么复杂,还用 fakeip 来污染 dns 解析,透明代理你可以在网关设备的防火墙里面配置 openvpn 、wireguard 和其他你也可以直接在网关设备部署,AdguardHome 这东西你也可以直接在网关设备部署 不知道你是否经历过一炸全炸的情况,在我这套配置里,OpenWRT 是完全作为一台普通的路由&网关设备存在的。旁路网关因为各种原因(IP 被封,程序故障)炸掉,是不会影响到国内网络访问的。 > 完成你这些需求其实只需要一台物理设备,完全不需要 3 台设备和配置多个半虚拟机,你搞那么复杂,没太大的意义,徒增故障点 我在文章里写了,设备可以根据你自己的情况选,你要是有服务器就开虚拟机咯。只不过我认为 150 元以内不存在可以满足这一切的服务器设备。150 元以内的软路由都很难跑满千兆网络。 |
27
iamwin 45 天前
@mouyase 我说的意思是你不仅不需要多台设备,也不需要任何虚拟机包括 docker 这种半虚拟机
你只需要一台 4567 代 i3i5 的电脑就能轻松跑满千兆,这种烂电脑几百块左右的多得是,很多人还有现成的老笔记本老办公机,为了压那一点点的成本去把整个网络配置搞复杂得不偿失 |
28
lower 45 天前
二手极路由,30 块钱,我觉得用起来很好😀
|
30
mouyase OP @iamwin
> 我说的意思是你不仅不需要多台设备,也不需要任何虚拟机包括 docker 这种半虚拟机 如果想要部署递归 DNS 用于抗污染,那一定需要启动一个本地的 DNS 服务,那这个服务不用 Docker ,难道是直接部署在物理机上吗?部署难度和维护难度不考虑一下吗? 其次,如果想要做国内外网络分流,并且国外网络故障时,不影响国内网络,那一定需要两个网关。 市面上的单设备透明代理全部是靠修改路由表+全部流量转发到代理工具然后再用代理工具的分流方案。 这种方案一会导致代理挂掉国内网络也无法访问,二会导致全部流量多一层 NAT ,三还会导致和一些游戏加速器有冲突。 就是为了要避免上面的几个问题,所以最后才会出现两个网关一个 Docker 这样的部署形式。 形式是为了达成目的,如果你没有这些目的那自然也不需要这么复杂的形式。 |
33
mouyase OP @lower 在单网关内部处理透明代理,就会导致一旦代理挂了,整个网络都会瘫痪,而且 NAT 会降级,对于一些 BT 软件,游戏联机之类的都不友好。
如果你用 NatTypeTester 检查 NAT 等级,一定不会是 FullCone. |
34
SkywalkerJi 45 天前
这方案没算 ap 啊,推荐点便宜的 ap 。
|
35
mouyase OP @SkywalkerJi
确实是没算 AP ,因为很多家庭用主路由自己的无线网就足够了,我买的那个只是因为天线坏了所以没无线。 实际上现在就算是好的同款机器也只要 60 块钱左右了,一直在降价。 如果有其他的比如 MESH 或者 ACAP 的方案需求,那就不在本文的讨论范围内了。 |
36
xuanjiangsara 45 天前
给动手能力强的人点赞,就算现在用不到。这个思路过程写的清晰看着舒服
|
37
MrLonely 45 天前 via iPhone
楼主,我想 rss 订阅你的 blog ,但是好像找不到订阅链接呀。
|
38
yyysuo 45 天前
感谢分享,很好,我也有一套方案,只需要 openwrt 就行了,根源也是泡泡的方案,你可以看看。另外有个问题,屏蔽掉对 FakeIP 的 NAT 是什么作用,防止回环吗?比如电报 IP ,主路由静态到网关,如果网关发回到主路由,肯定就炸了,是为了防止这种情况吗?
https://github.com/IrineSistiana/mosdns/discussions/837 |
40
mouyase OP @yyysuo
如果不屏蔽 NAT ,你在 Clash 里看到的来源 IP 将全部都是路由器的 IP ,这样不利于查看运行信息。 参考 https://github.com/kkkgo/PaoPaoGateWay/discussions/26 |
41
yyysuo 45 天前
@mouyase 哦,明白了。那刚才我说的那个问题,我的科学网关是 sing-box puer 版本,偶发的会出现我前帖说的问题,所以干脆把 dns 网关 主路由 3 合一了,本质上也是 fakeip 分流,分流用 mosdns ,就规避了这个问题。泡泡网关用的是 mihomo ,不知道有没有在防火墙规则中添加规则,防止电报 IP 这种再发回到主路由。
|
42
nilai 45 天前
对于纯 ip 的应用, 在路由表上有没有简便的方法?
目前的方式是不是这样子的? 通过抓包应用---->得到对应的纯 ip 的详细信息---->主路由添加纯 ip 目标到 fake 网关 有没有简单一点,不需要得到应用的纯 ip , 能否在主路由中写路由表类似 0.0.0.0/0 下一跳指向 fake 网关(网段可能没这么大) |
43
johnyoung24 45 天前 via Android
@Charkey +1🤣
|
44
yyysuo 45 天前
@nilai 目前已知的,就电报 IP 、netflix ip 、国外 dnsip 、fakeip 共 4 种需要设置路由表,加起来就几十个路由条目吧,如果全劫持,就要排除内网网段等 IP ,反而更麻烦,直接粘给你算了。
table inet singbox { set local_ipv4 { type ipv4_addr flags interval elements = { 28.0.0.0/8, 8.8.8.8/32, 8.8.4.4/32, 1.0.0.1/32, 1.1.1.1/32, 9.9.9.9/32, 8.41.4.0/24, 23.23.189.144/28, 23.246.0.0/18, 34.195.253.0/25, 37.77.184.0/21, 38.72.126.0/24, 45.57.0.0/17, 52.24.178.0/24, 52.35.140.0/24, 54.204.25.0/28, 54.213.167.0/24, 64.120.128.0/17, 66.197.128.0/17, 69.53.224.0/19, 103.87.204.0/22, 108.175.32.0/20, 185.2.220.0/22, 185.9.188.0/22, 192.173.64.0/18, 198.38.96.0/19, 198.45.48.0/20, 203.75.84.0/24, 203.198.13.0/24, 203.198.80.0/24, 207.45.72.0/22, 208.75.76.0/22, 210.0.153.0/24, 91.108.56.0/22, 91.108.4.0/22, 91.108.8.0/22, 91.108.16.0/22, 91.108.12.0/22, 149.154.160.0/20, 91.105.192.0/23, 91.108.20.0/22, 185.76.151.0/24, 95.161.64.0/20 } } set local_ipv6 { type ipv6_addr flags interval elements = { 2001:b28:f23d::/48, 2001:b28:f23f::/48, 2001:67c:4e8::/48, 2001:b28:f23c::/48, 2a0a:f280::/32, 2607:fb10::/32, 2620:10c:7000::/44, 2a00:86c0::/32, 2a03:5640::/32, fc00::/18 } } set router_ipv4 { type ipv4_addr flags interval elements = { 28.0.0.0/8, 8.8.8.8/32, 8.8.4.4/32, 1.0.0.1/32, 1.1.1.1/32, 9.9.9.9/32 } } set router_ipv6 { type ipv6_addr flags interval elements = { fc00::/18 } } chain singbox-tproxy { meta l4proto udp meta mark set 1 tproxy to :7895 accept } chain singbox-mark { meta mark set 1 } chain mangle-prerouting { type filter hook prerouting priority mangle; policy accept; ip daddr @local_ipv4 meta l4proto udp ct direction original goto singbox-tproxy ip6 daddr @local_ipv6 meta l4proto udp ct direction original goto singbox-tproxy } chain mangle-output { type route hook output priority mangle; policy accept; ip daddr @router_ipv4 meta l4proto udp ct direction original goto singbox-mark ip6 daddr @router_ipv6 meta l4proto udp ct direction original goto singbox-mark } chain nat-prerouting { type nat hook prerouting priority dstnat; policy accept; ip daddr @local_ipv4 meta l4proto tcp redirect to :7899 ip6 daddr @local_ipv6 meta l4proto tcp redirect to :7899 } chain nat-output { type nat hook output priority filter; policy accept; ip daddr @router_ipv4 meta l4proto tcp redirect to :7899 ip6 daddr @router_ipv6 meta l4proto tcp redirect to :7899 } } |
45
ssgooglg 45 天前
感觉很复杂的样子 我直接路由器刷了 clash 配置下规则就好了。
|
46
bobryjosin 45 天前 via Android
Openwrt+Routeros
op 跑在 pve 里面,ros 是硬件 rb5009 op 用 passwall tproxy 模式,dns 分流 dnsmasq chinadns-ng+adguard ros 和 op 走 vrrp ,op 离线 ros 切主路由。 原本准备换 ccr 用 bgp 拉全表 as 分流,后来想想上个网而已,就不整这么复杂了。 |
47
mouyase OP @nilai
如果这样做,就相当于把对所有 IP 的请求全部导向了旁路网关,这和我们想要的结果(国内外分流)是相违背的。 目前的做法是,设备要访问一个网站,会先向 PaoPaoDNS 请求解析地址,PaoPaoDNS 根据分流规则,分别到递归服务器和 FakeIP 上去解析。如果是国外的应用,会返回 FakeIP 。这样设备就会访问 FakeIP 。由于创建了静态路由表,所以 FakeIP 的请求流向了 PaoPaoGateWay 旁路网关。从而实现经由网关访问对应的网站。 但是 IP 应用由于没有 DNS 这一步,导致网络请求直接从普通网关流出而没有流向旁路网关。 所以需要对其 IP 设置静态路由表。 |
48
Charkey 45 天前
@johnyoung24 我发现服务 passwall 有时候需要重启下才能正常,不知道什么原因
|
49
yyysuo 45 天前
@bobryjosin 有个电报群的群友,之前大部分是你这个方案,现在全改 fakeip 网关了。
|
51
bobryjosin 45 天前
@yyysuo 我不想污染原本的 dns 解析,有时候根据 realip 能判断一些服务是否有效,fakeip 的入侵性太强了,而且我还有一部分 v4 和 v6 的段要走三层隧道,也不太可能维护两套 dns ,个人习惯问题 fakeip 不太适合我。
|
52
yyysuo 45 天前
@bobryjosin 入侵性太强不太理解,对于一个域名获取对应的 ip ,不管是真的还是假的,只有可达不可达两种状态,科学网关挂了,不管真假,都不会可达的,结果并没有不同,现在的 fakeip ,ttl 基本上给 1 ,没什么残余的影响;另外典型的 fakeip 网关,客户端的 dns 和网关都应该是主路由,不经过 dns 的 ip 直接发起来的连接,默认是直连的。
|
53
povsister 45 天前
@yyysuo
扶墙 != 无法直连访问 例如 Github 这种只是被劣化+间歇性 SNI 阻断,所以扶墙是为了改善体验。 Fakeip 要配合 FakeDNS ,DNS 自带不可控 cache ,很容易被各种奇怪的客户端软件缓存解析结果。 而且,扶墙梯重启的时候,不一定会保存之前的域名-IP 映射关系,那之前被客户端缓存的 IP 在重启后的梯子看来就是无效的。 综上,fakeip 问题很多,虽然其大幅度降低了拓扑配置门槛,也省掉了一个 DNS RTT (可以直接将域名送往远程服务器落地再解析),但我个人也拒绝 fakeip 的方案。 |
54
bobryjosin 45 天前
@yyysuo 比如我要判断一个网站是否用了 cf ,用了哪家 cdn ,如果返回的是 realip ,我能快速根据 ip 段判断,直接用浏览器插件就可以看,全是 fakeip 就不行了,还有很多类似的场景,所以说是个人习惯问题。
|
55
mouyase OP @bobryjosin
我猜你是把 FakeIP 这个操作和 Clash 的 FakeIP 模式绑定到一起了。实际上这两者并没有什么强关联。 Clash 是把所有网络请求全都引入到自身,然后在根据配置,选择 Real-IP 解析模式或者 FakeIP 解析模式。 如果是 Clash 的 FakeIP 解析,会把所有的网址全部解析为 FakeIP ,所以才会有你所谓的入侵性太强的问题,实际上这是 Clash 的问题而不是 FakeIP 的问题。 这套方案 DNS 是先在 PaoPaoDNS 上处理,而 PaoPaoDNS 只有国外(需要代理)的地址,才会送到 Clash 的 FakeIP 解析,其他的地址都是用递归服务器解析到真实 IP 的。而需要代理的地址,真实 IP 并不具备什么意义。如 @yyysuo 所说,只有可达和不可达两种状态。 |
56
mouyase OP @povsister
@bobryjosin 现在这个方案默认是将所有国外 IP 全部送去 FakeDNS 解析,也就是所谓的大陆白名单,但是如果你们的使用场景是有直连需求,那你们的方案应该是黑名单模式。那只把需要代理的地址送去 FakeDNS 解析就好了。 |
57
mouyase OP @povsister
@bobryjosin 需要 Real-IP = 可以直连 = PaoPaoDNS 直接解析 不能直连 = 可以使用 Fake-IP = PaoPaoDNS 使用 FakeIP 解析 这俩似乎并不冲突,而且在这个方案中也已经兼容了,只不过配置是需要修改一下的 |
58
povsister 45 天前
@mouyase
不管黑白,fakeip 总要污染一边,你只能说两害相权取其轻。但结果都是一样的,你选一边牺牲掉吧。 何况,这个黑白名单也不是 100%准确的,github 这种灰色的你到底怎么算,只能两边都牺牲掉。 |
59
mouyase OP @povsister
那这个时候问题就出现了,github 这种灰色的,是否能取到 Real-IP 呢,能取到说明可以直连,不能取到说明连不上,那走 Fake-IP 又有什么问题呢? 现在应该不存在什么方案可以在直连失败的时候自动切代理,检测到可以直连再自动关代理吧? 理论上不应该都是黑名单/白名单模式吗? |
60
johnyoung24 45 天前 via Android
@Charkey 换 clash 吧,passwall 和 ssrp 我用着也偶尔出现小问题
|
61
yyysuo 45 天前
@povsister 理论上如此,实际上你说的这些问题,基本上不存在了,特别是 fakeip 网关这个方案,体验极好,当然个人喜好是没有问题的,实在无聊的时候体验下,可能会有新的认识。
|
62
povsister 45 天前 1
@mouyase
哥们。。你是来分享方案的,对于别人指出的一些问题要正视。我和#51 都是认可 fakeip 的优点,不接受缺点,所以最终不采用 fakeip 方案。在这一点上,你也没必要按着别人头非要按你方案来吧。。 既然如此,来,这是我自用的方案,比你这个更胜一筹,全真 IP ,内网设备无需任何配置,自动容灾,单臂旁路由随便插拔不残留任何污染,你接受下? https://github.com/povsister/v2ray-core @yyysuo 体验上来说确实,省掉 DNS 一个 RTT 的体验是非常好的,还可以直接跳过 DNS 分流这种麻烦的步骤。 而且我提个你们可能都忽视的点,FakeIP 可以非常完美的应对“多个域名套同一个 CDN IP ,但是要针对不同域名走不同代理出口”这样的 case ,全真 IP+不嗅探流量的情况下,刚提到的 case 按域名精准分流是不可能解决的。何况后面 ECH 一普及,你想嗅探都没门咯。 |
63
yyysuo 45 天前
@mouyase 不在列表中的,带本地的 ecs ip 去 8888 解析,解析之后是国外 ip 再发 fakeip ,这个逻辑加上,体验就非常棒了,不知道泡泡 dns 有没有这么搞。
|
65
yyysuo 45 天前
@povsister 大佬来喽,之前就拜读过你的方案了,说实话,太高深了,v2 上能搞明白搞定的也不多吧,我也有个整套的方案(小白写的小白版本),大佬要部署也是分分钟,无聊试下呢? https://github.com/IrineSistiana/mosdns/discussions/837
dns 分流部分借助 mosdns: 1:国内域名列表的国内 dns 解析 2:国外域名列表的直发 fakeip 3:不在列表中的,带拨号的公网 IP 作为 ecs 发到 8888 ,返回国外 ip 的,丢弃,发 fakeip ,是国内 ip 就接受(很提升体验,借助谷歌 ecs 分流)。 openwrt 防火墙部分 只劫持电报 ip 、奈飞 ip 、8888 等国外 dns 、fakeip 去到 sing-box tproxy/redirect 入站。 |
66
povsister 45 天前
@yyysuo
👍千人千面,只要你个人觉得满足需求的就是好方案。就跟有人喜好 fakeip 一把梭,有人痛恨 fakeip 从而对我开发的方案欣喜若狂一样。 但我无法接受 fakeip 所以可能不会尝试,其他方面的配置思路是和你一样的:预定义域名列表内的域名走国内外分流,未知域名通过多次 DNS 回退查询选择更合适的响应。 |
67
mouyase OP @povsister
刚刚看了一圈你的方案,有点牛逼的,讲道理是很想部署一下试试的。 但是方案里面主路由用的是 ROS ,这个东西自己玩不太转,也不太好安利。并且硬路由不是很好搞。这东西能替换成 iKuai 或 OpenWRT 吗? |
71
povsister 45 天前
|
72
mouyase OP @povsister 有个疑问,这个方案,是不是还是需要黑白名单?只不过没有用 Fake-IP 而且返回 Real-IP 之后再去连接的?
|
73
povsister 45 天前 via iPhone
@mouyase
要不要黑白名单,想怎么去分流完全取决于你怎么配置。 我只是开发并提供了一套机制。示例配置是 gfw 黑名单走 proxy ,其他域名直连+dns 回退防止 dns 污染。如果想黑名单无条件走海外 DNS+ECS ,自行改下配置即可。 是的,无论黑白,返回均为真实 ip ,是否要连接取决于客户端自己,需要代理访问的真实 IP 会由 DNS Route 机制自动完成透明代理的搭建,真正访问时就是无感通过透明代理访问。 |
74
eastcukt 45 天前 via Android
nb ,没一个星期折腾不下来
|
75
bobryjosin 45 天前
@yyysuo 楼上的那位老哥把我想说的说清楚了,fakeip 对于常规端口,优势非常明显,之前放弃 fakeip 的其中原因是游戏的 udp 数据包,会出现数据包不通过代理核心,虽然这个可以通过静态路由解决,但是 tproxy 能更无感的解决这个问题,且不需要去查日志重写规则,根据 ip 拦截转发到核心非常精准,我还遇到过有些服务会去校验 PTR 记录,这时候返回 fakeip 是肯定不行的,理论上配置重写 dns 可以解决这个问题,但很麻烦。
|
76
bobryjosin 45 天前
说到底,fakeip 不是很优雅,因为破坏了域名->DNS->IP 这个关系,不过这确实适用普通上网环境,更进阶的比如专线这种三层直通网络,fakeip 就有局限了。
|
77
yyysuo 45 天前 via iPhone
@bobryjosin 游戏通过 ip 直连种确实不好弄,不玩游戏不知道有没有 ip 直连的
|
78
Dk2014 45 天前 via Android
4 月就在用这套了,唯一的缺点就是 gateway 必须跑在 x86 机器上,直接断了用 arm 设备跑的念想
县城有 5600g 的 all in boom 倒没问题,老家就不好搞了,有个闲置的 nanopc-t4 也没啥用处 另外我 gateway 也是走 suburl 加了 subconvert 规则的,没有单纯的走全局,方便针对不同服务调节点 |
81
chenbin36255 45 天前
物理机安装 ikuai x64
自带虚拟机+docker 可以做到 ikuai+paopaogateway+paopaodns 一体化 爱快自带 http 服务 可以放 gateway 配置 custom.yaml 节点配置拉取 |
82
mouyase OP @chenbin36255 iKuai 的虚拟机性能比较差,Docker 也比较难用。低价的 iKuai 开的虚拟机肯定是不如物理机的性能强的。不过我就是你说的这样部署的,网络设施都在一起,比较好维护。
|
84
bitfly 45 天前 via Android
直接 openwrt & xray & ADH(最新版)里 对域名进行分流解析就好了
还可以设置多个国内的 doh/dot 来分担解析压力 搞那么多干啥呢 |
86
neroxps 44 天前 via iPhone
同方案,在没有 PaoPaoDNS 我是用别人写的 coredns 读 clash 配置的插件来工作,正常运行 3 年了
|
87
yyysuo 44 天前
|
89
chenbin36255 44 天前
@mouyase #82 那可以用 pve 做底层 其实是一样的
|
90
rulagiti 44 天前
看不得这些乱七八糟的,mosdns+iptables 手搓
|
91
RoccoShi 44 天前
真折腾啊。。
|
92
Dk2014 44 天前 via Android
楼上没搞明白啊,这套配置优点在于可以做成非侵入式的
只要你不走 paopaodns ,默认就是主路由的 dns 和网关 只有 dns 换到 paopaodns 了,那就会把国外域名全部解析到 fakeip ,然后由主路由的路由表转到 gateway 的 clash 上面去 要下发 dns ,主路由不能是国产那些原厂系统,换成 op 和 ros 都可以做到 我家里就是只有我的设备走 paopao ,父母手机和一些 iot 设备都是默认 dns 和网关,这样即使挂了也不会影响到他们 |
93
byuan04 44 天前
买个 n5105 4 口 2.5G .... 准系统才 350...
|
94
ynxh 44 天前
有没有简单点的,卧槽
|
95
Xymmh 44 天前 via Android
过于复杂了,immortalwrt+homeproxy+smartdns+zerotier 就完美实现了我的需求
|
96
hsczy 43 天前 via Android
大佬咨询一下。您的 openwrt 是作为旁路由还是主路由?
|
97
ChaosAttractor 42 天前
AdguardHome 的全部功能就是一个 DNS 转发器+DNS Filter+前端,刨除前端部分,dnsmasq 都能实现过滤,而 mosdns/knot-resolver 则健壮的多
此外旁路由...非对称路由警告, 入站流量不能 Conntrack 警告 |
98
mouyase OP @hsczy #96
主路由 @ChaosAttractor #97 AdguardHome 仅为了给局域网设备分配不同的上游 DNS ,以及去广告使用。上游 DNS 是 PaoPaoDNS 方案(基于 unbound 和 mosdns)。 旁路网关仅作为出国转发使用,入站流量不会经过旁路网关。 |