Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
esp_wifi_repeater — フル機能のWiFi NATルーター(そして現在はWiFiリピーターでもある) | Kitploit
ツール/GitHubGitHub/martin-ger/esp_wifi_repeater
組み込みシステムセキュリティパケットスニッフィングと分析Wi-Fi監査IoTセキュリティネットワークセキュリティワイヤレスセキュリティハードウェアとIoTセキュリティDNS分析
GitHubmartin-ger/esp_wifi_repeater

esp_wifi_repeater

フル機能のWiFi NATルーター(そして現在はWiFiリピーターでもある)

リポジトリを見る
5.2k9812ヶ月前Kitploit レビュー済み

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

esp_wifi_repeater

フル機能のWiFi NATルーター(そして今ではWiFiリピーター、別名L2ブリッジでもあります)

NEW 2026: 初回リリースから10年を経て、それはついに、ずっとそうであろうとしていたものになりました:真のWiFiリピーター。既存のドキュメントやリンクを壊さないために、標準エディションは依然として、すべての高度な機能を備えた有名なNATルーターバージョンのままです。しかし、本格的なL2ブリッジの簡素化されたバージョンに興味があるなら、以下のセクション ESP8266 WiFi Repeater - L2 bridge をご覧ください。

これは、esp8266 および esp8285 上での WiFi NAT ルーターの実装です。また、ACL を備えたパケットフィルタリングファイアウォール、ポートマッピング、トラフィックシェーピング、リモートモニタリング(またはパケットスニッフィング)用のフック、MQTT 管理インターフェース、簡単な GPIO 操作、および電力管理のサポートも含まれています。より広いエリアをカバーするためにメッシュ構成で複数のルーターをセットアップするための新しいモード「Automesh」も含まれています。

NAT 機能を Arduino プロジェクトに統合する方法をお探しなら - こちら をご覧ください。

EPS32 NAT Router は ESP32 向けの高度なプロジェクトです。

典型的な使用シナリオは次のとおりです。

  • 既存のWiFiネットワーク用のシンプルなレンジエクステンダー
  • バッテリー駆動の屋外(メッシュ)ネットワーク
  • ゲスト用に異なるSSID/パスワードを持つ追加のWiFiネットワークを設定する
  • IoTデバイス用の安全で制限されたネットワークを設定する
  • WPA2 EnterpriseネットワークをWPA-PSKに変換する
  • WiFiトラフィック解析用のモニタープローブ
  • ルート、ACL、トラフィックシェーピングを使ったネットワーク実験
  • 基本的なI/O機能とMQTT制御を備えたメッシュIoTデバイス

デフォルトでは、ESP は STA およびソフトAPとして動作し、あらゆる IP トラフィックを透過的に転送します。NAT を使用しているため、ネットワーク側にも接続ステーション側にもルーティングエントリは必要ありません。ステーションはデフォルトで DHCP により 192.168.4.0/24 ネットワーク内で設定され、既存の WiFi ネットワークから DNS レスポンダアドレスを受け取ります。

測定結果によると、双方向で約 5 Mbps を達成できるため、ストリーミングも可能です。

いくつかの詳細はこの ビデオ で説明されています。

Webインストーラー

デバイスへの直接フラッシュには Web-Installer を使用してください。

初回起動

esp_wifi_repeater は次のデフォルト設定で起動します。

  • ap_ssid: MyAP, ap_password: none, ap_on: 1, ap_open: 1
  • network: 192.168.4.0/24

初回起動(またはファクトリーリセット)後、ESP はオープンAPと ssid "MyAP" を持つ WiFi ネットワークを提供します。有効な ssid やパスワードを知らないため、まだアップリンクAPへの自動再接続は試みません。

この WiFi ネットワークに接続し、シンプルな Web インターフェースまたはコンソール経由の全オプションを含む完全な設定のいずれかで基本設定を行ってください。

基本Web設定インターフェース

Web インターフェースでは、基本的な転送機能に必要なすべてのパラメータを設定できます。この主要な作業については rubfi に感謝します: https://github.com/rubfi/esp_wifi_repeater/ 。ブラウザで "http://192.168.4.1" を開いてください。次のページが表示されます。

まず、アップリンク WiFi ネットワークの適切な値、つまり "STA Settings" を入力します。オープンネットワークの場合はパスワード "none" を使用します。本当に automesh モードを使用したい場合にのみ "Automesh" ボックスにチェックを入れます。"Connect" をクリックします。ESP は再起動し、あなたの WiFi ルーターに接続します。数秒後、ステータス LED が点滅するはずです。

automesh を選択した場合、設定は完了です。"Soft AP Settings" の設定は必要ありません。automesh モードではこれらの設定は "STA Settings" と同じだからです。接続されたすべての ESP リピーターによって同じ ssid が提供されます。

automesh を使用しない場合は、ページを再読み込みして "Soft AP Settings" を変更できます。"Set" をクリックすると、再び ESP が再起動します。これで、新しく設定された Soft AP を介してトラフィックを転送する準備が整います。これらの変更は設定インターフェースにも影響することに注意してください。つまり、さらに設定を行うには、新しく設定された WiFi ネットワークのいずれかを介して ESP に接続してください。Soft AP 経由でアクセスする場合は、変更した場合に備えて Soft AP ネットワークのアドレスを覚えておいてください(ESP はこのネットワーク内では常にアドレス x.x.x.1 を持ちます)。

必要に応じて、"lock" チェックボックスをオンにして "Lock" をクリックできます。これで、アップリンク WiFi ネットワークのパスワードでロックを解除しない限り、設定を変更できなくなります(ネットワークがオープンでもパスワードを定義してください)。

Web インターフェースで非 ASCII 文字や特殊文字を入力する場合は、"My%20AccessPoint" のような HTTP スタイルの 16 進エンコーディングを使用する必要があります。これにより、文字列 "My AccessPoint" が生成されます。この 16 進エンコーディングを使用すると、0 を除く任意のバイト値を入力できます(C 内部の理由による)。

間違えて ESP との接続をすべて失った場合でも、シリアルコンソールを使用して回復できます("reset factory"、以下を参照)。

コマンドラインインターフェース

高度な設定は、コンソールインターフェースのコマンドラインから行う必要があります。このコンソールは、115200 ボーのシリアルポートまたは tcp ポート 7777(例: 接続された STA からの "telnet 192.168.4.1 7777")を介して利用できます。

初期設定には次のコマンドを使用します:

  • set ssid your_home_router's_SSID
  • set password your_home_router's_password
  • set ap_ssid ESP's_ssid
  • set ap_password ESP's_password
  • show (パラメータを確認するため)
  • save
  • reset

繰り返しますが、非 ASCII 文字や特殊文字を入力したい場合は、HTTP スタイルの 16 進エンコーディング(例: "My%20AccessPoint")を使用するか、CLI のみのショートカットとしてバックスラッシュ付きの C スタイル引用符(例: "My\ AccessPoint")を使用できます。どちらの方法でも文字列 "My AccessPoint" になります。

コマンドラインはさらに多くのコマンドを理解します:

基本コマンド

ほぼすべての環境で動作させるのに十分です。

  • help: 短いヘルプメッセージを表示します
  • set [ssid|password] value: アップリンク AP の設定を変更します(ホームルーターの WiFi 設定)。オープンネットワークではパスワード "none" を使用します。
  • set [ap_ssid|ap_password] value: ESP のソフトAPの設定を変更します(ステーション用)
  • show [config|stats]: 現在の設定、またはいくつかのステータス情報と統計を表示します
  • save [dhcp]: 現在の設定パラメータ、ACL、ルーティングエントリ [+ 現在の DHCP リース] をフラッシュに保存します
  • lock [password]: 現在の設定を保存してロックします。変更は許可されません。以前に設定されている場合はパスワードを省略できます(デフォルトはアップリンク WiFi のパスワード)
  • unlock password: 設定のロックを解除します。lock コマンドのパスワードが必要です
  • reset [factory]: esp をリセットします。'factory' はオプションで WiFi パラメータをデフォルト値にリセットします(ロックされたデバイスではシリアルコンソールからのみ動作します)
  • quit: リモートセッションを終了します

高度なコマンド

ほとんどの set コマンドは、save と reset の後にのみ有効になります。

コマンドライン入力の "単一の #" 以降、行末まではコメントとして扱われ、無視されます。

Automesh Config

  • set automesh [0|1]: automesh モードをオンにするかオフにするかを選択します(デフォルトはオフ)。詳細は https://github.com/martin-ger/esp_wifi_repeater#automesh-mode を参照
  • set am_threshold dB: "悪い" 接続とみなすしきい値を設定します(負の dB で指定、デフォルト 85、すなわち -85 dB)
  • set am_scan_time secs: automesh モードで ESP がスリープする前にアップリンク AP を探す時間間隔を秒単位で設定します(0 は無効、デフォルト)
  • set am_sleep_time secs: アップリンク AP が見つからない場合に automesh モードで ESP がスリープする時間間隔を秒単位で設定します(0 は無効、デフォルト)

WiFi Config

  • set ap_on [0|1]: ソフトAPを無効にするか (ap_on=0)、有効にするかを選択します (ap_on=1、デフォルト)
  • set ap_open [0|1]: ソフトAPが WPA2-PSK セキュリティを使用するか (ap_open=0、ap_password が設定されている場合は自動)、オープンにするかを選択します (ap_open=1)
  • set auto_connect [0|1]: STA が AP への再接続を試み続けるかどうかを選択します。auto_connect は最初のフラッシュ後または "reset factory" 後はオフ (0) です。新しい SSID を入力すると自動的にオン (1) になります。
  • set ssid_hidden [0|1]: ソフトAPの SSID を非表示にするか (ssid_hidden=1)、表示するかを選択します (ssid_hidden=0、デフォルト)
  • set phy_mode [1|2|3]: WiFi の PHY_MODE を設定します (1=b、2=g、3=n(デフォルト))
  • set country CC: WiFi の電波規制国コードを 2 文字の ISO 3166-1 コードで設定します (例: "US"、"DE"、"CN"、"JP")。米国以外のコードはチャンネル 12 と 13 を解放します。空 (デフォルト) の場合は SDK デフォルトを変更しません。この設定はフラッシュに保存され、起動のたびに再適用されます。
  • set bssid xx:xx:xx:xx:xx:xx: 接続先のアップリンク AP の特定の BSSID を設定します (デフォルト 00:00:00:00:00:00 は任意を意味します)
  • set [ap_mac|sta_mac] xx:xx:xx:xx:xx:xx: STA および SOFTAP の MAC アドレスをユーザー定義の値に設定します (MAC アドレスの最初のバイトのビット 0 を 1 にすることはできません)
  • set sta_mac random: 再起動のたびに新しいランダムな STA MAC を設定します
  • set sta_hostname name: STA の名前を設定します (アップリンク AP に表示されます)
  • set max_clients [1-8]: SoftAP に接続できる STA の数を設定します (ESP の SoftAP 実装の制限は 8、デフォルト)
  • scan: AP のスキャンを実行します
  • connect: 現在設定されている ssid と password で AP への接続を試みます
  • disconnect: アップリンク AP から切断します

WPA2 Enterprise Config

  • set use_peap[0|1]: STA が単純な WPA-PSK で接続するか (use_peap=0、デフォルト)、WPA2 Enterprise (PEAP) を使用するかを選択します
  • set peap_identity value: PEAP の '外部' ID を設定します (最初に RADIUS サーバーに提示される文字列。[email protected] など)
  • peap_username value: PEAP ユーザー名を設定します
  • peap_password value: PEAP パスワードを設定します

TCP/IP Config

  • set network ip-addr: 内部ネットワークの IP アドレスを設定します。ネットワークは常に /24、ルーターは常に x.x.x.1 です
  • set dns dns-addr: DHCP 経由でクライアントに配布される静的 DNS アドレスを設定します
  • set dns dhcp: DHCP からの動的 DNS アドレスの使用を設定します(デフォルト)
  • set ip ip-addr: STA インターフェースに静的 IP アドレスを設定します
  • set ip dhcp: STA インターフェースに動的 IP アドレスを設定します(デフォルト)
  • set netmask netmask: STA インターフェースに静的ネットマスクを設定します
  • set gw gw-addr: STA インターフェースに静的ゲートウェイアドレスを設定します
  • set max_nat no_of_entries: NAPT テーブルのサイズを設定します(デフォルト 512)
  • set max_portmap no_of_entries: portmap テーブルのサイズを設定します(デフォルト 32)
  • set tcp_timeout secs: TCP 接続の NAPT タイムアウトを設定します(0=デフォルト(1800 秒))
  • set udp_timeout secs: UDP 接続の NAPT タイムアウトを設定します(0=デフォルト(2 秒))
  • set lease min: 内部ネットワーク DHCP サーバーのリース時間を分単位で設定します(デフォルト 120)
  • show dhcp: dhcp リーステーブルの現在のステータスを表示します

Routing

  • show route: 現在のルーティングテーブルを表示します
  • route clear: すべての静的ルートをクリアします
  • route add network gw: ゲートウェイ gw を介してネットワークへの静的ルートを追加します(ネットワークは CIDR 表記('x.x.x.x/n')で指定)
  • route delete network: ネットワークへの静的ルートを削除します
  • interface inX [up|down]: インターフェースの状態を up または down に設定します(down のインターフェースを介した IP ルーティング/トラフィックはありません。デフォルト: up)
  • set nat [0|1]: ソフトAPインターフェースを NAT するか (nat=1、デフォルト)、しないか (nat=0) を選択します。NAT なしでは、内部 STA からのトラフィックの透過転送は機能しません! 主に静的ルーティングと組み合わせて有用です。
  • portmap add [TCP|UDP] external_port internal_ip internal_port: ポートフォワーディングを追加します
  • portmap remove [TCP|UDP] external_port: ポートフォワーディングを削除します
  • nslookup name: 指定された名前の DNS ルックアップを開始し、結果を表示します
  • ping host: ICMP エコー要求/応答で IP 接続を確認します(ホストは IP アドレスまたは DNS 名)

Firewall/Monitor Config

  • acl [from_sta|to_sta|from_ap|to_ap] [TCP|UDP|IP] src-ip [src_port] desr-ip [dest_port] [allow|deny|allow_monitor|deny_monitor]: ACL に新しいルールを追加します
  • acl [from_sta|to_sta|from_ap|to_ap] clear: ACL 全体をクリアします
  • show acl: 定義された ACL と一部の統計を表示します
  • set acl_debug [0|1]: ACL デバッグ出力をオン/オフにします - 拒否されたすべてのパケットが端末にログ記録されます
  • set [upstream_kbps|downstream_kbps] bitrate: 最大アップストリーム/ダウンストリームビットレートを設定します(0 = 制限なし、デフォルト)
  • set daily_limit limit_in_KB: STA が 1 日に転送できる最大キロバイト数を定義します(0 = 制限なし、デフォルト)
  • set timezone hours_offset: ローカルタイムゾーンを定義します(00:00 に 1 日が終わることを知るために必要)
  • monitor [on|off|acl] port: 指定されたポートでモニターサーバーを開始および停止します

User Interface Config

  • set config_port portno: コンソールログインのポート番号を設定します(デフォルトは 7777、0 はリモートコンソール設定を無効にします)
  • set web_port portno: Web 設定サーバーのポート番号を設定します(デフォルトは 80、0 は Web 設定を無効にします)
  • set config_access mode: コンソールと Web の設定アクセスを許可するネットワークを制御します(0: アクセス不可、1: 内部のみ、2: 外部のみ、3: 両方(デフォルト))

GPIO Config

  • show gpio: gpio 設定を表示します
  • gpio [0-16] mode [in|in_pullup|out]: ESP の GPIO ポートを設定します(フラッシュに保存されます)
  • gpio [0-16] set [high|low]: 出力ポートに書き込みます
  • gpio [0-16] set [high|low] for seconds: 出力ポートに書き込み、一定時間後に元に戻します
  • gpio [0-16] get: 入力ポートから読み取ります
  • gpio [0-16] trigger [0-16] [monostable_NO|monostable_NC|bistable_NO|bistable_NC]: 入力ポートを出力ポートにリンクします。モノステーブルノーマルオープン(状態が low に変わるとプッシュボタンがトリガー)、モノステーブルノーマルクローズ(状態が high に変わるとプッシュボタンがトリガー)、バイステーブルノーマルオープン(入力を複製するスイッチ)、またはバイステーブルノーマルクローズ(状態が入力の逆になるスイッチ)のいずれかとして
  • gpio [0-16] trigger none: リンクをクリアします

Chip Config

  • set speed [80|160]: CPU クロック周波数を設定します(デフォルト 160 MHz)
  • sleep seconds: ESP を指定した秒数だけディープスリープにします。有効な値は 1 から 4294(約 71 分)
  • set status_led GPIOno: ステータス LED 用の GPIO ピンを選択します(デフォルト 2、>16 で無効)
  • set hw_reset GPIOno: ハードウェアファクトリーリセット用の GPIO ピンを選択します(>16 で無効、デフォルト)
  • set ap_watchdog secs: AP ウォッチドッグタイムアウトを設定します - アップリンク AP から secs の間パケットを受信しない場合、リピーターはリセットします("none" = タイムアウトなし、デフォルト)
  • set client_watchdog secs: クライアントウォッチドッグタイムアウトを設定します - 接続されたクライアントから secs の間パケットを受信しない場合、リピーターはリセットします("none" = タイムアウトなし、デフォルト)
  • set vmin voltage: 最小バッテリー電圧を mV で設定します。Vdd がこれを下回ると、ESP はディープスリープに入ります。0 の場合は何も起こりません
  • set vmin_sleep secs: 低電圧時に ESP がスリープする時間間隔を秒単位で設定します

ステータス LED

デフォルト設定では、GPIO2 がステータス LED(GND に接続)を駆動するように設定されており、次の表示が行われます:

  • 常時点灯: 起動したが、AP に正常に接続されていない(有効な外部 IP がない)
  • 点滅(毎秒 1 回): 動作中、AP に接続済み
  • 不定期に点滅: 動作中、内部ネットワークにトラフィックあり

"set status_led GPIOno" で GPIO ピンを変更できます(16 より大きい任意の値、例: "set status_led 255" でステータス LED を完全に無効化)。GPIO1 に設定すると、ESP-01 ボードの内蔵青 LED で動作します。ただし、GPIO1 は UART-TX ピンでもあるため、シリアルコンソールが機能しなくなります。その場合、設定はネットワークアクセスのみに制限されます。

HWファクトリーリセット

選択した GPIO を 3 秒以上 Low にすると、リピーターはファクトリーリセットを実行し、デフォルト設定で再起動します。"set hw_reset GPIOno" で GPIO ピンを変更できます(16 より大きい任意の値、例: "set hw_reset 255" で HW ファクトリーリセット機能を無効化)。

ESP-01s や NodeMCU を含む多くのモジュールでは、GPIO 0 はすでに使用されているため、それを使用するのがおそらく良い考えです。ただし、フラッシュ中に Low に引っ張ることと干渉する可能性があるため、デフォルトのピンではありません。したがって、GPIO 0 の既存のプッシュボタンを HW ファクトリーリセットに使用したい場合は、フラッシュ後に "set hw_reset 0" と "save" で設定してください。HW ピンによってトリガーされたファクトリーリセットは、設定された hw_reset GPIO 番号をリセットしません(コンソールからの "reset factory" はリセットします)。

ポートマッピング

外部ネットワークのクライアントが内部ネットワークのサーバーポートに接続できるようにするには、ポートをマッピングする必要があります。外部ポートは、特定の内部 IP アドレスの内部ポートにマッピングされます。これには "portmap add" コマンドを使用します。ポートマッピングは "show" コマンドで一覧表示でき、現在の設定とともに保存されます。

ただし、期待するデバイスが特定の IP アドレスで待ち受けていることを確認するには、そのデバイスまたは ESP が再起動されたときに、そのデバイスが同じ IP アドレスを持つことを保証する必要があります。これを実現するには、デバイスに固定 IP アドレスを設定するか、ESP が DHCP リースを記憶する必要があります。これは "save dhcp" コマンドで実現できます。現在の状態とすべての DHCP リースを保存するため、再起動後に復元されます。DHCP リースは "show stats" コマンドで一覧表示できます。

WPA2 Enterprise (PEAP)

WPA2 Enterprise (PEAP) サポートがプロジェクトに含まれました。これにより、PEAP 認証を使用する WPA2 Enterprise ネットワークを WPA2-PSK ネットワークに変換する「コンバーター」が可能になります。これは特に大学環境でよくある問題を解決します: ローカル WiFi ネットワークが PEAP-MSCHAPv2 認証を使用する WPA2 Enterprise ネットワークである場合です。非常に顕著な例は、世界中の多くの大学で利用可能な "eduroam" ネットワークです。問題は、多くの IoT デバイスが WPA2 Enterprise 認証を処理できないことです。そのため、開発やデモが困難です。非常に役立つのは、WPA2 Enterprise ネットワークにログインし、クライアントにより単純な WPA-PSK ネットワークを提供する「コンバーター」です。

使用するには、次の設定パラメータを設定してください: ssid、use_peap、peap_identity、peap_username、peap_password(通常の password パラメータは不要です)。この設定は CLI を介して行う(および保存する)必要があり、Web インターフェースでは利用できません。

現在のコードは RADIUS サーバーの証明書をチェックしません。誰かが不正な AP と RADIUS サーバーを設置した場合、MITM 攻撃に対して脆弱です。パスワードは平文で送信されませんが、使用される MSCHAPv2 は破られていることが知られています。また、ESP8266 には現在、あなたの Enterprise ネットワークパスワードが含まれていることに注意してください。ESP8266 によって転送されるすべてのトラフィックは、ネットワーク管理者によってあなたのアカウントに関連付けられる可能性があります。悪用したり、信頼できない他人に提供したりしないでください(例: オープンネットワークを設定すること)。また、デバイスがロックされていても、Enterprise ネットワークパスワードはシリアルポートを介して ESP のフラッシュから平文で抽出できます。

Automesh モード

より長い距離や広いエリアをカバーするために、複数の esp_wifi_repeater を直列またはメッシュ構成で使用したい場合があるかもしれません。一般に、これは NAT ルーターで問題なく実行できます。実際には複数の NAT レイヤーが存在することになります。しかし、これは接続性が制限されることを意味します: すべてのノードはインターネットと通信できますが、一般にノード間の直接 IP 接続はありません。そしてもちろん、ホップ数が増えるほど利用可能な帯域幅は低下します。しかし、5 台の esp_wifi_repeater を直列にしても十分に動作するというユーザーレポートがあります。

このようなセットアップでは、設定は非常に時間がかかり、エラーが発生しやすい作業です。それを簡素化するために、esp_wifi_repeater に新しいモード「Automesh」が追加されました。SSID とパスワードを設定し、"automesh" をオンにするだけです(CLI で "set automesh 1" を使用するか、Web インターフェースでチェックボックスを選択するだけです)。これにより、次のことが行われます:このように設定された各esp_wifi_repeaterは、接続先と同じSSID/パスワードを持つWiFiネットワークをAP上で自動的に提供します。クライアントは、元のネットワークとリピートされたネットワークの両方で同じWiFi設定を使用できます。"automesh"で設定された各esp_wifi_repeaterは、まず接続先として最適な他のAPを探します。それは、元のWiFiネットワークに最も近く、信号強度(RSSI)が最も良いAPです。

信号強度はスキャンで簡単に測定できますが、同じSSIDを持つAPが複数見える場合、どれが元のWiFiネットワークに最も近いのでしょうか?そのため、このプロトコルはやや汚いトリックを使用します:"automesh"モードのesp_wifi_repeaterは、自身のBSSID(実際にはIEEE 802.11規格によればAPであるためこれは"ESSID"ですが、SDKはこれを"BSSID"と呼びます)、つまりAPインターフェースのMACアドレスを操作します。これは、毎秒約10回送信されるすべてのビーコンフレームに含まれます。この形式は、24:24:mm:rr:rr:rr です。"24:24"はリピーターの一意の識別子にすぎません(これが実際のAPのMACと衝突する可能性はわずかにありますが、本当に必要な場合はこのプレフィックスを変更できるため無視できます)。"mm"は"メッシュレベル"、つまり元のWiFiネットワークまでのホップ数を意味します。最後の3つの"rr:rr:rr"は、さまざまなESPを区別するための単なるランダムな数字です。元のAPは自身のBSSIDを維持します。つまり、"24:24"というプレフィックスがないものがルートとして認識され、メッシュレベル0と呼ばれます。

これで、各esp_wifi_repeaterは、どの他のesp_wifi_repeaterが元のWiFiネットワークに最も近いかを学習し、それに接続して、自身のBSSIDをそれに応じて選択できます。また、内部ネットワークのIPアドレスもメッシュレベルに合わせて調整されます:10.24.m.0。これにより、元のWiFi APをルートとし、複数のメッシュレベルでリピートノードを持つツリー(非常に特殊なメッシュ)が作成されます(実際には、リンク層のスパニングツリープロトコル(STP)や、ネットワーク層の距離ベクトルプロトコルを使用したルーティングと似た動作をします)。アップリンクのリンク損失が検出されるとすぐに、設定が再起動されます。これにより、ループを回避できます。(再)設定中は、BSSIDを含むビーコンも送信されないためです。

利便性のため、"automesh"設定後のesp_wifi_repeaterは、最初にアップリンクAPに接続できるかどうかを確認します。これが失敗した場合、正しいSSIDのAPが見つかったとしても、ユーザーがパスワードを間違えたと判断し、工場出荷時設定にリセットします。一度接続に成功した後は、設定が正しいと見なし、接続が失われたりリセットされたりした後も、接続できるまで試行し続けます(誤って設定されたAPによるDoS攻撃を回避するためです)。

Automeshのチューニング

範囲内に複数のESPがある場合、短い"悪い"パスと長い"良い"パス(リンク品質の点での良し悪し)の間にトレードオフが存在する可能性があります。パラメータ am_threshold は、どのような接続が悪いかを決定します:スキャンでのRSSIがこのしきい値未満の場合、その接続は悪く、1ホップ多いパスが優先されます。つまり、am_threshold が85で、スキャンで2つのautomeshノードが検出されたとします:レベル1でRSSI -88 dBのAと、レベル2でRSSI -60 dBのBです。この場合、Aへのリンクはあまりに悪い(-88 dB < -am_threshold)と見なされ、Bが優先されます。新しいノードは、Bを経由するアップリンクを持つレベル3ノードになります。am_threshold は正の値で指定されますが、負のdBを意味します。値が小さいほど良好です。

automeshネットワークのトポロジーをより詳しく知りたい場合は、すべてのノードをMQTTブローカーに接続し、"Topology"トピックをパブリッシュさせることを検討するとよいでしょう(下記参照)。ここで "/WiFi/+/system/Topology" を購読すると、メッシュ内の弱いリンクを検出し、完全なグラフを再構築するために必要な、すべてのノードとリンク情報(接続されたESPのRSSIを含む)を取得できます。TopologyInfoトピックには、次のJSON構造が含まれており、automeshネットワークの完全なグラフを再構築するために使用できます:``` { "nodeinfo" { "id":"ESP_07e37e", "ap_mac":"24:24:01:72:c7:f9", "sta_mac":"60:01:bc:07:e3:7e", "uplink_bssid":"00:1a:54:93:23:0a", "ap_ip":"10.24.1.1", "sta_ip":"192.168.178.33", "rssi":"-66", "mesh_level":"1", "no_stas":"2" }, "stas":[ {"mac":"5c:cf:45:11:7f:13","ip":"10.24.1.2"}, {"mac":"00:14:22:76:99:c5","ip":"10.24.1.3"} ] }

root@kitploit:~
_am_scan_time_ と _am_sleep_time_ の2つのパラメータを使用することで、GPIO16をRSTに接続している場合、automeshモードで電源管理を実装できます。起動後、esp_wifi_repeater は _am_scan_time_ 秒間、利用可能なアップリンクAPをスキャンします。見つからない場合は _am_sleep_time_ 秒間ディープスリープし、再起動後に再試行します(デフォルトは0 = 両パラメータ無効)。

# モニタリング
コンソールからモニタサービスを開始できます("monitor on [portno]")。このサービスは内部ネットワークのトラフィックをpcap形式でTCPストリームにミラーリングします。例えば、外部ネットワークのコンピュータから "netcat [external_ip_of_the_repeater] [portno] | sudo wireshark -k -S -i -" を使用すると、内部ネットワークのトラフィックをリアルタイムで観測できます。例えば、内部クライアントがどのインターネットサイトと通信しているかを観測するために使用します。これによりESPとWiFiネットワークにかかる負荷が少なくとも2倍になることに注意してください。高負荷時には、モニタセッションで一部のパケットが途中で切れたり、ドロップされたりする可能性があります。注意: このポートを開いたままにすることは潜在的なセキュリティ問題です。ローカルネットワーク内の誰でも接続してトラフィックを観測できます。

# ファイアウォール
ESPルーターには基本的なファイアウォールが統合されています。ACL(アクセス制御リスト)をSoftAPインターフェースに適用できます。これは、ルーターを使用して他のIoTデバイスをインターネットに接続する場合、IoTセキュリティの要となります。例えば、サードパーティのIoTデバイスが "calling home" を行ったり、マルウェアボットとして悪用されたりするのを防ぎ、PC、タブレット、スマートフォンを含むホームネットワークをホームオートメーションデバイスから見えないように保護するために使用できます。

4つのACLリストは、"from_sta"、"to_sta"、"from_ap"、"to_ap" と名付けられており、両方のインターフェースの受信パケットと送信パケットを対象としています("sta" は接続されたクライアントへのインターフェース、"ap" はアップリンクAPへのインターフェースを意味します)。ACLは "CISCO IOS スタイル" で定義されます。

次の例はゲストサブネットに役立ちます。インターネットへのアクセスを許可しますが、他のローカルアドレスへのアクセスは許可しません(xx.xx.xx.xx アドレスにはご自身のローカルネットワーク範囲を使用してください)。このルールセットは、送信ローカルブロードキャスト(DHCP用)とUDP 53(DNS)を許可し、上流ルーターのサブネット宛ての他のパケットはすべてブロックし、その他のパケットはすべてインターネットに通過させます:```
acl from_sta clear
acl from_sta IP any 255.255.255.255 allow
acl from_sta UDP any any any 53 allow
acl from_sta IP any xx.xx.xx.xx/24 deny
acl from_sta IP any any allow

次の例はより制限的で、ESPのAPでアクセスが非常に制限されたIoTサブネットを計画する場合に役立ちます。また、送信方向のローカルブロードキャスト(DHCP用)、UDP 53(DNS)、およびローカルブローカーへのTCP 1883(MQTT)を許可しますが、その他のパケットはすべてブロックされ、任意のインターネットアクセスも含まれます(必要に応じて4番目のステートメントを調整して、他のホストを有効にすることができます):``` acl from_sta clear acl from_sta IP any 255.255.255.255 allow acl from_sta UDP any any any 53 allow acl from_sta TCP any any 192.168.0.0/16 1883 allow acl from_sta IP any any deny

root@kitploit:~
"to_sta" 方向の ACL も定義できますが、通常は不要です。逆方向は NAT 変換によって、要求されていないトラフィックから十分に保護されているためです。

ACL は、各パケットに対して処理されるフィルタリングルールで構成されます。各ルールは、プロトコル(IP、TCP、または UDP)、送信元アドレス/ポート、宛先アドレス/ポート、およびアクション "allow" または "deny" で構成されます。プレーン IP の場合はポートはなく、アドレスのみが指定されます。IP ルールには TCP パケットと UDP パケットが含まれます。アドレスは "/" 表記のサブネットアドレスとして指定できます(例: 192.168.178.0/24)。また、"any" をワイルドカードとして使用でき、任意のアドレスまたはポート番号に一致します。ルールは "acl" コマンドで定義されます:

- acl [from_sta|to_sta|from_ap|to_ap] [TCP|UDP|IP] _src-ip_ [_src_port_] _desr-ip_ [_dest_port_] [allow|deny|allow_monitor|deny_monitor]

ルールは、リストに現れる順序で上から下へ処理されます。パケットに一致する最初のルールが適用され、そのパケットが許可(転送)されるか、拒否(ドロップ)されるかが決定されます。つまり、特殊なケースを先に、一般的なルールを最後に置きます。ACL にルールがある場合、どのルールにも一致しないすべてのパケットはデフォルトで拒否されます。したがって、上記の例の最後のルール "from_sta IP any any deny" は、そもそもデフォルトであるため、実際には必要ありません。ACL が空の場合、すべてのパケットが許可されます。

ACL ルールの定義も上から下への順序で行われます。新しいルールは常にリストの最後に追加されます。ACL を変更するには、まず完全にクリアして (acl from_sta clear) から再構築する必要があります。ACL は設定と共に保存されます。"show acl" を実行すると、各ルールのヒット数と、許可および拒否されたパケットの総数の統計とともに ACL が表示されます。

"set acl_debug 1" コマンドを使用すると、拒否されたすべてのパケットのサマリーがコンソールに出力されます。また、MQTT トピックでこのサマリーを公開することもできます。これはファイアウォール構成に使用でき、接続されたデバイスを機能させるために必要なルールを判断するのに役立ちます。また、予期しないトラフィックが発生した場合(そして拒否された場合)の手がかりにもなります。

より深い分析には、モニタリングサービスを使用できます(拒否されたパケットも、ドロップされる前にモニタに報告されます)。"monitor acl _port_" コマンドでモニタを開始すると、ACL をオンラインフィルタとして使用できます。"allow" の代わりに "allow_monitor"、および "deny" の代わりに "deny_monitor" として定義されたすべてのルールは、
通常どおり処理され、パケットの転送を許可しますが、パケットをモニタにも送信します。したがって、基本的にすべてのパケットを "allow" または "allow_monitor" するルールのリストも意味があります。キャプチャ時にどのパケットを記録するかを選択するために使用できるからです。例: リスト:```
acl from_sta clear
acl from_sta IP 192.168.0.0/16 any allow_monitor
acl from_sta IP any any allow

acl to_sta clear
acl to_sta IP any 192.168.0.0/16 allow_monitor
cl to_sta IP any any allow

すべてのパケットを許可し、またステーションから192.168.0.0/16(ローカル)サブネットへ、および192.168.0.0/16からステーションへ向かうすべてのパケットを監視用に選択します。もちろん、このようなフィルタはキャプチャ後に完全なモニタリングトレースに対しても適用できますが、何を探しているのかがすでにわかっている場合、これらのオンラインフィルタは監視オーバーヘッドを大幅に削減するのに役立ちます。また、"deny" の代わりに "deny_monitor" を使用するだけで、すべてのdenyファイアウォールルールをデバッグするためにも使用できます。

静的ルート

デフォルトでは、APインターフェースはNATされているため、APに接続されたノードはESPのSTAインターフェースを介して透過的に外部世界にアクセスできます。したがって、本格的なネットワークマニアでない限り、追加の操作は必要ありません。

さらにネットワーク設定に本当に興味がある方のために: このプロジェクトではESPのlwip IPv4スタックが拡張され、静的ルートをサポートしています。"show route" は、接続されたネットワークインターフェース(APおよびSTAインターフェース)へのリンクを含む、既知のすべてのルートをルーティングテーブルに表示します。これら2つのインターフェース間のルーティングは、追加設定なしで動作します。他のネットワークへの追加ルートは、Linuxボックスやルーターで知られている "route add network gateway" コマンドで設定できます。"save" コマンドは、ルーティングテーブルの現在の状態をフラッシュ設定に書き込みます。

静的ルートで何ができるかの簡単な例を次に示します。中央のホームルーターを介してSTAインターフェースで接続された2つのESPというネットワーク構成を考えます:``` | 10.0.1.1 AP-ESP1-STA 192.168.1.10 | <-> |Home Router| <-> | 192.168.1.20 STA-ESP2-AP 10.0.2.1|

root@kitploit:~
各ESPは、そのAPの背後に、異なるネットワークアドレス(10.0.1.0/24 と 10.0.2.0/24)を持つ第2のネットワークを有しています。ESP1 は 192.168.1.20 の ESP2 に ping を送信できますが、10.0.2.1 には ping を送信できません。192.168.1.20 を介して到達できることを知らないためです。これは、2つの静的ルートを追加すると変わります。ESP1 では:```
route add 10.0.2.0/24 192.168.1.20

そしてESP2では:``` route add 10.0.1.0/24 192.168.1.10

root@kitploit:~
これで、ESP1 上の "ping 10.0.2.1" は成功します。これは 192.168.1.20 に送信され、ESP2 によって応答されます。

次に、各ネットワークで追加のクライアントが接続します(アドレス 10.0.1.2 と 10.0.2.2):```
| STA1 10.0.1.2 | <-> | 10.0.1.1 ESP1 192.168.1.10 | <-> |Home Router| <-> | 192.168.1.20 ESP2 10.0.2.1| <-> | STA2 10.0.2.2 |

Now even client STA1 with the local address 10.0.1.2 can ping to STA2 with 10.0.2.2 as it send its request first to its default router ESP1 and this knows, that all packets to a 10.0.2.0/24 address have to be forwarded to 192.168.1.20. There the ESP2 knows how to send it to STA2. Tthe same applies for the reply in the other direction.

これで、ローカルアドレス 10.0.1.2 のクライアント STA1 も、まずデフォルトルーターである ESP1 にリクエストを送信することで、10.0.2.2 の STA2 に ping を送信できます。ESP1 は、10.0.2.0/24 アドレスへのすべてのパケットを 192.168.1.20 に転送する必要があることを認識しています。そこで ESP2 が STA2 への送信方法を把握しています。逆方向の応答についても同様です。

これにより、各 ESP とその STA クライアントが(ポートマップを一切必要とせずに)互いに直接到達できる、ESP のマルチスター型トポロジーを構成できます。必要なルートの設定は多少面倒かもしれませんが、ネットワーキングの良い練習になります。次のステップは、RIP のような動的ルーティングプロトコルを ESP に移植することでしょう...

ビットレート制限

upstream_kbps と downstream_kbps を 0 以外の値に設定すると(デフォルトは 0)、ESP の AP の最大ビットレートを制限できます。この値は、接続されているすべてのクライアントのトラフィックに適用される制限です。定義されたビットレートを超えるパケットはドロップされます。トラフィックシェイパーは「トークンバケット」アルゴリズムを使用しており、バケットサイズは現在、1秒あたりのビットレートの4倍に設定されているため、それまでトラフィックがなかった場合にはバーストが許可されます。

MQTT サポート

バージョン 1.3 以降、ルーターには MQTT クライアントが組み込まれています(彼のライブラリ https://github.com/tuanpmt/esp_mqtt に対する Tuan PM に感謝します)。これにより、ルーター/リピーターを IoT に統合しやすくなります。ホームオートメーションシステムは、例えば、現在関連付けられているステーションの情報に基づいて判断を下したり、リピーターをオン/オフしたり(例えば、時間スケジュールに基づいて)、単に負荷を監視するために使用したりできます。ルーターは、ローカルの MQTT ブローカーまたはクラウド内の公開ブローカーのいずれかに接続できます。ただし、現在 TLS 暗号化には対応していません。

デフォルトでは、MQTT クライアントは無効になっています。設定パラメータ "mqtt_host" を "none" 以外のホスト名に設定することで有効にできます。MQTT を構成するには、次のパラメータを設定できます。

  • set mqtt_host IP_or_hostname: MQTT ブローカーの IP またはホスト名("none" を指定すると MQTT クライアントが無効になります)
  • set mqtt_port port: 接続に使用する MQTT ブローカーのポート(デフォルト: 1883)
  • set mqtt_qos QoS: 公開および購読のための MQTT QoS 値(0〜2、デフォルト: 0)
  • set mqtt_user username: 認証用のユーザー名(ブローカーで認証が不要な場合は "none")
  • set mqtt_password password: 認証用のパスワード
  • set mqtt_id clientId: ブローカーでのクライアント ID(デフォルト: MAC アドレスから派生した "ESPRouter_xxxxxx")
  • set mqtt_prefix prefix_path: 公開されるすべてのトピックのプレフィックス(デフォルト: "/WiFi/ESPRouter_xxxxxx/system"。これも MAC アドレスから派生)
  • set mqtt_command_topic command_topic: コンソールと同じようにコマンドを受け取るために購読するトピック(デフォルト: "/WiFi/ESPRouter_xxxxxx/command"、"none" を指定すると MQTT 経由のコマンドが無効になります)
  • set mqtt_interval secs: ルーターがステータストピックを公開する間隔を設定します(デフォルト: 15秒、0 を指定するとステータス公開が無効になります)
  • set mqtt_mask mask_in_hex: 公開するトピックを選択します(デフォルト: "ffff" はすべてを意味します)

MQTT パラメータは "show mqtt" コマンドで表示できます。

ルーターは次のステータストピックを定期的に(mqtt_interval ごとに)公開できます。

  • prefix_path/Uptime: 最後のリセットからのシステム稼働時間(秒)(マスク: 0x0020)
  • prefix_path/Vdd: 電源の電圧(mV)(マスク: 0x0040)
  • prefix_path/Bpsin: ステーションから AP への KB/秒(マスク: 0x0800)
  • prefix_path/Bpsout: AP からステーションへの KB/秒(マスク: 0x0800)
  • prefix_path/Bpd: ステーションとの間の1日あたりの KB(マスク: 0x0400)
  • prefix_path/Ppsin: ステーションから AP へのパケット/秒(マスク: 0x0200)
  • prefix_path/Ppsout: AP からステーションへのパケット/秒(マスク: 0x0200)
  • prefix_path/Bin: ステーションから AP への合計バイト数(マスク: 0x0100)
  • prefix_path/Bout: AP からステーションへの合計バイト数(マスク: 0x0100)
  • prefix_path/NoStations: 現在 AP に接続されているステーション数(マスク: 0x2000)
  • prefix_path/TopologyInfo: ノードの現在のトポロジー情報を含む JSON 構造体(マスク: 0x1000)

さらに、リピーターはイベントベースで公開できます。

  • prefix_path/join: AP に参加するステーションの MAC アドレス(マスク: 0x0008)
  • prefix_path/leave: AP から離脱するステーションの MAC アドレス(マスク: 0x0010)
  • prefix_path/IP: DHCP 経由で受信したルーターの IP アドレス(マスク: 0x0002)
  • prefix_path/ScanResult: "scan" コマンドの結果用の個別トピック(検出された AP ごとに1つのメッセージ)(マスク: 0x0004)
  • prefix_path/ACLDeny: ACL ルールによってパケットが拒否され、ドロップされたことを示します(マスク: 0x0080)

LWT およびステータスレポートとして、リピーターは次を公開します。

  • prefix_path/status: 保持されるトピックで、"online"(リピーターが接続するとすぐに)または "offline"(接続喪失後の LWT として)のいずれか

ルーターは次のトピックを使用して構成できます。

  • command_topic: ルーターはこのトピックを購読し、すべてのメッセージをコマンドラインとして解釈します
  • prefix_path/response: ルーターはこのトピックにコマンドラインの出力を公開します(マスク: 0x0001)

ルーターに例えば Vdd、その IP、およびコマンドライン出力のみを公開させたい場合は、mqtt_mask を 0x0001 | 0x0002 | 0x0040(= "set mqtt_mask 0043")に設定します。

ENC28J60 イーサネットサポート

esp_wifi_repeater は、SPI 経由で接続された ENC28J60 イーサネット NIC のサポートを追加しました(これを正しく動作させるための素晴らしい仕事をしてくれた Andrew Kroll https://github.com/xxxajk に感謝します)。これは、"user_config.h" で HAVE_ENC28J60 コンパイルオプションを有効にした場合です。イーサネットインターフェースは、ESP が 160 MHz で動作している場合、約 1 Mbps をサポートします。AP インターフェースを有効にしてイーサネットをアップリンクとして使用すると、esp_wifi_repeater は WiFi デバイス(例: 他の ESP)向けの安価な AP になります。

SPI 経由の接続は次のようになります。``` NodeMCU/Wemos ESP8266 ENC28J60

root@kitploit:~
    D6     GPIO12 <---> MISO
    D7     GPIO13 <---> MOSI
    D5     GPIO14 <---> SCLK
    D8     GPIO15 <---> CS
    D1     GPIO5  <---> INT
D2     GPIO4  <---> RESET
           Q3/V33 <---> 3.3V
           GND    <---> GND
root@kitploit:~
短くてはんだ付けされた配線が最適です。さらに、GPIO15をデカップリングするためのトランジスタが必要です。そうしないとESPが起動しなくなります。参照: https://esp8266hints.wordpress.com/category/ethernet/ 。また、良質な電源が重要です: ENC28j60は動作時に約160mAを必要とします。ESPボードの3.3Vを使用しようとすると、私の環境では失敗します。

これで新しいイーサネットインターフェースを設定できます: 
- set eth_enable [0|1]: SPIバス上のENC28J60イーサネットNICを有効/無効にします (デフォルト: 0 - 無効)
- set eth_ip _ip-addr_: ETHインターフェースに静的IPアドレスを設定します
- set eth_netmask _netmask_: ETHインターフェースに静的ネットマスクを設定します
- set eth_gw _gw-addr_: ETHインターフェースに静的ゲートウェイアドレスを設定します
- set eth_dhcpd [0|1]: ETHインターフェース上で動的IPアドレス用のDHCPサーバーを起動します (デフォルト: 0 - 無効)

# 電源管理
リピーターは現在の供給電圧を監視します("show stats"コマンドで表示されます)。これは、esp_init_data_default.binの107番目のバイト(vdd33_constという名前)が255(0xFF)に設定されている場合にのみ機能します。これを実現する最も簡単な方法は、esp_init_data_default_v08_vdd33.binをフラッシュに書き込むことです(下記参照)。

_vmin_ (mV単位、デフォルト0)が0より大きい値に設定され、供給電圧がこの値を下回ると、_vmin_sleep_ 秒間ディープスリープモードに入ります。GPIO16をRSTに接続している場合(ESP-01でははんだ付けが困難です)、この間隔の後に再起動し、再接続を試みて、測定を継続します。_vmin_ が設定とともに保存されている場合、供給電圧がしきい値を上回るまで、繰り返しスリープします。これらの設定は、過放電保護なしの(リチウム)バッテリーでESPに電源を供給している場合に特に(唯一?)役立ちます。その場合、2900mV-3000mVの値がおそらく有用で、ESPの消費電力を最小限に抑え、損傷する前にバッテリーを再充電または交換する時間を大幅に確保できます。これは、ESPをバッテリーに直接接続している場合にのみ意味があります。追加のロジックがある場合、それでもバッテリーは消耗します。

"sleep"コマンドを使用して、ESPを手動で一度スリープさせることができます。

注意: 最大供給電圧より高い _vmin_ 値をフラッシュに保存すると、リピーターは再起動のたびに即座にシャットダウンします。その場合は、blank.bin(または他の任意のファイル)を0x0c000にフラッシュして、設定全体を消去する必要があります。

# WiFiリピーター - L2ブリッジ

このプロジェクトは現在、**NATルーター**と**レイヤー2ブリッジ**("リピーターモード"と呼ばれる)という2つの異なる動作モードを提供しています。両方のモードがネットワークカバレッジを拡張しますが、トラフィックとデバイスIDの処理方法が根本的に異なります。

### NATルーターモード(標準)
このモードでは、上記で説明したように、デバイスは標準ゲートウェイとして動作します。新しいサブネットを作成し、そのアクセスポイント(AP)に接続されたすべてのデバイスに対してネットワークアドレス変換(NAT)を実行します。

*   **サブネットの分離**: 接続されたクライアントはプライベートサブネット(例: 192.168.4.x)上にあり、プライマリネットワークから隔離されます。
*   **トラフィックの識別情報**: クライアントからのすべてのトラフィックは、ESP8266自身のIP/MACアドレスから発信されているようにメインルーターに認識されます。
*   **シンプルさ**: 上流ルーターに特別な設定は不要で、事実上すべての標準Wi-Fiネットワークと互換性があります。
*   **制限事項**: NATバリアのため、ポートマッピングを使用しない限り、プライマリネットワーク上のデバイスはリピーターの背後にあるデバイスへの接続を簡単に開始できません。

### レイヤー2ブリッジモード("リピーター"バリアント)
このモードは、透過的なレイヤー2(データリンク層)ブリッジを実装します。ESP8266は、セカンダリサブネットを作成するのではなく、既存のプライマリネットワークを拡張します。

*   **透過的ブリッジング**: ESP8266はイーサネットフレームレベルでトラフィックをブリッジします。接続されたクライアントは、プライマリネットワークのDHCPサーバーから直接IPアドレスを受け取ります(DHCPスヌーピング/リレー経由)。
*   **統一ネットワーク**: すべてのデバイス(リピーターとメインルーターの両方)は、同じL2ブロードキャストドメイン上に存在します。
*   **デバイスの可視性**: リピーターの背後にあるデバイスは、メインネットワーク上で元のMACおよびIP識別情報を保持します。これにより、ローカル検出プロトコル(mDNS/Bonjour、UPnP、ネットワーク探索など)がネットワーク全体でシームレスに機能します。
*   **複雑さ**: 上流ネットワークがリピーター経由で接続された「隠れた」クライアントにトラフィックを正しくルーティングし返すように、プロキシARPやDHCPスヌーピングなどの高度な処理が必要です。
*   **ユースケース**: ネットワーク全体でのデバイス検出(例: スマホアプリを介したプリンターやスマートホームデバイスの制御)が必要な場合に最適です。

リピーターモードには機能が少なくなっています: ルーティング、ポートマッピング、DHCPは不要で、ACLとAutomeshもあまり意味がなく、pcapによるネットワーク監視も同様です。したがって、これらの機能はすべてリピーターモードでは利用できません。MQTTも削除されています。残りの機能は、コンソールまたはリモートコンソールから引き続き利用できます。

プリコンパイル済みバイナリは "firmware-repeater" フォルダにあります。

リピーターモード版の初回設定は、基本的にNATルーターと同じくらい簡単です。シリアルコンソールからssid、password、ap_ssid、ap_passwordを設定し、保存してリセットするだけです。Webインターフェース経由で行いたい場合も簡単ですが、正しい順序に従う必要があります:

- クライアントで"MyAP" WiFiに接続します
- ブラウザで "http://192.168.4.1" を開きます
- **最初に** AP設定のssidとパスワードを入力し、設定して再起動します
- その後、新しく定義したAPのssidに接続し、ブラウザで再度 "http://192.168.4.1" を開きます
- 次にSTA設定のssidとパスワードを入力して接続します

STAのssidが定義されると、リピーターは独自のDHCPサーバーを実行しなくなり、上流のDHCPからIPアドレスを受け取ります(192.168.4.1ではなくなります)。Webページまたはリモートコンソールに接続するには、クライアントがmDNSをサポートしている場合は "esp-wifi-repeater.local" という名前を使用するか、上流ルーターで割り当てられたアドレスを調べる必要があります(またはシリアルコンソールで "show stats" を使用します)。ESPはコンソールと "reset factory" でいつでもリセットできます。

### 主な相違点のまとめ

| 機能 | NATルーター | レイヤー2ブリッジ |
| :--- | :--- | :--- |
| **ネットワークアーキテクチャ** | 新しい独立したサブネットを作成 | 既存のブロードキャストドメインを拡張 |
| **IPアドレス割り当て** | クライアントはセカンダリプールを使用 | クライアントは上流のDHCPサーバーを使用 |
| **検出 (mDNS/UPnP)** | ブロックまたは困難なことが多い | 完全サポート (透過的) |
| **上流からの可視性** | クライアントIDが隠される (NAT) | クライアントIDが保持される |
| **実装** | 標準的なネットワーキング | 高度なプロキシ処理 (Proxy ARP/スヌーピング) |

# ビルドとフラッシュ
プリコンパイル済みバイナリをデバイスに直接フラッシュするには、[Web-Installer](https://martin-ger.github.io/esp_wifi_repeater/) を使用してください。 

Dockerがインストールされている場合、完全なビルド環境にアクセスする最も簡単な方法は、ESP8266を /dev/ttyUSB0 に接続し、イメージを次のコマンドで実行することです:```
git clone https://github.com/martin-ger/esp_wifi_repeater.git
docker run -it --rm --device=/dev/ttyUSB0 -v $(pwd)/esp_wifi_repeater:/home/esp/esp_wifi_repeater martinfger/iot_devel:1.0
cd esp_wifi_repeater
make
make flash

L2 WiFi リピータ バージョンをビルドするには、make コマンドで VARIANT=bridge オプションを使用するだけです:``` git clone https://github.com/martin-ger/esp_wifi_repeater.git docker run -it --rm --device=/dev/ttyUSB0 -v $(pwd)/esp_wifi_repeater:/home/esp/esp_wifi_repeater martinfger/iot_devel:1.0 cd esp_wifi_repeater make VARIANT=bridge make flash

root@kitploit:~
ビルド環境をゼロから構築し、このバイナリをビルドするには、esp-open-sdk をダウンロードしてインストールしてください(ベースの NONOS SDK 2.2 を同梱したこのバージョンを推奨します: https://github.com/xxxajk/esp-open-sdk)。同梱されている "blinky" サンプルをコンパイルして書き込めることを確認してください。

次に、このソースツリーを別のディレクトリにダウンロードし、Makefile 内の BUILD_AREA 変数と、user/user_config.h 内の任意のオプションを調整します。デフォルト構成の変更は user/config_flash.c で行えます。"make" で esp_wifi_repeater ファームウェアをビルドします。"make flash" で esp8266 に書き込みます。

ソースツリーには、liblwip_open のバイナリ版と、esp-open-lwip の私のフォークから必要な追加インクルード、および rboot ツールのバイナリが含まれています。*そのために追加のインストール作業は不要です。* プリコンパイル済みライブラリを使いたくない場合にのみ、https://github.com/martin-ger/esp-open-lwip からソースをチェックアウトしてください。それを使って esp-open-sdk ツリー内の "esp-open-lwip" ディレクトリを置き換えます。esp_open_lwip ディレクトリで "make clean" を実行し、その上の esp_open_sdk ディレクトリで再度 "make" を実行します。これにより、NAT 機能を含む liblwip_open.a がコンパイルされます。そのバイナリで liblwip_open_napt.a を置き換えてください。また、https://github.com/raburton/rboot から "rboot.bin" バイナリをビルドし、プロジェクトのルートディレクトリに置き換えても構いません。

*更新*: ウェブ上のインストール手順で "0x10000.bin" を使うと書かれているのを読んだ場合 - OTA のため、これは現在 "0x02000.bin" に変更されました。

完全なプリコンパイル済みファームウェアバイナリを使用したい場合は、"esptool.py --port /dev/ttyUSB0 write_flash -fs 4MB -ff 80m -fm dio 0x00000 firmware/0x00000.bin 0x02000 firmware/0x02000.bin" でフラッシュできます(ESP-01 の場合は -fs 1MB を使用)。esp8285 の場合は、-fs 1MB と -fm dout を使用する必要があります。

Windows では、https://espressif.com/en/support/download/other-tools で入手できる "ESP8266 Download Tool" を使用してフラッシュできます。ファームウェアディレクトリから 0x00000.bin と 0x02000.bin の 2 つのファイルをダウンロードします。一般的な ESP12、NodeMCU、Wemos D1 の場合、次の設定を使用します(ESP-01 の場合は FLASH SIZE を "8Mbit" に変更します):

<img src="https://raw.githubusercontent.com/martin-ger/esp_wifi_repeater/master/FlashRepeaterWindows.jpg">

お使いのデバイスで "QIO" モードが失敗する場合は、代わりに "DIO" を試してください。また、"Detected Info" を確認して、フラッシュチップのサイズとモードを確認してください。ダウンロードしたファームウェアがまだ正しく起動しない場合は、同梱のチェックサムでバイナリファイルが破損していないか確認してください。ファームウェアバイナリの破損が疑われる場合は、リポジトリ全体を zip としてダウンロードし、その zip からバイナリを展開してください。これにより、HTTP ダウンロードの問題(CR-LF 変換など)を回避できます。

# OTA(Over the air)アップデート対応

rboot ライブラリを使用した実装に基づいています: https://github.com/raburton/rboot 。christianchristensen の貢献に感謝します。

ビルドプロセスでは、esp_wifi_repeater バイナリのコピーが 2 つ、ファームウェアディレクトリに作成されます: 0x02000.bin と 0x82000.bin です。初期インストールでは、0x00000.bin(rboot ブートローダ)と 0x02000.bin(プログラムの 1 コピー)をフラッシュするだけで問題ありません。esp_wifi_repeater は動作します。

少なくとも 1MB のフラッシュがあれば、別のバージョンで OTA(Over the air)アップデートを行うことができます。つまり、CLI から対話的に新しいバイナリをロードし、それに切り替えることができます。もう一方のバイナリは、現在非アクティブなメモリ位置(0x02000(rom0)または 0x82000(rom1)のどちらか)にロードされ、成功すると起動されます。インストール済みの 2 つのバイナリを対話的に切り替えることもできます。現在の設定は、フォーマットが変更されていない限り、両方のバイナリで使用されます。

OTA 機能は次のコマンドで制御できます: 
- show ota: 現在アクティブなバイナリと次のアップデートの URL を表示します
- set ota_host _hostname_: OTA サーバーのホスト名または IP アドレスを設定します(デフォルト: "none")
- set ota_port _portno_: OTA サーバーのポート番号を設定します(デフォルト: 80)
- ota update: ota_host:ota_port から HTTP 経由で新しいバイナリ(0x02000.bin または 0x82000.bin)のダウンロードを試行し、起動します
- ota switch: もう一方のバイナリに切り替えます(インストールされている場合)

OTA 機能をテストするには、ESP を(STA または AP として)アップデートサーバーと同じネットワークに接続するよう設定します。そこで、ファームウェアディレクトリ内で簡単な Web サーバーを起動します。例:```
cd firmware
python -m SimpleHTTPServer 8080

パラメータ hostname をコンピュータのホスト名またはIPアドレスに設定し、portno を8080に設定して、「保存」します。次にCLIで次のように入力してください:``` ota update

root@kitploit:~
If configured correctly, the update will start and the ESP will reboot with the new binary.

正しく設定されていれば、アップデートが開始され、ESPは新しいバイナリで再起動します。

# Known Issues
# 既知の問題
- Due to the limitations of the ESP's SoftAP implementation, there is a maximum of 8 simultaniously connected stations.
- ESPのSoftAP実装の制限により、同時に接続できるステーションは最大8台です。
- The ESP8266 requires a good power supply as it produces current spikes of up to 170 mA during transmit (typical average consumption is around 70 mA when WiFi is on). Check the power supply first, if your ESP runs unstable and reboots from time to time. A large capacitor between Vdd and Gnd can help if you experience problems here.
- ESP8266は送信中に最大170 mAの電流スパイクを発生させるため、良質な電源が必要です(WiFiがオンのときの典型的な平均消費電流は約70 mAです)。ESPが不安定に動作したり、時々再起動する場合は、まず電源を確認してください。ここで問題が発生する場合は、VddとGndの間に大きなコンデンサを追加すると効果的です。

# Licenses
# ライセンス
The software is open source. Third party source files have their own license header. For all other files the MIT license applies.

本ソフトウェアはオープンソースです。サードパーティのソースファイルにはそれぞれ独自のライセンスヘッダーがあります。その他のファイルにはMITライセンスが適用されます。
ツールをダウンロード