🚧

自宅に DNSリゾルバを立てて SNS を強制シャットアウトする方法

に公開

「SNS で時間を溶かしてしまう」という悩み

作業に集中しようと思って PC を開きます。でも気づいたら、SNS のおすすめ動画などに時間を取られてしまったことありませんか?

意志の力で SNS を我慢しようとしても、なかなか続きません。

📝 補足: この記事では SNS を例に説明していますが、この仕組みは SNS に限らず、YouTube、ニュースサイト、ゲームサイトなど、任意のドメインをブロックすることができます。

そこで思いついたのが、ネットワークレベルでブロックするという方法です。この記事の応用編の設定まで行うと、家の Wi-Fi に接続している全てのデバイスで、指定したサイトに一切アクセスできなくすることができます。これなら、スマホでもタブレットでもゲーム機でも、確実にブロックできます。

その仕組みが、自宅 DNS リゾルバです。

DNS リゾルバでサイトをブロックする仕組み

私たちがウェブサイトにアクセスするとき、youtube.comのような「ドメイン名」を入力します。しかし、実際にはインターネット上のサーバーはIP アドレス(例:142.250.196.174)で識別されています。

この「ドメイン名 → IP アドレス」の変換を担当するのがDNS リゾルバです。通常は、プロバイダーや Google が提供する DNS リゾルバを使っていますが、これを自宅に立てた専用の DNS リゾルバに切り替えます。

そして、自宅の DNS リゾルバで「youtube.com は存在しない(0.0.0.0)」と返すように設定すれば、どのデバイスからも YouTube にアクセスできなくなります。

事前準備

必要なもの

  • サーバー用PC
  • スクリプト実行用の Mac または Linux 環境(Windows の場合は WSL2 を使用)

今回は、自宅に眠っていた古いノート PC に Ubuntu をインストールして使用しました。

DNS リゾルバにする PC の IP アドレスを確認

DNS リゾルバにする PC で以下のコマンドを実行して、IP アドレスを確認します:

ip addr show | grep "inet " | grep -v 127.0.0.1

例えば 192.168.1.100 のような IP アドレスが表示されます。この IP アドレスを後で使用します。

セットアップ手順

1. 簡易セットアップスクリプトの準備

Ansible を使った自動化システムを構築しましたが、少し複雑になります。そこで、ここでは簡易セットアップスクリプトを紹介します。

setup_dns_simple.sh を作成します:

#!/bin/bash
# ========================================
# 自宅DNS簡易セットアップスクリプト
# ========================================
#
# 使い方:
#   1. このスクリプトをローカルマシンに保存
#   2. ./setup_dns_simple.sh <DNSリゾルバのIPアドレス>
#
# 例: ./setup_dns_simple.sh 192.168.1.100
#

set -e

# 引数チェック
if [ $# -ne 1 ]; then
    echo "使い方: $0 <DNSリゾルバのIPアドレス>"
    echo "例: $0 192.168.1.100"
    exit 1
fi

DNS_SERVER_IP=$1
echo "セットアップ開始: $DNS_SERVER_IP"

# Step 1: SSH接続確認
if ! ssh -o ConnectTimeout=5 "$DNS_SERVER_IP" "echo 'OK'" > /dev/null 2>&1; then
    echo "エラー: SSH接続失敗"
    exit 1
fi
echo "[1/6] SSH接続確認完了"

# Step 2: dnsmasqのインストール
ssh "$DNS_SERVER_IP" "sudo apt-get update && sudo apt-get install -y dnsmasq" > /dev/null 2>&1
echo "[2/6] dnsmasqインストール完了"

# Step 3: systemd-resolvedの停止とDNS設定(ポート53の競合回避)
ssh "$DNS_SERVER_IP" "sudo systemctl stop systemd-resolved && sudo systemctl disable systemd-resolved" > /dev/null 2>&1
ssh "$DNS_SERVER_IP" "echo 'nameserver 8.8.8.8' | sudo tee /etc/resolv.conf > /dev/null"
echo "[3/6] ポート53解放完了"

# Step 4: dnsmasq基本設定ファイルの作成
ssh "$DNS_SERVER_IP" "sudo tee /etc/dnsmasq.conf > /dev/null" <<EOF
# DNSリゾルバ基本設定
listen-address=$DNS_SERVER_IP,127.0.0.1
bind-interfaces
port=53

# 上流DNSリゾルバ(Google DNS)
server=8.8.8.8
server=8.8.4.4

# キャッシュ設定
cache-size=1000

# ログ設定
log-queries
log-facility=/var/log/dnsmasq.log

# ブラックリスト設定の読み込み
conf-dir=/etc/dnsmasq.d/,*.conf
EOF
echo "[4/6] DNS基本設定完了"

# Step 5: YouTubeブロック設定の作成
ssh "$DNS_SERVER_IP" "sudo mkdir -p /etc/dnsmasq.d"
ssh "$DNS_SERVER_IP" "sudo tee /etc/dnsmasq.d/blacklist.conf > /dev/null" <<EOF
# YouTube関連ドメインをブロック
address=/youtube.com/0.0.0.0
address=/www.youtube.com/0.0.0.0
address=/m.youtube.com/0.0.0.0
address=/youtu.be/0.0.0.0
address=/youtubei.googleapis.com/0.0.0.0
address=/googlevideo.com/0.0.0.0
EOF
echo "[5/6] YouTubeブロック設定完了"

# Step 6: dnsmasqの再起動と自動起動設定
ssh "$DNS_SERVER_IP" "sudo systemctl restart dnsmasq && sudo systemctl enable dnsmasq" > /dev/null 2>&1
echo "[6/6] DNSリゾルバ起動完了"

# ファイアウォール設定(UFWが有効な場合のみ)
if ssh "$DNS_SERVER_IP" "sudo ufw status 2>/dev/null" | grep -q "Status: active"; then
    ssh "$DNS_SERVER_IP" "sudo ufw allow 53/tcp && sudo ufw allow 53/udp" > /dev/null 2>&1
    echo "[補足] ファイアウォールでポート53を開放しました"
fi

echo ""
echo "=========================================="
echo "セットアップ完了!"
echo "=========================================="
echo ""
echo "動作確認コマンド:"
echo "  dig @$DNS_SERVER_IP google.com      # 通常のサイト"
echo "  dig @$DNS_SERVER_IP youtube.com     # ブロック確認(0.0.0.0が返ればOK)"
echo ""
echo "次のステップ:"
echo "  1. 上記コマンドで動作確認"
echo "  2. デバイスのDNS設定を $DNS_SERVER_IP に変更"
echo "  3. ルーター設定で家全体に適用可能"
echo ""

このスクリプトに実行権限を付与します:

chmod +x setup_dns_simple.sh

2. セットアップの実行

スクリプトを実行するだけで、すべての設定が完了します。

# 例: DNS リゾルバの IP が 192.168.1.100 の場合
./setup_dns_simple.sh 192.168.1.100

実行すると、以下の処理が自動的に行われます:

  1. サーバーへの接続確認
  2. dnsmasq(DNS リゾルバソフトウェア)のインストール
  3. systemd-resolved の停止と DNS 設定(ポート 53 の解放)
  4. DNS 基本設定の作成
  5. SNS ブロック設定の作成(ここでは例として YouTube)
  6. DNS リゾルバの起動と自動起動設定
  7. ファイアウォール設定(必要な場合)

3. 動作確認

セットアップが完了したら、DNS リゾルバが正しく動作しているか確認します。

# 通常のサイト(Google)が引けるか確認
dig @192.168.1.100 google.com

# YouTube がブロックされているか確認(0.0.0.0 が返れば OK)
dig @192.168.1.100 youtube.com

youtube.comの問い合わせで0.0.0.0が返ってくれば、ブロック設定が正しく動作しています。

4. Mac の DNS 設定を変更

まずは自分の Mac だけで試してみます。

# Wi-Fi の DNS を自宅サーバーに変更
sudo networksetup -setdnsservers Wi-Fi 192.168.1.100

# 確認
networksetup -getdnsservers Wi-Fi

これで、自分の Mac からは YouTube にアクセスできなくなります。ブラウザでyoutube.comを開こうとしても、接続エラーが表示されます。

応用編:家族全体にも適用する(ルーター設定)

自分だけで効果を確認できたら、次は自宅のルーターを通る通信全体に適用してみましょう。前述の注意事項を理解した上で、以下の手順で設定します。

⚠️ 家庭のルーターへの設定前に知っておくべき重要なこと

この仕組みを導入すると、影響範囲は家庭のデバイス全てになります。

想像してみてください。子供を持つ父親が、子供たちが YouTube を見続けて宿題をしなかったり、夜遅くまでスマホを触っていたりする状況を回避するためにこのシステムを構築するとします。

そして、ルーター設定で家族全体に適用したある日の夜、事件が起きるかもしれません。

DNS リゾルバが停止したらどうなるでしょうか?

妻がレシピサイトを見ようとしても、子供が学校の課題を調べようとしても接続エラー。オンラインゲームをしようとしても繋がらない。

「なんでネットが使えないの!?」
「今すぐ直して!」

という状況になり得ます。

このシステムを導入するということは、以下の責任を負うということです:

  • DNS リゾルバは 24 時間 365 日稼働させる(停止すると家族全員がインターネットに繋がらなくなる)
  • トラブル時は即座に対応(深夜でも休日でも)

ただし、後述するセカンダリ DNS の設定によって、サーバー停止時のインターネット接続断を回避することは可能です。その場合、サーバー停止中はブロック機能も無効化されるトレードオフがあります。

ルーターの DNS 設定手順

  1. ルーターの管理画面にアクセス(通常 192.168.1.1 など)
  2. DHCP 設定またはLAN 設定を開く
  3. DNS サーバーの項目を探す
  4. プライマリ DNS: 192.168.1.100(自宅 DNS リゾルバ)
  5. セカンダリ DNS: 8.8.8.8(バックアップ用)
  6. 設定を保存して再起動

これで、家族全員のデバイス(スマホ、タブレット、ゲーム機、スマート TV 等)で自動的に 指定したドメイン がブロックされます。

⚠️ セカンダリDNSに関する注意

セカンダリDNSを8.8.8.8などの外部DNSに設定すると、プライマリDNSサーバー(自宅DNSリゾルバ)が応答しない場合にセカンダリが使われます。つまり、自宅DNSリゾルバが停止するとブロックが無効になります。

完全なブロックを維持したい場合は、以下のいずれかを選択してください:

  • セカンダリDNSを設定しない(推奨:サーバー停止時はインターネット全体が使えなくなるため、サーバー管理を徹底する動機になる)
  • 別の自宅DNSリゾルバを用意して冗長化する

ブロック対象の追加方法

他の SNS やサイトもブロックしたい場合、サーバー上の設定ファイルを編集します。

# サーバーに接続
ssh 192.168.1.100

# ブラックリスト設定ファイルを編集
sudo vim /etc/dnsmasq.d/blacklist.conf

以下の形式でドメインを追加します:

# Twitter(X)をブロック
address=/twitter.com/0.0.0.0
address=/x.com/0.0.0.0

# Instagram をブロック
address=/instagram.com/0.0.0.0

# TikTok をブロック
address=/tiktok.com/0.0.0.0

編集後、DNS リゾルバを再起動して設定を反映します:

sudo systemctl restart dnsmasq

この方法の限界とこれから

回避される可能性について

実はこのシステムには弱点があります。

VPN を使うと、DNS リゾルバの設定を無視して外部の DNS リゾルバを使うことができてしまいます。

この問題の根本的な解決には、以下のような対策が必要です:

  • 外部DNS(8.8.8.8等)への直接通信を遮断(ポート53)
  • VPNプロトコル特有のポート(OpenVPN 1194、WireGuard 51820等)をブロック

これらの対策は今回の範囲を超えるため、別の記事で取り上げたいと思います。次回は「VPN 対策編」として、ファイアウォールレベルでの制御方法を紹介する予定です。

まとめ

自宅に DNS リゾルバを立てることで、ネットワークレベルでの SNS ブロック(指定したドメインのブロック)が実現できます。

このシステムの特徴:

  • 古い PC があれば追加費用ゼロ
  • 簡易スクリプトで 10 分程度でセットアップ完了
  • 全デバイスに一括適用可能
  • ブロック対象の追加・削除が簡単

ただし注意点も:

  • サーバー管理者としての責任が伴う
  • VPN などで回避される可能性がある

「SNS をついつい見てしまう」「作業に集中できない」「子どもが特定のサイトを利用するのを制限したい」という悩みを抱えている方は、まずは自分のデバイスだけで試してみることをおすすめします。効果を実感できたら、家族と相談の上、ルーター設定で家全体に適用を検討してみてください。

J-CATテックブログ

Discussion