私のインターネット一時停止ボタンの中心は 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 はパワーが多すぎるので、莫大なお金の無駄になります。 このプロジェクトのために購入しないでください。
ブランド
ラズベリーパイ
CPU
クアッドコア 64 ビット ARM Cortex-A53
メモリ
512MBのSDRAM
Raspberry Pi Zero 2 W は超小型で非常に手頃な価格ですが、さまざまな DIY プロジェクトに十分なコンピューティング能力を備えています。これを使用して、Klipper/Mainsail 用のハンドヘルド レトロ ゲーム コンソール、超コンパクトなホーム サーバーやメディア サーバーなどを作成できます。
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()
LED を追加する場合は、直列に接続された抵抗を使用してスクリプトで指定した GPIO に LED を接続し、LED が適切な電圧を取得できるようにします。必要な抵抗の種類は、使用する特定の LED によって異なります。実際にライトをオーバードライブしないようにするには、ドキュメントを再確認して適切な抵抗を見つけてください。
ボックス内のインターネットスイッチ
ソフトウェアが作成され、ハードウェアが準備できたら、それを接続し、好みのコンテナに置き、電源を入れるだけです。次に、サービスを実行してスクリプトを起動します。その後、ボタンを押すたびに、Pi ホールはデバイスが行う DNS リクエストをブロックします。
すべてをブロックするわけではありません。ハードコーディングされた IP アドレスを使用して Web にアクセスするものもあります。これらのデバイスをブロックするには、他の手段を講じる必要があります。