Raspberry Piをホームネットワークの物理的な「インターネット一時停止ボタン」に変えてみた

in tech

デスクトップ、ラップトップ、電話、そしてインターネットに接続された他のスマートなデバイスの間で、まるで動物園にいるような気分です 常に オンライン。より簡単にログオフするために、ネットワーク上のほぼすべてのデバイスをインターネットから即座に機能的に切断するワンプッシュ インターネット スイッチを構築しました。

すべては、安価な Raspberry Pi、いくつかの既製コンポーネント、およびオープンソース ソフトウェアに依存しています。

インターネット一時停止ボタンの仕組み

予備の Pi、ボタン 1 つ、スクリプトですべてを一度に停止

スタートレック LCARS テーマが適用された Pi-Hole コンテンツ ブロッカー。 クレジット: Patrick Campanale / How-To Geek

私のインターネット一時停止ボタンの中心は Pi-hole です。これは通常、DNS リクエストを選択的にフィルタリングするために使用されます。このフィルターは、マルウェアを配布したり、広告やトラッカーを配信したり、フィッシングで知られる Web サイトをブロックするために使用できます。

ただし、Pi-hole をブロックするように簡単に設定できます。 すべて。 一時停止ボタンは、Pi-hole をすべてブロック状態に移行するように構成するスクリプトをトリガーします。 Pi ホールのあるネットワーク上のすべての DNS リクエストは Pi ホールを通過するため、ネットワーク上のデバイスはインターネット上のどのデバイスにも接続できません。

速くて簡単です。ルーターやモデムへの電力を物理的に切断するのとは異なり、起動時間はかかりません。インターネットのオンとオフを切り替えるには、物理​​的にボタンを押してソフトウェア DNS ルールを更新するのと同じくらいの時間しかかかりません。

DNSブロックには抜け穴がある

DNS ブロックは確実ではありません。ハードコードされた DNS を備えたデバイス、またはハードコードされた IP アドレスを使用するデバイスは、Pi ホールを完全にバイパスできます。これを防ぐには、すべての DNS トラフィックが Pi を通過するようにルーターのファイアウォール ルールを設定する必要があります。さらに、携帯電話接続には何も機能しません。

また、これはデフォルトですべてに影響することを覚えておく必要があります。仕事の会議中にボタンを押すと通話は切断されますが、特定のデバイスが影響を受けないようにする除外を作成できます。最後に、Pi は重要なインフラストラクチャになるため、Pi がロックしたりクラッシュしたりすると、家でインターネットにアクセスできなくなります。回復メモを常に手元に保管し、万が一に備えてルーターの設定でフォールバック DNS を設定する必要があります。

必要な部品

このプロジェクトには特に強力な Pi は必要ありません。GPIO ピンを備えたほぼすべての Pi が機能します。 Pi Zero 2 W で十分です。古い Pi 3 または 4 が手元にある場合は、それらも機能します。 Pi 5 はパワーが多すぎるので、莫大なお金の無駄になります。 このプロジェクトのために購入しないでください。

ラズベリーパイゼロ2W。

ブランド

ラズベリーパイ

CPU

クアッドコア 64 ビット ARM Cortex-A53

メモリ

512MBのSDRAM

Raspberry Pi Zero 2 W は超小型で非常に手頃な価格ですが、さまざまな DIY プロジェクトに十分なコンピューティング能力を備えています。これを使用して、Klipper/Mainsail 用のハンドヘルド レトロ ゲーム コンソール、超コンパクトなホーム サーバーやメディア サーバーなどを作成できます。


それ以外に、モーメンタリー ボタン、数本のワイヤー、および使用したいエンクロージャが必要になります。安価な ABS ボックスを入手することもできますし、3D プリントすることもできます。

視覚的なインジケーターが必要な場合は、LED、抵抗器、少しの追加のワイヤー、およびそれらを接続するためのはんだが必要になります。

また、セットアップの再確認が容易になるため、小さなブレッドボードを強くお勧めします。

Pi インターネット一時停止ボタンの構築

DNSインターネット一時停止ボタンのソフトウェア設定

まず Raspberry Pi OS Lite を Pi にインストールし、起動して実行したら、次のコマンドを使用して Pi-hole をインストールします。

curl -sSL https://install.pi-hole.net | bash

インストールしたら、ルーターの DHCP DNS 設定を Pi の IP アドレスに向けます。すべてが正しく動作していることを確認するために、しばらく実行することをお勧めします 前に ボタンを追加します。

ここで、ボタンを押したときに新しいルールを作成して有効にし、それを無効にするスクリプトが必要になります。 Python は使用するのに適した言語であり、自分で作成したくない場合は、ほとんどの LLM (ローカルのものでも) でこれを行うための簡単なスクリプトを作成できます。結果を再確認してください。正しく動作する前に調整する必要がありました。

import subprocess
import time
import signal
import sys

from gpiozero import Button, LED
from signal import pause

# ---------------------------------------------------------------------------
# Config — GPIO numbers (not physical header).
# ---------------------------------------------------------------------------
BUTTON_GPIO = 17     # put in the GPIO you want to use here
LED_GPIO    = 27     # Put in the LED GPIO you're using here
BOUNCE_S    = 0.2    
REGEX       = ".*"   # blocks all domains 
# ---------------------------------------------------------------------------

led = LED(LED_GPIO) if LED_GPIO is not None else None

killswitch_on = False


def run_pihole(*args) -> None:
    subprocess.run(("pihole", *args), check=False,
                   stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)


def set_killswitch(on: bool) -> None:
    global killswitch_on
    if on:
        run_pihole("--regex", REGEX)             # add the block-all rule
    else:
        run_pihole("--regex", "--delete", REGEX) # remove it
    killswitch_on = on
    if led is not None:
        led.on() if on else led.off()
    mode = "KILLSWITCH ON (all DNS blocked)" if on else "normal mode"
    print(f"(このテーマについてさらに詳しく知りたい方は以下をご覧ください) -> 公式情報はこちら", flush=True)


def toggle() -> None:
    set_killswitch(not killswitch_on)


def shutdown(signum, frame):
    if led is not None:
        led.close()
    sys.exit(0)


def main():
    signal.signal(signal.SIGTERM, shutdown)
    signal.signal(signal.SIGINT, shutdown)

    button = Button(BUTTON_GPIO, pull_up=True, bounce_time=BOUNCE_S)
    button.when_pressed = toggle

    set_killswitch(False)  # known baseline: start OFF
    print(f"Killswitch button ready on GPIO関連情報は以下のリンクからご確認いただけます. Press to toggle.",
          flush=True)
    pause()


if __name__ == "__main__":
    main()

これで、手動でスクリプトを開始するだけになります。 Systemd を使用して、Pi の電源が切れた場合、または何らかの理由でクラッシュした場合に、常に電源をオンにしてスクリプトを再起動するサービスを作成することもできます。私のものは次のようになりました:

(Unit)
Description=Pi-hole kill switch
After=pihole-FTL.service network-online.target
Wants=pihole-FTL.service
 
(Service)
Type=simple
ExecStart=/usr/bin/python3 /opt/pihole-killswitch/pihole_killswitch.py
Restart=on-failure
RestartSec=5
 
(Install)
WantedBy=multi-user.target

ボタンとLEDの配線

使用する必要がある特定のボタンはスクリプトで設定されます。私の場合、GPIO 17 と近くのアースを使用していますが、どれでも機能します。

スイッチの片方の脚を GPIO 17 とアースに接続するだけです。ジャンパー線がある場合は、ブレッドボードで試してみることをお勧めします 前に 何でもはんだ付けします。

LED を追加する場合は、直列に接続された抵抗を使用してスクリプトで指定した GPIO に LED を接続し、LED が適切な電圧を取得できるようにします。必要な抵抗の種類は、使用する特定の LED によって異なります。実際にライトをオーバードライブしないようにするには、ドキュメントを再確認して適切な抵抗を見つけてください。


ボックス内のインターネットスイッチ

ソフトウェアが作成され、ハードウェアが準備できたら、それを接続し、好みのコンテナに置き、電源を入れるだけです。次に、サービスを実行してスクリプトを起動します。その後、ボタンを押すたびに、Pi ホールはデバイスが行う DNS リクエストをブロックします。

すべてをブロックするわけではありません。ハードコーディングされた IP アドレスを使用して Web にアクセスするものもあります。これらのデバイスをブロックするには、他の手段を講じる必要があります。

詳しい情報を見る

詳しい情報を見る

関連記事

前の投稿
Linux デスクトップをサーバーのように管理し始めたら、すべてが簡単になりました
次の投稿
Amazon Fire TV Stickがバッファリングを続ける理由と実際に機能する5つの修正