OpenWrtのバイパスルーターでmihomoを動かす方法|透過プロキシの構成と設定

GUIクライアントを使わず、ルーターやバイパスルーターでmihomoを動かして、家中の端末の通信をまとめて振り分けます。この記事では、構成の選び方、TProxyとredirの違い、ゲートウェイの設定を解説します。

1. まずバイパスルーターが処理する通信を決める

mihomoはプロキシコアであり、OpenWrtのネットワーク設定をすべて自動で行うものではありません。サブスクリプションはノードとルールを提供し、コアは接続先を選択します。端末の通信がコアに届くかどうかは、デフォルトゲートウェイ、ルーティングテーブル、ファイアウォール、DNSの経路によって決まります。YAMLをルーターに置いて実行しただけでは、LAN内の端末が透過プロキシに接続されたことにはなりません。

ここではIPv4の構成例として、メインルーターを192.168.10.1/24(PPPoE接続とDHCPを担当)、バイパスルーターを192.168.10.2/24(デフォルトゲートウェイはメインルーター)、テスト用PCを192.168.10.100/24とします。これらのアドレスは説明用です。実際に導入する前に現在のネットワークに合わせて変更し、DHCPのアドレス範囲と重複しないことを確認してください。

接続方式通信の入口用途
明示的プロキシアプリからバイパスルーターのポート7890へ手動で接続ノード、サブスクリプション、ルールの動作確認
シングルアーム構成のバイパスルーター端末のデフォルトゲートウェイを192.168.10.2に変更少数の端末から段階的に接続
デュアルNICの下位ルーター端末を独立した下位ネットワークに接続転送範囲を明確に分けたい場合
メインルーターによるポリシールーティングメインルーターが送信元アドレスやポリシーに応じて転送接続端末を一元管理したい場合

2. OpenWrtへの導入前に確認すること

システムのアーキテクチャとファイアウォールのバックエンドを確認

SSHでシステムのバージョン、CPUアーキテクチャ、空きストレージを確認します。OpenWrt 22.03以降は通常firewall4とnftablesが使われますが、アップグレードやカスタムファームウェア、サードパーティープラグインによって環境が異なる場合があります。nftables環境に旧版のiptablesルールをそのまま貼り付けないでください。また、同じ通信を処理する透過プロキシ用プラグインを複数同時に動かさないでください。

ubus call system board
uname -m
df -h /overlay
free -m
command -v fw4
command -v nft
ip route show
ip -6 route show

uname -mの出力はアーキテクチャの確認に役立ちますが、それだけでmihomoのビルドを選べるわけではありません。デバイスのCPU機能に合ったものを選んでください。古い機種では新しい命令セットに対応していない場合があります。起動直後に終了したり、不正な命令のエラーが出たりする場合は、サブスクリプションを何度も変更する前にバイナリのビルドを確認します。

コア、設定ファイル、サービス管理を分ける

実行ファイル、作業ディレクトリ、サービススクリプトは分けて管理するのがおすすめです。たとえば、コアを/usr/bin/mihomo、設定を/etc/mihomo/config.yamlに置き、OpenWrtのprocdで実行状態を管理します。以下のパスは構成例であり、システムに該当ファイルがあらかじめインストールされていることを示すものではありません。

/usr/bin/mihomo -v
/usr/bin/mihomo -t -d /etc/mihomo -f /etc/mihomo/config.yaml

2つ目のコマンドは設定を読み込めるか確認するもので、インターネット接続全体をテストするものではありません。ルールセット、GeoIP、GeoSiteのデータを使う場合は、対応するリソースも必要です。外部リソースをダウンロードできるか、保存先に書き込めるか、初回起動時にまだ確立されていないプロキシ接続に依存しないかを確認します。サービススクリプトには起動順序、異常終了時の再起動、ログ出力を設定し、SSHセッション終了とともにプロセスが停止しないようにします。

3. 明示的プロキシでサブスクリプションとルールを確認

導入は「コアの起動 → 明示的プロキシの動作確認 → DNSの動作確認 → 透過プロキシ化」の順に進めます。こうすれば、ノードの問題とルーティング設定の問題を切り分けられます。以下は疎通確認用の最小構成です。プロキシノードはなく、最後のルールですべての通信を直接接続します。サブスクリプションの代わりにはならず、プロキシ経由の通信が可能かどうかも確認できません。

mixed-port: 7890
allow-lan: true
bind-address: 192.168.10.2
mode: rule
log-level: info
ipv6: false

rules:
  - MATCH,DIRECT

この設定例を実際の設定に統合するときは、同じトップレベルの項目を複数残さないでください。LANからの接続を許可する場合、OpenWrtのファイアウォールで信頼できるLANからのポート7890へのアクセスだけを許可します。WANには公開せず、インターネットからのポート転送も設定しないでください。待ち受けアドレスには、バイパスルーターが実際に使用しているアドレスを指定します。

  1. まずテスト用PCのHTTPプロキシを192.168.10.2:7890に設定し、リクエストがコアに届くことを確認します。
  2. 次に、有効なClash形式のサブスクリプションを読み込み、プロキシグループに利用可能なノードが含まれていることを確認して、使うノードを選びます。
  3. 接続ログで適用されたルールと出力先を確認します。ルールモードでの結果はルールの順序によって決まり、プロキシグループ名に「自動」と書かれているかどうかには左右されません。
  4. 透過プロキシのテストに進む前に、PC側の明示的プロキシを無効にします。2つの接続方式が重なり、誤った判断につながるのを防げます。

curlをインストールしたテスト用PCでは、curl -I --proxy http://192.168.10.2:7890 https://example.comを実行できます。このコマンドでHTTPプロキシの通信経路を確認できます。ノード経由かどうかを確認するには、適用ルール、出力先のログ、信頼できる接続元IP確認サービスの結果も併せて確認してください。

4. TProxy、redir、TUNの違い

方式主な機能必要なシステム設定
redir-portリダイレクトされたTCP接続を受信NATリダイレクト、アドレス除外、ループバック除外
tproxy-port透過プロキシのTCP・UDP通信を受信TPROXYルール、マーク、ポリシールーティング
tun仮想ネットワークインターフェース経由でIP通信を受信TUN対応、ルーティングの引き継ぎ、ファイアウォール転送

redirは主にTCPを処理

redir-port: 7892を設定するだけでは、待ち受けポートが作られるだけです。対象となるTCP通信をそこへ転送するファイアウォール設定も必要です。この入口だけではUDPを同じように透過処理できません。Webページは開くのにゲーム、音声通話、QUICで問題が出る場合は、タイムアウトを延ばす前にUDPの実際の経路を確認してください。

TProxyにはマークとポリシールーティングが必要

tproxy-port: 7893はTCPとUDPの透過プロキシ用の入口にできますが、対応するカーネルモジュール、ファイアウォールルール、ルーティングテーブルがすべて必要です。システムはfwmarkとip ruleを使って、マーク付きパケットをローカルの受信経路に転送します。マーク値とルーティングテーブル番号は、既存のVPN、マルチWAN、その他のプラグインと重複しないように設定してください。どの機器でも同じ番号が空いているとは限りません。

TUNはスイッチを1つ有効にするだけではない

mihomoのTUNはauto-routeなどの項目を使ってルートを設定できますが、OpenWrt側の転送ポリシー、インターフェースの認識、IPv6ルートは別途確認が必要です。新しいバージョンのmihomoはLinuxでauto-redirect関連の機能も利用できます。動作は使用中のコアのバージョンに対応したドキュメントで確認してください。異なる解説記事にある自動リダイレクト機能と手動設定のTProxyルールを同時に有効にしないでください。

5. ゲートウェイ、戻り経路、ファイアウォール転送

シングルアーム構成では、テスト用PCのデフォルトゲートウェイを192.168.10.2に設定し、バイパスルーター自身のデフォルトルートは192.168.10.1を向くようにします。メインルーターとバイパスルーターのデフォルトルートを互いに向けないでください。DHCPをメインルーターで提供している場合は、まずPCの設定を手動で変更します。動作確認後、DHCPオプション3でゲートウェイ、オプション6でDNSを配布できます。

シングルアーム構成の一部では、送信元アドレスを制御して変換し、直接接続する通信の戻り経路をバイパスルーター経由にします。その代わり、上流から見る送信元がバイパスルーターのアドレスに統一され、端末ごとの統計やポリシーに影響することがあります。「すべてのゾーンでマスカレードを有効にする」ことを万能の解決策にしないでください。デュアルNIC、独立した下位ネットワーク、異なるファイアウォールポリシーでは、それぞれに合わせた設計が必要です。

6. DNS:ポート53と1053の役割を整理

OpenWrtでは通常、dnsmasqがポート53で待ち受け、DHCPとLAN内の名前解決を提供します。mihomoも同じアドレスのポート53で待ち受けると、競合が起こります。切り分けやすい構成は、端末からバイパスルーターの53番ポートへ問い合わせ、dnsmasqからmihomoのローカル1053番ポートへ転送し、その後mihomoが上流DNSに問い合わせる方法です。

dns:
  enable: true
  listen: 127.0.0.1:1053
  ipv6: false
  enhanced-mode: fake-ip
  fake-ip-range: 198.18.0.1/16
  nameserver:
    - https://1.1.1.1/dns-query

これはDNS設定の一例です。上流アドレスに到達できることと、その接続経路が実際のプロキシポリシーと整合していることを確認してください。LuCIの「ネットワーク」→「DHCP/DNS」→「一般設定」にあるDNS転送では、使用中のバージョンでサポートされている書式に従って127.0.0.1#1053を設定できます。resolvファイルの参照元も確認し、dnsmasqから自身へ再転送されないようにしてください。

fake-ipが返すのは接続を対応付けるためのアドレスであり、接続先Webサイトの実アドレスではありません。そのアドレスに端末が接続したとき、その通信もmihomoで受信できて初めてマッピングが機能します。DNSだけバイパスルーターを経由し、ゲートウェイがメインルーターのままだと、「名前解決はできるのに、どのWebページもタイムアウトする」ことがあります。

まずIPv4の動作を確認してから、IPv6のRA、DNS通知、デフォルトルート、プロキシ経路を個別に設計することをおすすめします。デュアルスタックの通信を処理する場合は、AAAAの名前解決と実際のIPv6接続も確認してください。IPv4の接続元だけでは判断できません。

7. 段階ごとの動作確認とトラブルシューティング

一度に変更するのは1か所だけにし、変更前後の結果を記録します。以下の順で確認すれば、「通信がバイパスルーターに届いていない」「コアには届いているがルールが違う」「ノード自体に問題がある」を切り分けられます。

  1. 基本ネットワーク:テスト用PCからメインルーターとバイパスルーターの管理アドレスにアクセスできること、バイパスルーターのデフォルトルートが正しいこと、システム時刻が正確であることを確認します。
  2. 明示的プロキシ:ポート7890経由でテストサイトに接続し、接続ログ、プロキシグループの選択、出力先のエラーを確認します。
  3. DNS:nslookup example.com 192.168.10.2を実行し、想定したDNS経路に問い合わせが届くことを確認します。fake-ipを有効にしている場合は、マッピング結果も確認してください。
  4. 透過プロキシ:アプリのプロキシ設定を無効にして新しい接続を開始し、mihomoのログに接続が表示され、想定したルールが適用されることを確認します。
  5. UDPとIPv6:UDPが必要なアプリとIPv6の接続先をそれぞれテストします。TCPの成功だけでは、他の2つの経路も正常とは限りません。
  6. 再起動後の動作:バイパスルーターを再起動し、サービスの起動、DNSの動作、ファイアウォールルールの復元、ノードのホスト名解決を確認します。
症状まず確認する項目
明示的プロキシは動くが、透過プロキシのログが出ない端末のゲートウェイ、転送経路、ルールのカウンター、TUNのルート
名前解決はできるが、接続がタイムアウトするfake-ipの通信がコアに届いているか、プロキシループ、ノードへの到達性
Webページは開くが、一部のリアルタイムアプリが動かないUDPの入口、ノードのUDP対応、MTU、ファイアウォール
ルールを変更しても、既存の接続が以前の出力先を使い続けるテスト中の接続を終了して新しく接続し、既存セッションの再利用を避ける
再起動後、ネットワーク全体で名前解決できないdnsmasqの上流設定、mihomoの起動順序、リソースのダウンロード依存関係

パケットを確認するには、tcpdumpをインストールした機器でtcpdump -ni br-lan host 192.168.10.100を実行し、テスト用PCの通信を確認できます。br-lanは実際のLANインターフェース名に置き換えてください。ログにサブスクリプションのURL、ノードの認証情報、アクセス先ドメインが含まれる場合は、共有する前に機密情報を削除してください。

8. 設定の管理と元に戻す方法

サブスクリプションの更新、コアのアップグレード、ファイアウォールの変更は分けて行います。機器固有のDNS、待ち受けアドレス、入口ポート、ルーティングポリシーはローカル側で管理し、リモートのサブスクリプション更新で上書きされないようにしてください。オーバーライドや設定のマージ機能を使う場合は、元のサブスクリプションだけでなく、最終的に生成されたYAMLも確認します。

バイパスルーターの導入では、通信の入口、DNS、外向き通信の3つの経路を整合させることが重要です。まず1台の端末で明示的プロキシを確認し、透過プロキシの方式を1つ選んでから、DHCPで設定を配布する範囲を広げてください。ルールモード、サブスクリプションの読み込み、クライアントの操作についてはClashの使い方ガイドを、設定項目については詳細ドキュメントをご覧ください。