banner
amtoaer

晓风残月

叹息似的渺茫,你仍要保存着那真!
github
telegram
email
x
bilibili
steam
nintendo switch

[NAS 系列第三弹]局所ネットワークデバイスに対して無感知の透過プロキシを設定する

覚えておいてください、前回の記事で言及しました:

本記事ではネットワークの問題を解決しません。デフォルトの docker イメージなどは外部ネットワークに接続できると仮定します。接続できない場合は、手動でイメージに HTTP_PROXY、HTTPS_PROXY を設定してください。

今日は私のネットワーク設定を共有します。設定後、有線または無線で LAN に接続された任意のデバイスが、特別な設定なしで外部ネットワークに接続でき、非常に簡単な構文で DNS とトラフィックの分流を実現できます。

全体の考え方は、NAS をバイパスゲートウェイとして使用し、dhcp が返すデフォルトゲートウェイを NAS に指向させ、NAS 側でプロキシツールを設定することです。いつものように、始める前にいくつかの声明を書きます:

  1. 本文で言及されているプロキシツール dae は、カーネルバージョン >=5.8 が必要です。条件を満たさない場合は、他のプロキシツールに変更してください。
  2. 私の NAS ネットワークは Network Manager で設定しています。他のツールについては、代替の書き方を自分で調べてください。
  3. 家庭ごとにネットワークの設定や構造が異なるため、そのままコピーできないかもしれませんが、基本的な原理は同じです。
  4. ALL IN ONE, ALL IN BOOM !

ネットワーク構造#

家のネットワーク構造は以下の図のようになります(私の拙い図作成技術をお許しください):

image

私には専用のルーターがないことがわかります。ダイヤルアップ、NAT、無線 AP はすべて内蔵ルーターの光モデムが担当しており、すべてのデバイスを光モデムに接続するだけでインターネットに接続できます。

すべてのデバイスが同じネットワークセグメントにあるため、プロキシの実現は非常に簡単で、全体的には 3 つのステップに分かれます:

  1. NAS のすべてのネットワークポートをブリッジ接続(スキップ可能、主に有線インターフェースを拡張するため)
  2. 光モデムと NAS の IP アドレスを固定する
  3. NAS 上でプロキシと IP 転送を設定する
  4. DHCP サーバーを変更し、デフォルトゲートウェイを NAS に指向させる

以下で詳細を説明します。

NAS のすべてのネットワークポートをブリッジ接続(スキップ可能)#

私の NAS のマザーボードには 1 つのネットワークポートが付属していますが、光モデムのポートが足りないことを心配して、4 ポートの PCIe ネットワークカードを別途購入してブリッジ接続しました:

IMG_20230804_205220

接続後、ifconfigを実行すると、私の 5 つのネットワークポートの番号はそれぞれ enp3s0、enp4s0、enp5s0、enp6s0、enp7s0 であることがわかりました。Network Manager を使用すると、ネットワークポートを簡単にブリッジ接続できます:

# 新しいブリッジを作成
sudo nmcli connection add type bridge ifname br0 stp no
# 物理ネットワークポートをすべてブリッジに追加
sudo nmcli connection add type bridge-slave ifname enp3s0 master br0
sudo nmcli connection add type bridge-slave ifname enp4s0 master br0
sudo nmcli connection add type bridge-slave ifname enp5s0 master br0
sudo nmcli connection add type bridge-slave ifname enp6s0 master br0
sudo nmcli connection add type bridge-slave ifname enp7s0 master br0

光モデムと NAS の IP アドレスを固定する#

光モデムについては省略しますが、通常は IP が固定されています(例:192.168.0.1、192.168.1.1)。ここでは NAS の IP アドレスを固定する必要があります。

sudo nmcli connection showを使用すると、すべての接続が表示され、前面にありハイライトされているのがアクティブな接続です:

image

上の図のように、通常は最前面の接続を使用すれば問題ありません。

注:もし最近ネットワークポートをブリッジ接続した場合、ブリッジ接続の bridge-xx はデフォルトで有効になっていません。この場合、最前面の接続ではなく bridge-xx を使用する必要があります。

bridge-br0 を例に、IP アドレスを固定するコマンドは以下の通りです:

# あなたのIPとゲートウェイを固定(光モデムと同じネットワークセグメントである必要があります)
sudo nmcli connection modify bridge-br0 ipv4.addresses 192.168.1.250/24 ipv4.gateway 192.168.1.1
# 使用したいDNSを設定
sudo nmcli connection modify bridge-br0 ipv4.dns 119.29.29.29
# ipv4アドレスの割り当て方式を手動に変更
sudo nmcli connection modify bridge-br0 ipv4.method manual
# 再読み込み
sudo nmcli connection reload

注:同様に、最近ブリッジ接続を行った場合、ここでもすべてのブリッジポートを有効にし、既存の接続を無効にしてブリッジを有効にする必要があります:

# すべてのブリッジポートを有効にする
sudo nmcli connection up bridge-slave-enp3s0
sudo nmcli connection up bridge-slave-enp4s0
sudo nmcli connection up bridge-slave-enp5s0
sudo nmcli connection up bridge-slave-enp6s0
sudo nmcli connection up bridge-slave-enp7s0
# 使用中の接続を無効にする
sudo nmcli connection down Wired\ connection\ 6
# 設定したばかりのブリッジを有効にする
sudo nmcli connection up bridge-br0

NAS 上でプロキシと IP 転送を設定する#

最も重要なステップに来ました。プロキシと IP 転送を設定します。

IP 転送#

まず、IP 転送を有効にします。これにより、このデバイスがゲートウェイとして他のデバイスのトラフィックを転送できるようになります:

sudo vim /etc/sysctl.d/30-ipforward.conf

# 以下の内容を書き込み、保存します
net.ipv4.ip_forward=1
net.ipv6.conf.default.forwarding=1
net.ipv6.conf.all.forwarding=1

# 再読み込み
sudo sysctl --system

プロキシ#

本記事で使用するプロキシツールは dae です。実際には操作が簡単な webui 付きの daed を使用することが多いです:

daed, a modern dashboard with dae.

Arch Linux にインストールするのは非常に簡単で、以下のコマンドを使用してインストールし、自動起動を設定します:

sudo pacman -S daed
sudo systemctl enable --now daed.service

NAS の 2023 ポートを開き、初期のアカウントとパスワードを入力すると、メインページが表示されます:

image

全体の操作ロジックは非常にシンプルで、右下にサブスクリプションを追加し、サブスクリプションまたはノードを左下のグループにドラッグするだけです。DNS とルーティングモジュールで編集ボタンをクリックすると設定が展開され、分流ルールを記述できます。

dae の分流ルールは v2raya を継承しており、構文はシンプルで明確です。以下は私の DNS とルーティングルールのサンプルです:

# dns ルール

upstream {
  googledns: 'tcp+udp://dns.google.com:53'
  alidns: 'udp://dns.alidns.com:53'
}
routing {
  request {
    # 広告のdns解析をブロック
    qname(geosite:category-ads) -> reject
    qname(geosite:category-ads-all) -> reject
    # デフォルトでalidnsを使用
    fallback: alidns
  }
  response {
    # 上流がgooglednsの場合は直接通過、ループを避ける
    upstream(googledns) -> accept
    # 国内サイトがLAN IPに解決された場合、dns汚染に遭遇したと見なし、googlednsで再度確認
    !qname(geosite:cn) && ip(geoip:private) -> googledns
    # その他の状況は直接accept
    fallback: accept
  }
}
# ルーティングルール

# デフォルトルールにqbittorrentの直接接続を追加
pname(NetworkManager, systemd-resolved, qbittorrent-nox) -> direct
# 広告接続をブロック
domain(geosite:category-ads, geosite:category-ads-all) -> block
# 一般的にプロキシはipv6をサポートしていないため、直接接続
ipversion(6) -> direct
# chatgptには固定のノードグループを使用
domain(geosite:openai, regex: ".+\.openai$") -> chatgpt
# ブロードキャストアドレス、LANアドレス、国内IPは直接接続
dip(224.0.0.0/3, 'ff00::/8', geoip:private, geoip:cn) -> direct
# steam、国内ドメインは直接接続
domain(geosite:steam@cn, geosite:cn, geosite:geolocation-cn) -> direct
# 未マッチの場合はプロキシを使用
fallback: proxy

分流ルールの設定が完了したら、設定でバインドするインターフェースを設定する必要があります。バイパスゲートウェイの使用シナリオでは、LAN と WAN の両方に現在アクティブなインターフェース(私の場合は br0)を追加する必要があります。さらに、LAN ポートには他のプロキシが必要なインターフェース(例:docker0)を追加することもできます:

image

他のオプションは一般的に変更する必要はなく、最下部の送信をクリックし、次にホームページの右上で起動をクリックします。

image

この時点で、NAS とすべてのゲートウェイが NAS を指向するデバイスからのトラフィックはすべて dae によって管理され、分流され、透明なプロキシが実現されます。

DHCP サーバーを変更し、デフォルトゲートウェイを NAS に指向させる#

現在、ゲートウェイが NAS を指向しているため透明プロキシが機能していますが、DHCP が返すゲートウェイは依然として 192.168.1.1(光モデムルーターのアドレス)です。ネットワークに接続されたデバイスは、プロキシを成功させるために手動でゲートウェイを変更する必要があります。この状況を変更するためには、DHCP サーバーを調整する必要があります。

光モデムルーター内の DHCP サーバーでは、返されるゲートウェイアドレスを変更することができないため、NAS 上で DHCP サーバーを起動し、光モデムルーターの DHCP サーバーの代わりに使用する必要があります。

NAS 上で DHCP サーバーを展開する#

Linux で利用可能な DHCP サーバーは多数ありますが、私が選んだのは dhcpd の後継である kea で、dnsmasq も同様の目的を果たせます:

A modern, scalable, robust DHCPv4 and DHCPv6 server, with database (MySQL, PostgreSQL), hooks, multi-threading, RADIUS, NETCONF, Kerberos and more.

Arch Linux にインストールします:

sudo pacman -S kea

ここでは dhcp4 を置き換えるだけで要件を満たすことができます。公式ドキュメントを参考にして、DHCP 設定を以下のように記述します:

{ "Dhcp4":

{
  "interfaces-config": {
    "interfaces": [ "br0" ]
  },

  "lease-database": {
      "type": "memfile",
      "lfc-interval": 3600
  },

  "valid-lifetime": 4000,


  "subnet4": [
    {
       "pools": [ { "pool":  "192.168.1.2 - 192.168.1.254" } ],
       "subnet": "192.168.1.0/24",
       "interface": "br0",
       "option-data": [
         {
             "name": "domain-name-servers",
             "data": "119.29.29.29"
         },
         {
             "name": "routers",
             "data": "192.168.1.250"
         },
      ]
    }
  ],
    "loggers": [
        {
            "name": "kea-dhcp4",
            "output_options": [
                {
                    "output": "stdout"
                }
            ],
            "severity": "INFO"
        }
    ]
}

}

上記の設定を/etc/kea/kea-dhcp4.confに書き込み、kea-dhcp4 サービスを起動します:

sudo systemctl enable --now kea-dhcp4.service

次に、光モデムルーターの管理画面にログインし、内蔵の dhcp4 サーバーを無効にします:

image

今、任意の有線または無線デバイスをネットワークに接続し、DHCP が正常に機能しているか確認します:

image

ルーターの位置に表示されるアドレスが設定した 192.168.1.250 であることがわかり、NAS 上で展開した DHCP が正常に動作していることが確認できます。

これで設定が完了し、大成功です。

参考資料#

  1. dae dns ドキュメント
  2. dae routing ドキュメント
  3. dae 設定例
  4. Arch Wiki - Network Bridge
  5. Arch Wiki - Internet Sharing
  6. Kea examples
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。