نصب کلاینت روی هر دستگاه خستهکننده است، و تلویزیون و ویدیوپروژکتور و دستگاههای IoT اصلاً نمیتوانند اجرایش کنند. Mihomo را روی یک روتر نرمافزاری یا NAS مستقر کنید تا هر دستگاهی که به Wi-Fi وصل است خودکار پوشش داده شود.
سه راه اتصال
خط اصلی این مقاله روتر جانبی بهعلاوهٔ TProxy است، کاربردیترین ترکیب برای خانه.
۱. نصب Mihomo
با فرض یک روتر نرمافزاری یا NAS با Linux amd64:
# دانلود و استخراج (معماری را متناسب انتخاب کنید)
gunzip mihomo-linux-amd64-v1.19.29.gz
chmod +x mihomo-linux-amd64-v1.19.29
sudo mv mihomo-linux-amd64-v1.19.29 /usr/local/bin/mihomo
mihomo -v
# آماده کردن پوشهٔ کاری
sudo mkdir -p /etc/mihomoدستگاههای ARM (رزبریپای، NAS با ARM) نسخهٔ linux-arm64 میخواهند؛ اگر uname -m خروجی aarch64 داد یعنی همان.
۲. فایل پیکربندی
فایل /etc/mihomo/config.yaml:
# ===== پایه =====
mixed-port: 7890
tproxy-port: 7895 # برای TProxy
redir-port: 7892 # برای REDIRECT (اختیاری)
allow-lan: true
bind-address: "*"
mode: rule
log-level: info
ipv6: false
unified-delay: true
tcp-concurrent: true
external-controller: 0.0.0.0:9090
secret: "یک رمز تصادفی بهقدر کافی بلند بگذارید"
external-ui: /etc/mihomo/ui
# ===== DNS =====
dns:
enable: true
listen: 0.0.0.0:1053
ipv6: false
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
fake-ip-filter:
- "*.lan"
- "*.local"
- "+.home.arpa"
- "+.pool.ntp.org"
- "time.*.com"
- "+.msftconnecttest.com"
- "+.msftncsi.com"
- "captive.apple.com"
default-nameserver: [223.5.5.5, 119.29.29.29]
nameserver:
- https://doh.pub/dns-query
- https://dns.alidns.com/dns-query
fallback:
- https://1.1.1.1/dns-query
fallback-filter:
geoip: true
geoip-code: CN
# ===== گرهها از کجا میآیند =====
proxy-providers:
main:
type: http
url: "لینک اشتراک شما"
interval: 3600
path: ./providers/main.yaml
header:
User-Agent: ["clash.meta"]
exclude-filter: "(?i)remaining|expire|website|traffic"
health-check:
enable: true
url: http://www.gstatic.com/generate_204
interval: 300
lazy: true
# ===== گروههای سیاست =====
proxy-groups:
- name: "PROXY"
type: select
proxies: ["AUTO", "HK", "JP", "SG", DIRECT]
- name: "AUTO"
type: url-test
use: [main]
url: http://www.gstatic.com/generate_204
interval: 300
tolerance: 50
lazy: true
- name: "HK"
type: url-test
use: [main]
filter: "(?i)HK|Hong ?Kong"
interval: 300
tolerance: 50
- name: "JP"
type: url-test
use: [main]
filter: "(?i)JP|Japan"
interval: 300
tolerance: 50
- name: "SG"
type: url-test
use: [main]
filter: "(?i)SG|Singapore"
interval: 300
tolerance: 50
- name: "FINAL"
type: select
proxies: ["PROXY", DIRECT]
# ===== قواعد =====
rules:
- IP-CIDR,127.0.0.0/8,DIRECT,no-resolve
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
- IP-CIDR,172.16.0.0/12,DIRECT,no-resolve
- IP-CIDR,100.64.0.0/10,DIRECT,no-resolve
- DOMAIN-SUFFIX,lan,DIRECT
- DOMAIN-SUFFIX,local,DIRECT
# مسیریابی بهازای دستگاه (نمونه)
- SRC-IP-CIDR,192.168.1.50/32,DIRECT # گوشی یکی از اعضای خانواده مستقیم بماند
- SRC-IP-CIDR,192.168.1.60/32,PROXY # تلویزیون همیشه پروکسی شود
# مسیریابی معمولی
- GEOIP,CN,DIRECT
- MATCH,FINAL۳. سرویس systemd
فایل /etc/systemd/system/mihomo.service:
[Unit]
Description=Mihomo Daemon
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=root
LimitNOFILE=1000000
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE CAP_SYS_TIME CAP_SYS_PTRACE CAP_DAC_READ_SEARCH
AmbientCapabilities=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE CAP_SYS_TIME CAP_SYS_PTRACE CAP_DAC_READ_SEARCH
Restart=always
RestartSec=5
ExecStartPre=/usr/local/bin/mihomo -t -d /etc/mihomo
ExecStart=/usr/local/bin/mihomo -d /etc/mihomo
[Install]
WantedBy=multi-user.targetسوییچ -t در ExecStartPre بررسی پیکربندی است — آنوقت پیکربندی خراب بهجای انداختن سرویس در حال کار، خودش راه نمیافتد، و همین جزئیات دردسر زیادی را میخرد.
sudo systemctl daemon-reload
sudo systemctl enable --now mihomo
sudo systemctl status mihomo
journalctl -u mihomo -f۴. رویکرد الف: دروازه را دستی اشاره بدهید (از همینجا شروع کنید)
به هیچ قاعدهٔ فایروالی دست نزنید؛ روی دستگاههایی که پروکسی میخواهند اینها را عوض کنید:
- دروازه: نشانی روتر نرمافزاری (مثلاً
192.168.1.2) - DNS: باز هم
192.168.1.2
قوت این رویکرد تابآوری است — اگر Mihomo بمیرد فقط دستگاههایی که عوض کردهاید تحت تأثیرند و بقیهٔ اهل خانه متوجه نمیشوند.
۵. رویکرد ب: پروکسی شفاف TProxy
صفر تنظیم روی دستگاهها، به بهای قواعد فایروال روی دروازه.
فعال کردن forwarding در هسته
sudo tee /etc/sysctl.d/99-mihomo.conf > /dev/null <<'EOF'
net.ipv4.ip_forward = 1
net.ipv4.conf.all.route_localnet = 1
EOF
sudo sysctl --systemقواعد iptables
#!/bin/bash
# /etc/mihomo/tproxy.sh
TPROXY_PORT=7895
ROUTE_TABLE=100
FWMARK=1
# مسیریابی سیاستی: بستههای علامتخورده به جدول محلی میروند
ip rule add fwmark $FWMARK table $ROUTE_TABLE 2>/dev/null
ip route add local default dev lo table $ROUTE_TABLE 2>/dev/null
# زنجیرهٔ خودمان
iptables -t mangle -N MIHOMO 2>/dev/null
iptables -t mangle -F MIHOMO
# بازههای خصوصی و رزروشده را دستنخورده رد کنید
for net in 0.0.0.0/8 10.0.0.0/8 127.0.0.0/8 169.254.0.0/16 \
172.16.0.0/12 192.168.0.0/16 224.0.0.0/4 240.0.0.0/4; do
iptables -t mangle -A MIHOMO -d $net -j RETURN
done
# بقیه را علامت بزن و به پورت TProxy بسپار
iptables -t mangle -A MIHOMO -p tcp -j TPROXY --on-port $TPROXY_PORT --tproxy-mark $FWMARK
iptables -t mangle -A MIHOMO -p udp -j TPROXY --on-port $TPROXY_PORT --tproxy-mark $FWMARK
# روی ترافیک فرستادهشده (از دستگاههای دیگر) اعمال کن
iptables -t mangle -A PREROUTING -j MIHOMO
# ربودن DNS: پرسوجوهای پورت ۵۳ دستگاهها را به Mihomo منحرف کن
iptables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 1053
iptables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 1053اسکریپت پاکسازی:
#!/bin/bash
# /etc/mihomo/tproxy-clear.sh
iptables -t mangle -D PREROUTING -j MIHOMO 2>/dev/null
iptables -t mangle -F MIHOMO 2>/dev/null
iptables -t mangle -X MIHOMO 2>/dev/null
iptables -t nat -F PREROUTING 2>/dev/null
ip rule del fwmark 1 table 100 2>/dev/null
ip route del local default dev lo table 100 2>/dev/nullقواعد را به systemd بچسبانید تا با سرویس بیایند و بروند:
[Service]
ExecStartPost=/etc/mihomo/tproxy.sh
ExecStopPost=/etc/mihomo/tproxy-clear.shواداشتن دستگاهها به استفاده از آن
در تنظیمات DHCP روتر اصلی، هم دروازهٔ پیشفرض و هم سرور DNS را نشانی روتر نرمافزاری بگذارید. دستگاهها با اتصال دوباره به Wi-Fi برمیدارندش.
۶. تابآوری: اهل خانه را عصبانی نکنید
مهمترین بخش استقرار خانگی همین است.
یک اسکریپت امن بهروزرسانی اشتراک
#!/bin/bash
# /usr/local/bin/update-mihomo.sh
set -euo pipefail
CONF=/etc/mihomo/config.yaml
TMP=$(mktemp)
trap 'rm -f "$TMP"' EXIT
curl -fsSL --max-time 30 -A "clash.meta" -o "$TMP" "لینک اشتراک شما"
# بررسی پایهٔ سلامت
grep -q "^proxies:\|^proxy-providers:" "$TMP" || { echo "محتوای اشتراک درست نیست"; exit 1; }
# بگذارید mihomo هم اعتبارسنجی کند
cp "$CONF" "${CONF}.bak"
cp "$TMP" "$CONF"
if mihomo -t -d /etc/mihomo; then
systemctl restart mihomo
echo "بهروز شد"
else
cp "${CONF}.bak" "$CONF"
echo "اعتبارسنجی شکست خورد، برگردانده شد"
exit 1
fiبه cron اضافهاش کنید:
0 4 * * * /usr/local/bin/update-mihomo.sh >> /var/log/mihomo-update.log 2>&1با proxy-provider در واقع به این اسکریپت نیازی ندارید — هسته خودش طبق زمانبندی گرهها را میکشد و پیکربندی اصلی هرگز عوض نمیشود. این دلیل مهمی است که provider را به کل اشتراک ترجیح بدهید.
۷. پنل وب
external-ui: /etc/mihomo/ui
external-ui-name: metacubexdفایلهای پنل را در /etc/mihomo/ui بگذارید، بعد در مرورگر به http://ip-روتر:9090/ui بروید، secret را وارد کنید و از یک صفحهٔ وب گره عوض کنید و اتصالها را ببینید و لاگ بخوانید.
بقیهٔ اهل خانه هم میتوانند از همان صفحه خودشان گره عوض کنند و سراغ شما نیایند.
۸. کارایی و منابع
ترتیب بهینهسازی وقتی کارایی کم میآورد:
۱. مجموعهقواعد را کم کنید (فهرستهای پخش و تبلیغاتی که به کار نمیبرید را بیندازید) ۲. مجموعهقواعد را به قالب دودویی mrs ببرید ۳. log-level را روی warning بگذارید، هرگز debug نه ۴. بسامد health-check را کم کنید ۵. TProxy از TUN کممصرفتر است، پس TProxy را ترجیح بدهید
۹. عیبیابی
# وضعیت سرویس
systemctl status mihomo
journalctl -u mihomo -n 100 --no-pager
# چه چیزی گوش میدهد
ss -tulnp | grep mihomo
# آیا API پاسخ میدهد
curl -H "Authorization: Bearer secret-شما" http://127.0.0.1:9090/version
# آزمودن پورت پروکسی از دستگاهی دیگر
curl -x http://192.168.1.2:7890 -I https://www.google.com
# شمارندهٔ برخورد قواعد iptables
iptables -t mangle -L MIHOMO -v -nخلاصه
- اول «روتر جانبی بهعلاوهٔ دروازهٔ دستی» را راه بیندازید و وقتی پایدار شد سراغ TProxy بروید
- گذاشتن secret اجباری است؛
0.0.0.0:9090به روی کل شبکهٔ محلی شما باز است - proxy-provider بردارید نه کل اشتراک تا هسته خودش بهروز شود و پیکربندی اصلی تکان نخورد
- سوییچ
-tرا به ExecStartPre اضافه کنید تا پیکربندی خراب سرویس در حال کار را کنار نزند - به دستگاههای مهم قاعدهٔ مستقیم SRC-IP-CIDR بدهید تا اهل خانه تحت تأثیر نباشند
- پیش از دست زدن به TProxy یک پاکسازی خودکار زمانبندی کنید تا راه برگشت داشته باشید
بیشتر بخوانید: API کنترل و پنلهای وب و مدیریت چند اشتراک.
مستندات مرتبط
نشانی 127.0.0.1 داخل کانتینر همان میزبان نیست. پیکربندی برای هر سه سناریوی Docker — کشیدن تصویر توسط دیمون، زمان ساخت و زمان اجرا — بهعلاوهٔ دو رویکرد برای حالتهای شبکهٔ متفاوت WSL2.
جدول مرجعی که ارزش نشان کردن دارد. دستور پروکسی هر ابزار، محل فایل تنظیماتش، راه برگرداندنش، و اینکه چرا بعضی ابزارها متغیرهای محیطی را نادیده میگیرند.
تمام RESTful API که external-controller باز میکند: تعویض گره، بازرسی اتصالها، بارگذاری دوبارهٔ پیکربندی، استقرار پنل وب، و چند اسکریپت خودکارسازی کاربردی.