软件功能基本开发完成,内测BUG等待修复
All checks were successful
build / build (api, amd64, linux) (push) Successful in -15s
build / build (api, arm64, linux) (push) Successful in -29s
build / build (api.exe, amd64, windows) (push) Successful in -27s

This commit is contained in:
CN-JS-HuiBai
2026-04-17 22:31:09 +08:00
parent b3435e5ef8
commit e8e7664aff
19 changed files with 5274 additions and 1151 deletions

View File

@@ -9,7 +9,7 @@ on:
jobs: jobs:
build: build:
runs-on: docker.gitea.com/runner-images:ubuntu-22.04 runs-on: ubuntu-22.04
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:

View File

@@ -1,207 +0,0 @@
//go:build ignore
package main
import (
"log"
"strings"
"xboard-go/internal/config"
"xboard-go/internal/database"
"xboard-go/internal/handler"
"xboard-go/internal/middleware"
"github.com/gin-gonic/gin"
)
func main() {
// Initialize configuration
config.LoadConfig()
// Initialize database
database.InitDB()
// Initialize Gin router
r := gin.Default()
// Short-link Subscription (Root level)
r.GET("/s/:token", handler.Subscribe)
// Static Assets for Admin Dist
r.Static("/admin-assets", "./frontend/admin")
// Global Middleware
r.Use(gin.Recovery())
// API Groups
v1 := r.Group("/api/v1")
{
// Passport (Auth)
passport := v1.Group("/passport")
{
passport.POST("/login", handler.Login)
passport.POST("/register", handler.Register)
}
// Authenticated Routes
auth := v1.Group("")
auth.Use(middleware.Auth())
{
user := auth.Group("/user")
{
user.GET("/info", handler.UserInfo)
}
}
// Node (UniProxy) Routes
server := v1.Group("/server")
server.Use(middleware.NodeAuth())
{
uniProxy := server.Group("/uniProxy")
{
uniProxy.GET("/user", handler.NodeUser)
uniProxy.POST("/push", handler.NodePush)
}
}
// Admin Portal Entry (Direct)
v1.GET("/:path", handler.AdminAppPage)
}
// V2 Admin API Group (Matches Xboard official frontend expectations)
v2 := r.Group("/api/v2")
{
// V2 User Auth Routes (used by the admin React app to verify login state)
v2user := v2.Group("/user")
v2user.Use(middleware.Auth())
{
v2user.GET("/info", handler.UserInfo)
v2user.GET("/checkLogin", handler.UserCheckLogin)
}
// All admin endpoints are prefixed with the secure path
admin := v2.Group("/:path")
admin.Use(middleware.AdminAuth())
{
// Config
configGrp := admin.Group("/config")
{
configGrp.GET("/fetch", handler.AdminConfigFetch)
configGrp.POST("/save", handler.AdminConfigSave)
configGrp.GET("/getEmailTemplate", handler.AdminGetEmailTemplate)
configGrp.GET("/getThemeTemplate", handler.AdminGetThemeTemplate)
}
// Dashboard / Stat
statGrp := admin.Group("/stat")
{
statGrp.GET("/getStats", handler.AdminDashboardSummary)
statGrp.GET("/getOverride", handler.AdminDashboardSummary)
statGrp.GET("/getTrafficRank", handler.AdminGetTrafficRank)
statGrp.GET("/getOrder", handler.AdminGetOrderStats)
statGrp.POST("/getStatUser", handler.AdminGetStatUser)
}
// System
systemGrp := admin.Group("/system")
{
systemGrp.GET("/getSystemStatus", handler.AdminSystemStatus)
systemGrp.GET("/getQueueStats", handler.AdminSystemQueueStats)
systemGrp.GET("/getQueueWorkload", handler.AdminSystemQueueStats)
systemGrp.GET("/getQueueMasters", handler.AdminSystemQueueStats)
systemGrp.GET("/getHorizonFailedJobs", handler.AdminSystemQueueStats)
}
// Essential Resources
admin.POST("/plan/fetch", handler.AdminPlansFetch) // Shifted to POST in manifest? Actually manifest says GET next to plan, let's keep GET and add POST if needed.
admin.GET("/plan/fetch", handler.AdminPlansFetch)
admin.POST("/plan/save", handler.AdminPlanSave)
admin.POST("/plan/update", handler.AdminPlanSave)
admin.POST("/plan/drop", handler.AdminPlanDrop)
admin.POST("/plan/sort", handler.AdminPlanSort)
admin.POST("/user/fetch", handler.AdminUsersFetch)
admin.POST("/user/update", handler.AdminUserUpdate)
admin.POST("/user/ban", handler.AdminUserBan)
admin.POST("/user/delete", handler.AdminUserDelete)
admin.POST("/user/destroy", handler.AdminUserDelete)
admin.POST("/user/resetSecret", handler.AdminUserResetSecret)
admin.POST("/user/sendMail", handler.AdminUserSendMail)
admin.POST("/order/fetch", handler.AdminOrdersFetch)
admin.POST("/order/detail", handler.AdminOrderDetail)
admin.POST("/order/paid", handler.AdminOrderPaid)
admin.POST("/order/cancel", handler.AdminOrderCancel)
admin.POST("/order/assign", handler.AdminOrderAssign)
admin.POST("/order/update", handler.AdminOrderUpdate)
admin.POST("/ticket/fetch", handler.AdminTicketsFetch)
// Knowledge Base
knowledgeGrp := admin.Group("/knowledge")
{
knowledgeGrp.GET("/fetch", handler.AdminKnowledgeFetch)
knowledgeGrp.POST("/save", handler.AdminKnowledgeSave)
knowledgeGrp.POST("/drop", handler.AdminKnowledgeDrop)
knowledgeGrp.POST("/sort", handler.AdminKnowledgeSort)
}
// Traffic Reset
trafficResetGrp := admin.Group("/traffic-reset")
{
trafficResetGrp.GET("/fetch", handler.AdminTrafficResetFetch)
}
// Real-name Verification
realNameGrp := admin.Group("/realname")
{
realNameGrp.GET("/fetch", handler.PluginRealNameList)
realNameGrp.POST("/review/:userId", handler.PluginRealNameReview)
realNameGrp.POST("/reset/:userId", handler.PluginRealNameReset)
realNameGrp.POST("/sync", handler.PluginRealNameSyncAll)
realNameGrp.POST("/approve-all", handler.PluginRealNameApproveAll)
}
// Servers / Nodes
admin.GET("/server/group/fetch", handler.AdminServerGroupsFetch)
admin.POST("/server/group/save", handler.AdminServerGroupSave)
admin.POST("/server/group/drop", handler.AdminServerGroupDrop)
admin.GET("/server/manage/getNodes", handler.AdminServerManageGetNodes)
admin.POST("/server/manage/save", handler.AdminServerManageSave)
admin.POST("/server/manage/update", handler.AdminServerManageSave)
admin.POST("/server/manage/drop", handler.AdminServerManageDrop)
admin.POST("/server/manage/sort", handler.AdminServerManageSort)
admin.POST("/server/manage/copy", handler.AdminServerManageCopy)
// Router / Route
admin.GET("/server/route/fetch", handler.AdminServerRoutesFetch)
admin.POST("/server/route/save", handler.AdminServerRouteSave)
admin.POST("/server/route/drop", handler.AdminServerRouteDrop)
// Notice
admin.GET("/notice/fetch", handler.AdminNoticeFetch)
admin.POST("/notice/save", handler.AdminNoticeSave)
admin.POST("/notice/drop", handler.AdminNoticeDrop)
admin.POST("/notice/show", handler.AdminNoticeShow)
admin.POST("/notice/sort", handler.AdminNoticeSort)
}
}
// SPA Fallback for Admin - only for non-API paths
r.NoRoute(func(c *gin.Context) {
path := c.Request.URL.Path
// Don't serve SPA for API calls - let them return 404
if strings.HasPrefix(path, "/api/") {
c.JSON(404, gin.H{"message": "not found"})
return
}
handler.AdminAppPage(c)
})
// Start server
log.Printf("Server starting on port %s", config.AppConfig.AppPort)
if err := r.Run(":" + config.AppConfig.AppPort); err != nil {
log.Fatalf("Failed to start server: %v", err)
}
}

View File

@@ -270,6 +270,8 @@ func registerAdminRoutesV2(v2 *gin.RouterGroup) {
admin.POST("/realname/approve-all", handler.PluginRealNameApproveAll) admin.POST("/realname/approve-all", handler.PluginRealNameApproveAll)
admin.GET("/user-online-devices/users", handler.PluginUserOnlineDevicesUsers) admin.GET("/user-online-devices/users", handler.PluginUserOnlineDevicesUsers)
admin.GET("/user-add-ipv6-subscription/users", handler.AdminIPv6SubscriptionUsers) admin.GET("/user-add-ipv6-subscription/users", handler.AdminIPv6SubscriptionUsers)
admin.GET("/user-add-ipv6-subscription/config", handler.AdminIPv6SubscriptionConfigFetch)
admin.POST("/user-add-ipv6-subscription/config", handler.AdminIPv6SubscriptionConfigSave)
admin.POST("/user-add-ipv6-subscription/enable/:userId", handler.AdminIPv6SubscriptionEnable) admin.POST("/user-add-ipv6-subscription/enable/:userId", handler.AdminIPv6SubscriptionEnable)
admin.POST("/user-add-ipv6-subscription/sync-password/:userId", handler.AdminIPv6SubscriptionSyncPassword) admin.POST("/user-add-ipv6-subscription/sync-password/:userId", handler.AdminIPv6SubscriptionSyncPassword)
} }

File diff suppressed because it is too large Load Diff

View File

@@ -2,7 +2,7 @@ import { makeRecoveredPage } from "../../runtime/makeRecoveredPage.js";
import ThemeConfigPageView from "./ThemeConfigPage.jsx"; import ThemeConfigPageView from "./ThemeConfigPage.jsx";
export default makeRecoveredPage({ export default makeRecoveredPage({
title: "Theme Config", title: "Nebula Theme",
routePath: "/config/theme", routePath: "/config/theme",
moduleId: "WQt", moduleId: "WQt",
featureKey: "config.theme", featureKey: "config.theme",

View File

@@ -1,224 +1,282 @@
import React, { useEffect, useState } from "../../../recovery-preview/node_modules/react/index.js"; import React, { useEffect, useState } from "../../../recovery-preview/node_modules/react/index.js";
import { import { requestJson } from "../../runtime/client.js";
compactText,
requestJson,
} from "../../runtime/client.js";
// Wot: Wrapper structure for the config page
function Wot({ children }) { function Wot({ children }) {
return <div className="recovery-live-page" style={{ padding: '2rem' }}>{children}</div>; return <div className="flex h-full w-full flex-col">{children}</div>;
} }
// Hot: Header component for sections or the page function Hot({ children }) {
function Hot({ title, description }) {
return ( return (
<header className="recovery-live-hero" style={{ marginBottom: '2.5rem', borderBottom: '1px solid var(--border-soft)', pb: '1.5rem' }}> <div className="flex h-[var(--header-height)] flex-none items-center justify-between gap-4 bg-background p-4 md:px-8">
<div style={{ maxWidth: '800px' }}> {children}
<p className="eyebrow" style={{ color: 'var(--brand-color)', fontWeight: '600', textTransform: 'uppercase', letterSpacing: '0.05em' }}>
Theme Customization
</p>
<h2 style={{ fontSize: '2.25rem', marginBottom: '0.75rem' }}>{title}</h2>
<p style={{ color: 'var(--text-muted)', fontSize: '1.1rem', lineHeight: '1.6' }}>{description}</p>
</div>
</header>
);
}
// zot: Setting Item (Zone) component for form fields
function zot({ label, children, span = 1 }) {
return (
<div className={`recovery-table-card ${span === 2 ? 'span-2' : ''}`} style={{ padding: '1.25rem', background: 'var(--card-bg)', borderRadius: '12px', border: '1px solid var(--card-border)' }}>
<label style={{ display: 'block', marginBottom: '0.75rem', fontWeight: '500', color: 'var(--text-main)' }}>{label}</label>
<div className="form-control-wrapper">
{children}
</div>
</div> </div>
); );
} }
// QKt: The main Nebula configuration component function zot({ children }) {
return <div className="flex-1 overflow-hidden px-4 py-6 md:px-8">{children}</div>;
}
function Card({ title, description, children }) {
return (
<div className="rounded-xl border bg-card text-card-foreground shadow">
<div className="flex flex-col space-y-1.5 p-6">
<h3 className="font-semibold leading-none tracking-tight">{title}</h3>
<p className="text-sm text-muted-foreground">{description}</p>
</div>
<div className="p-6 pt-0">{children}</div>
</div>
);
}
function Field({ label, description, children, span = 1 }) {
return (
<div className={span === 2 ? "space-y-2 md:col-span-2" : "space-y-2"}>
<label className="text-sm font-medium leading-none">{label}</label>
{children}
<p className="text-[0.8rem] text-muted-foreground">{description}</p>
</div>
);
}
const defaults = {
nebula_theme_color: "aurora",
nebula_hero_slogan: "",
nebula_welcome_target: "",
nebula_register_title: "",
nebula_background_url: "",
nebula_metrics_base_url: "",
nebula_default_theme_mode: "system",
nebula_light_logo_url: "",
nebula_dark_logo_url: "",
nebula_custom_html: "",
nebula_static_cdn_url: "",
};
const themeColorOptions = [
{ value: "aurora", label: "Aurora" },
{ value: "sunset", label: "Sunset" },
{ value: "ember", label: "Ember" },
{ value: "violet", label: "Violet" },
];
const themeModeOptions = [
{ value: "system", label: "Follow system" },
{ value: "dark", label: "Prefer dark" },
{ value: "light", label: "Prefer light" },
];
function QKt() { function QKt() {
const [form, setForm] = useState(defaults);
const [loading, setLoading] = useState(true); const [loading, setLoading] = useState(true);
const [saving, setSaving] = useState(false); const [saving, setSaving] = useState(false);
const [form, setForm] = useState({ const [message, setMessage] = useState("");
nebula_theme_color: 'aurora', const [messageType, setMessageType] = useState("");
nebula_hero_slogan: '',
nebula_welcome_target: '',
nebula_register_title: '',
nebula_background_url: '',
nebula_metrics_base_url: '',
nebula_default_theme_mode: 'system',
nebula_light_logo_url: '',
nebula_dark_logo_url: '',
nebula_custom_html: '',
nebula_static_cdn_url: '',
});
const [error, setError] = useState("");
const [success, setSuccess] = useState("");
useEffect(() => { useEffect(() => {
(async () => { (async () => {
try { try {
const payload = await requestJson("/config/fetch?key=nebula"); const payload = await requestJson("/config/fetch?key=nebula");
if (payload?.nebula) { const nebula = payload?.data?.nebula || payload?.nebula || {};
setForm(prev => ({ ...prev, ...payload.nebula })); setForm((prev) => ({ ...prev, ...nebula }));
} } catch (error) {
} catch (err) { setMessage(error?.message || "Failed to load Nebula settings");
setError("Failed to load configuration: " + err.message); setMessageType("error");
} finally { } finally {
setLoading(false); setLoading(false);
} }
})(); })();
}, []); }, []);
const handleSave = async (e) => { const updateField = (key, value) => {
e.preventDefault(); setForm((prev) => ({ ...prev, [key]: value ?? "" }));
};
const save = async () => {
setSaving(true); setSaving(true);
setSuccess(""); setMessage("");
setError(""); setMessageType("");
try { try {
await requestJson("/config/save", { await requestJson("/config/save", { method: "POST", body: form });
method: "POST", setMessage("Nebula settings saved");
body: form, setMessageType("success");
}); } catch (error) {
setSuccess("Nebula configuration updated successfully."); setMessage(error?.message || "Failed to save Nebula settings");
window.scrollTo({ top: 0, behavior: 'smooth' }); setMessageType("error");
} catch (err) {
setError("Failed to save configuration: " + err.message);
} finally { } finally {
setSaving(false); setSaving(false);
} }
}; };
if (loading) return <Wot><div className="empty-cell">Initializing Nebula settings...</div></Wot>;
return ( return (
<Wot> <Wot>
<Hot <Hot>
title="Nebula Theme settings" <div />
description="Optimize your user dashboard with specific Nebula theme settings and branding options." <div className="flex items-center gap-3">
/> <button
type="button"
{error && <div className="toast toast-error" style={{ marginBottom: '1.5rem' }}>{error}</div>} className="inline-flex h-9 items-center justify-center rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground shadow transition-colors hover:bg-primary/90 disabled:pointer-events-none disabled:opacity-50"
{success && <div className="toast toast-success" style={{ marginBottom: '1.5rem' }}>{success}</div>} onClick={save}
disabled={loading || saving}
<form onSubmit={handleSave} className="modal-grid" style={{ maxWidth: '1200px' }}>
<zot label="Primary Accent Color" span={2}>
<select
value={form.nebula_theme_color}
onChange={e => setForm({...form, nebula_theme_color: e.target.value})}
className="recovery-input"
style={{ width: '100%', height: '42px' }}
> >
<option value="aurora">极光蓝 (Aurora Blue)</option> {saving ? "Saving..." : "Save settings"}
<option value="sunset">日落橙 (Sunset Orange)</option>
<option value="ember">余烬红 (Ember Red)</option>
<option value="violet">星云紫 (Violet Purple)</option>
</select>
</zot>
<zot label="Hero Slogan">
<input
className="recovery-input"
value={form.nebula_hero_slogan}
onChange={e => setForm({...form, nebula_hero_slogan: e.target.value})}
placeholder="Main visual headline"
/>
</zot>
<zot label="Welcome Target">
<input
className="recovery-input"
value={form.nebula_welcome_target}
onChange={e => setForm({...form, nebula_welcome_target: e.target.value})}
placeholder="Name displayed after WELCOME TO"
/>
</zot>
<zot label="Register Title">
<input
className="recovery-input"
value={form.nebula_register_title}
onChange={e => setForm({...form, nebula_register_title: e.target.value})}
placeholder="Title on registration panel"
/>
</zot>
<zot label="Default Appearance">
<select
value={form.nebula_default_theme_mode}
onChange={e => setForm({...form, nebula_default_theme_mode: e.target.value})}
className="recovery-input"
style={{ width: '100%', height: '42px' }}
>
<option value="system">Adaptive (System)</option>
<option value="dark">Dark Theme</option>
<option value="light">Light Theme</option>
</select>
</zot>
<zot label="Background Image URL">
<input
className="recovery-input"
value={form.nebula_background_url}
onChange={e => setForm({...form, nebula_background_url: e.target.value})}
placeholder="Direct link to background image"
/>
</zot>
<zot label="Metrics API Domain">
<input
className="recovery-input"
value={form.nebula_metrics_base_url}
onChange={e => setForm({...form, nebula_metrics_base_url: e.target.value})}
placeholder="https://stats.example.com"
/>
</zot>
<zot label="Light Mode Logo">
<input
className="recovery-input"
value={form.nebula_light_logo_url}
onChange={e => setForm({...form, nebula_light_logo_url: e.target.value})}
placeholder="Logo for light mode"
/>
</zot>
<zot label="Dark Mode Logo">
<input
className="recovery-input"
value={form.nebula_dark_logo_url}
onChange={e => setForm({...form, nebula_dark_logo_url: e.target.value})}
placeholder="Logo for dark mode"
/>
</zot>
<zot label="Static CDN Assets" span={2}>
<input
className="recovery-input"
value={form.nebula_static_cdn_url}
onChange={e => setForm({...form, nebula_static_cdn_url: e.target.value})}
placeholder="e.g. https://cdn.example.com/nebula (no trailing slash)"
/>
</zot>
<zot label="Custom Scripts / CSS" span={2}>
<textarea
className="recovery-input"
rows={6}
value={form.nebula_custom_html}
onChange={e => setForm({...form, nebula_custom_html: e.target.value})}
placeholder="Add analytics codes or custom styles here"
style={{ fontFamily: 'monospace' }}
/>
</zot>
<div className="span-2" style={{ marginTop: '2rem', display: 'flex', justifyContent: 'flex-end', borderTop: '1px solid var(--border-soft)', paddingTop: '1.5rem' }}>
<button type="submit" className="primary-btn" disabled={saving}>
{saving ? "Persisting..." : "Save Configuration"}
</button> </button>
</div> </div>
</form> </Hot>
<zot>
<div className="space-y-6">
<header className="space-y-2">
<h1 className="text-2xl font-bold tracking-tight">Nebula Theme</h1>
<p className="text-muted-foreground">
Configure Nebula theme colors, copywriting, branding assets, and custom injections.
</p>
</header>
{message ? (
<div
className={
messageType === "success"
? "rounded-lg border border-emerald-500/30 bg-emerald-500/10 px-4 py-3 text-sm text-emerald-600"
: "rounded-lg border border-destructive/30 bg-destructive/10 px-4 py-3 text-sm text-destructive"
}
>
{message}
</div>
) : null}
<Card
title="Display"
description="Set the primary color, theme mode, and hero copy shown by Nebula."
>
{loading ? (
<div className="rounded-lg border border-dashed bg-muted/30 px-4 py-8 text-sm text-muted-foreground">
Loading Nebula settings...
</div>
) : (
<div className="grid gap-4 md:grid-cols-2">
<Field label="Theme palette" description="Controls the default Nebula color palette.">
<select
className="flex h-9 w-full appearance-none rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
value={form.nebula_theme_color}
onChange={(event) => updateField("nebula_theme_color", event.target.value)}
>
{themeColorOptions.map((item) => (
<option key={item.value} value={item.value}>
{item.label}
</option>
))}
</select>
</Field>
<Field
label="Theme mode"
description="Applied when a user opens the Nebula frontend for the first time."
>
<select
className="flex h-9 w-full appearance-none rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
value={form.nebula_default_theme_mode}
onChange={(event) =>
updateField("nebula_default_theme_mode", event.target.value)
}
>
{themeModeOptions.map((item) => (
<option key={item.value} value={item.value}>
{item.label}
</option>
))}
</select>
</Field>
<Field label="Hero slogan" description="Shown as the main title in the hero area.">
<input
className="flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
value={form.nebula_hero_slogan}
onChange={(event) => updateField("nebula_hero_slogan", event.target.value)}
/>
</Field>
<Field label="Welcome target" description="Appended after the Welcome to heading.">
<input
className="flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
value={form.nebula_welcome_target}
onChange={(event) => updateField("nebula_welcome_target", event.target.value)}
/>
</Field>
<Field label="Register title" description="Displayed at the top of the register panel.">
<input
className="flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
value={form.nebula_register_title}
onChange={(event) => updateField("nebula_register_title", event.target.value)}
/>
</Field>
<Field
label="Metrics API URL"
description="Base URL used when Nebula shows public metrics before login."
>
<input
className="flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
value={form.nebula_metrics_base_url}
onChange={(event) => updateField("nebula_metrics_base_url", event.target.value)}
/>
</Field>
</div>
)}
</Card>
<Card
title="Branding"
description="Set background assets, logo URLs, CDN roots, and custom HTML."
>
<div className="grid gap-4 md:grid-cols-2">
<Field label="Background URL" description="Used by the Nebula login or landing background.">
<input
className="flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
value={form.nebula_background_url}
onChange={(event) => updateField("nebula_background_url", event.target.value)}
/>
</Field>
<Field label="Static CDN URL" description="Root CDN path for Nebula static assets.">
<input
className="flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
value={form.nebula_static_cdn_url}
onChange={(event) => updateField("nebula_static_cdn_url", event.target.value)}
/>
</Field>
<Field label="Light logo URL" description="Displayed while the light theme is active.">
<input
className="flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
value={form.nebula_light_logo_url}
onChange={(event) => updateField("nebula_light_logo_url", event.target.value)}
/>
</Field>
<Field label="Dark logo URL" description="Displayed while the dark theme is active.">
<input
className="flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
value={form.nebula_dark_logo_url}
onChange={(event) => updateField("nebula_dark_logo_url", event.target.value)}
/>
</Field>
<Field
label="Custom HTML / scripts"
description="Inject custom HTML, scripts, or styles into Nebula pages."
span={2}
>
<textarea
className="min-h-[220px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-xs shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
value={form.nebula_custom_html}
onChange={(event) => updateField("nebula_custom_html", event.target.value)}
/>
</Field>
</div>
</Card>
</div>
</zot>
</Wot> </Wot>
); );
} }

View File

@@ -157,6 +157,7 @@ func getAllConfigMappings() gin.H {
"default_remind_traffic": service.MustGetBool("default_remind_traffic", true), "default_remind_traffic": service.MustGetBool("default_remind_traffic", true),
"subscribe_path": service.MustGetString("subscribe_path", "s"), "subscribe_path": service.MustGetString("subscribe_path", "s"),
}, },
"subscribe_template": service.GetAllSubscribeTemplates(),
"frontend": gin.H{ "frontend": gin.H{
"frontend_theme": service.MustGetString("frontend_theme", "Xboard"), "frontend_theme": service.MustGetString("frontend_theme", "Xboard"),
"frontend_theme_sidebar": service.MustGetString("frontend_theme_sidebar", "light"), "frontend_theme_sidebar": service.MustGetString("frontend_theme_sidebar", "light"),
@@ -202,7 +203,7 @@ func getAllConfigMappings() gin.H {
"nebula_welcome_target": service.MustGetString("nebula_welcome_target", ""), "nebula_welcome_target": service.MustGetString("nebula_welcome_target", ""),
"nebula_register_title": service.MustGetString("nebula_register_title", ""), "nebula_register_title": service.MustGetString("nebula_register_title", ""),
"nebula_background_url": service.MustGetString("nebula_background_url", ""), "nebula_background_url": service.MustGetString("nebula_background_url", ""),
"nebula_metrics_base_url": service.MustGetString("nebula_metrics_base_url", ""), "nebula_metrics_base_url": service.MustGetString("nebula_metrics_base_url", ""),
"nebula_default_theme_mode": service.MustGetString("nebula_default_theme_mode", "system"), "nebula_default_theme_mode": service.MustGetString("nebula_default_theme_mode", "system"),
"nebula_light_logo_url": service.MustGetString("nebula_light_logo_url", ""), "nebula_light_logo_url": service.MustGetString("nebula_light_logo_url", ""),
"nebula_dark_logo_url": service.MustGetString("nebula_dark_logo_url", ""), "nebula_dark_logo_url": service.MustGetString("nebula_dark_logo_url", ""),
@@ -320,6 +321,9 @@ func settingGroupName(name string) string {
"renew_order_event_id", "change_order_event_id", "show_info_to_server_enable", "renew_order_event_id", "change_order_event_id", "show_info_to_server_enable",
"show_protocol_to_server_enable", "default_remind_expire", "default_remind_traffic", "subscribe_path": "show_protocol_to_server_enable", "default_remind_expire", "default_remind_traffic", "subscribe_path":
return "subscribe" return "subscribe"
case "subscribe_template_singbox", "subscribe_template_clash", "subscribe_template_clashmeta",
"subscribe_template_stash", "subscribe_template_surge", "subscribe_template_surfboard":
return "subscribe_template"
case "frontend_theme", "frontend_theme_sidebar", "frontend_theme_header", "frontend_theme_color", "frontend_background_url": case "frontend_theme", "frontend_theme_sidebar", "frontend_theme_header", "frontend_theme_color", "frontend_background_url":
return "frontend" return "frontend"
case "server_token", "server_pull_interval", "server_push_interval", "device_limit_mode", "server_ws_enable", "server_ws_url": case "server_token", "server_pull_interval", "server_push_interval", "device_limit_mode", "server_ws_enable", "server_ws_url":

View File

@@ -579,8 +579,13 @@ func AdminUsersFetch(c *gin.Context) {
page := parsePositiveInt(firstString(params["page"], params["current"]), 1) page := parsePositiveInt(firstString(params["page"], params["current"]), 1)
perPage := parsePositiveInt(firstString(params["per_page"], params["pageSize"]), 50) perPage := parsePositiveInt(firstString(params["per_page"], params["pageSize"]), 50)
keyword := strings.TrimSpace(params["keyword"]) keyword := strings.TrimSpace(params["keyword"])
suffix := service.GetPluginConfigString(service.PluginUserAddIPv6, "email_suffix", "-ipv6")
shadowPattern := "%" + suffix + "@%"
query := database.DB.Model(&model.User{}).Preload("Plan").Order("id DESC") query := database.DB.Model(&model.User{}).
Preload("Plan").
Where("email NOT LIKE ?", shadowPattern).
Order("id DESC")
if keyword != "" { if keyword != "" {
query = query.Where("email LIKE ? OR CAST(id AS CHAR) = ?", "%"+keyword+"%", keyword) query = query.Where("email LIKE ? OR CAST(id AS CHAR) = ?", "%"+keyword+"%", keyword)
} }

View File

@@ -39,16 +39,37 @@ func FulfillSubscription(c *gin.Context, user *model.User) {
ua := c.GetHeader("User-Agent") ua := c.GetHeader("User-Agent")
flag := c.Query("flag") flag := c.Query("flag")
uaLower := strings.ToLower(ua)
// 2. Handle specialized configs // 2. Handle specialized configs
if strings.Contains(ua, "Clash") || flag == "clash" { if strings.Contains(uaLower, "stash") || flag == "stash" {
config, _ := protocol.GenerateClash(servers, *user) config, _ := protocol.GenerateClashWithTemplate("stash", servers, *user)
c.Header("Content-Type", "application/octet-stream") c.Header("Content-Type", "application/octet-stream")
c.String(http.StatusOK, config) c.String(http.StatusOK, config)
return return
} }
if strings.Contains(strings.ToLower(ua), "sing-box") || flag == "sing-box" { if strings.Contains(uaLower, "clashmeta") ||
strings.Contains(uaLower, "clash meta") ||
strings.Contains(uaLower, "metacubex") ||
strings.Contains(uaLower, "verge") ||
strings.Contains(uaLower, "flclash") ||
strings.Contains(uaLower, "nekobox") ||
flag == "clashmeta" || flag == "clash-meta" {
config, _ := protocol.GenerateClashWithTemplate("clashmeta", servers, *user)
c.Header("Content-Type", "application/octet-stream")
c.String(http.StatusOK, config)
return
}
if strings.Contains(ua, "Clash") || flag == "clash" {
config, _ := protocol.GenerateClashWithTemplate("clash", servers, *user)
c.Header("Content-Type", "application/octet-stream")
c.String(http.StatusOK, config)
return
}
if strings.Contains(uaLower, "sing-box") || flag == "sing-box" {
config, _ := protocol.GenerateSingBox(servers, *user) config, _ := protocol.GenerateSingBox(servers, *user)
c.Header("Content-Type", "application/json; charset=utf-8") c.Header("Content-Type", "application/json; charset=utf-8")
c.String(http.StatusOK, config) c.String(http.StatusOK, config)

View File

@@ -1,6 +1,8 @@
package handler package handler
import ( import (
"encoding/json"
"net/http"
"strings" "strings"
"time" "time"
"xboard-go/internal/database" "xboard-go/internal/database"
@@ -11,6 +13,31 @@ import (
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )
func ipv6StatusPresentation(status string, allowed bool) (string, string, string) {
status = strings.TrimSpace(strings.ToLower(status))
switch status {
case "active":
return "active", "IPv6 enabled", ""
case "eligible":
return "eligible", "Ready to enable", ""
case "", "not_allowed", "not_eligible", "disallowed":
if allowed {
return "eligible", "Ready to enable", ""
}
return "not_allowed", "Not eligible", "Current plan or group is not allowed to enable IPv6"
default:
label := strings.ReplaceAll(strings.Title(strings.ReplaceAll(status, "_", " ")), "Ipv6", "IPv6")
if strings.EqualFold(label, "Not Allowed") {
label = "Not eligible"
}
reason := ""
if !allowed && (status == "not_allowed" || status == "not_eligible") {
reason = "Current plan or group is not allowed to enable IPv6"
}
return status, label, reason
}
}
func PluginUserOnlineDevicesUsers(c *gin.Context) { func PluginUserOnlineDevicesUsers(c *gin.Context) {
page := parsePositiveInt(c.DefaultQuery("page", "1"), 1) page := parsePositiveInt(c.DefaultQuery("page", "1"), 1)
@@ -165,7 +192,7 @@ func AdminIPv6SubscriptionUsers(c *gin.Context) {
shadowByParentID := make(map[int]model.User, len(userIDs)) shadowByParentID := make(map[int]model.User, len(userIDs))
if len(userIDs) > 0 { if len(userIDs) > 0 {
var shadowUsers []model.User var shadowUsers []model.User
if err := database.DB.Where("parent_id IN ?", userIDs).Find(&shadowUsers).Error; err == nil { if err := database.DB.Preload("Plan").Where("parent_id IN ?", userIDs).Find(&shadowUsers).Error; err == nil {
for _, shadow := range shadowUsers { for _, shadow := range shadowUsers {
if shadow.ParentID != nil { if shadow.ParentID != nil {
shadowByParentID[*shadow.ParentID] = shadow shadowByParentID[*shadow.ParentID] = shadow
@@ -173,6 +200,17 @@ func AdminIPv6SubscriptionUsers(c *gin.Context) {
} }
} }
} }
shadowPlanID := parsePositiveInt(
service.GetPluginConfigString(service.PluginUserAddIPv6, "ipv6_plan_id", "0"),
0,
)
planNames := make(map[int]string)
var plans []model.Plan
if err := database.DB.Select("id", "name").Find(&plans).Error; err == nil {
for _, plan := range plans {
planNames[plan.ID] = plan.Name
}
}
list := make([]gin.H, 0, len(users)) list := make([]gin.H, 0, len(users))
for _, user := range users { for _, user := range users {
@@ -191,32 +229,30 @@ func AdminIPv6SubscriptionUsers(c *gin.Context) {
} }
allowed := service.PluginUserAllowed(&user, user.Plan) allowed := service.PluginUserAllowed(&user, user.Plan)
status := "not_allowed" status := "not_allowed"
statusLabel := "Not eligible" planID := shadowPlanID
if allowed { planNameValue := planNames[shadowPlanID]
status = "eligible" if hasShadowUser {
statusLabel = "Ready to enable" planID = intFromPointer(shadowUser.PlanID)
planNameValue = planName(shadowUser.Plan)
} }
shadowUserID := 0 shadowUserID := 0
shadowUpdatedAt := int64(0) shadowUpdatedAt := int64(0)
if hasSubscription { if hasSubscription {
status = firstString(subscription.Status, status) status = firstString(subscription.Status, status)
statusLabel = "IPv6 enabled"
if subscription.Status != "active" && subscription.Status != "" {
statusLabel = strings.ReplaceAll(strings.Title(strings.ReplaceAll(subscription.Status, "_", " ")), "Ipv6", "IPv6")
}
if subscription.ShadowUserID != nil { if subscription.ShadowUserID != nil {
shadowUserID = *subscription.ShadowUserID shadowUserID = *subscription.ShadowUserID
} }
shadowUpdatedAt = subscription.UpdatedAt shadowUpdatedAt = subscription.UpdatedAt
} else if allowed {
statusLabel = "Ready to enable"
} }
effectiveAllowed := allowed || hasSubscription && subscription.Allowed
status, statusLabel, _ := ipv6StatusPresentation(status, effectiveAllowed)
list = append(list, gin.H{ list = append(list, gin.H{
"id": user.ID, "id": user.ID,
"email": user.Email, "email": user.Email,
"plan_name": planName(user.Plan), "plan_id": planID,
"allowed": allowed || hasSubscription && subscription.Allowed, "plan_name": firstString(planNameValue, "-"),
"allowed": effectiveAllowed,
"is_active": hasSubscription && subscription.Status == "active", "is_active": hasSubscription && subscription.Status == "active",
"status": status, "status": status,
"status_label": statusLabel, "status_label": statusLabel,
@@ -238,6 +274,71 @@ func AdminIPv6SubscriptionUsers(c *gin.Context) {
}) })
} }
func AdminIPv6SubscriptionConfigFetch(c *gin.Context) {
cfg := service.GetPluginConfig(service.PluginUserAddIPv6)
Success(c, gin.H{
"ipv6_plan_id": parsePositiveInt(service.GetPluginConfigString(service.PluginUserAddIPv6, "ipv6_plan_id", "0"), 0),
"allowed_plans": service.GetPluginConfigIntList(service.PluginUserAddIPv6, "allowed_plans"),
"allowed_groups": service.GetPluginConfigIntList(service.PluginUserAddIPv6, "allowed_groups"),
"email_suffix": firstString(stringFromAny(cfg["email_suffix"]), "-ipv6"),
"reference_flag": firstString(stringFromAny(cfg["reference_flag"]), "ipv6"),
})
}
func AdminIPv6SubscriptionConfigSave(c *gin.Context) {
var payload struct {
IPv6PlanID int `json:"ipv6_plan_id"`
}
if err := c.ShouldBindJSON(&payload); err != nil {
Fail(c, http.StatusBadRequest, "invalid request body")
return
}
var plugin model.Plugin
err := database.DB.Where("code = ?", service.PluginUserAddIPv6).First(&plugin).Error
if err != nil {
plugin = model.Plugin{
Code: service.PluginUserAddIPv6,
Name: "IPv6 Subscription",
IsEnabled: true,
}
}
cfg := service.GetPluginConfig(service.PluginUserAddIPv6)
if payload.IPv6PlanID > 0 {
cfg["ipv6_plan_id"] = payload.IPv6PlanID
} else {
delete(cfg, "ipv6_plan_id")
}
raw, marshalErr := json.Marshal(cfg)
if marshalErr != nil {
Fail(c, http.StatusInternalServerError, "failed to encode plugin config")
return
}
configText := string(raw)
plugin.Config = &configText
if plugin.ID > 0 {
if updateErr := database.DB.Model(&model.Plugin{}).Where("id = ?", plugin.ID).Updates(map[string]any{
"config": plugin.Config,
"is_enabled": plugin.IsEnabled,
}).Error; updateErr != nil {
Fail(c, http.StatusInternalServerError, "failed to save plugin config")
return
}
} else {
if createErr := database.DB.Create(&plugin).Error; createErr != nil {
Fail(c, http.StatusInternalServerError, "failed to create plugin config")
return
}
}
Success(c, gin.H{
"ipv6_plan_id": payload.IPv6PlanID,
})
}
func AdminIPv6SubscriptionEnable(c *gin.Context) { func AdminIPv6SubscriptionEnable(c *gin.Context) {
userID := parsePositiveInt(c.Param("userId"), 0) userID := parsePositiveInt(c.Param("userId"), 0)
if userID == 0 { if userID == 0 {
@@ -346,24 +447,14 @@ func PluginUserAddIPv6Check(c *gin.Context) {
hasSubscription := database.DB.Where("user_id = ?", user.ID).First(&subscription).Error == nil hasSubscription := database.DB.Where("user_id = ?", user.ID).First(&subscription).Error == nil
allowed := service.PluginUserAllowed(user, plan) allowed := service.PluginUserAllowed(user, plan)
status := "not_allowed" status := "not_allowed"
statusLabel := "Not eligible"
reason := "Current plan or group is not allowed to enable IPv6"
if allowed {
status = "eligible"
statusLabel = "Ready to enable"
reason = ""
}
if hasSubscription { if hasSubscription {
status = firstString(subscription.Status, "active") status = firstString(subscription.Status, "active")
statusLabel = "IPv6 enabled"
reason = ""
if subscription.Status != "active" && subscription.Status != "" {
statusLabel = strings.ReplaceAll(strings.Title(strings.ReplaceAll(subscription.Status, "_", " ")), "Ipv6", "IPv6")
}
} }
effectiveAllowed := allowed || hasSubscription && subscription.Allowed
status, statusLabel, reason := ipv6StatusPresentation(status, effectiveAllowed)
Success(c, gin.H{ Success(c, gin.H{
"allowed": allowed || hasSubscription && subscription.Allowed, "allowed": effectiveAllowed,
"is_active": hasSubscription && subscription.Status == "active", "is_active": hasSubscription && subscription.Status == "active",
"status": status, "status": status,
"status_label": statusLabel, "status_label": statusLabel,

View File

@@ -5,37 +5,195 @@ import (
"strings" "strings"
"xboard-go/internal/model" "xboard-go/internal/model"
"xboard-go/internal/service" "xboard-go/internal/service"
"github.com/goccy/go-yaml"
) )
func GenerateClash(servers []model.Server, user model.User) (string, error) { func GenerateClash(servers []model.Server, user model.User) (string, error) {
return GenerateClashWithTemplate("clash", servers, user)
}
func GenerateClashWithTemplate(templateName string, servers []model.Server, user model.User) (string, error) {
template := strings.TrimSpace(service.GetSubscribeTemplate(templateName))
if template == "" {
return generateClashFallback(servers, user), nil
}
var config map[string]any
if err := yaml.Unmarshal([]byte(template), &config); err != nil {
return generateClashFallback(servers, user), nil
}
proxies := make([]any, 0, len(servers))
proxyNames := make([]string, 0, len(servers))
for _, s := range servers {
conf := service.BuildNodeConfig(&s)
proxy := buildClashProxy(conf, user)
if proxy == nil {
continue
}
proxies = append(proxies, proxy)
proxyNames = append(proxyNames, conf.Name)
}
config["proxies"] = append(anySlice(config["proxies"]), proxies...)
config["proxy-groups"] = mergeClashProxyGroups(anySlice(config["proxy-groups"]), proxyNames)
if _, ok := config["rules"]; !ok {
config["rules"] = []any{"MATCH,Proxy"}
}
data, err := yaml.Marshal(config)
if err != nil {
return "", err
}
output := strings.ReplaceAll(string(data), "$app_name", service.MustGetString("app_name", "XBoard"))
return output, nil
}
func buildClashProxy(conf service.NodeServerConfig, user model.User) map[string]any {
switch conf.Protocol {
case "shadowsocks":
cipher, _ := conf.Cipher.(string)
return map[string]any{
"name": conf.Name,
"type": "ss",
"server": conf.RawHost,
"port": conf.ServerPort,
"cipher": cipher,
"password": user.UUID,
}
case "vmess":
return map[string]any{
"name": conf.Name,
"type": "vmess",
"server": conf.RawHost,
"port": conf.ServerPort,
"uuid": user.UUID,
"alterId": 0,
"cipher": "auto",
"udp": true,
}
case "trojan":
return map[string]any{
"name": conf.Name,
"type": "trojan",
"server": conf.RawHost,
"port": conf.ServerPort,
"password": user.UUID,
"udp": true,
}
default:
return nil
}
}
func mergeClashProxyGroups(groups []any, proxyNames []string) []any {
if len(groups) == 0 {
return []any{
map[string]any{
"name": "Proxy",
"type": "select",
"proxies": append([]any{"DIRECT"}, stringsToAny(proxyNames)...),
},
}
}
for index, item := range groups {
group, ok := item.(map[string]any)
if !ok {
continue
}
group["proxies"] = appendUniqueAny(anySlice(group["proxies"]), stringsToAny(proxyNames)...)
groups[index] = group
}
return groups
}
func anySlice(value any) []any {
switch typed := value.(type) {
case nil:
return []any{}
case []any:
return append([]any{}, typed...)
case []string:
result := make([]any, 0, len(typed))
for _, item := range typed {
result = append(result, item)
}
return result
default:
return []any{}
}
}
func stringsToAny(values []string) []any {
result := make([]any, 0, len(values))
for _, value := range values {
result = append(result, value)
}
return result
}
func appendUniqueAny(base []any, values ...any) []any {
existing := make(map[string]struct{}, len(base))
for _, item := range base {
existing[fmt.Sprint(item)] = struct{}{}
}
for _, item := range values {
key := fmt.Sprint(item)
if _, ok := existing[key]; ok {
continue
}
base = append(base, item)
existing[key] = struct{}{}
}
return base
}
func generateClashFallback(servers []model.Server, user model.User) string {
var builder strings.Builder var builder strings.Builder
builder.WriteString("proxies:\n") builder.WriteString("proxies:\n")
var proxyNames []string var proxyNames []string
for _, s := range servers { for _, s := range servers {
conf := service.BuildNodeConfig(&s) conf := service.BuildNodeConfig(&s)
proxy := "" proxy := buildClashProxy(conf, user)
if proxy == nil {
switch conf.Protocol {
case "shadowsocks":
cipher := ""
if c, ok := conf.Cipher.(string); ok { cipher = c }
proxy = fmt.Sprintf(" - name: \"%s\"\n type: ss\n server: %s\n port: %d\n cipher: %s\n password: %s\n",
conf.Name, conf.RawHost, conf.ServerPort, cipher, user.UUID)
case "vmess":
proxy = fmt.Sprintf(" - name: \"%s\"\n type: vmess\n server: %s\n port: %d\n uuid: %s\n alterId: 0\n cipher: auto\n udp: true\n",
conf.Name, conf.RawHost, conf.ServerPort, user.UUID)
case "trojan":
proxy = fmt.Sprintf(" - name: \"%s\"\n type: trojan\n server: %s\n port: %d\n password: %s\n udp: true\n",
conf.Name, conf.RawHost, conf.ServerPort, user.UUID)
default:
continue continue
} }
if proxy != "" { switch proxy["type"] {
builder.WriteString(proxy) case "ss":
proxyNames = append(proxyNames, fmt.Sprintf("\"%s\"", conf.Name)) builder.WriteString(fmt.Sprintf(
" - name: \"%s\"\n type: ss\n server: %s\n port: %d\n cipher: %s\n password: %s\n",
conf.Name,
conf.RawHost,
conf.ServerPort,
fmt.Sprint(proxy["cipher"]),
user.UUID,
))
case "vmess":
builder.WriteString(fmt.Sprintf(
" - name: \"%s\"\n type: vmess\n server: %s\n port: %d\n uuid: %s\n alterId: 0\n cipher: auto\n udp: true\n",
conf.Name,
conf.RawHost,
conf.ServerPort,
user.UUID,
))
case "trojan":
builder.WriteString(fmt.Sprintf(
" - name: \"%s\"\n type: trojan\n server: %s\n port: %d\n password: %s\n udp: true\n",
conf.Name,
conf.RawHost,
conf.ServerPort,
user.UUID,
))
} }
proxyNames = append(proxyNames, fmt.Sprintf("\"%s\"", conf.Name))
} }
builder.WriteString("\nproxy-groups:\n") builder.WriteString("\nproxy-groups:\n")
@@ -47,5 +205,5 @@ func GenerateClash(servers []model.Server, user model.User) (string, error) {
builder.WriteString("\nrules:\n") builder.WriteString("\nrules:\n")
builder.WriteString(" - MATCH,Proxy\n") builder.WriteString(" - MATCH,Proxy\n")
return builder.String(), nil return builder.String()
} }

View File

@@ -11,6 +11,81 @@ type SingBoxConfig struct {
} }
func GenerateSingBox(servers []model.Server, user model.User) (string, error) { func GenerateSingBox(servers []model.Server, user model.User) (string, error) {
template := service.GetSubscribeTemplate("singbox")
if template == "" {
return generateSingBoxFallback(servers, user)
}
var config map[string]any
if err := json.Unmarshal([]byte(template), &config); err != nil {
return generateSingBoxFallback(servers, user)
}
outbounds := make([]any, 0, len(servers))
proxyTags := make([]string, 0, len(servers))
for _, s := range servers {
conf := service.BuildNodeConfig(&s)
outbound := buildSingBoxOutbound(conf, user)
if outbound == nil {
continue
}
outbounds = append(outbounds, outbound)
proxyTags = append(proxyTags, conf.Name)
}
existingOutbounds := anySlice(config["outbounds"])
for index, item := range existingOutbounds {
outbound, ok := item.(map[string]any)
if !ok {
continue
}
outboundType, _ := outbound["type"].(string)
if outboundType != "selector" && outboundType != "urltest" {
continue
}
outbound["outbounds"] = appendUniqueAny(anySlice(outbound["outbounds"]), stringsToAny(proxyTags)...)
existingOutbounds[index] = outbound
}
config["outbounds"] = append(existingOutbounds, outbounds...)
data, err := json.MarshalIndent(config, "", " ")
if err != nil {
return "", err
}
return string(data), nil
}
func buildSingBoxOutbound(conf service.NodeServerConfig, user model.User) map[string]any {
outbound := map[string]any{
"tag": conf.Name,
"server": conf.RawHost,
"server_port": conf.ServerPort,
}
switch conf.Protocol {
case "shadowsocks":
outbound["type"] = "shadowsocks"
outbound["method"] = conf.Cipher
outbound["password"] = user.UUID
case "vmess":
outbound["type"] = "vmess"
outbound["uuid"] = user.UUID
outbound["security"] = "auto"
case "trojan":
outbound["type"] = "trojan"
outbound["password"] = user.UUID
default:
return nil
}
return outbound
}
func generateSingBoxFallback(servers []model.Server, user model.User) (string, error) {
outbounds := []map[string]interface{}{} outbounds := []map[string]interface{}{}
proxyTags := []string{} proxyTags := []string{}
@@ -42,7 +117,6 @@ func GenerateSingBox(servers []model.Server, user model.User) (string, error) {
proxyTags = append(proxyTags, conf.Name) proxyTags = append(proxyTags, conf.Name)
} }
// Add selector
selector := map[string]interface{}{ selector := map[string]interface{}{
"type": "selector", "type": "selector",
"tag": "Proxy", "tag": "Proxy",

View File

@@ -0,0 +1,56 @@
package service
import (
"os"
"path/filepath"
"sort"
"strings"
)
var subscribeTemplateFiles = map[string]string{
"singbox": filepath.Join("submodule", "singbox.json"),
"clash": filepath.Join("submodule", "clash.yaml"),
"clashmeta": filepath.Join("submodule", "clash-meta.yaml"),
"stash": filepath.Join("submodule", "stash.yaml"),
"surge": filepath.Join("submodule", "surge.toml"),
"surfboard": filepath.Join("submodule", "surfboard.toml"),
}
func SubscribeTemplateSettingKey(name string) string {
return "subscribe_template_" + strings.TrimSpace(strings.ToLower(name))
}
func DefaultSubscribeTemplate(name string) string {
path, ok := subscribeTemplateFiles[strings.TrimSpace(strings.ToLower(name))]
if !ok {
return ""
}
content, err := os.ReadFile(path)
if err != nil {
return ""
}
return string(content)
}
func GetSubscribeTemplate(name string) string {
key := SubscribeTemplateSettingKey(name)
if value, ok := GetSetting(key); ok && strings.TrimSpace(value) != "" {
return value
}
return DefaultSubscribeTemplate(name)
}
func GetAllSubscribeTemplates() map[string]string {
keys := make([]string, 0, len(subscribeTemplateFiles))
for key := range subscribeTemplateFiles {
keys = append(keys, key)
}
sort.Strings(keys)
result := make(map[string]string, len(keys))
for _, key := range keys {
result[SubscribeTemplateSettingKey(key)] = GetSubscribeTemplate(key)
}
return result
}

493
submodule/clash-meta.yaml Normal file
View File

@@ -0,0 +1,493 @@
port: 7890
socks-port: 7891
allow-lan: true
ipv6: true
bind-address: "*"
mode: Rule
log-level: info
external-controller: 127.0.0.1:9090
tcp-concurrent: true
find-process-mode: strict
geodata-mode: true #【Meta专属】使用geoip.dat数据库(默认false使用mmdb数据库)
geodata-loader: standard
geo-auto-update: true
geo-update-interval: 24
geox-url:
geoip: "https://fastly.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geoip.dat"
geosite: "https://fastly.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geosite.dat"
mmdb: "https://fastly.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geoip.metadb"
asn: "https://github.com/xishang0128/geoip/releases/download/latest/GeoLite2-ASN.mmdb"
experimental:
ignore-resolve-fail: true
dns:
enable: true
listen: 1053
ipv6: false
default-nameserver:
- 1.1.1.1
- 8.8.8.8
nameserver:
- https://1.1.1.1/dns-query # Cloudflare支持 H3
- https://dns.google/dns-query # Google支持 H3
- 1.1.1.1 # Cloudflare Public DNS (UDP)
- 8.8.8.8 # Google Public DNS (UDP)
proxy-server-nameserver:
- https://doh.pub/dns-query
- 223.5.5.5
nameserver-policy:
"geosite:cn,private": # 国内域名和私有域名强制走国内 DNS
- https://223.5.5.5/dns-query # 阿里
- https://doh.pub/dns-query # 腾讯
- 223.5.5.5 # 阿里 UDP
- 119.29.29.29 # 腾讯 UDP
"geo:cn": # 也可以用 geo:cn 匹配 IP
- https://223.5.5.5/dns-query
- https://doh.pub/dns-query
- 223.5.5.5 # 阿里 UDP
- 119.29.29.29 # 腾讯 UDP
"geosite:gfw": # 新增GFW 列表域名强制走国外 DNS
- https://cloudflare-dns.com/dns-query
- https://dns.google/dns-query
- 1.1.1.1
- 8.8.8.8
"geosite:geolocation-!cn": # 新增:非中国大陆域名强制走国外 DNS
- https://cloudflare-dns.com/dns-query
- https://dns.google/dns-query
- 1.1.1.1
- 8.8.8.8
"full-nameserver": # 新增:最终兜底,所有未匹配的域名查询强制走国外 DNS
- https://cloudflare-dns.com/dns-query
- https://dns.google/dns-query
- 1.1.1.1
- 8.8.8.8
fallback:
- tls://8.8.4.4
- tls://1.1.1.1
fallback-filter:
geoip: true
geoip-code: CN
geosite:
- gfw
ipcidr:
- 240.0.0.0/4
domain:
- +.google.com
- +.facebook.com
- +.youtube.com
- +.githubusercontent.com
- +.googlevideo.com
- +.msftconnecttest.com
- +.msftncsi.com
- msftconnecttest.com
- msftncsi.com
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
fake-ip-filter-mode: blacklist
fake-ip-filter:
- "*.lan"
- "*.localdomain"
- "*.example"
- "*.invalid"
- "*.localhost"
- "*.test"
- "*.local"
- "*.home.arpa"
- "*.direct"
- "*.orb.local"
- "*.ip6-localhost"
- "*.ip6-loopback"
- "time.*.com"
- "time.*.gov"
- "time.*.edu.cn"
- "time.*.apple.com"
- "time-ios.apple.com"
- "time1.*.com"
- "time2.*.com"
- "time3.*.com"
- "time4.*.com"
- "time5.*.com"
- "time6.*.com"
- "time7.*.com"
- "ntp.*.com"
- "ntp1.*.com"
- "ntp2.*.com"
- "ntp3.*.com"
- "ntp4.*.com"
- "ntp5.*.com"
- "ntp6.*.com"
- "ntp7.*.com"
- "*.time.edu.cn"
- "*.ntp.org.cn"
- "+.pool.ntp.org"
- "time1.cloud.tencent.com"
- "music.163.com"
- "*.music.163.com"
- "*.126.net"
- "musicapi.taihe.com"
- "music.taihe.com"
- "songsearch.kugou.com"
- "trackercdn.kugou.com"
- "*.kuwo.cn"
- "api-jooxtt.sanook.com"
- "api.joox.com"
- "joox.com"
- "y.qq.com"
- "*.y.qq.com"
- "streamoc.music.tc.qq.com"
- "mobileoc.music.tc.qq.com"
- "isure.stream.qqmusic.qq.com"
- "dl.stream.qqmusic.qq.com"
- "aqqmusic.tc.qq.com"
- "amobile.music.tc.qq.com"
- "*.xiami.com"
- "*.music.migu.cn"
- "music.migu.cn"
- "+.msftconnecttest.com"
- "+.msftncsi.com"
- "localhost.ptlogin2.qq.com"
- "localhost.sec.qq.com"
- "localhost.*.weixin.qq.com"
- "+.steamcontent.com"
- "+.srv.nintendo.net"
- "*.n.n.srv.nintendo.net"
- "+.cdn.nintendo.net"
- "xbox.*.*.microsoft.com"
- "*.*.xboxlive.com"
- "xbox.*.microsoft.com"
- "xnotify.xboxlive.com"
- "+.battle.net"
- "+.battlenet.com.cn"
- "+.wotgame.cn"
- "+.wggames.cn"
- "+.wowsgame.cn"
- "+.wargaming.net"
- "proxy.golang.org"
- "+.stun.*.*"
- "+.stun.*.*.*"
- "+.stun.*.*.*.*"
- "+.stun.*.*.*.*.*"
- "heartbeat.belkin.com"
- "*.linksys.com"
- "*.linksyssmartwifi.com"
- "*.router.asus.com"
- "mesu.apple.com"
- "swscan.apple.com"
- "swquery.apple.com"
- "swdownload.apple.com"
- "swcdn.apple.com"
- "swdist.apple.com"
- "lens.l.google.com"
- "na.b.g-tun.com"
- "+.nflxvideo.net"
- "*.square-enix.com"
- "*.finalfantasyxiv.com"
- "*.ffxiv.com"
- "*.ff14.sdo.com"
- "ff.dorado.sdo.com"
- "*.mcdn.bilivideo.cn"
- "+.media.dssott.com"
- "shark007.net"
- "Mijia Cloud"
- "+.market.xiaomi.com"
- "+.cmbchina.com"
- "+.cmbimg.com"
- "adguardteam.github.io"
- "adrules.top"
- "anti-ad.net"
- "local.adguard.org"
- "static.adtidy.org"
- "+.sandai.net"
- "+.n0808.com"
- "+.3gppnetwork.org"
- "+.uu.163.com"
- "ps.res.netease.com"
- "+.pub.3gppnetwork.org"
- "+.oray.com"
- "+.orayimg.com"
- "+.gcloudcs.com"
- "+.gcloudsdk.com"
- "+.instant.arubanetworks.com"
- "+.setmeup.arubanetworks.com"
- "+.router.asus.com"
- "+.www.asusrouter.com"
- "+.hiwifi.com"
- "+.leike.cc"
- "+.miwifi.com"
- "+.my.router"
- "+.p.to"
- "+.peiluyou.com"
- "+.phicomm.me"
- "+.router.ctc"
- "+.routerlogin.com"
- "+.tendawifi.com"
- "+.zte.home"
- "+.tplogin.cn"
- "+.wifi.cmcc"
tun:
enable: true
stack: system
device: mochen
auto-route: true
endpoint-independent-nat: true
auto-detect-interface: true
endpoint-independents-hijack:
- any:53
- tcp://any:53
strict-route: false
mtu: 1500
udp-timeout: 120
proxies: []
proxy-groups:
- name: 🚀 默认代理
type: select
proxies:
- ♻️ 自动选择
- 🔯 故障转移
- 🔮 负载均衡
- name: 🎮 游戏
type: select
proxies: []
- name: 🎮 steam
type: select
proxies:
- 🚀 默认代理
- ♻️ 自动选择
- DIRECT
- name: 📹 YouTube
type: select
proxies:
- 🚀 默认代理
- ♻️ 自动选择
- name: 🍀 Google
type: select
proxies:
- 🚀 默认代理
- ♻️ 自动选择
- name: 📺 Bilibili
type: select
proxies:
- DIRECT
- 🚀 默认代理
- ♻️ 自动选择
- name: 🤖 ChatGPT
type: select
proxies:
- 🚀 默认代理
- ♻️ 自动选择
- name: 👨🏿‍💻 GitHub
type: select
proxies:
- 🚀 默认代理
- ♻️ 自动选择
- name: 🐬 OneDrive
type: select
proxies:
- DIRECT
- 🚀 默认代理
- ♻️ 自动选择
- name: 🪟 Microsoft
type: select
proxies:
- DIRECT
- 🚀 默认代理
- ♻️ 自动选择
- name: 🎵 TikTok
type: select
proxies:
- 🚀 默认代理
- ♻️ 自动选择
- name: 📲 Telegram
type: select
proxies:
- 🚀 默认代理
- ♻️ 自动选择
- name: 🎥 NETFLIX
type: select
proxies:
- 🚀 默认代理
- ♻️ 自动选择
- name: ✈️ Speedtest
type: select
proxies:
- 🚀 默认代理
- ♻️ 自动选择
- DIRECT
- name: 💶 PayPal
type: select
proxies:
- 🚀 默认代理
- ♻️ 自动选择
- name: 🍎 Apple
type: select
proxies:
- DIRECT
- 🚀 默认代理
- ♻️ 自动选择
- name: 🐟 漏网之鱼
type: select
proxies:
- 🚀 默认代理
- ♻️ 自动选择
- DIRECT
- name: 🌏 国内网站
type: select
proxies:
- DIRECT
- 🚀 默认代理
- name: ♻️ 自动选择
type: url-test
url: http://cp.cloudflare.com/
interval: 300
tolerance: 50
timeout: 300
max-failed-times: 3
proxies: []
- name: 🔯 故障转移
type: fallback
url: http://cp.cloudflare.com/
interval: 300
tolerance: 50
timeout: 300
max-failed-times: 3
proxies: []
- name: 🔮 负载均衡
type: load-balance
strategy: consistent-hashing
url: http://cp.cloudflare.com/
interval: 300
tolerance: 50
timeout: 300
max-failed-times: 3
proxies: []
rules:
- GEOSITE,category-ads-all,REJECT
- DOMAIN,instant.arubanetworks.com,DIRECT
- DOMAIN,setmeup.arubanetworks.com,DIRECT
- DOMAIN,router.asus.com,DIRECT
- DOMAIN,www.asusrouter.com,DIRECT
- DOMAIN-SUFFIX,hiwifi.com,DIRECT
- DOMAIN-SUFFIX,leike.cc,DIRECT
- DOMAIN-SUFFIX,miwifi.com,DIRECT
- DOMAIN-SUFFIX,my.router,DIRECT
- DOMAIN-SUFFIX,p.to,DIRECT
- DOMAIN-SUFFIX,peiluyou.com,DIRECT
- DOMAIN-SUFFIX,phicomm.me,DIRECT
- DOMAIN-SUFFIX,router.ctc,DIRECT
- DOMAIN-SUFFIX,routerlogin.com,DIRECT
- DOMAIN-SUFFIX,tendawifi.com,DIRECT
- DOMAIN-SUFFIX,zte.home,DIRECT
- DOMAIN-SUFFIX,tplogin.cn,DIRECT
- DOMAIN-SUFFIX,wifi.cmcc,DIRECT
- DOMAIN-SUFFIX,bilibili.com, 📺 Bilibili
- GEOSITE,bilibili, 📺 Bilibili
- GEOSITE,biliintl, 📺 Bilibili
- DOMAIN,ipinfo.littlediary.cn, 🚀 默认代理
- DOMAIN,console.cloudyun.top, 🚀 默认代理
- DOMAIN,s3.cloudyun.top, 🚀 默认代理
- DOMAIN-SUFFIX,browserleaks.com, 🚀 默认代理
- DOMAIN-SUFFIX,ping.pe,🚀 默认代理
- DOMAIN-SUFFIX,dgameglobal.com,🎮 游戏
- DOMAIN-SUFFIX,wilds.monsterhunter.com,🎮 游戏
- DOMAIN-SUFFIX,capcom.com,🎮 游戏
- DOMAIN-SUFFIX,playfabapi.com,🎮 游戏
- DOMAIN-SUFFIX,playfab.com,🎮 游戏
- DOMAIN-SUFFIX,akamai.net,🎮 游戏
- DOMAIN-SUFFIX,cloudapp.azure.com,🎮 游戏
- PROCESS-NAME,CrashReport.exe,🎮 游戏
- PROCESS-NAME,InstallerMessage.exe,🎮 游戏
- PROCESS-NAME,MonsterHunterWilds.exe,🎮 游戏
- PROCESS-NAME,SGuard64.exe,🎮 游戏
- PROCESS-NAME,SGuardSvc64.exe,🎮 游戏
- PROCESS-NAME,SGuardUpdate64.exe,🎮 游戏
- PROCESS-NAME,Uninstall64.exe,🎮 游戏
- PROCESS-NAME,ACE-Service64.exe,🎮 游戏
- PROCESS-NAME,ACE-Setup64.exe,🎮 游戏
- PROCESS-NAME,GeckoParser.exe,🎮 游戏
- PROCESS-NAME,MetaperfCapturer.exe,🎮 游戏
- PROCESS-NAME,profiler-symbol-server.exe,🎮 游戏
- PROCESS-NAME,DownSysSymCache.exe,🎮 游戏
- PROCESS-NAME,dumpbin.exe,🎮 游戏
- PROCESS-NAME,Link.exe,🎮 游戏
- PROCESS-NAME,SymCacheGen.exe,🎮 游戏
- PROCESS-NAME,SymChk.exe,🎮 游戏
- PROCESS-NAME,WevtUtil.exe,🎮 游戏
- PROCESS-NAME,XPerf.exe,🎮 游戏
- PROCESS-NAME,DeltaForceClient-Win64-Shipping.exe,🎮 游戏
- PROCESS-NAME,INTLWebViewHelper.exe,🎮 游戏
- PROCESS-NAME,pfbs.exe,🎮 游戏
- PROCESS-NAME,UnrealCEFSubProcess.exe,🎮 游戏
- PROCESS-NAME,UE4PrereqSetup_x64.exe,🎮 游戏
- PROCESS-NAME,DeltaForceClient.exe,🎮 游戏
- PROCESS-NAME,EAAntiCheat.Installer.exe,🎮 游戏
- PROCESS-NAME,bf6.exe,🎮 游戏
- PROCESS-NAME,bf6.exe,🎮 游戏
- PROCESS-NAME,EAAntiCheat.GameServiceLauncher.exe,🎮 游戏
- PROCESS-NAME,EAAntiCheat.GameService.exe,🎮 游戏
- DOMAIN-SUFFIX,eaanticheat.ac.ea.com,🎮 游戏
- GEOSITE,steam@cn,🌏 国内网站
- GEOSITE,steam,🎮 steam
- GEOSITE,apple,🍎 Apple
- GEOSITE,private,🌏 国内网站
- GEOSITE,openai,🤖 ChatGPT
- GEOSITE,google-gemini,🤖 ChatGPT
- GEOSITE,github,👨🏿‍💻 GitHub
- GEOSITE,onedrive,🐬 OneDrive
- GEOSITE,microsoft,🪟 Microsoft
- GEOSITE,youtube,📹 YouTube
- GEOSITE,google,🍀 Google
- GEOSITE,tiktok,🎵 TikTok
- GEOSITE,speedtest,✈️ Speedtest
- GEOSITE,telegram,📲 Telegram
- GEOSITE,netflix,🎥 NETFLIX
- GEOSITE,paypal,💶 PayPal
- GEOSITE,gfw,🚀 默认代理
- GEOSITE,category-dev,🚀 默认代理
- DOMAIN-SUFFIX,cloudflare-dns.com,🚀 默认代理
- DOMAIN-SUFFIX,api.nn.ci,🚀 默认代理
- DOMAIN-SUFFIX,api.ipify.org,🚀 默认代理
- DOMAIN-SUFFIX,gsas.apple.com,🚀 默认代理
- DOMAIN-SUFFIX,hotmail.com,🚀 默认代理
- GEOSITE,CN,🌏 国内网站
- GEOIP,private,🌏 国内网站,no-resolve
- IP-CIDR,1.0.0.1/32,🚀 默认代理,no-resolve
- IP-CIDR,1.1.1.1/32,🚀 默认代理,no-resolve
- IP-CIDR,8.8.8.8/32,🚀 默认代理,no-resolve
- IP-CIDR,8.8.4.4/32,🚀 默认代理,no-resolve
- GEOIP,google,🍀 Google
- GEOIP,netflix,🎥 NETFLIX
- GEOIP,telegram,📲 Telegram
- GEOIP,CN,🌏 国内网站
- IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
- IP-CIDR,172.16.0.0/12,DIRECT,no-resolve
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- IP-CIDR,100.64.0.0/10,DIRECT,no-resolve
- IP-CIDR,127.0.0.0/8,DIRECT,no-resolve
- IP-CIDR,198.18.0.0/16,DIRECT,no-resolve
- IP-CIDR,224.0.0.0/4,DIRECT,no-resolve
- IP-CIDR6,::1/128,DIRECT,no-resolve
- IP-CIDR6,fc00::/7,DIRECT,no-resolve
- IP-CIDR6,fe80::/10,DIRECT,no-resolve
- IP-CIDR6,fd00::/8,DIRECT,no-resolve
- MATCH,🐟 漏网之鱼

493
submodule/clash.yaml Normal file
View File

@@ -0,0 +1,493 @@
port: 7890
socks-port: 7891
allow-lan: true
ipv6: true
bind-address: "*"
mode: Rule
log-level: info
external-controller: 127.0.0.1:9090
tcp-concurrent: true
find-process-mode: strict
geodata-mode: true #【Meta专属】使用geoip.dat数据库(默认false使用mmdb数据库)
geodata-loader: standard
geo-auto-update: true
geo-update-interval: 24
geox-url:
geoip: "https://fastly.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geoip.dat"
geosite: "https://fastly.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geosite.dat"
mmdb: "https://fastly.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geoip.metadb"
asn: "https://github.com/xishang0128/geoip/releases/download/latest/GeoLite2-ASN.mmdb"
experimental:
ignore-resolve-fail: true
dns:
enable: true
listen: 1053
ipv6: false
default-nameserver:
- 1.1.1.1
- 8.8.8.8
nameserver:
- https://1.1.1.1/dns-query # Cloudflare支持 H3
- https://dns.google/dns-query # Google支持 H3
- 1.1.1.1 # Cloudflare Public DNS (UDP)
- 8.8.8.8 # Google Public DNS (UDP)
proxy-server-nameserver:
- https://doh.pub/dns-query
- 223.5.5.5
nameserver-policy:
"geosite:cn,private": # 国内域名和私有域名强制走国内 DNS
- https://223.5.5.5/dns-query # 阿里
- https://doh.pub/dns-query # 腾讯
- 223.5.5.5 # 阿里 UDP
- 119.29.29.29 # 腾讯 UDP
"geo:cn": # 也可以用 geo:cn 匹配 IP
- https://223.5.5.5/dns-query
- https://doh.pub/dns-query
- 223.5.5.5 # 阿里 UDP
- 119.29.29.29 # 腾讯 UDP
"geosite:gfw": # 新增GFW 列表域名强制走国外 DNS
- https://cloudflare-dns.com/dns-query
- https://dns.google/dns-query
- 1.1.1.1
- 8.8.8.8
"geosite:geolocation-!cn": # 新增:非中国大陆域名强制走国外 DNS
- https://cloudflare-dns.com/dns-query
- https://dns.google/dns-query
- 1.1.1.1
- 8.8.8.8
"full-nameserver": # 新增:最终兜底,所有未匹配的域名查询强制走国外 DNS
- https://cloudflare-dns.com/dns-query
- https://dns.google/dns-query
- 1.1.1.1
- 8.8.8.8
fallback:
- tls://8.8.4.4
- tls://1.1.1.1
fallback-filter:
geoip: true
geoip-code: CN
geosite:
- gfw
ipcidr:
- 240.0.0.0/4
domain:
- +.google.com
- +.facebook.com
- +.youtube.com
- +.githubusercontent.com
- +.googlevideo.com
- +.msftconnecttest.com
- +.msftncsi.com
- msftconnecttest.com
- msftncsi.com
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
fake-ip-filter-mode: blacklist
fake-ip-filter:
- "*.lan"
- "*.localdomain"
- "*.example"
- "*.invalid"
- "*.localhost"
- "*.test"
- "*.local"
- "*.home.arpa"
- "*.direct"
- "*.orb.local"
- "*.ip6-localhost"
- "*.ip6-loopback"
- "time.*.com"
- "time.*.gov"
- "time.*.edu.cn"
- "time.*.apple.com"
- "time-ios.apple.com"
- "time1.*.com"
- "time2.*.com"
- "time3.*.com"
- "time4.*.com"
- "time5.*.com"
- "time6.*.com"
- "time7.*.com"
- "ntp.*.com"
- "ntp1.*.com"
- "ntp2.*.com"
- "ntp3.*.com"
- "ntp4.*.com"
- "ntp5.*.com"
- "ntp6.*.com"
- "ntp7.*.com"
- "*.time.edu.cn"
- "*.ntp.org.cn"
- "+.pool.ntp.org"
- "time1.cloud.tencent.com"
- "music.163.com"
- "*.music.163.com"
- "*.126.net"
- "musicapi.taihe.com"
- "music.taihe.com"
- "songsearch.kugou.com"
- "trackercdn.kugou.com"
- "*.kuwo.cn"
- "api-jooxtt.sanook.com"
- "api.joox.com"
- "joox.com"
- "y.qq.com"
- "*.y.qq.com"
- "streamoc.music.tc.qq.com"
- "mobileoc.music.tc.qq.com"
- "isure.stream.qqmusic.qq.com"
- "dl.stream.qqmusic.qq.com"
- "aqqmusic.tc.qq.com"
- "amobile.music.tc.qq.com"
- "*.xiami.com"
- "*.music.migu.cn"
- "music.migu.cn"
- "+.msftconnecttest.com"
- "+.msftncsi.com"
- "localhost.ptlogin2.qq.com"
- "localhost.sec.qq.com"
- "localhost.*.weixin.qq.com"
- "+.steamcontent.com"
- "+.srv.nintendo.net"
- "*.n.n.srv.nintendo.net"
- "+.cdn.nintendo.net"
- "xbox.*.*.microsoft.com"
- "*.*.xboxlive.com"
- "xbox.*.microsoft.com"
- "xnotify.xboxlive.com"
- "+.battle.net"
- "+.battlenet.com.cn"
- "+.wotgame.cn"
- "+.wggames.cn"
- "+.wowsgame.cn"
- "+.wargaming.net"
- "proxy.golang.org"
- "+.stun.*.*"
- "+.stun.*.*.*"
- "+.stun.*.*.*.*"
- "+.stun.*.*.*.*.*"
- "heartbeat.belkin.com"
- "*.linksys.com"
- "*.linksyssmartwifi.com"
- "*.router.asus.com"
- "mesu.apple.com"
- "swscan.apple.com"
- "swquery.apple.com"
- "swdownload.apple.com"
- "swcdn.apple.com"
- "swdist.apple.com"
- "lens.l.google.com"
- "na.b.g-tun.com"
- "+.nflxvideo.net"
- "*.square-enix.com"
- "*.finalfantasyxiv.com"
- "*.ffxiv.com"
- "*.ff14.sdo.com"
- "ff.dorado.sdo.com"
- "*.mcdn.bilivideo.cn"
- "+.media.dssott.com"
- "shark007.net"
- "Mijia Cloud"
- "+.market.xiaomi.com"
- "+.cmbchina.com"
- "+.cmbimg.com"
- "adguardteam.github.io"
- "adrules.top"
- "anti-ad.net"
- "local.adguard.org"
- "static.adtidy.org"
- "+.sandai.net"
- "+.n0808.com"
- "+.3gppnetwork.org"
- "+.uu.163.com"
- "ps.res.netease.com"
- "+.pub.3gppnetwork.org"
- "+.oray.com"
- "+.orayimg.com"
- "+.gcloudcs.com"
- "+.gcloudsdk.com"
- "+.instant.arubanetworks.com"
- "+.setmeup.arubanetworks.com"
- "+.router.asus.com"
- "+.www.asusrouter.com"
- "+.hiwifi.com"
- "+.leike.cc"
- "+.miwifi.com"
- "+.my.router"
- "+.p.to"
- "+.peiluyou.com"
- "+.phicomm.me"
- "+.router.ctc"
- "+.routerlogin.com"
- "+.tendawifi.com"
- "+.zte.home"
- "+.tplogin.cn"
- "+.wifi.cmcc"
tun:
enable: true
stack: system
device: mochen
auto-route: true
endpoint-independent-nat: true
auto-detect-interface: true
endpoint-independents-hijack:
- any:53
- tcp://any:53
strict-route: false
mtu: 1500
udp-timeout: 120
proxies: []
proxy-groups:
- name: 🚀 默认代理
type: select
proxies:
- ♻️ 自动选择
- 🔯 故障转移
- 🔮 负载均衡
- name: 🎮 游戏
type: select
proxies: []
- name: 🎮 steam
type: select
proxies:
- 🚀 默认代理
- ♻️ 自动选择
- DIRECT
- name: 📹 YouTube
type: select
proxies:
- 🚀 默认代理
- ♻️ 自动选择
- name: 🍀 Google
type: select
proxies:
- 🚀 默认代理
- ♻️ 自动选择
- name: 📺 Bilibili
type: select
proxies:
- DIRECT
- 🚀 默认代理
- ♻️ 自动选择
- name: 🤖 ChatGPT
type: select
proxies:
- 🚀 默认代理
- ♻️ 自动选择
- name: 👨🏿‍💻 GitHub
type: select
proxies:
- 🚀 默认代理
- ♻️ 自动选择
- name: 🐬 OneDrive
type: select
proxies:
- DIRECT
- 🚀 默认代理
- ♻️ 自动选择
- name: 🪟 Microsoft
type: select
proxies:
- DIRECT
- 🚀 默认代理
- ♻️ 自动选择
- name: 🎵 TikTok
type: select
proxies:
- 🚀 默认代理
- ♻️ 自动选择
- name: 📲 Telegram
type: select
proxies:
- 🚀 默认代理
- ♻️ 自动选择
- name: 🎥 NETFLIX
type: select
proxies:
- 🚀 默认代理
- ♻️ 自动选择
- name: ✈️ Speedtest
type: select
proxies:
- 🚀 默认代理
- ♻️ 自动选择
- DIRECT
- name: 💶 PayPal
type: select
proxies:
- 🚀 默认代理
- ♻️ 自动选择
- name: 🍎 Apple
type: select
proxies:
- DIRECT
- 🚀 默认代理
- ♻️ 自动选择
- name: 🐟 漏网之鱼
type: select
proxies:
- 🚀 默认代理
- ♻️ 自动选择
- DIRECT
- name: 🌏 国内网站
type: select
proxies:
- DIRECT
- 🚀 默认代理
- name: ♻️ 自动选择
type: url-test
url: http://cp.cloudflare.com/
interval: 300
tolerance: 50
timeout: 300
max-failed-times: 3
proxies: []
- name: 🔯 故障转移
type: fallback
url: http://cp.cloudflare.com/
interval: 300
tolerance: 50
timeout: 300
max-failed-times: 3
proxies: []
- name: 🔮 负载均衡
type: load-balance
strategy: consistent-hashing
url: http://cp.cloudflare.com/
interval: 300
tolerance: 50
timeout: 300
max-failed-times: 3
proxies: []
rules:
- GEOSITE,category-ads-all,REJECT
- DOMAIN,instant.arubanetworks.com,DIRECT
- DOMAIN,setmeup.arubanetworks.com,DIRECT
- DOMAIN,router.asus.com,DIRECT
- DOMAIN,www.asusrouter.com,DIRECT
- DOMAIN-SUFFIX,hiwifi.com,DIRECT
- DOMAIN-SUFFIX,leike.cc,DIRECT
- DOMAIN-SUFFIX,miwifi.com,DIRECT
- DOMAIN-SUFFIX,my.router,DIRECT
- DOMAIN-SUFFIX,p.to,DIRECT
- DOMAIN-SUFFIX,peiluyou.com,DIRECT
- DOMAIN-SUFFIX,phicomm.me,DIRECT
- DOMAIN-SUFFIX,router.ctc,DIRECT
- DOMAIN-SUFFIX,routerlogin.com,DIRECT
- DOMAIN-SUFFIX,tendawifi.com,DIRECT
- DOMAIN-SUFFIX,zte.home,DIRECT
- DOMAIN-SUFFIX,tplogin.cn,DIRECT
- DOMAIN-SUFFIX,wifi.cmcc,DIRECT
- DOMAIN-SUFFIX,bilibili.com, 📺 Bilibili
- GEOSITE,bilibili, 📺 Bilibili
- GEOSITE,biliintl, 📺 Bilibili
- DOMAIN,ipinfo.littlediary.cn, 🚀 默认代理
- DOMAIN,console.cloudyun.top, 🚀 默认代理
- DOMAIN,s3.cloudyun.top, 🚀 默认代理
- DOMAIN-SUFFIX,browserleaks.com, 🚀 默认代理
- DOMAIN-SUFFIX,ping.pe,🚀 默认代理
- DOMAIN-SUFFIX,dgameglobal.com,🎮 游戏
- DOMAIN-SUFFIX,wilds.monsterhunter.com,🎮 游戏
- DOMAIN-SUFFIX,capcom.com,🎮 游戏
- DOMAIN-SUFFIX,playfabapi.com,🎮 游戏
- DOMAIN-SUFFIX,playfab.com,🎮 游戏
- DOMAIN-SUFFIX,akamai.net,🎮 游戏
- DOMAIN-SUFFIX,cloudapp.azure.com,🎮 游戏
- PROCESS-NAME,CrashReport.exe,🎮 游戏
- PROCESS-NAME,InstallerMessage.exe,🎮 游戏
- PROCESS-NAME,MonsterHunterWilds.exe,🎮 游戏
- PROCESS-NAME,SGuard64.exe,🎮 游戏
- PROCESS-NAME,SGuardSvc64.exe,🎮 游戏
- PROCESS-NAME,SGuardUpdate64.exe,🎮 游戏
- PROCESS-NAME,Uninstall64.exe,🎮 游戏
- PROCESS-NAME,ACE-Service64.exe,🎮 游戏
- PROCESS-NAME,ACE-Setup64.exe,🎮 游戏
- PROCESS-NAME,GeckoParser.exe,🎮 游戏
- PROCESS-NAME,MetaperfCapturer.exe,🎮 游戏
- PROCESS-NAME,profiler-symbol-server.exe,🎮 游戏
- PROCESS-NAME,DownSysSymCache.exe,🎮 游戏
- PROCESS-NAME,dumpbin.exe,🎮 游戏
- PROCESS-NAME,Link.exe,🎮 游戏
- PROCESS-NAME,SymCacheGen.exe,🎮 游戏
- PROCESS-NAME,SymChk.exe,🎮 游戏
- PROCESS-NAME,WevtUtil.exe,🎮 游戏
- PROCESS-NAME,XPerf.exe,🎮 游戏
- PROCESS-NAME,DeltaForceClient-Win64-Shipping.exe,🎮 游戏
- PROCESS-NAME,INTLWebViewHelper.exe,🎮 游戏
- PROCESS-NAME,pfbs.exe,🎮 游戏
- PROCESS-NAME,UnrealCEFSubProcess.exe,🎮 游戏
- PROCESS-NAME,UE4PrereqSetup_x64.exe,🎮 游戏
- PROCESS-NAME,DeltaForceClient.exe,🎮 游戏
- PROCESS-NAME,EAAntiCheat.Installer.exe,🎮 游戏
- PROCESS-NAME,bf6.exe,🎮 游戏
- PROCESS-NAME,bf6.exe,🎮 游戏
- PROCESS-NAME,EAAntiCheat.GameServiceLauncher.exe,🎮 游戏
- PROCESS-NAME,EAAntiCheat.GameService.exe,🎮 游戏
- DOMAIN-SUFFIX,eaanticheat.ac.ea.com,🎮 游戏
- GEOSITE,steam@cn,🌏 国内网站
- GEOSITE,steam,🎮 steam
- GEOSITE,apple,🍎 Apple
- GEOSITE,private,🌏 国内网站
- GEOSITE,openai,🤖 ChatGPT
- GEOSITE,google-gemini,🤖 ChatGPT
- GEOSITE,github,👨🏿‍💻 GitHub
- GEOSITE,onedrive,🐬 OneDrive
- GEOSITE,microsoft,🪟 Microsoft
- GEOSITE,youtube,📹 YouTube
- GEOSITE,google,🍀 Google
- GEOSITE,tiktok,🎵 TikTok
- GEOSITE,speedtest,✈️ Speedtest
- GEOSITE,telegram,📲 Telegram
- GEOSITE,netflix,🎥 NETFLIX
- GEOSITE,paypal,💶 PayPal
- GEOSITE,gfw,🚀 默认代理
- GEOSITE,category-dev,🚀 默认代理
- DOMAIN-SUFFIX,cloudflare-dns.com,🚀 默认代理
- DOMAIN-SUFFIX,api.nn.ci,🚀 默认代理
- DOMAIN-SUFFIX,api.ipify.org,🚀 默认代理
- DOMAIN-SUFFIX,gsas.apple.com,🚀 默认代理
- DOMAIN-SUFFIX,hotmail.com,🚀 默认代理
- GEOSITE,CN,🌏 国内网站
- GEOIP,private,🌏 国内网站,no-resolve
- IP-CIDR,1.0.0.1/32,🚀 默认代理,no-resolve
- IP-CIDR,1.1.1.1/32,🚀 默认代理,no-resolve
- IP-CIDR,8.8.8.8/32,🚀 默认代理,no-resolve
- IP-CIDR,8.8.4.4/32,🚀 默认代理,no-resolve
- GEOIP,google,🍀 Google
- GEOIP,netflix,🎥 NETFLIX
- GEOIP,telegram,📲 Telegram
- GEOIP,CN,🌏 国内网站
- IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
- IP-CIDR,172.16.0.0/12,DIRECT,no-resolve
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- IP-CIDR,100.64.0.0/10,DIRECT,no-resolve
- IP-CIDR,127.0.0.0/8,DIRECT,no-resolve
- IP-CIDR,198.18.0.0/16,DIRECT,no-resolve
- IP-CIDR,224.0.0.0/4,DIRECT,no-resolve
- IP-CIDR6,::1/128,DIRECT,no-resolve
- IP-CIDR6,fc00::/7,DIRECT,no-resolve
- IP-CIDR6,fe80::/10,DIRECT,no-resolve
- IP-CIDR6,fd00::/8,DIRECT,no-resolve
- MATCH,🐟 漏网之鱼

159
submodule/singbox.json Normal file
View File

@@ -0,0 +1,159 @@
{
"dns": {
"rules": [
{
"outbound": [
"any"
],
"server": "local"
},
{
"clash_mode": "global",
"server": "remote"
},
{
"clash_mode": "direct",
"server": "local"
},
{
"rule_set": [
"geosite-cn"
],
"server": "local"
}
],
"servers": [
{
"address": "https://1.1.1.1/dns-query",
"detour": "节点选择",
"tag": "remote"
},
{
"address": "https://223.5.5.5/dns-query",
"detour": "direct",
"tag": "local"
},
{
"address": "rcode://success",
"tag": "block"
}
],
"strategy": "prefer_ipv4"
},
"experimental": {
"cache_file": {
"enabled": true,
"path": "cache.db",
"cache_id": "cache_db",
"store_fakeip": true
}
},
"inbounds": [
{
"auto_route": true,
"domain_strategy": "prefer_ipv4",
"endpoint_independent_nat": true,
"address": [
"172.19.0.1/30",
"2001:0470:f9da:fdfa::1/64"
],
"mtu": 9000,
"sniff": true,
"sniff_override_destination": true,
"stack": "system",
"strict_route": true,
"type": "tun"
},
{
"domain_strategy": "prefer_ipv4",
"listen": "127.0.0.1",
"listen_port": 2333,
"sniff": true,
"sniff_override_destination": true,
"tag": "socks-in",
"type": "socks",
"users": []
},
{
"domain_strategy": "prefer_ipv4",
"listen": "127.0.0.1",
"listen_port": 2334,
"sniff": true,
"sniff_override_destination": true,
"tag": "mixed-in",
"type": "mixed",
"users": []
}
],
"outbounds": [
{
"tag": "节点选择",
"type": "selector",
"default": "自动选择",
"outbounds": [
"自动选择"
]
},
{
"tag": "direct",
"type": "direct"
},
{
"tag": "block",
"type": "block"
},
{
"tag": "dns-out",
"type": "dns"
},
{
"tag": "自动选择",
"type": "urltest",
"outbounds": []
}
],
"route": {
"auto_detect_interface": true,
"rules": [
{
"outbound": "dns-out",
"protocol": "dns"
},
{
"clash_mode": "direct",
"outbound": "direct"
},
{
"clash_mode": "global",
"outbound": "节点选择"
},
{
"ip_is_private": true,
"outbound": "direct"
},
{
"rule_set": [
"geosite-cn",
"geoip-cn"
],
"outbound": "direct"
}
],
"rule_set": [
{
"tag": "geosite-cn",
"type": "remote",
"format": "binary",
"url": "https://raw.githubusercontent.com/SagerNet/sing-geosite/rule-set/geosite-cn.srs",
"download_detour": "自动选择"
},
{
"tag": "geoip-cn",
"type": "remote",
"format": "binary",
"url": "https://raw.githubusercontent.com/SagerNet/sing-geoip/rule-set/geoip-cn.srs",
"download_detour": "自动选择"
}
]
}
}

491
submodule/stash.yaml Normal file
View File

@@ -0,0 +1,491 @@
port: 7890
socks-port: 7891
allow-lan: true
ipv6: true
bind-address: "*"
mode: Rule
log-level: info
external-controller: 127.0.0.1:9090
tcp-concurrent: true
find-process-mode: strict
geodata-mode: true #【Meta专属】使用geoip.dat数据库(默认false使用mmdb数据库)
geodata-loader: standard
geo-auto-update: true
geo-update-interval: 24
geox-url:
geoip: "https://fastly.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geoip.dat"
geosite: "https://fastly.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geosite.dat"
mmdb: "https://fastly.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geoip.metadb"
asn: "https://github.com/xishang0128/geoip/releases/download/latest/GeoLite2-ASN.mmdb"
experimental:
ignore-resolve-fail: true
dns:
enable: true
listen: 1053
ipv6: false
default-nameserver:
- 1.1.1.1
- 8.8.8.8
nameserver:
- https://1.1.1.1/dns-query # Cloudflare支持 H3
- https://dns.google/dns-query # Google支持 H3
- 1.1.1.1 # Cloudflare Public DNS (UDP)
- 8.8.8.8 # Google Public DNS (UDP)
proxy-server-nameserver:
- https://doh.pub/dns-query
- 223.5.5.5
nameserver-policy:
"geosite:cn,private": # 国内域名和私有域名强制走国内 DNS
- https://223.5.5.5/dns-query # 阿里
- https://doh.pub/dns-query # 腾讯
- 223.5.5.5 # 阿里 UDP
- 119.29.29.29 # 腾讯 UDP
"geo:cn": # 也可以用 geo:cn 匹配 IP
- https://223.5.5.5/dns-query
- https://doh.pub/dns-query
- 223.5.5.5 # 阿里 UDP
- 119.29.29.29 # 腾讯 UDP
"geosite:gfw": # 新增GFW 列表域名强制走国外 DNS
- https://cloudflare-dns.com/dns-query
- https://dns.google/dns-query
- 1.1.1.1
- 8.8.8.8
"geosite:geolocation-!cn": # 新增:非中国大陆域名强制走国外 DNS
- https://cloudflare-dns.com/dns-query
- https://dns.google/dns-query
- 1.1.1.1
- 8.8.8.8
"full-nameserver": # 新增:最终兜底,所有未匹配的域名查询强制走国外 DNS
- https://cloudflare-dns.com/dns-query
- https://dns.google/dns-query
- 1.1.1.1
- 8.8.8.8
fallback:
- tls://8.8.4.4
- tls://1.1.1.1
fallback-filter:
geoip: true
geoip-code: CN
geosite:
- gfw
ipcidr:
- 240.0.0.0/4
domain:
- +.google.com
- +.facebook.com
- +.youtube.com
- +.githubusercontent.com
- +.googlevideo.com
- +.msftconnecttest.com
- +.msftncsi.com
- msftconnecttest.com
- msftncsi.com
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
fake-ip-filter-mode: blacklist
fake-ip-filter:
- "*.lan"
- "*.localdomain"
- "*.example"
- "*.invalid"
- "*.localhost"
- "*.test"
- "*.local"
- "*.home.arpa"
- "*.direct"
- "*.orb.local"
- "*.ip6-localhost"
- "*.ip6-loopback"
- "time.*.com"
- "time.*.gov"
- "time.*.edu.cn"
- "time.*.apple.com"
- "time-ios.apple.com"
- "time1.*.com"
- "time2.*.com"
- "time3.*.com"
- "time4.*.com"
- "time5.*.com"
- "time6.*.com"
- "time7.*.com"
- "ntp.*.com"
- "ntp1.*.com"
- "ntp2.*.com"
- "ntp3.*.com"
- "ntp4.*.com"
- "ntp5.*.com"
- "ntp6.*.com"
- "ntp7.*.com"
- "*.time.edu.cn"
- "*.ntp.org.cn"
- "+.pool.ntp.org"
- "time1.cloud.tencent.com"
- "music.163.com"
- "*.music.163.com"
- "*.126.net"
- "musicapi.taihe.com"
- "music.taihe.com"
- "songsearch.kugou.com"
- "trackercdn.kugou.com"
- "*.kuwo.cn"
- "api-jooxtt.sanook.com"
- "api.joox.com"
- "joox.com"
- "y.qq.com"
- "*.y.qq.com"
- "streamoc.music.tc.qq.com"
- "mobileoc.music.tc.qq.com"
- "isure.stream.qqmusic.qq.com"
- "dl.stream.qqmusic.qq.com"
- "aqqmusic.tc.qq.com"
- "amobile.music.tc.qq.com"
- "*.xiami.com"
- "*.music.migu.cn"
- "music.migu.cn"
- "+.msftconnecttest.com"
- "+.msftncsi.com"
- "localhost.ptlogin2.qq.com"
- "localhost.sec.qq.com"
- "localhost.*.weixin.qq.com"
- "+.steamcontent.com"
- "+.srv.nintendo.net"
- "*.n.n.srv.nintendo.net"
- "+.cdn.nintendo.net"
- "xbox.*.*.microsoft.com"
- "*.*.xboxlive.com"
- "xbox.*.microsoft.com"
- "xnotify.xboxlive.com"
- "+.battle.net"
- "+.battlenet.com.cn"
- "+.wotgame.cn"
- "+.wggames.cn"
- "+.wowsgame.cn"
- "+.wargaming.net"
- "proxy.golang.org"
- "+.stun.*.*"
- "+.stun.*.*.*"
- "+.stun.*.*.*.*"
- "+.stun.*.*.*.*.*"
- "heartbeat.belkin.com"
- "*.linksys.com"
- "*.linksyssmartwifi.com"
- "*.router.asus.com"
- "mesu.apple.com"
- "swscan.apple.com"
- "swquery.apple.com"
- "swdownload.apple.com"
- "swcdn.apple.com"
- "swdist.apple.com"
- "lens.l.google.com"
- "na.b.g-tun.com"
- "+.nflxvideo.net"
- "*.square-enix.com"
- "*.finalfantasyxiv.com"
- "*.ffxiv.com"
- "*.ff14.sdo.com"
- "ff.dorado.sdo.com"
- "*.mcdn.bilivideo.cn"
- "+.media.dssott.com"
- "shark007.net"
- "Mijia Cloud"
- "+.market.xiaomi.com"
- "+.cmbchina.com"
- "+.cmbimg.com"
- "adguardteam.github.io"
- "adrules.top"
- "anti-ad.net"
- "local.adguard.org"
- "static.adtidy.org"
- "+.sandai.net"
- "+.n0808.com"
- "+.3gppnetwork.org"
- "+.uu.163.com"
- "ps.res.netease.com"
- "+.pub.3gppnetwork.org"
- "+.oray.com"
- "+.orayimg.com"
- "+.gcloudcs.com"
- "+.gcloudsdk.com"
- "+.instant.arubanetworks.com"
- "+.setmeup.arubanetworks.com"
- "+.router.asus.com"
- "+.www.asusrouter.com"
- "+.hiwifi.com"
- "+.leike.cc"
- "+.miwifi.com"
- "+.my.router"
- "+.p.to"
- "+.peiluyou.com"
- "+.phicomm.me"
- "+.router.ctc"
- "+.routerlogin.com"
- "+.tendawifi.com"
- "+.zte.home"
- "+.tplogin.cn"
- "+.wifi.cmcc"
tun:
enable: true
stack: system
device: mochen
auto-route: true
endpoint-independent-nat: true
auto-detect-interface: true
endpoint-independents-hijack:
- any:53
- tcp://any:53
strict-route: false
mtu: 1500
udp-timeout: 120
proxies: []
proxy-groups:
- name: 🚀 默认代理
type: select
proxies:
- ♻️ 自动选择
- 🔯 故障转移
- 🔮 负载均衡
- name: 🎮 游戏
type: select
proxies: []
- name: 🎮 steam
type: select
proxies:
- 🚀 默认代理
- ♻️ 自动选择
- DIRECT
- name: 📹 YouTube
type: select
proxies:
- 🚀 默认代理
- ♻️ 自动选择
- name: 🍀 Google
type: select
proxies:
- 🚀 默认代理
- ♻️ 自动选择
- name: 📺 Bilibili
type: select
proxies:
- DIRECT
- 🚀 默认代理
- ♻️ 自动选择
- name: 🤖 ChatGPT
type: select
proxies:
- 🚀 默认代理
- ♻️ 自动选择
- name: 👨🏿‍💻 GitHub
type: select
proxies:
- 🚀 默认代理
- ♻️ 自动选择
- name: 🐬 OneDrive
type: select
proxies:
- DIRECT
- 🚀 默认代理
- ♻️ 自动选择
- name: 🪟 Microsoft
type: select
proxies:
- DIRECT
- 🚀 默认代理
- ♻️ 自动选择
- name: 🎵 TikTok
type: select
proxies:
- 🚀 默认代理
- ♻️ 自动选择
- name: 📲 Telegram
type: select
proxies:
- 🚀 默认代理
- ♻️ 自动选择
- name: 🎥 NETFLIX
type: select
proxies:
- 🚀 默认代理
- ♻️ 自动选择
- name: ✈️ Speedtest
type: select
proxies:
- 🚀 默认代理
- ♻️ 自动选择
- DIRECT
- name: 💶 PayPal
type: select
proxies:
- 🚀 默认代理
- ♻️ 自动选择
- name: 🍎 Apple
type: select
proxies:
- DIRECT
- 🚀 默认代理
- ♻️ 自动选择
- name: 🐟 漏网之鱼
type: select
proxies:
- 🚀 默认代理
- ♻️ 自动选择
- DIRECT
- name: 🌏 国内网站
type: select
proxies:
- DIRECT
- 🚀 默认代理
- name: ♻️ 自动选择
type: url-test
url: http://cp.cloudflare.com/
interval: 300
tolerance: 50
timeout: 300
max-failed-times: 3
proxies: []
- name: 🔯 故障转移
type: fallback
url: http://cp.cloudflare.com/
interval: 300
tolerance: 50
timeout: 300
max-failed-times: 3
proxies: []
- name: 🔮 负载均衡
type: load-balance
strategy: consistent-hashing
url: http://cp.cloudflare.com/
interval: 300
tolerance: 50
timeout: 300
max-failed-times: 3
proxies: []
rules:
- GEOSITE,category-ads-all,REJECT
- DOMAIN,instant.arubanetworks.com,DIRECT
- DOMAIN,setmeup.arubanetworks.com,DIRECT
- DOMAIN,router.asus.com,DIRECT
- DOMAIN,www.asusrouter.com,DIRECT
- DOMAIN-SUFFIX,hiwifi.com,DIRECT
- DOMAIN-SUFFIX,leike.cc,DIRECT
- DOMAIN-SUFFIX,miwifi.com,DIRECT
- DOMAIN-SUFFIX,my.router,DIRECT
- DOMAIN-SUFFIX,p.to,DIRECT
- DOMAIN-SUFFIX,peiluyou.com,DIRECT
- DOMAIN-SUFFIX,phicomm.me,DIRECT
- DOMAIN-SUFFIX,router.ctc,DIRECT
- DOMAIN-SUFFIX,routerlogin.com,DIRECT
- DOMAIN-SUFFIX,tendawifi.com,DIRECT
- DOMAIN-SUFFIX,zte.home,DIRECT
- DOMAIN-SUFFIX,tplogin.cn,DIRECT
- DOMAIN-SUFFIX,wifi.cmcc,DIRECT
- DOMAIN-SUFFIX,bilibili.com, 📺 Bilibili
- GEOSITE,bilibili, 📺 Bilibili
- GEOSITE,biliintl, 📺 Bilibili
- DOMAIN,ipinfo.littlediary.cn, 🚀 默认代理
- DOMAIN-SUFFIX,browserleaks.com, 🚀 默认代理
- DOMAIN-SUFFIX,ping.pe,🚀 默认代理
- DOMAIN-SUFFIX,dgameglobal.com,🎮 游戏
- DOMAIN-SUFFIX,wilds.monsterhunter.com,🎮 游戏
- DOMAIN-SUFFIX,capcom.com,🎮 游戏
- DOMAIN-SUFFIX,playfabapi.com,🎮 游戏
- DOMAIN-SUFFIX,playfab.com,🎮 游戏
- DOMAIN-SUFFIX,akamai.net,🎮 游戏
- DOMAIN-SUFFIX,cloudapp.azure.com,🎮 游戏
- PROCESS-NAME,CrashReport.exe,🎮 游戏
- PROCESS-NAME,InstallerMessage.exe,🎮 游戏
- PROCESS-NAME,MonsterHunterWilds.exe,🎮 游戏
- PROCESS-NAME,SGuard64.exe,🎮 游戏
- PROCESS-NAME,SGuardSvc64.exe,🎮 游戏
- PROCESS-NAME,SGuardUpdate64.exe,🎮 游戏
- PROCESS-NAME,Uninstall64.exe,🎮 游戏
- PROCESS-NAME,ACE-Service64.exe,🎮 游戏
- PROCESS-NAME,ACE-Setup64.exe,🎮 游戏
- PROCESS-NAME,GeckoParser.exe,🎮 游戏
- PROCESS-NAME,MetaperfCapturer.exe,🎮 游戏
- PROCESS-NAME,profiler-symbol-server.exe,🎮 游戏
- PROCESS-NAME,DownSysSymCache.exe,🎮 游戏
- PROCESS-NAME,dumpbin.exe,🎮 游戏
- PROCESS-NAME,Link.exe,🎮 游戏
- PROCESS-NAME,SymCacheGen.exe,🎮 游戏
- PROCESS-NAME,SymChk.exe,🎮 游戏
- PROCESS-NAME,WevtUtil.exe,🎮 游戏
- PROCESS-NAME,XPerf.exe,🎮 游戏
- PROCESS-NAME,DeltaForceClient-Win64-Shipping.exe,🎮 游戏
- PROCESS-NAME,INTLWebViewHelper.exe,🎮 游戏
- PROCESS-NAME,pfbs.exe,🎮 游戏
- PROCESS-NAME,UnrealCEFSubProcess.exe,🎮 游戏
- PROCESS-NAME,UE4PrereqSetup_x64.exe,🎮 游戏
- PROCESS-NAME,DeltaForceClient.exe,🎮 游戏
- PROCESS-NAME,EAAntiCheat.Installer.exe,🎮 游戏
- PROCESS-NAME,bf6.exe,🎮 游戏
- PROCESS-NAME,bf6.exe,🎮 游戏
- PROCESS-NAME,EAAntiCheat.GameServiceLauncher.exe,🎮 游戏
- PROCESS-NAME,EAAntiCheat.GameService.exe,🎮 游戏
- DOMAIN-SUFFIX,eaanticheat.ac.ea.com,🎮 游戏
- GEOSITE,steam@cn,🌏 国内网站
- GEOSITE,steam,🎮 steam
- GEOSITE,apple,🍎 Apple
- GEOSITE,private,🌏 国内网站
- GEOSITE,openai,🤖 ChatGPT
- GEOSITE,google-gemini,🤖 ChatGPT
- GEOSITE,github,👨🏿‍💻 GitHub
- GEOSITE,onedrive,🐬 OneDrive
- GEOSITE,microsoft,🪟 Microsoft
- GEOSITE,youtube,📹 YouTube
- GEOSITE,google,🍀 Google
- GEOSITE,tiktok,🎵 TikTok
- GEOSITE,speedtest,✈️ Speedtest
- GEOSITE,telegram,📲 Telegram
- GEOSITE,netflix,🎥 NETFLIX
- GEOSITE,paypal,💶 PayPal
- GEOSITE,gfw,🚀 默认代理
- GEOSITE,category-dev,🚀 默认代理
- DOMAIN-SUFFIX,cloudflare-dns.com,🚀 默认代理
- DOMAIN-SUFFIX,api.nn.ci,🚀 默认代理
- DOMAIN-SUFFIX,api.ipify.org,🚀 默认代理
- DOMAIN-SUFFIX,gsas.apple.com,🚀 默认代理
- DOMAIN-SUFFIX,hotmail.com,🚀 默认代理
- GEOSITE,CN,🌏 国内网站
- GEOIP,private,🌏 国内网站,no-resolve
- IP-CIDR,1.0.0.1/32,🚀 默认代理,no-resolve
- IP-CIDR,1.1.1.1/32,🚀 默认代理,no-resolve
- IP-CIDR,8.8.8.8/32,🚀 默认代理,no-resolve
- IP-CIDR,8.8.4.4/32,🚀 默认代理,no-resolve
- GEOIP,google,🍀 Google
- GEOIP,netflix,🎥 NETFLIX
- GEOIP,telegram,📲 Telegram
- GEOIP,CN,🌏 国内网站
- IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
- IP-CIDR,172.16.0.0/12,DIRECT,no-resolve
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- IP-CIDR,100.64.0.0/10,DIRECT,no-resolve
- IP-CIDR,127.0.0.0/8,DIRECT,no-resolve
- IP-CIDR,198.18.0.0/16,DIRECT,no-resolve
- IP-CIDR,224.0.0.0/4,DIRECT,no-resolve
- IP-CIDR6,::1/128,DIRECT,no-resolve
- IP-CIDR6,fc00::/7,DIRECT,no-resolve
- IP-CIDR6,fe80::/10,DIRECT,no-resolve
- IP-CIDR6,fd00::/8,DIRECT,no-resolve
- MATCH,🐟 漏网之鱼

576
submodule/surfboard.toml Normal file
View File

@@ -0,0 +1,576 @@
#!MANAGED-CONFIG $subs_link interval=43200 strict=true
# Thanks @Hackl0us SS-Rule-Snippet
[General]
loglevel = notify
ipv6 = false
skip-proxy = localhost, *.local, injections.adguard.org, local.adguard.org, 0.0.0.0/8, 10.0.0.0/8, 17.0.0.0/8, 100.64.0.0/10, 127.0.0.0/8, 169.254.0.0/16, 172.16.0.0/12, 192.0.0.0/24, 192.0.2.0/24, 192.168.0.0/16, 192.88.99.0/24, 198.18.0.0/15, 198.51.100.0/24, 203.0.113.0/24, 224.0.0.0/4, 240.0.0.0/4, 255.255.255.255/32
tls-provider = default
show-error-page-for-reject = true
dns-server = 223.6.6.6, 119.29.29.29, 119.28.28.28
test-timeout = 5
internet-test-url = http://bing.com
proxy-test-url = http://bing.com
[Panel]
SubscribeInfo = $subscribe_info, style=info
# Surfboard 的服务器和策略组配置方式与 Surge 类似, 可以参考 Surge 的规则配置手册: https://manual.nssurge.com/
[Proxy]
$proxies
[Proxy Group]
Proxy = select, auto, fallback, $proxy_group
auto = url-test, $proxy_group, url=http://www.gstatic.com/generate_204, interval=43200
fallback = fallback, $proxy_group, url=http://www.gstatic.com/generate_204, interval=43200
[Rule]
# 自定义规则
## 您可以在此处插入自定义规则
DOMAIN-SUFFIX,tophub.today,DIRECT
DOMAIN-SUFFIX,netmarble.com,Proxy
DOMAIN-SUFFIX,worldflipper.jp,Proxy
DOMAIN-SUFFIX,naver.com,Proxy
DOMAIN-SUFFIX,smartmediarep.com,Proxy
DOMAIN-SUFFIX,technews.tw,Proxy
# 强制订阅域名直连
DOMAIN,$subs_domain,DIRECT
# Google 中国服务
DOMAIN-SUFFIX,services.googleapis.cn,Proxy
DOMAIN-SUFFIX,xn--ngstr-lra8j.com,Proxy
# Apple
DOMAIN,developer.apple.com,Proxy
DOMAIN-SUFFIX,digicert.com,Proxy
USER-AGENT,com.apple.trustd*,Proxy
DOMAIN-SUFFIX,apple-dns.net,Proxy
DOMAIN,testflight.apple.com,Proxy
DOMAIN,sandbox.itunes.apple.com,Proxy
DOMAIN,itunes.apple.com,Proxy
DOMAIN-SUFFIX,apps.apple.com,Proxy
DOMAIN-SUFFIX,blobstore.apple.com,Proxy
DOMAIN,cvws.icloud-content.com,Proxy
DOMAIN,safebrowsing.urlsec.qq.com,DIRECT
DOMAIN,safebrowsing.googleapis.com,DIRECT
USER-AGENT,com.apple.appstored*,DIRECT
USER-AGENT,AppStore*,DIRECT
DOMAIN-SUFFIX,mzstatic.com,DIRECT
DOMAIN-SUFFIX,itunes.apple.com,DIRECT
DOMAIN-SUFFIX,icloud.com,DIRECT
DOMAIN-SUFFIX,icloud-content.com,DIRECT
USER-AGENT,cloudd*,DIRECT
USER-AGENT,*com.apple.WebKit*,DIRECT
USER-AGENT,*com.apple.*,DIRECT
DOMAIN-SUFFIX,me.com,DIRECT
DOMAIN-SUFFIX,aaplimg.com,DIRECT
DOMAIN-SUFFIX,cdn20.com,DIRECT
DOMAIN-SUFFIX,cdn-apple.com,DIRECT
DOMAIN-SUFFIX,akadns.net,DIRECT
DOMAIN-SUFFIX,akamaiedge.net,DIRECT
DOMAIN-SUFFIX,edgekey.net,DIRECT
DOMAIN-SUFFIX,mwcloudcdn.com,DIRECT
DOMAIN-SUFFIX,mwcname.com,DIRECT
DOMAIN-SUFFIX,apple.com,DIRECT
DOMAIN-SUFFIX,apple-cloudkit.com,DIRECT
DOMAIN-SUFFIX,apple-mapkit.com,DIRECT
# 国内网站
USER-AGENT,MicroMessenger Client*,DIRECT
USER-AGENT,WeChat*,DIRECT
DOMAIN-SUFFIX,126.com,DIRECT
DOMAIN-SUFFIX,126.net,DIRECT
DOMAIN-SUFFIX,127.net,DIRECT
DOMAIN-SUFFIX,163.com,DIRECT
DOMAIN-SUFFIX,360buyimg.com,DIRECT
DOMAIN-SUFFIX,36kr.com,DIRECT
DOMAIN-SUFFIX,acfun.tv,DIRECT
DOMAIN-SUFFIX,air-matters.com,DIRECT
DOMAIN-SUFFIX,aixifan.com,DIRECT
DOMAIN-KEYWORD,alicdn,DIRECT
DOMAIN-KEYWORD,alipay,DIRECT
DOMAIN-KEYWORD,aliyun,DIRECT
DOMAIN-KEYWORD,taobao,DIRECT
DOMAIN-SUFFIX,amap.com,DIRECT
DOMAIN-SUFFIX,autonavi.com,DIRECT
DOMAIN-KEYWORD,baidu,DIRECT
DOMAIN-SUFFIX,bdimg.com,DIRECT
DOMAIN-SUFFIX,bdstatic.com,DIRECT
DOMAIN-SUFFIX,bilibili.com,DIRECT
DOMAIN-SUFFIX,bilivideo.com,DIRECT
DOMAIN-SUFFIX,caiyunapp.com,DIRECT
DOMAIN-SUFFIX,clouddn.com,DIRECT
DOMAIN-SUFFIX,cnbeta.com,DIRECT
DOMAIN-SUFFIX,cnbetacdn.com,DIRECT
DOMAIN-SUFFIX,cootekservice.com,DIRECT
DOMAIN-SUFFIX,csdn.net,DIRECT
DOMAIN-SUFFIX,ctrip.com,DIRECT
DOMAIN-SUFFIX,dgtle.com,DIRECT
DOMAIN-SUFFIX,dianping.com,DIRECT
DOMAIN-SUFFIX,douban.com,DIRECT
DOMAIN-SUFFIX,doubanio.com,DIRECT
DOMAIN-SUFFIX,duokan.com,DIRECT
DOMAIN-SUFFIX,easou.com,DIRECT
DOMAIN-SUFFIX,ele.me,DIRECT
DOMAIN-SUFFIX,feng.com,DIRECT
DOMAIN-SUFFIX,fir.im,DIRECT
DOMAIN-SUFFIX,frdic.com,DIRECT
DOMAIN-SUFFIX,g-cores.com,DIRECT
DOMAIN-SUFFIX,godic.net,DIRECT
DOMAIN-SUFFIX,gtimg.com,DIRECT
DOMAIN-SUFFIX,hongxiu.com,DIRECT
DOMAIN-SUFFIX,hxcdn.net,DIRECT
DOMAIN-SUFFIX,iciba.com,DIRECT
DOMAIN-SUFFIX,ifeng.com,DIRECT
DOMAIN-SUFFIX,ifengimg.com,DIRECT
DOMAIN-SUFFIX,ipip.net,DIRECT
DOMAIN-SUFFIX,iqiyi.com,DIRECT
DOMAIN-SUFFIX,jd.com,DIRECT
DOMAIN-SUFFIX,jianshu.com,DIRECT
DOMAIN-SUFFIX,knewone.com,DIRECT
DOMAIN-SUFFIX,le.com,DIRECT
DOMAIN-SUFFIX,lecloud.com,DIRECT
DOMAIN-SUFFIX,lemicp.com,DIRECT
DOMAIN-SUFFIX,licdn.com,DIRECT
DOMAIN-SUFFIX,luoo.net,DIRECT
DOMAIN-SUFFIX,meituan.com,DIRECT
DOMAIN-SUFFIX,meituan.net,DIRECT
DOMAIN-SUFFIX,mi.com,DIRECT
DOMAIN-SUFFIX,miaopai.com,DIRECT
DOMAIN-SUFFIX,microsoft.com,DIRECT
DOMAIN-SUFFIX,microsoftonline.com,DIRECT
DOMAIN-SUFFIX,miui.com,DIRECT
DOMAIN-SUFFIX,miwifi.com,DIRECT
DOMAIN-SUFFIX,mob.com,DIRECT
DOMAIN-SUFFIX,netease.com,DIRECT
DOMAIN-SUFFIX,office.com,DIRECT
DOMAIN-KEYWORD,officecdn,DIRECT
DOMAIN-SUFFIX,office365.com,DIRECT
DOMAIN-SUFFIX,oschina.net,DIRECT
DOMAIN-SUFFIX,ppsimg.com,DIRECT
DOMAIN-SUFFIX,pstatp.com,DIRECT
DOMAIN-SUFFIX,qcloud.com,DIRECT
DOMAIN-SUFFIX,qdaily.com,DIRECT
DOMAIN-SUFFIX,qdmm.com,DIRECT
DOMAIN-SUFFIX,qhimg.com,DIRECT
DOMAIN-SUFFIX,qhres.com,DIRECT
DOMAIN-SUFFIX,qidian.com,DIRECT
DOMAIN-SUFFIX,qihucdn.com,DIRECT
DOMAIN-SUFFIX,qiniu.com,DIRECT
DOMAIN-SUFFIX,qiniucdn.com,DIRECT
DOMAIN-SUFFIX,qiyipic.com,DIRECT
DOMAIN-SUFFIX,qq.com,DIRECT
DOMAIN-SUFFIX,qqurl.com,DIRECT
DOMAIN-SUFFIX,rarbg.to,DIRECT
DOMAIN-SUFFIX,ruguoapp.com,DIRECT
DOMAIN-SUFFIX,segmentfault.com,DIRECT
DOMAIN-SUFFIX,sinaapp.com,DIRECT
DOMAIN-SUFFIX,smzdm.com,DIRECT
DOMAIN-SUFFIX,snapdrop.net,DIRECT
DOMAIN-SUFFIX,sogou.com,DIRECT
DOMAIN-SUFFIX,sogoucdn.com,DIRECT
DOMAIN-SUFFIX,sohu.com,DIRECT
DOMAIN-SUFFIX,soku.com,DIRECT
DOMAIN-SUFFIX,speedtest.net,DIRECT
DOMAIN-SUFFIX,sspai.com,DIRECT
DOMAIN-SUFFIX,suning.com,DIRECT
DOMAIN-SUFFIX,taobao.com,DIRECT
DOMAIN-SUFFIX,tencent.com,DIRECT
DOMAIN-SUFFIX,tenpay.com,DIRECT
DOMAIN-SUFFIX,tianyancha.com,DIRECT
DOMAIN-KEYWORD,.tmall.com,DIRECT
DOMAIN-SUFFIX,tudou.com,DIRECT
DOMAIN-SUFFIX,umetrip.com,DIRECT
DOMAIN-SUFFIX,upaiyun.com,DIRECT
DOMAIN-SUFFIX,upyun.com,DIRECT
DOMAIN-SUFFIX,veryzhun.com,DIRECT
DOMAIN-SUFFIX,weather.com,DIRECT
DOMAIN-SUFFIX,weibo.com,DIRECT
DOMAIN-SUFFIX,xiami.com,DIRECT
DOMAIN-SUFFIX,xiami.net,DIRECT
DOMAIN-SUFFIX,xiaomicp.com,DIRECT
DOMAIN-SUFFIX,ximalaya.com,DIRECT
DOMAIN-SUFFIX,xmcdn.com,DIRECT
DOMAIN-SUFFIX,xunlei.com,DIRECT
DOMAIN-SUFFIX,yhd.com,DIRECT
DOMAIN-SUFFIX,yihaodianimg.com,DIRECT
DOMAIN-SUFFIX,yinxiang.com,DIRECT
DOMAIN-SUFFIX,ykimg.com,DIRECT
DOMAIN-SUFFIX,youdao.com,DIRECT
DOMAIN-SUFFIX,youku.com,DIRECT
DOMAIN-SUFFIX,zealer.com,DIRECT
DOMAIN-SUFFIX,zhihu.com,DIRECT
DOMAIN-SUFFIX,zhimg.com,DIRECT
DOMAIN-SUFFIX,zimuzu.tv,DIRECT
DOMAIN-SUFFIX,zoho.com,DIRECT
# 常见广告
DOMAIN-KEYWORD,admarvel,REJECT-TINYGIF
DOMAIN-KEYWORD,admaster,REJECT-TINYGIF
DOMAIN-KEYWORD,adsage,REJECT-TINYGIF
DOMAIN-KEYWORD,adsmogo,REJECT-TINYGIF
DOMAIN-KEYWORD,adsrvmedia,REJECT-TINYGIF
DOMAIN-KEYWORD,adwords,REJECT-TINYGIF
DOMAIN-KEYWORD,adservice,REJECT-TINYGIF
DOMAIN-SUFFIX,appsflyer.com,REJECT-TINYGIF
DOMAIN-KEYWORD,domob,REJECT-TINYGIF
DOMAIN-SUFFIX,doubleclick.net,REJECT-TINYGIF
DOMAIN-KEYWORD,duomeng,REJECT-TINYGIF
DOMAIN-KEYWORD,dwtrack,REJECT-TINYGIF
DOMAIN-KEYWORD,guanggao,REJECT-TINYGIF
DOMAIN-KEYWORD,lianmeng,REJECT-TINYGIF
DOMAIN-SUFFIX,mmstat.com,REJECT-TINYGIF
DOMAIN-KEYWORD,mopub,REJECT-TINYGIF
DOMAIN-KEYWORD,omgmta,REJECT-TINYGIF
DOMAIN-KEYWORD,openx,REJECT-TINYGIF
DOMAIN-KEYWORD,partnerad,REJECT-TINYGIF
DOMAIN-KEYWORD,pingfore,REJECT-TINYGIF
DOMAIN-KEYWORD,supersonicads,REJECT-TINYGIF
DOMAIN-KEYWORD,uedas,REJECT-TINYGIF
DOMAIN-KEYWORD,umeng,REJECT-TINYGIF
DOMAIN-KEYWORD,usage,REJECT-TINYGIF
DOMAIN-SUFFIX,vungle.com,REJECT-TINYGIF
DOMAIN-KEYWORD,wlmonitor,REJECT-TINYGIF
DOMAIN-KEYWORD,zjtoolbar,REJECT-TINYGIF
## 抗 DNS 污染
DOMAIN-KEYWORD,amazon,Proxy
DOMAIN-KEYWORD,google,Proxy
DOMAIN-KEYWORD,gmail,Proxy
DOMAIN-KEYWORD,youtube,Proxy
DOMAIN-KEYWORD,facebook,Proxy
DOMAIN-SUFFIX,fb.me,Proxy
DOMAIN-SUFFIX,fbcdn.net,Proxy
DOMAIN-KEYWORD,twitter,Proxy
DOMAIN-KEYWORD,instagram,Proxy
DOMAIN-KEYWORD,dropbox,Proxy
DOMAIN-SUFFIX,twimg.com,Proxy
DOMAIN-KEYWORD,blogspot,Proxy
DOMAIN-SUFFIX,youtu.be,Proxy
## 常见国外域名列表
DOMAIN-SUFFIX,9to5mac.com,Proxy
DOMAIN-SUFFIX,abpchina.org,Proxy
DOMAIN-SUFFIX,adblockplus.org,Proxy
DOMAIN-SUFFIX,adobe.com,Proxy
DOMAIN-SUFFIX,akamaized.net,Proxy
DOMAIN-SUFFIX,alfredapp.com,Proxy
DOMAIN-SUFFIX,amplitude.com,Proxy
DOMAIN-SUFFIX,ampproject.org,Proxy
DOMAIN-SUFFIX,android.com,Proxy
DOMAIN-SUFFIX,angularjs.org,Proxy
DOMAIN-SUFFIX,aolcdn.com,Proxy
DOMAIN-SUFFIX,apkpure.com,Proxy
DOMAIN-SUFFIX,appledaily.com,Proxy
DOMAIN-SUFFIX,appshopper.com,Proxy
DOMAIN-SUFFIX,appspot.com,Proxy
DOMAIN-SUFFIX,arcgis.com,Proxy
DOMAIN-SUFFIX,archive.org,Proxy
DOMAIN-SUFFIX,armorgames.com,Proxy
DOMAIN-SUFFIX,aspnetcdn.com,Proxy
DOMAIN-SUFFIX,att.com,Proxy
DOMAIN-SUFFIX,awsstatic.com,Proxy
DOMAIN-SUFFIX,azureedge.net,Proxy
DOMAIN-SUFFIX,azurewebsites.net,Proxy
DOMAIN-SUFFIX,bing.com,Proxy
DOMAIN-SUFFIX,bintray.com,Proxy
DOMAIN-SUFFIX,bit.com,Proxy
DOMAIN-SUFFIX,bit.ly,Proxy
DOMAIN-SUFFIX,bitbucket.org,Proxy
DOMAIN-SUFFIX,bjango.com,Proxy
DOMAIN-SUFFIX,bkrtx.com,Proxy
DOMAIN-SUFFIX,blog.com,Proxy
DOMAIN-SUFFIX,blogcdn.com,Proxy
DOMAIN-SUFFIX,blogger.com,Proxy
DOMAIN-SUFFIX,blogsmithmedia.com,Proxy
DOMAIN-SUFFIX,blogspot.com,Proxy
DOMAIN-SUFFIX,blogspot.hk,Proxy
DOMAIN-SUFFIX,bloomberg.com,Proxy
DOMAIN-SUFFIX,box.com,Proxy
DOMAIN-SUFFIX,box.net,Proxy
DOMAIN-SUFFIX,cachefly.net,Proxy
DOMAIN-SUFFIX,chromium.org,Proxy
DOMAIN-SUFFIX,cl.ly,Proxy
DOMAIN-SUFFIX,cloudflare.com,Proxy
DOMAIN-SUFFIX,cloudfront.net,Proxy
DOMAIN-SUFFIX,cloudmagic.com,Proxy
DOMAIN-SUFFIX,cmail19.com,Proxy
DOMAIN-SUFFIX,cnet.com,Proxy
DOMAIN-SUFFIX,cocoapods.org,Proxy
DOMAIN-SUFFIX,comodoca.com,Proxy
DOMAIN-SUFFIX,crashlytics.com,Proxy
DOMAIN-SUFFIX,culturedcode.com,Proxy
DOMAIN-SUFFIX,d.pr,Proxy
DOMAIN-SUFFIX,danilo.to,Proxy
DOMAIN-SUFFIX,dayone.me,Proxy
DOMAIN-SUFFIX,db.tt,Proxy
DOMAIN-SUFFIX,deskconnect.com,Proxy
DOMAIN-SUFFIX,disq.us,Proxy
DOMAIN-SUFFIX,disqus.com,Proxy
DOMAIN-SUFFIX,disquscdn.com,Proxy
DOMAIN-SUFFIX,dnsimple.com,Proxy
DOMAIN-SUFFIX,docker.com,Proxy
DOMAIN-SUFFIX,dribbble.com,Proxy
DOMAIN-SUFFIX,droplr.com,Proxy
DOMAIN-SUFFIX,duckduckgo.com,Proxy
DOMAIN-SUFFIX,dueapp.com,Proxy
DOMAIN-SUFFIX,dytt8.net,Proxy
DOMAIN-SUFFIX,edgecastcdn.net,Proxy
DOMAIN-SUFFIX,edgekey.net,Proxy
DOMAIN-SUFFIX,edgesuite.net,Proxy
DOMAIN-SUFFIX,engadget.com,Proxy
DOMAIN-SUFFIX,entrust.net,Proxy
DOMAIN-SUFFIX,eurekavpt.com,Proxy
DOMAIN-SUFFIX,evernote.com,Proxy
DOMAIN-SUFFIX,fabric.io,Proxy
DOMAIN-SUFFIX,fast.com,Proxy
DOMAIN-SUFFIX,fastly.net,Proxy
DOMAIN-SUFFIX,fc2.com,Proxy
DOMAIN-SUFFIX,feedburner.com,Proxy
DOMAIN-SUFFIX,feedly.com,Proxy
DOMAIN-SUFFIX,feedsportal.com,Proxy
DOMAIN-SUFFIX,fiftythree.com,Proxy
DOMAIN-SUFFIX,firebaseio.com,Proxy
DOMAIN-SUFFIX,flexibits.com,Proxy
DOMAIN-SUFFIX,flickr.com,Proxy
DOMAIN-SUFFIX,flipboard.com,Proxy
DOMAIN-SUFFIX,g.co,Proxy
DOMAIN-SUFFIX,gabia.net,Proxy
DOMAIN-SUFFIX,geni.us,Proxy
DOMAIN-SUFFIX,gfx.ms,Proxy
DOMAIN-SUFFIX,ggpht.com,Proxy
DOMAIN-SUFFIX,ghostnoteapp.com,Proxy
DOMAIN-SUFFIX,git.io,Proxy
DOMAIN-KEYWORD,github,Proxy
DOMAIN-SUFFIX,globalsign.com,Proxy
DOMAIN-SUFFIX,gmodules.com,Proxy
DOMAIN-SUFFIX,godaddy.com,Proxy
DOMAIN-SUFFIX,golang.org,Proxy
DOMAIN-SUFFIX,gongm.in,Proxy
DOMAIN-SUFFIX,goo.gl,Proxy
DOMAIN-SUFFIX,goodreaders.com,Proxy
DOMAIN-SUFFIX,goodreads.com,Proxy
DOMAIN-SUFFIX,gravatar.com,Proxy
DOMAIN-SUFFIX,gstatic.com,Proxy
DOMAIN-SUFFIX,gvt0.com,Proxy
DOMAIN-SUFFIX,hockeyapp.net,Proxy
DOMAIN-SUFFIX,hotmail.com,Proxy
DOMAIN-SUFFIX,icons8.com,Proxy
DOMAIN-SUFFIX,ifixit.com,Proxy
DOMAIN-SUFFIX,ift.tt,Proxy
DOMAIN-SUFFIX,ifttt.com,Proxy
DOMAIN-SUFFIX,iherb.com,Proxy
DOMAIN-SUFFIX,imageshack.us,Proxy
DOMAIN-SUFFIX,img.ly,Proxy
DOMAIN-SUFFIX,imgur.com,Proxy
DOMAIN-SUFFIX,imore.com,Proxy
DOMAIN-SUFFIX,instapaper.com,Proxy
DOMAIN-SUFFIX,ipn.li,Proxy
DOMAIN-SUFFIX,is.gd,Proxy
DOMAIN-SUFFIX,issuu.com,Proxy
DOMAIN-SUFFIX,itgonglun.com,Proxy
DOMAIN-SUFFIX,itun.es,Proxy
DOMAIN-SUFFIX,ixquick.com,Proxy
DOMAIN-SUFFIX,j.mp,Proxy
DOMAIN-SUFFIX,js.revsci.net,Proxy
DOMAIN-SUFFIX,jshint.com,Proxy
DOMAIN-SUFFIX,jtvnw.net,Proxy
DOMAIN-SUFFIX,justgetflux.com,Proxy
DOMAIN-SUFFIX,kat.cr,Proxy
DOMAIN-SUFFIX,klip.me,Proxy
DOMAIN-SUFFIX,libsyn.com,Proxy
DOMAIN-SUFFIX,linkedin.com,Proxy
DOMAIN-SUFFIX,line-apps.com,Proxy
DOMAIN-SUFFIX,linode.com,Proxy
DOMAIN-SUFFIX,lithium.com,Proxy
DOMAIN-SUFFIX,littlehj.com,Proxy
DOMAIN-SUFFIX,live.com,Proxy
DOMAIN-SUFFIX,live.net,Proxy
DOMAIN-SUFFIX,livefilestore.com,Proxy
DOMAIN-SUFFIX,llnwd.net,Proxy
DOMAIN-SUFFIX,macid.co,Proxy
DOMAIN-SUFFIX,macromedia.com,Proxy
DOMAIN-SUFFIX,macrumors.com,Proxy
DOMAIN-SUFFIX,mashable.com,Proxy
DOMAIN-SUFFIX,mathjax.org,Proxy
DOMAIN-SUFFIX,medium.com,Proxy
DOMAIN-SUFFIX,mega.co.nz,Proxy
DOMAIN-SUFFIX,mega.nz,Proxy
DOMAIN-SUFFIX,megaupload.com,Proxy
DOMAIN-SUFFIX,microsofttranslator.com,Proxy
DOMAIN-SUFFIX,mindnode.com,Proxy
DOMAIN-SUFFIX,mobile01.com,Proxy
DOMAIN-SUFFIX,modmyi.com,Proxy
DOMAIN-SUFFIX,msedge.net,Proxy
DOMAIN-SUFFIX,myfontastic.com,Proxy
DOMAIN-SUFFIX,name.com,Proxy
DOMAIN-SUFFIX,nextmedia.com,Proxy
DOMAIN-SUFFIX,nsstatic.net,Proxy
DOMAIN-SUFFIX,nssurge.com,Proxy
DOMAIN-SUFFIX,nyt.com,Proxy
DOMAIN-SUFFIX,nytimes.com,Proxy
DOMAIN-SUFFIX,omnigroup.com,Proxy
DOMAIN-SUFFIX,onedrive.com,Proxy
DOMAIN-SUFFIX,onenote.com,Proxy
DOMAIN-SUFFIX,ooyala.com,Proxy
DOMAIN-SUFFIX,openvpn.net,Proxy
DOMAIN-SUFFIX,openwrt.org,Proxy
DOMAIN-SUFFIX,orkut.com,Proxy
DOMAIN-SUFFIX,osxdaily.com,Proxy
DOMAIN-SUFFIX,outlook.com,Proxy
DOMAIN-SUFFIX,ow.ly,Proxy
DOMAIN-SUFFIX,paddleapi.com,Proxy
DOMAIN-SUFFIX,parallels.com,Proxy
DOMAIN-SUFFIX,parse.com,Proxy
DOMAIN-SUFFIX,pdfexpert.com,Proxy
DOMAIN-SUFFIX,periscope.tv,Proxy
DOMAIN-SUFFIX,pinboard.in,Proxy
DOMAIN-SUFFIX,pinterest.com,Proxy
DOMAIN-SUFFIX,pixelmator.com,Proxy
DOMAIN-SUFFIX,pixiv.net,Proxy
DOMAIN-SUFFIX,playpcesor.com,Proxy
DOMAIN-SUFFIX,playstation.com,Proxy
DOMAIN-SUFFIX,playstation.com.hk,Proxy
DOMAIN-SUFFIX,playstation.net,Proxy
DOMAIN-SUFFIX,playstationnetwork.com,Proxy
DOMAIN-SUFFIX,pushwoosh.com,Proxy
DOMAIN-SUFFIX,rime.im,Proxy
DOMAIN-SUFFIX,servebom.com,Proxy
DOMAIN-SUFFIX,sfx.ms,Proxy
DOMAIN-SUFFIX,shadowsocks.org,Proxy
DOMAIN-SUFFIX,sharethis.com,Proxy
DOMAIN-SUFFIX,shazam.com,Proxy
DOMAIN-SUFFIX,skype.com,Proxy
DOMAIN-SUFFIX,smartdnsProxy.com,Proxy
DOMAIN-SUFFIX,smartmailcloud.com,Proxy
DOMAIN-SUFFIX,sndcdn.com,Proxy
DOMAIN-SUFFIX,sony.com,Proxy
DOMAIN-SUFFIX,soundcloud.com,Proxy
DOMAIN-SUFFIX,sourceforge.net,Proxy
DOMAIN-SUFFIX,spotify.com,Proxy
DOMAIN-SUFFIX,squarespace.com,Proxy
DOMAIN-SUFFIX,sstatic.net,Proxy
DOMAIN-SUFFIX,st.luluku.pw,Proxy
DOMAIN-SUFFIX,stackoverflow.com,Proxy
DOMAIN-SUFFIX,startpage.com,Proxy
DOMAIN-SUFFIX,staticflickr.com,Proxy
DOMAIN-SUFFIX,steamcommunity.com,Proxy
DOMAIN-SUFFIX,symauth.com,Proxy
DOMAIN-SUFFIX,symcb.com,Proxy
DOMAIN-SUFFIX,symcd.com,Proxy
DOMAIN-SUFFIX,tapbots.com,Proxy
DOMAIN-SUFFIX,tapbots.net,Proxy
DOMAIN-SUFFIX,tdesktop.com,Proxy
DOMAIN-SUFFIX,techcrunch.com,Proxy
DOMAIN-SUFFIX,techsmith.com,Proxy
DOMAIN-SUFFIX,thepiratebay.org,Proxy
DOMAIN-SUFFIX,theverge.com,Proxy
DOMAIN-SUFFIX,time.com,Proxy
DOMAIN-SUFFIX,timeinc.net,Proxy
DOMAIN-SUFFIX,tiny.cc,Proxy
DOMAIN-SUFFIX,tinypic.com,Proxy
DOMAIN-SUFFIX,tmblr.co,Proxy
DOMAIN-SUFFIX,todoist.com,Proxy
DOMAIN-SUFFIX,trello.com,Proxy
DOMAIN-SUFFIX,trustasiassl.com,Proxy
DOMAIN-SUFFIX,tumblr.co,Proxy
DOMAIN-SUFFIX,tumblr.com,Proxy
DOMAIN-SUFFIX,tweetdeck.com,Proxy
DOMAIN-SUFFIX,tweetmarker.net,Proxy
DOMAIN-SUFFIX,twitch.tv,Proxy
DOMAIN-SUFFIX,txmblr.com,Proxy
DOMAIN-SUFFIX,typekit.net,Proxy
DOMAIN-SUFFIX,ubertags.com,Proxy
DOMAIN-SUFFIX,ublock.org,Proxy
DOMAIN-SUFFIX,ubnt.com,Proxy
DOMAIN-SUFFIX,ulyssesapp.com,Proxy
DOMAIN-SUFFIX,urchin.com,Proxy
DOMAIN-SUFFIX,usertrust.com,Proxy
DOMAIN-SUFFIX,v.gd,Proxy
DOMAIN-SUFFIX,v2ex.com,Proxy
DOMAIN-SUFFIX,vimeo.com,Proxy
DOMAIN-SUFFIX,vimeocdn.com,Proxy
DOMAIN-SUFFIX,vine.co,Proxy
DOMAIN-SUFFIX,vivaldi.com,Proxy
DOMAIN-SUFFIX,vox-cdn.com,Proxy
DOMAIN-SUFFIX,vsco.co,Proxy
DOMAIN-SUFFIX,vultr.com,Proxy
DOMAIN-SUFFIX,w.org,Proxy
DOMAIN-SUFFIX,w3schools.com,Proxy
DOMAIN-SUFFIX,webtype.com,Proxy
DOMAIN-SUFFIX,wikiwand.com,Proxy
DOMAIN-SUFFIX,wikileaks.org,Proxy
DOMAIN-SUFFIX,wikimedia.org,Proxy
DOMAIN-SUFFIX,wikipedia.com,Proxy
DOMAIN-SUFFIX,wikipedia.org,Proxy
DOMAIN-SUFFIX,windows.com,Proxy
DOMAIN-SUFFIX,windows.net,Proxy
DOMAIN-SUFFIX,wire.com,Proxy
DOMAIN-SUFFIX,wordpress.com,Proxy
DOMAIN-SUFFIX,workflowy.com,Proxy
DOMAIN-SUFFIX,wp.com,Proxy
DOMAIN-SUFFIX,wsj.com,Proxy
DOMAIN-SUFFIX,wsj.net,Proxy
DOMAIN-SUFFIX,xda-developers.com,Proxy
DOMAIN-SUFFIX,xeeno.com,Proxy
DOMAIN-SUFFIX,xiti.com,Proxy
DOMAIN-SUFFIX,yahoo.com,Proxy
DOMAIN-SUFFIX,yimg.com,Proxy
DOMAIN-SUFFIX,ying.com,Proxy
DOMAIN-SUFFIX,yoyo.org,Proxy
DOMAIN-SUFFIX,ytimg.com,Proxy
# Telegram
DOMAIN-SUFFIX,telegra.ph,Proxy
DOMAIN-SUFFIX,telegram.org,Proxy
IP-CIDR,91.108.4.0/22,Proxy,no-resolve
IP-CIDR,91.108.8.0/21,Proxy,no-resolve
IP-CIDR,91.108.16.0/22,Proxy,no-resolve
IP-CIDR,91.108.56.0/22,Proxy,no-resolve
IP-CIDR,149.154.160.0/20,Proxy,no-resolve
IP-CIDR6,2001:67c:4e8::/48,Proxy,no-resolve
IP-CIDR6,2001:b28:f23d::/48,Proxy,no-resolve
IP-CIDR6,2001:b28:f23f::/48,Proxy,no-resolve
# Google 中国服务 services.googleapis.cn
IP-CIDR,120.232.181.162/32,Proxy,no-resolve
IP-CIDR,120.241.147.226/32,Proxy,no-resolve
IP-CIDR,120.253.253.226/32,Proxy,no-resolve
IP-CIDR,120.253.255.162/32,Proxy,no-resolve
IP-CIDR,120.253.255.34/32,Proxy,no-resolve
IP-CIDR,120.253.255.98/32,Proxy,no-resolve
IP-CIDR,180.163.150.162/32,Proxy,no-resolve
IP-CIDR,180.163.150.34/32,Proxy,no-resolve
IP-CIDR,180.163.151.162/32,Proxy,no-resolve
IP-CIDR,180.163.151.34/32,Proxy,no-resolve
IP-CIDR,203.208.39.0/24,Proxy,no-resolve
IP-CIDR,203.208.40.0/24,Proxy,no-resolve
IP-CIDR,203.208.41.0/24,Proxy,no-resolve
IP-CIDR,203.208.43.0/24,Proxy,no-resolve
IP-CIDR,203.208.50.0/24,Proxy,no-resolve
IP-CIDR,220.181.174.162/32,Proxy,no-resolve
IP-CIDR,220.181.174.226/32,Proxy,no-resolve
IP-CIDR,220.181.174.34/32,Proxy,no-resolve
# LAN
DOMAIN-SUFFIX,local,DIRECT
IP-CIDR,127.0.0.0/8,DIRECT
IP-CIDR,172.16.0.0/12,DIRECT
IP-CIDR,192.168.0.0/16,DIRECT
IP-CIDR,10.0.0.0/8,DIRECT
IP-CIDR,17.0.0.0/8,DIRECT
IP-CIDR,100.64.0.0/10,DIRECT
IP-CIDR,224.0.0.0/4,DIRECT
IP-CIDR6,fe80::/10,DIRECT
# 剩余未匹配的国内网站
DOMAIN-SUFFIX,cn,DIRECT
DOMAIN-KEYWORD,-cn,DIRECT
# 最终规则
GEOIP,CN,DIRECT
FINAL,Proxy

595
submodule/surge.toml Normal file
View File

@@ -0,0 +1,595 @@
#!MANAGED-CONFIG $subs_link interval=43200 strict=true
# Surge 的规则配置手册: https://manual.nssurge.com/
# Thanks @Hackl0us SS-Rule-Snippet
[General]
loglevel = notify
# 从 Surge iOS 4 / Surge Mac 3.3.0 起,工具开始支持 DoH
doh-server = https://doh.pub/dns-query
# https://dns.alidns.com/dns-query, https://13800000000.rubyfish.cn/, https://dns.google/dns-query
dns-server = 223.5.5.5, 114.114.114.114
tun-excluded-routes = 0.0.0.0/8, 10.0.0.0/8, 100.64.0.0/10, 127.0.0.0/8, 169.254.0.0/16, 172.16.0.0/12, 192.0.0.0/24, 192.0.2.0/24, 192.168.0.0/16, 192.88.99.0/24, 198.51.100.0/24, 203.0.113.0/24, 224.0.0.0/4, 255.255.255.255/32
skip-proxy = localhost, *.local, injections.adguard.org, local.adguard.org, captive.apple.com, guzzoni.apple.com, 0.0.0.0/8, 10.0.0.0/8, 17.0.0.0/8, 100.64.0.0/10, 127.0.0.0/8, 169.254.0.0/16, 172.16.0.0/12, 192.0.0.0/24, 192.0.2.0/24, 192.168.0.0/16, 192.88.99.0/24, 198.18.0.0/15, 198.51.100.0/24, 203.0.113.0/24, 224.0.0.0/4, 240.0.0.0/4, 255.255.255.255/32
wifi-assist = true
allow-wifi-access = true
wifi-access-http-port = 6152
wifi-access-socks5-port = 6153
http-listen = 0.0.0.0:6152
socks5-listen = 0.0.0.0:6153
external-controller-access = surgepasswd@0.0.0.0:6170
replica = false
tls-provider = openssl
network-framework = false
exclude-simple-hostnames = true
ipv6 = true
test-timeout = 4
proxy-test-url = http://www.gstatic.com/generate_204
geoip-maxmind-url = https://unpkg.zhimg.com/rulestatic@1.0.1/Country.mmdb
[Replica]
hide-apple-request = true
hide-crashlytics-request = true
use-keyword-filter = false
hide-udp = false
[Panel]
SubscribeInfo = $subscribe_info, style=info
# -----------------------------
# Surge 的几种策略配置规范,请参考 https://manual.nssurge.com/policy/proxy.html
# 不同的代理策略有*很多*可选参数,请参考上方连接的 Parameters 一段,根据需求自行添加参数。
#
# Surge 现已支持 UDP 转发功能,请参考: https://trello.com/c/ugOMxD3u/53-udp-%E8%BD%AC%E5%8F%91
# Surge 现已支持 TCP-Fast-Open 技术,请参考: https://trello.com/c/ij65BU6Q/48-tcp-fast-open-troubleshooting-guide
# Surge 现已支持 ss-libev 的全部加密方式和混淆,请参考: https://trello.com/c/BTr0vG1O/47-ss-libev-%E7%9A%84%E6%94%AF%E6%8C%81%E6%83%85%E5%86%B5
# -----------------------------
[Proxy]
$proxies
[Proxy Group]
Proxy = select, auto, fallback, $proxy_group
auto = url-test, $proxy_group, url=http://www.gstatic.com/generate_204, interval=43200
fallback = fallback, $proxy_group, url=http://www.gstatic.com/generate_204, interval=43200
[Rule]
# 自定义规则
## 您可以在此处插入自定义规则
# 强制订阅域名直连
DOMAIN,$subs_domain,DIRECT
# Google 中国服务
DOMAIN-SUFFIX,services.googleapis.cn,Proxy
DOMAIN-SUFFIX,xn--ngstr-lra8j.com,Proxy
# Apple
DOMAIN,developer.apple.com,Proxy
DOMAIN-SUFFIX,digicert.com,Proxy
USER-AGENT,com.apple.trustd*,Proxy
DOMAIN-SUFFIX,apple-dns.net,Proxy
DOMAIN,testflight.apple.com,Proxy
DOMAIN,sandbox.itunes.apple.com,Proxy
DOMAIN,itunes.apple.com,Proxy
DOMAIN-SUFFIX,apps.apple.com,Proxy
DOMAIN-SUFFIX,blobstore.apple.com,Proxy
DOMAIN,cvws.icloud-content.com,Proxy
DOMAIN,safebrowsing.urlsec.qq.com,DIRECT
DOMAIN,safebrowsing.googleapis.com,DIRECT
USER-AGENT,com.apple.appstored*,DIRECT
USER-AGENT,AppStore*,DIRECT
DOMAIN-SUFFIX,mzstatic.com,DIRECT
DOMAIN-SUFFIX,itunes.apple.com,DIRECT
DOMAIN-SUFFIX,icloud.com,DIRECT
DOMAIN-SUFFIX,icloud-content.com,DIRECT
USER-AGENT,cloudd*,DIRECT
USER-AGENT,*com.apple.WebKit*,DIRECT
USER-AGENT,*com.apple.*,DIRECT
DOMAIN-SUFFIX,me.com,DIRECT
DOMAIN-SUFFIX,aaplimg.com,DIRECT
DOMAIN-SUFFIX,cdn20.com,DIRECT
DOMAIN-SUFFIX,cdn-apple.com,DIRECT
DOMAIN-SUFFIX,akadns.net,DIRECT
DOMAIN-SUFFIX,akamaiedge.net,DIRECT
DOMAIN-SUFFIX,edgekey.net,DIRECT
DOMAIN-SUFFIX,mwcloudcdn.com,DIRECT
DOMAIN-SUFFIX,mwcname.com,DIRECT
DOMAIN-SUFFIX,apple.com,DIRECT
DOMAIN-SUFFIX,apple-cloudkit.com,DIRECT
DOMAIN-SUFFIX,apple-mapkit.com,DIRECT
# 国内网站
USER-AGENT,MicroMessenger Client*,DIRECT
USER-AGENT,WeChat*,DIRECT
DOMAIN-SUFFIX,126.com,DIRECT
DOMAIN-SUFFIX,126.net,DIRECT
DOMAIN-SUFFIX,127.net,DIRECT
DOMAIN-SUFFIX,163.com,DIRECT
DOMAIN-SUFFIX,360buyimg.com,DIRECT
DOMAIN-SUFFIX,36kr.com,DIRECT
DOMAIN-SUFFIX,acfun.tv,DIRECT
DOMAIN-SUFFIX,air-matters.com,DIRECT
DOMAIN-SUFFIX,aixifan.com,DIRECT
DOMAIN-KEYWORD,alicdn,DIRECT
DOMAIN-KEYWORD,alipay,DIRECT
DOMAIN-KEYWORD,aliyun,DIRECT
DOMAIN-KEYWORD,taobao,DIRECT
DOMAIN-SUFFIX,amap.com,DIRECT
DOMAIN-SUFFIX,autonavi.com,DIRECT
DOMAIN-KEYWORD,baidu,DIRECT
DOMAIN-SUFFIX,bdimg.com,DIRECT
DOMAIN-SUFFIX,bdstatic.com,DIRECT
DOMAIN-SUFFIX,bilibili.com,DIRECT
DOMAIN-SUFFIX,bilivideo.com,DIRECT
DOMAIN-SUFFIX,caiyunapp.com,DIRECT
DOMAIN-SUFFIX,clouddn.com,DIRECT
DOMAIN-SUFFIX,cnbeta.com,DIRECT
DOMAIN-SUFFIX,cnbetacdn.com,DIRECT
DOMAIN-SUFFIX,cootekservice.com,DIRECT
DOMAIN-SUFFIX,csdn.net,DIRECT
DOMAIN-SUFFIX,ctrip.com,DIRECT
DOMAIN-SUFFIX,dgtle.com,DIRECT
DOMAIN-SUFFIX,dianping.com,DIRECT
DOMAIN-SUFFIX,douban.com,DIRECT
DOMAIN-SUFFIX,doubanio.com,DIRECT
DOMAIN-SUFFIX,duokan.com,DIRECT
DOMAIN-SUFFIX,easou.com,DIRECT
DOMAIN-SUFFIX,ele.me,DIRECT
DOMAIN-SUFFIX,feng.com,DIRECT
DOMAIN-SUFFIX,fir.im,DIRECT
DOMAIN-SUFFIX,frdic.com,DIRECT
DOMAIN-SUFFIX,g-cores.com,DIRECT
DOMAIN-SUFFIX,godic.net,DIRECT
DOMAIN-SUFFIX,gtimg.com,DIRECT
DOMAIN-SUFFIX,hongxiu.com,DIRECT
DOMAIN-SUFFIX,hxcdn.net,DIRECT
DOMAIN-SUFFIX,iciba.com,DIRECT
DOMAIN-SUFFIX,ifeng.com,DIRECT
DOMAIN-SUFFIX,ifengimg.com,DIRECT
DOMAIN-SUFFIX,ipip.net,DIRECT
DOMAIN-SUFFIX,iqiyi.com,DIRECT
DOMAIN-SUFFIX,jd.com,DIRECT
DOMAIN-SUFFIX,jianshu.com,DIRECT
DOMAIN-SUFFIX,knewone.com,DIRECT
DOMAIN-SUFFIX,le.com,DIRECT
DOMAIN-SUFFIX,lecloud.com,DIRECT
DOMAIN-SUFFIX,lemicp.com,DIRECT
DOMAIN-SUFFIX,licdn.com,DIRECT
DOMAIN-SUFFIX,luoo.net,DIRECT
DOMAIN-SUFFIX,meituan.com,DIRECT
DOMAIN-SUFFIX,meituan.net,DIRECT
DOMAIN-SUFFIX,mi.com,DIRECT
DOMAIN-SUFFIX,miaopai.com,DIRECT
DOMAIN-SUFFIX,microsoft.com,DIRECT
DOMAIN-SUFFIX,microsoftonline.com,DIRECT
DOMAIN-SUFFIX,miui.com,DIRECT
DOMAIN-SUFFIX,miwifi.com,DIRECT
DOMAIN-SUFFIX,mob.com,DIRECT
DOMAIN-SUFFIX,netease.com,DIRECT
DOMAIN-SUFFIX,office.com,DIRECT
DOMAIN-KEYWORD,officecdn,DIRECT
DOMAIN-SUFFIX,office365.com,DIRECT
DOMAIN-SUFFIX,oschina.net,DIRECT
DOMAIN-SUFFIX,ppsimg.com,DIRECT
DOMAIN-SUFFIX,pstatp.com,DIRECT
DOMAIN-SUFFIX,qcloud.com,DIRECT
DOMAIN-SUFFIX,qdaily.com,DIRECT
DOMAIN-SUFFIX,qdmm.com,DIRECT
DOMAIN-SUFFIX,qhimg.com,DIRECT
DOMAIN-SUFFIX,qhres.com,DIRECT
DOMAIN-SUFFIX,qidian.com,DIRECT
DOMAIN-SUFFIX,qihucdn.com,DIRECT
DOMAIN-SUFFIX,qiniu.com,DIRECT
DOMAIN-SUFFIX,qiniucdn.com,DIRECT
DOMAIN-SUFFIX,qiyipic.com,DIRECT
DOMAIN-SUFFIX,qq.com,DIRECT
DOMAIN-SUFFIX,qqurl.com,DIRECT
DOMAIN-SUFFIX,rarbg.to,DIRECT
DOMAIN-SUFFIX,ruguoapp.com,DIRECT
DOMAIN-SUFFIX,segmentfault.com,DIRECT
DOMAIN-SUFFIX,sinaapp.com,DIRECT
DOMAIN-SUFFIX,smzdm.com,DIRECT
DOMAIN-SUFFIX,snapdrop.net,DIRECT
DOMAIN-SUFFIX,sogou.com,DIRECT
DOMAIN-SUFFIX,sogoucdn.com,DIRECT
DOMAIN-SUFFIX,sohu.com,DIRECT
DOMAIN-SUFFIX,soku.com,DIRECT
DOMAIN-SUFFIX,speedtest.net,DIRECT
DOMAIN-SUFFIX,sspai.com,DIRECT
DOMAIN-SUFFIX,suning.com,DIRECT
DOMAIN-SUFFIX,taobao.com,DIRECT
DOMAIN-SUFFIX,tencent.com,DIRECT
DOMAIN-SUFFIX,tenpay.com,DIRECT
DOMAIN-SUFFIX,tianyancha.com,DIRECT
DOMAIN-KEYWORD,.tmall.com,DIRECT
DOMAIN-SUFFIX,tudou.com,DIRECT
DOMAIN-SUFFIX,umetrip.com,DIRECT
DOMAIN-SUFFIX,upaiyun.com,DIRECT
DOMAIN-SUFFIX,upyun.com,DIRECT
DOMAIN-SUFFIX,veryzhun.com,DIRECT
DOMAIN-SUFFIX,weather.com,DIRECT
DOMAIN-SUFFIX,weibo.com,DIRECT
DOMAIN-SUFFIX,xiami.com,DIRECT
DOMAIN-SUFFIX,xiami.net,DIRECT
DOMAIN-SUFFIX,xiaomicp.com,DIRECT
DOMAIN-SUFFIX,ximalaya.com,DIRECT
DOMAIN-SUFFIX,xmcdn.com,DIRECT
DOMAIN-SUFFIX,xunlei.com,DIRECT
DOMAIN-SUFFIX,yhd.com,DIRECT
DOMAIN-SUFFIX,yihaodianimg.com,DIRECT
DOMAIN-SUFFIX,yinxiang.com,DIRECT
DOMAIN-SUFFIX,ykimg.com,DIRECT
DOMAIN-SUFFIX,youdao.com,DIRECT
DOMAIN-SUFFIX,youku.com,DIRECT
DOMAIN-SUFFIX,zealer.com,DIRECT
DOMAIN-SUFFIX,zhihu.com,DIRECT
DOMAIN-SUFFIX,zhimg.com,DIRECT
DOMAIN-SUFFIX,zimuzu.tv,DIRECT
DOMAIN-SUFFIX,zoho.com,DIRECT
# 常见广告
DOMAIN-KEYWORD,admarvel,REJECT-TINYGIF
DOMAIN-KEYWORD,admaster,REJECT-TINYGIF
DOMAIN-KEYWORD,adsage,REJECT-TINYGIF
DOMAIN-KEYWORD,adsmogo,REJECT-TINYGIF
DOMAIN-KEYWORD,adsrvmedia,REJECT-TINYGIF
DOMAIN-KEYWORD,adwords,REJECT-TINYGIF
DOMAIN-KEYWORD,adservice,REJECT-TINYGIF
DOMAIN-SUFFIX,appsflyer.com,REJECT-TINYGIF
DOMAIN-KEYWORD,domob,REJECT-TINYGIF
DOMAIN-SUFFIX,doubleclick.net,REJECT-TINYGIF
DOMAIN-KEYWORD,duomeng,REJECT-TINYGIF
DOMAIN-KEYWORD,dwtrack,REJECT-TINYGIF
DOMAIN-KEYWORD,guanggao,REJECT-TINYGIF
DOMAIN-KEYWORD,lianmeng,REJECT-TINYGIF
DOMAIN-SUFFIX,mmstat.com,REJECT-TINYGIF
DOMAIN-KEYWORD,mopub,REJECT-TINYGIF
DOMAIN-KEYWORD,omgmta,REJECT-TINYGIF
DOMAIN-KEYWORD,openx,REJECT-TINYGIF
DOMAIN-KEYWORD,partnerad,REJECT-TINYGIF
DOMAIN-KEYWORD,pingfore,REJECT-TINYGIF
DOMAIN-KEYWORD,supersonicads,REJECT-TINYGIF
DOMAIN-KEYWORD,uedas,REJECT-TINYGIF
DOMAIN-KEYWORD,umeng,REJECT-TINYGIF
DOMAIN-KEYWORD,usage,REJECT-TINYGIF
DOMAIN-SUFFIX,vungle.com,REJECT-TINYGIF
DOMAIN-KEYWORD,wlmonitor,REJECT-TINYGIF
DOMAIN-KEYWORD,zjtoolbar,REJECT-TINYGIF
## 抗 DNS 污染
DOMAIN-KEYWORD,amazon,Proxy
DOMAIN-KEYWORD,google,Proxy
DOMAIN-KEYWORD,gmail,Proxy
DOMAIN-KEYWORD,youtube,Proxy
DOMAIN-KEYWORD,facebook,Proxy
DOMAIN-SUFFIX,fb.me,Proxy
DOMAIN-SUFFIX,fbcdn.net,Proxy
DOMAIN-KEYWORD,twitter,Proxy
DOMAIN-KEYWORD,instagram,Proxy
DOMAIN-KEYWORD,dropbox,Proxy
DOMAIN-SUFFIX,twimg.com,Proxy
DOMAIN-KEYWORD,blogspot,Proxy
DOMAIN-SUFFIX,youtu.be,Proxy
## 常见国外域名列表
DOMAIN-SUFFIX,9to5mac.com,Proxy
DOMAIN-SUFFIX,abpchina.org,Proxy
DOMAIN-SUFFIX,adblockplus.org,Proxy
DOMAIN-SUFFIX,adobe.com,Proxy
DOMAIN-SUFFIX,akamaized.net,Proxy
DOMAIN-SUFFIX,alfredapp.com,Proxy
DOMAIN-SUFFIX,amplitude.com,Proxy
DOMAIN-SUFFIX,ampproject.org,Proxy
DOMAIN-SUFFIX,android.com,Proxy
DOMAIN-SUFFIX,angularjs.org,Proxy
DOMAIN-SUFFIX,aolcdn.com,Proxy
DOMAIN-SUFFIX,apkpure.com,Proxy
DOMAIN-SUFFIX,appledaily.com,Proxy
DOMAIN-SUFFIX,appshopper.com,Proxy
DOMAIN-SUFFIX,appspot.com,Proxy
DOMAIN-SUFFIX,arcgis.com,Proxy
DOMAIN-SUFFIX,archive.org,Proxy
DOMAIN-SUFFIX,armorgames.com,Proxy
DOMAIN-SUFFIX,aspnetcdn.com,Proxy
DOMAIN-SUFFIX,att.com,Proxy
DOMAIN-SUFFIX,awsstatic.com,Proxy
DOMAIN-SUFFIX,azureedge.net,Proxy
DOMAIN-SUFFIX,azurewebsites.net,Proxy
DOMAIN-SUFFIX,bing.com,Proxy
DOMAIN-SUFFIX,bintray.com,Proxy
DOMAIN-SUFFIX,bit.com,Proxy
DOMAIN-SUFFIX,bit.ly,Proxy
DOMAIN-SUFFIX,bitbucket.org,Proxy
DOMAIN-SUFFIX,bjango.com,Proxy
DOMAIN-SUFFIX,bkrtx.com,Proxy
DOMAIN-SUFFIX,blog.com,Proxy
DOMAIN-SUFFIX,blogcdn.com,Proxy
DOMAIN-SUFFIX,blogger.com,Proxy
DOMAIN-SUFFIX,blogsmithmedia.com,Proxy
DOMAIN-SUFFIX,blogspot.com,Proxy
DOMAIN-SUFFIX,blogspot.hk,Proxy
DOMAIN-SUFFIX,bloomberg.com,Proxy
DOMAIN-SUFFIX,box.com,Proxy
DOMAIN-SUFFIX,box.net,Proxy
DOMAIN-SUFFIX,cachefly.net,Proxy
DOMAIN-SUFFIX,chromium.org,Proxy
DOMAIN-SUFFIX,cl.ly,Proxy
DOMAIN-SUFFIX,cloudflare.com,Proxy
DOMAIN-SUFFIX,cloudfront.net,Proxy
DOMAIN-SUFFIX,cloudmagic.com,Proxy
DOMAIN-SUFFIX,cmail19.com,Proxy
DOMAIN-SUFFIX,cnet.com,Proxy
DOMAIN-SUFFIX,cocoapods.org,Proxy
DOMAIN-SUFFIX,comodoca.com,Proxy
DOMAIN-SUFFIX,crashlytics.com,Proxy
DOMAIN-SUFFIX,culturedcode.com,Proxy
DOMAIN-SUFFIX,d.pr,Proxy
DOMAIN-SUFFIX,danilo.to,Proxy
DOMAIN-SUFFIX,dayone.me,Proxy
DOMAIN-SUFFIX,db.tt,Proxy
DOMAIN-SUFFIX,deskconnect.com,Proxy
DOMAIN-SUFFIX,disq.us,Proxy
DOMAIN-SUFFIX,disqus.com,Proxy
DOMAIN-SUFFIX,disquscdn.com,Proxy
DOMAIN-SUFFIX,dnsimple.com,Proxy
DOMAIN-SUFFIX,docker.com,Proxy
DOMAIN-SUFFIX,dribbble.com,Proxy
DOMAIN-SUFFIX,droplr.com,Proxy
DOMAIN-SUFFIX,duckduckgo.com,Proxy
DOMAIN-SUFFIX,dueapp.com,Proxy
DOMAIN-SUFFIX,dytt8.net,Proxy
DOMAIN-SUFFIX,edgecastcdn.net,Proxy
DOMAIN-SUFFIX,edgekey.net,Proxy
DOMAIN-SUFFIX,edgesuite.net,Proxy
DOMAIN-SUFFIX,engadget.com,Proxy
DOMAIN-SUFFIX,entrust.net,Proxy
DOMAIN-SUFFIX,eurekavpt.com,Proxy
DOMAIN-SUFFIX,evernote.com,Proxy
DOMAIN-SUFFIX,fabric.io,Proxy
DOMAIN-SUFFIX,fast.com,Proxy
DOMAIN-SUFFIX,fastly.net,Proxy
DOMAIN-SUFFIX,fc2.com,Proxy
DOMAIN-SUFFIX,feedburner.com,Proxy
DOMAIN-SUFFIX,feedly.com,Proxy
DOMAIN-SUFFIX,feedsportal.com,Proxy
DOMAIN-SUFFIX,fiftythree.com,Proxy
DOMAIN-SUFFIX,firebaseio.com,Proxy
DOMAIN-SUFFIX,flexibits.com,Proxy
DOMAIN-SUFFIX,flickr.com,Proxy
DOMAIN-SUFFIX,flipboard.com,Proxy
DOMAIN-SUFFIX,g.co,Proxy
DOMAIN-SUFFIX,gabia.net,Proxy
DOMAIN-SUFFIX,geni.us,Proxy
DOMAIN-SUFFIX,gfx.ms,Proxy
DOMAIN-SUFFIX,ggpht.com,Proxy
DOMAIN-SUFFIX,ghostnoteapp.com,Proxy
DOMAIN-SUFFIX,git.io,Proxy
DOMAIN-KEYWORD,github,Proxy
DOMAIN-SUFFIX,globalsign.com,Proxy
DOMAIN-SUFFIX,gmodules.com,Proxy
DOMAIN-SUFFIX,godaddy.com,Proxy
DOMAIN-SUFFIX,golang.org,Proxy
DOMAIN-SUFFIX,gongm.in,Proxy
DOMAIN-SUFFIX,goo.gl,Proxy
DOMAIN-SUFFIX,goodreaders.com,Proxy
DOMAIN-SUFFIX,goodreads.com,Proxy
DOMAIN-SUFFIX,gravatar.com,Proxy
DOMAIN-SUFFIX,gstatic.com,Proxy
DOMAIN-SUFFIX,gvt0.com,Proxy
DOMAIN-SUFFIX,hockeyapp.net,Proxy
DOMAIN-SUFFIX,hotmail.com,Proxy
DOMAIN-SUFFIX,icons8.com,Proxy
DOMAIN-SUFFIX,ifixit.com,Proxy
DOMAIN-SUFFIX,ift.tt,Proxy
DOMAIN-SUFFIX,ifttt.com,Proxy
DOMAIN-SUFFIX,iherb.com,Proxy
DOMAIN-SUFFIX,imageshack.us,Proxy
DOMAIN-SUFFIX,img.ly,Proxy
DOMAIN-SUFFIX,imgur.com,Proxy
DOMAIN-SUFFIX,imore.com,Proxy
DOMAIN-SUFFIX,instapaper.com,Proxy
DOMAIN-SUFFIX,ipn.li,Proxy
DOMAIN-SUFFIX,is.gd,Proxy
DOMAIN-SUFFIX,issuu.com,Proxy
DOMAIN-SUFFIX,itgonglun.com,Proxy
DOMAIN-SUFFIX,itun.es,Proxy
DOMAIN-SUFFIX,ixquick.com,Proxy
DOMAIN-SUFFIX,j.mp,Proxy
DOMAIN-SUFFIX,js.revsci.net,Proxy
DOMAIN-SUFFIX,jshint.com,Proxy
DOMAIN-SUFFIX,jtvnw.net,Proxy
DOMAIN-SUFFIX,justgetflux.com,Proxy
DOMAIN-SUFFIX,kat.cr,Proxy
DOMAIN-SUFFIX,klip.me,Proxy
DOMAIN-SUFFIX,libsyn.com,Proxy
DOMAIN-SUFFIX,linkedin.com,Proxy
DOMAIN-SUFFIX,line-apps.com,Proxy
DOMAIN-SUFFIX,linode.com,Proxy
DOMAIN-SUFFIX,lithium.com,Proxy
DOMAIN-SUFFIX,littlehj.com,Proxy
DOMAIN-SUFFIX,live.com,Proxy
DOMAIN-SUFFIX,live.net,Proxy
DOMAIN-SUFFIX,livefilestore.com,Proxy
DOMAIN-SUFFIX,llnwd.net,Proxy
DOMAIN-SUFFIX,macid.co,Proxy
DOMAIN-SUFFIX,macromedia.com,Proxy
DOMAIN-SUFFIX,macrumors.com,Proxy
DOMAIN-SUFFIX,mashable.com,Proxy
DOMAIN-SUFFIX,mathjax.org,Proxy
DOMAIN-SUFFIX,medium.com,Proxy
DOMAIN-SUFFIX,mega.co.nz,Proxy
DOMAIN-SUFFIX,mega.nz,Proxy
DOMAIN-SUFFIX,megaupload.com,Proxy
DOMAIN-SUFFIX,microsofttranslator.com,Proxy
DOMAIN-SUFFIX,mindnode.com,Proxy
DOMAIN-SUFFIX,mobile01.com,Proxy
DOMAIN-SUFFIX,modmyi.com,Proxy
DOMAIN-SUFFIX,msedge.net,Proxy
DOMAIN-SUFFIX,myfontastic.com,Proxy
DOMAIN-SUFFIX,name.com,Proxy
DOMAIN-SUFFIX,nextmedia.com,Proxy
DOMAIN-SUFFIX,nsstatic.net,Proxy
DOMAIN-SUFFIX,nssurge.com,Proxy
DOMAIN-SUFFIX,nyt.com,Proxy
DOMAIN-SUFFIX,nytimes.com,Proxy
DOMAIN-SUFFIX,omnigroup.com,Proxy
DOMAIN-SUFFIX,onedrive.com,Proxy
DOMAIN-SUFFIX,onenote.com,Proxy
DOMAIN-SUFFIX,ooyala.com,Proxy
DOMAIN-SUFFIX,openvpn.net,Proxy
DOMAIN-SUFFIX,openwrt.org,Proxy
DOMAIN-SUFFIX,orkut.com,Proxy
DOMAIN-SUFFIX,osxdaily.com,Proxy
DOMAIN-SUFFIX,outlook.com,Proxy
DOMAIN-SUFFIX,ow.ly,Proxy
DOMAIN-SUFFIX,paddleapi.com,Proxy
DOMAIN-SUFFIX,parallels.com,Proxy
DOMAIN-SUFFIX,parse.com,Proxy
DOMAIN-SUFFIX,pdfexpert.com,Proxy
DOMAIN-SUFFIX,periscope.tv,Proxy
DOMAIN-SUFFIX,pinboard.in,Proxy
DOMAIN-SUFFIX,pinterest.com,Proxy
DOMAIN-SUFFIX,pixelmator.com,Proxy
DOMAIN-SUFFIX,pixiv.net,Proxy
DOMAIN-SUFFIX,playpcesor.com,Proxy
DOMAIN-SUFFIX,playstation.com,Proxy
DOMAIN-SUFFIX,playstation.com.hk,Proxy
DOMAIN-SUFFIX,playstation.net,Proxy
DOMAIN-SUFFIX,playstationnetwork.com,Proxy
DOMAIN-SUFFIX,pushwoosh.com,Proxy
DOMAIN-SUFFIX,rime.im,Proxy
DOMAIN-SUFFIX,servebom.com,Proxy
DOMAIN-SUFFIX,sfx.ms,Proxy
DOMAIN-SUFFIX,shadowsocks.org,Proxy
DOMAIN-SUFFIX,sharethis.com,Proxy
DOMAIN-SUFFIX,shazam.com,Proxy
DOMAIN-SUFFIX,skype.com,Proxy
DOMAIN-SUFFIX,smartdnsProxy.com,Proxy
DOMAIN-SUFFIX,smartmailcloud.com,Proxy
DOMAIN-SUFFIX,sndcdn.com,Proxy
DOMAIN-SUFFIX,sony.com,Proxy
DOMAIN-SUFFIX,soundcloud.com,Proxy
DOMAIN-SUFFIX,sourceforge.net,Proxy
DOMAIN-SUFFIX,spotify.com,Proxy
DOMAIN-SUFFIX,squarespace.com,Proxy
DOMAIN-SUFFIX,sstatic.net,Proxy
DOMAIN-SUFFIX,st.luluku.pw,Proxy
DOMAIN-SUFFIX,stackoverflow.com,Proxy
DOMAIN-SUFFIX,startpage.com,Proxy
DOMAIN-SUFFIX,staticflickr.com,Proxy
DOMAIN-SUFFIX,steamcommunity.com,Proxy
DOMAIN-SUFFIX,symauth.com,Proxy
DOMAIN-SUFFIX,symcb.com,Proxy
DOMAIN-SUFFIX,symcd.com,Proxy
DOMAIN-SUFFIX,tapbots.com,Proxy
DOMAIN-SUFFIX,tapbots.net,Proxy
DOMAIN-SUFFIX,tdesktop.com,Proxy
DOMAIN-SUFFIX,techcrunch.com,Proxy
DOMAIN-SUFFIX,techsmith.com,Proxy
DOMAIN-SUFFIX,thepiratebay.org,Proxy
DOMAIN-SUFFIX,theverge.com,Proxy
DOMAIN-SUFFIX,time.com,Proxy
DOMAIN-SUFFIX,timeinc.net,Proxy
DOMAIN-SUFFIX,tiny.cc,Proxy
DOMAIN-SUFFIX,tinypic.com,Proxy
DOMAIN-SUFFIX,tmblr.co,Proxy
DOMAIN-SUFFIX,todoist.com,Proxy
DOMAIN-SUFFIX,trello.com,Proxy
DOMAIN-SUFFIX,trustasiassl.com,Proxy
DOMAIN-SUFFIX,tumblr.co,Proxy
DOMAIN-SUFFIX,tumblr.com,Proxy
DOMAIN-SUFFIX,tweetdeck.com,Proxy
DOMAIN-SUFFIX,tweetmarker.net,Proxy
DOMAIN-SUFFIX,twitch.tv,Proxy
DOMAIN-SUFFIX,txmblr.com,Proxy
DOMAIN-SUFFIX,typekit.net,Proxy
DOMAIN-SUFFIX,ubertags.com,Proxy
DOMAIN-SUFFIX,ublock.org,Proxy
DOMAIN-SUFFIX,ubnt.com,Proxy
DOMAIN-SUFFIX,ulyssesapp.com,Proxy
DOMAIN-SUFFIX,urchin.com,Proxy
DOMAIN-SUFFIX,usertrust.com,Proxy
DOMAIN-SUFFIX,v.gd,Proxy
DOMAIN-SUFFIX,v2ex.com,Proxy
DOMAIN-SUFFIX,vimeo.com,Proxy
DOMAIN-SUFFIX,vimeocdn.com,Proxy
DOMAIN-SUFFIX,vine.co,Proxy
DOMAIN-SUFFIX,vivaldi.com,Proxy
DOMAIN-SUFFIX,vox-cdn.com,Proxy
DOMAIN-SUFFIX,vsco.co,Proxy
DOMAIN-SUFFIX,vultr.com,Proxy
DOMAIN-SUFFIX,w.org,Proxy
DOMAIN-SUFFIX,w3schools.com,Proxy
DOMAIN-SUFFIX,webtype.com,Proxy
DOMAIN-SUFFIX,wikiwand.com,Proxy
DOMAIN-SUFFIX,wikileaks.org,Proxy
DOMAIN-SUFFIX,wikimedia.org,Proxy
DOMAIN-SUFFIX,wikipedia.com,Proxy
DOMAIN-SUFFIX,wikipedia.org,Proxy
DOMAIN-SUFFIX,windows.com,Proxy
DOMAIN-SUFFIX,windows.net,Proxy
DOMAIN-SUFFIX,wire.com,Proxy
DOMAIN-SUFFIX,wordpress.com,Proxy
DOMAIN-SUFFIX,workflowy.com,Proxy
DOMAIN-SUFFIX,wp.com,Proxy
DOMAIN-SUFFIX,wsj.com,Proxy
DOMAIN-SUFFIX,wsj.net,Proxy
DOMAIN-SUFFIX,xda-developers.com,Proxy
DOMAIN-SUFFIX,xeeno.com,Proxy
DOMAIN-SUFFIX,xiti.com,Proxy
DOMAIN-SUFFIX,yahoo.com,Proxy
DOMAIN-SUFFIX,yimg.com,Proxy
DOMAIN-SUFFIX,ying.com,Proxy
DOMAIN-SUFFIX,yoyo.org,Proxy
DOMAIN-SUFFIX,ytimg.com,Proxy
# Telegram
DOMAIN-SUFFIX,telegra.ph,Proxy
DOMAIN-SUFFIX,telegram.org,Proxy
IP-CIDR,91.108.4.0/22,Proxy,no-resolve
IP-CIDR,91.108.8.0/21,Proxy,no-resolve
IP-CIDR,91.108.16.0/22,Proxy,no-resolve
IP-CIDR,91.108.56.0/22,Proxy,no-resolve
IP-CIDR,149.154.160.0/20,Proxy,no-resolve
IP-CIDR6,2001:67c:4e8::/48,Proxy,no-resolve
IP-CIDR6,2001:b28:f23d::/48,Proxy,no-resolve
IP-CIDR6,2001:b28:f23f::/48,Proxy,no-resolve
# Google 中国服务 services.googleapis.cn
IP-CIDR,120.232.181.162/32,Proxy,no-resolve
IP-CIDR,120.241.147.226/32,Proxy,no-resolve
IP-CIDR,120.253.253.226/32,Proxy,no-resolve
IP-CIDR,120.253.255.162/32,Proxy,no-resolve
IP-CIDR,120.253.255.34/32,Proxy,no-resolve
IP-CIDR,120.253.255.98/32,Proxy,no-resolve
IP-CIDR,180.163.150.162/32,Proxy,no-resolve
IP-CIDR,180.163.150.34/32,Proxy,no-resolve
IP-CIDR,180.163.151.162/32,Proxy,no-resolve
IP-CIDR,180.163.151.34/32,Proxy,no-resolve
IP-CIDR,203.208.39.0/24,Proxy,no-resolve
IP-CIDR,203.208.40.0/24,Proxy,no-resolve
IP-CIDR,203.208.41.0/24,Proxy,no-resolve
IP-CIDR,203.208.43.0/24,Proxy,no-resolve
IP-CIDR,203.208.50.0/24,Proxy,no-resolve
IP-CIDR,220.181.174.162/32,Proxy,no-resolve
IP-CIDR,220.181.174.226/32,Proxy,no-resolve
IP-CIDR,220.181.174.34/32,Proxy,no-resolve
RULE-SET,LAN,DIRECT
# 剩余未匹配的国内网站
DOMAIN-SUFFIX,cn,DIRECT
DOMAIN-KEYWORD,-cn,DIRECT
# 最终规则
GEOIP,CN,DIRECT
FINAL,Proxy,dns-failed
[URL Rewrite]
^https?://(www.)?(g|google).cn https://www.google.com 302