J4125 All In One主机安装软路由和代理分流的网络配置

本期为软路由系列的第二期,介绍All In One主机的网络环境与软路由网络相关配置。分为主路由的网络网络配置与旁路由的代理分流配置。

网络架构

网络拓扑

AIO网络拓扑

结合上期,位于客厅的软路由下接8+1光交换机,并用光纤连接至位于弱电箱的交换机用于连接各网络面板。两交换机间另使用网线相连作为冗余备用,这要求环路中的其中一台交换机具有环路功能

布网时每个86面板预留一条CAT6网线和两条单模光纤,光模块选择拆机LC双纤光模块。

网络设备

  • 面板:末端光纤冷接,可以直接选择如下的法兰,插在普通的两口网络面板上。注意不要买倾斜开口的面板,这会导致打好冷接头的光纤由于86暗盒空间限制而不能插在面板上。若平式面板依然空间不足,可以考虑使用下面的异型86面板,将光纤盘在明盒中。

    光纤法兰耦合器

    双口网络面板

    明盒网络面板

    明盒安装效果

  • 交换机:兮克2.5G交换机 8+1光 非管理(SKS1200-8GPY1XF)、8+1光管理型(SKS3200M-8GPY1XF)

    弱电箱布局

  • PC:另购2.5G螃蟹8156bUSB网卡,网卡驱动下载参见:TANK TR8156N Realtek USB RTL8156B 2.5G网卡 全系统驱动安装使用教程 - Tank电玩&米多贝克 (mi-d.cn),这种2.5G网卡只是用默认驱动会导致不能跑满带宽。

主路由设置

DHCP与DNS配置

内网中架设AdGuard Home负责DNS解析,因此将路由DNS指向AdGuard服务器,并勾选DNS加速

iKuai DNS设置

为了区分正常用户与需要走旁路由代理的用户,将路由分为两个DHCP池,普通用户网关为主路由,DNS指向AdGuard;需要走代理的用户通过DHCP与MAC绑定接入第二个DHCP池,网关、DNS指向旁路由。这样即便旁路由挂了也不影响正常设备上网。

iKuai DHCP设置

内网访问光猫

使路由能够DHCP到光猫的网段IP,能够互相通信。

参考:通过ikuai访问光猫管理界面

内外网设置——外网设置WAN1,接入方式选择基于物理网卡的混合模式,添加PPPoE拨号配置adsl1,同时添加DHCP配置vwan1。将PPPoE设置开启默认网关。这样软路由的WAN口会获取到光猫DHCP分配的IP地址。

防火墙

参见: iKuai爱快的IPv6防火墙设置,允许规则优先于阻断。iKuai默认不启用IPv6防火墙,必须要添加的规则:

  • 禁止公网通过IPv6访问本地
  • 允许本地通过IPv6访问公网
  • 允许特定协议/端口通过IPv6访问内网特定用户
::32c/::FFFF:FFFF:FFFF:FFFF #nginx
::741/::FFFF:FFFF:FFFF:FFFF #qbittorrent
::b05/::FFFF:FFFF:FFFF:FFFF #debian12

应用访问控制

在路由层面上禁用STUN、P2P和去广告。网页端阻止泄露IP可以使用防WebRTC泄露插件:WebRTC Control (google.com)

iKuai应用协议控制


接下来是代理与分流配置。

主路由代理分流(不采用)

参考:iKuai与Openwrt的有机结合:传统旁路由方案的完美替代 | JackieWu

缺点:主路由分出两个WAN口,代理数据多走一层NAT

旁路由代理分流

旁路由使用OpenClash软件做代理,同时在旁路由上启用基于DNS或流量嗅探的分流,使中国大陆的流量不过核心。

iStore扩展插件包: https://github.com/AUK9527/Are-u-ok/tree/main/x86

防火墙分流

iptables 只通过国内ipv6:探讨下有没有国内流量保留 ipv6, 国外流量禁用 ipv6 的优雅姿势 - V2EX,仅作参考

ip6tables -F FORWARD
ip6tables -I FORWARD -d 240e::/18 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 2408:8000::/20 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 2409:8000::/20 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 240a:c000::/20 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 240c:c000::/20 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 240a:4000::/21 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 240a:8000::/21 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 240b:8000::/21 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 240c:8000::/21 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 240d:4000::/21 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 2408:4000::/22 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 240c:4000::/22 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 240d:8000::/24 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 240f:4000::/24 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 240f:8000::/24 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 2400:dd00::/28 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 240c::/28 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 2001:4510::/29 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 2400:a980::/29 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 2a0c:f480::/29 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 2a0d:2480::/29 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 2406:cf00::/30 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 2001:250::/31 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 2001:da8::/31 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -d 2403:800::/31 -j ACCEPT -m comment --comment "CHINA MAINLAND ipv6"
ip6tables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
ip6tables -A FORWARD -j REJECT

MosDNS分流

在旁路由上搭建MosDNS服务器来做DNS分流。

参考:
AdGuard-->MosDNS-->dnsmasq(主路由):基于 DNS 的内网透明代理分流方案 (songchenwen.com)
AdGuard-->dnsmasq-->MosDNS:OPenWRT 旁路由+MosDNS+open克拉什+AdGuard Home 傻瓜配置图文教程-恩山无线论坛
搭建公网DNS服务器:利用 Mosdns 和 AdGuardHome 搭建自己的 DNS (xukecheng.tech)
dnsmasq-->OpenClash-->AdGuard-->MosDNS:OpenWrt: OpenClash + AdGuardHome + MosDNS + IPv6 共存配置

这里采用的方案:AdGuard-->dnsmasq-->MosDNS-->OpenClash Fake-IP,不需要分流的设备使用AdGuard192.168.2.11,利用缓存和DoH/DoT请求国内DNS;需分流设备送至旁路由192.168.2.2,经MosDNS分流后决定走Clash或是国内。

graph TD
subgraph s1[AdGuard 192.168.2.11]
B(AdGuard <br>53)
end

subgraph s2[旁路由 192.168.2.2]
C(dnsmasq <br>53)
D(MosDNS <br> 5335)
F[Fallback]
Cl(Clash Fake-IP <br> 7874)
R[\Drop IPv6/]
end

A1[DNS Request]-->B
B-->|需分流设备|C
B--->|不分流设备|L
A[DNS Request]--->C-->D
D-->|国内ip|L[国内上游DNS]
D-->|国内域名|L
D-->|白名单|L
D-->|未知|F[Fallback]
F-->|国内ip|L
F-->|国外ip|R
D-->|国外ip|R
D-->|国外域名|R
D-->|黑名单|R
R-->Cl-->Out[国外上游DNS]

缺点:AdGuard与MosDNS处均有缓存

优点:旁路由失效不影响正常设备上网

本方式还需要设置OpenClash防火墙规则,只允许fake-ipip流量转发到Clash

iptables -t nat -D openclash -p tcp -j REDIRECT --to-ports $proxy_port
#iptables -t nat -A openclash -m set --match-set telegram dst -p tcp -j REDIRECT --to-ports $proxy_port

Clash DNS分流

采取方案:dnsmasq-->OpenClash-->AdGuard,用Clash的绕过大陆功能代替MosDNS分流。

启用OpenClash的绕过中国大陆功能,自定义DNS里Nameserver仅开启AdGuard Home,Fallback可勾选Cloudflare相关的。

  • DNS请求流程:
graph LR
subgraph s1[AdGuard LXC 192.168.2.11]
B(AdGuard <br>53)
end

subgraph s2[旁路由 192.168.2.2]
C(dnsmasq <br>53)
D(Clash DNS <br> 7874)
F[Fallback]
Cl(Clash Redirect <br> 7892)


end

A1[DNS Request]---->B
B--->|General|L[国内上游DNS <br> DoH DoT]
B-.->|需分流设备|C

A[DNS Request]-->C-->D
D-->|国内域名|B
Cl-->Out[国外上游DNS <br> DoH DoT]
D-->|国外域名|Cl
D-->|未知|F-->Cl

  • 流量转发流程:
graph LR
A[tcp udp包]

subgraph s1[旁路由 192.168.2.2]
fw[防火墙]-->|国外ip|R
fw-->|国外域名|R
fw-->|命中规则|R
fw--->|国内ip|C(出口)
fw--->|国内域名|C
R{{Drop IPv6}}-->B
B(Clash Redirect <br> 7892)
end

subgraph s2[主路由 192.168.2.1]
NAT(NAT)
end
NAT-->Internet
A-->fw
B-->|代理数据|NAT
C-->|原数据|NAT

Openclash自动添加的NAT表

-A openclash -m set --match-set localnetwork dst -j RETURN
-A openclash -m set --match-set china_ip_route dst -m set ! --match-set china_ip_route_pass dst -j RETURN
-A openclash -p tcp -j REDIRECT --to-ports 7892
-A openclash_output -d 198.18.0.0/16 -p tcp -m owner ! --uid-owner 65534 -j REDIRECT --to-ports 7892
-A openclash_output -m set --match-set localnetwork dst -j RETURN
-A openclash_output -m owner ! --uid-owner 65534 -m set --match-set china_ip_route dst -m set ! --match-set china_ip_route_pass dst -j RETURN
-A openclash_output -p tcp -m owner ! --uid-owner 65534 -j REDIRECT --to-ports 7892

国内流量不过Clash核心。

AdGuard

配置上游DNS并开启乐观缓存。

Surge/Loon/Quantumult x

这些软件可在iOS客户端运行或在Mac mini上运行,充当软路由。与Clash相比在于多了插件/模块,可用于URL重写/中间人攻击/脚本,进而精确地去广告或解除地区限制。

推荐几个好用的Loon插件/模块/脚本:

Open Clash设置

Open Clash官方Wiki:https://github.com/vernesong/OpenClash/wiki/

配置文件结构

  • proxies 节点列表,包括机场订阅和自建节点
  • proxies-group 策略组,用于选择特定服务的出口

    • select 手动选择
    • url-test 自动选择延迟最低的节点
    • 苹果 选择特定服务的出口
  • proxies-provider 订阅来源
  • rules 规则

    • RULE-SET,Spotify: 直连
    • RULE-SET,Apple: 苹果
  • rules-provider 规则集

    • Apple
    • Telegram
    • Spotify
    • 游戏
  • dns

    • nameserver
    • fallback

基础设置

订阅、订阅转换

内核、代理模式

DNS、绕过大陆

高级设置

规则集

bbr阻塞控制

  • linux开启bbr

    echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
    echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
    sysctl -p
    sysctl net.ipv4.tcp_congestion_control