ラズパイにPi-holeとPiVPNを導入

Raspberry Pi

ラズパイひとつでVPNと広告ブロック

我が家に最初のラズパイがきて約2年。小さくて場所も電気もとらないのにできることは無限大、そんな魅力に取りつかれてテレビチューナーやNASをつくってきました。

録画をNAS(OpenMediaVault)にいれていることもあって外出先から自宅ネットワークにアクセスしたいなんて思うように。数ギガなんてあっという間につかっちゃいますが出張先のホテルからアクセスできるようにしておいても損はしないでしょう。個人事業や一人株式会社の人なら出先からでも家のネットワークにアクセスできるメリット大きいかと。

今回は余ってたラズパイ3、デスクトップは不要なのでRaspberry pi OS Lite 32bitを使用しています。SSH接続できればokです。

Pi-holeのインストール

まずは広告ブロックのほうからインストールしていきます。VPNでラズパイを常時ONで運用するならついでにいれて損はしません。

SSH接続で以下のコマンドを実行しておきます。

//最初のおまじない
$ sudo apt update
$ sudo apt full-upgrade -y
//タイムゾーンの設定
$ sudo timedatectl set-timezone Asia/Tokyo
// 自分用、まとめて実行
$ sudo apt update && sudo apt full-upgrade -y && sudo timedatectl set-timezone Asia/Tokyo

アップデートが終わったらPi-holeをインストールします。

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

たったこれだけ。コマンドラインは慣れるとホント楽です。後は聞かれる質問に答えていくだけ。最初に聞かれるeth0とwlan0は有線か無線のどちらを用いるかです。スペースで*を動かしてからContinueを選択してください。

固定IPの設定はお使いのルーターを確認ください。たいていは192.168.0.1か192.168.1.1でアクセスできます。参考までに我が家のTP-Linkでは詳細設定 ⇒ ネットワーク ⇒ DHCPサーバー ⇒ アドレス予約から固定できます。

そのまま聞かれるがままにYesやContinue、Googleを選択します。最後の画面でパスワードが表示されますがコマンドラインにも残っているので消しちゃってもご安心を。

これでインストール完了です。画像の例だと、ブラウザからhttp://192.168.0.123/adminにアクセスするとWebUIが開けます。

Pi-holeの設定

ブラックリストを設定しないと機能しないので設定していきます。頭のいい人がGitHubで簡単にインストールできるパッケージを公開しているのでコマンド実行するだけです。

//クリーンインストールなのでpip3コマンドを使えるようにする
$ sudo apt install python3-pip -y
//リストツールの更新とインストール
$ sudo pip3 install pihole5-list-tool --upgrade
$ sudo pihole5-list-tool

こちらも聞かれるがままに進めます。Manage Blacklists ⇒ Add a listと進むと以下の3つから選んでねと聞かれます。

  1. Firebog | Non-crossed lists : Use when someone is usually around to allow
    falsely blocked sites
  2. Firebog | Ticked lists : Use where no one will be allowing falsely
    blocked sites
  3. Firebog | All lists : Use when someone will always be around to
    allow falsely blocked sites

簡単に言うと、

  1. 間違ってブロックするサイトあるかもしれないけど許してくれるならコレ。47リスト。
  2. ブロックする必要がないサイトをブロックしたらすごい怒られるならコレ。32リスト。
  3. 間違ってもいいから徹底的に広告ブロックしたいならコレ。55リスト。

おすすめは2番。これで十分機能します。

もうひとつ、完ぺきにブロックできるわけではないのですがYouTubeの公告対策もしておきます。使った感じあまり変わらないかな~って印象です。こちらも頭のいい人がパッケージを配布してくれているので使わせてもらいます。

$ git clone https://github.com/kboghdady/youTube_ads_4_pi-hole.git
$ cd youTube_ads_4_pi-hole
$ sudo nano youtube.sh

youtube.shファイルをnanoで開き、以下を”repoDir=$(pwd)”の下に追記します。

repoDir='/*設定したユーザー名*/youTube_ads_4_pi-hole'

我が家のユーザー名はpiholeにしているので以下のようになります。

Ctl+Sで保存して、このyoutube.shファイルに実行権を付与してcronに設定します。ここでは6時間ごとに実行するようにしています。別にこれが原因で重くなるってことはありません。

$ sudo chmod a+x youtube.sh
$ sudo crontab -e
//piholeはご自身のユーザー名に変更
0 */6 * * * sudo /home/pihole/youTube_ads_4_pi-hole/youtube.sh >/dev/null

そしたらさっそくyoutube.shを実行します。

$ sudo usermod -a -G pihole www-data
$ sudo ./youtube.sh

すんごい時間かかります。20分以上かかったかな・・・気長に待ちます。途中sqlite3でエラーがずらっとならびますが、対策で1行目のコマンドいれてるのですがでるので気にせず進めます。

ここまで終わればブラックリストはフルパッケージです。このリストを使うためにルーターの設定に進みます。

ルーターの設定

家中ぜんぶ広告ブロックするためにPi-holeの端末をDNSサーバーに指定します。

TP-Linkだと詳細設定 ⇒ ネットワーク ⇒ DNSサーバー ⇒ プライマリDNSにPi-holeのIPアドレスを入力するだけです。これで通信が一度Pi-holeを経由するようになり広告と思われるドメインをブロック、つまり広告に関する通信を遮断してくるようになります。

PiVPNのインストール

外から家庭内ネットワークに接続する方法はいくつかありますが、セキュリティが高いのに導入が簡単なVPNをつかうこととします。PiVPNは名前の通りラズパイで問題なく使えてインストールも簡単です。むしろ周辺環境を整えるほうが大変だったり。インストールの前に周辺を整備します。

ポート開放

デフォルトのポート:51820を使います。外からのアクセスに使う入口のようなもので、我が家はちょっとめんどくさい2重ルーターになってます。なのでNURO光から貸与されているONUと自分で買ったTP-Linkの無線LANルーターどちらもポート開放が必要です。

NURO光のONUのポート開放

我が家のはZXHN F660Aというもの。デフォルトのままなら192.168.0.1にアクセスして、アプリケーション ⇒ ホートフォワーディングから設定できます。設定名はpivpnとしてプロトコルはUDP、外部からのポート51820のアクセスをWiFiルーター192.168.1.#の同じくポート51820に右から左に流してね、という設定です。ここのWiFiルーターはONUからみたIPアドレスを指定します。

TP-Linkのポート開放

お次はArcherAX50。やることはほぼ同じで詳細設定 ⇒ NAT転送 ⇒ 仮想サーバーに設定します。TP-Linkの公式HPに「仮想サーバー(通称ポート開放)」と書いてなかったらわからなかったよ・・・

Dynamic DNSの登録

ほとんどの一般家庭は動的IPアドレスなので名前を解決する必要があります。無料で5つまで使えてラズパイ用コマンドまで用意されているDuck DNSを使います。

アカウント登録してドメインつくったら上のinstallをクリック、piを選択したら「これコマンドで打ちなさい」と教えてくれます。

この通りに進めるだけの親切設計。SSHで接続して進めていきます。

$ mkdir duckdns
$ cd duckdns
$ sudo nano duck.sh
//自分用、まとめて実行、nano使用
$ mkdir duckdns && cd duckdns && sudo nano duck.sh

DuckDNSから教えてもらったecho url=”~をduck.shに記載して保存します。そしたらduck.shに実行権を与えてcronに登録します。

$ chmod 700 duck.sh
$ crontab -e
//末尾に追記
*/5 * * * * ~/duckdns/duck.sh >/dev/null 2>&1

そしたらテストしていきます。

$ ./duck.sh
$ cat duck.log
$ sudo service cron start

1行目でテスト、2行目で「OK」と表示されたら3行目でcronを開始します。ここまでが事前準備、やっとpiVPNをインストールします。

piVPNをインストール

ウィザード形式でインストールが進みます。まずはコマンドを実行。

$ cd && curl -L https://install.pivpn.io | bash

Yesで進めていき、WireGuardとOpenVPNどちらを使うかを選びます。新しく情報量が多いWireGuardがおすすめです。

サクサク進めていくと「Pi-holeはいってるけど使う?」と聞かれるのでYesと答えます。こうゆうの非常にありがたい。

さらに進めるとPublic IP(グローバル固定IP)とDDNSサービスどっちと聞かれるのでDNS Entryに*をスペースで移してエンター、duckdnsならば「サブドメイン.duckdns.org」を入力します。あとはウィザードに従ってインストールを完了させます。WireGuardが自動起動するように以下のコマンド打って終了です。

$ sudo systemctl enable wg-quick@wg0

piVPNのユーザー設定

ユーザー(=アクセス者)を設定していきます。

$ pivpn add

で名前を設定し、[ユーザー名].confファイルを作成します。作成したプロファイルはQRコードで表示できます。スマホアプリで撮影するだけなので非常に便利。

$ pivpn -qr

QRコード生成はすべての設定が完了してからやるのが吉なので先に以下の設定を進めます。

VPNサーバー側の設定

RasPi OSのルーティング許可

Raspberry Pi OSはデフォルトではLAN内ルーティングができないのでこのままだとpiVPNがインストールされている端末にしかアクセスできないようになっています。家庭内ネットワークにアクセスできるように/etc/sysctl.confを開き「net.ipv4.ip_forward=1」のコメントアウトを解除します。

$ sudo nano /etc/sysctl.conf
//変更を反映
$ sudo sysctl -p

VPNサーバー側の設定

IPマスカレード(IPアドレスの紐づけ)を有効にします。ラズパイの無線LANはwlan0なので以下の記述ですが有線LAN接続ならwlan0をeth0に変更してください。

$ sudo nano /etc/wireguard/wg0.conf
//以下の2行をListenPort = 51820の下に追記
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE; iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o wlan0 -j MASQUERADE; iptables -t nat -D POSTROUTING -s 10.0.0.0/24 -j MASQUERADE
//WireGuardを再起動
$ sudo systemctl restart wg-quick@wg0

ユーザーconfファイルの設定

アクセスしたい家庭内LANのネットワークを手動で追加する必要があります。1行目で.confファイルを開いたら、最後の行AllowedIPsに家庭内LANのIPを追加し、2行目でWireGuard再起動します。

$ sudo nano /home/pi/configs/[ユーザー名].conf
$ sudo systemctl restart wg-quick@wg0
我が家のWiFiは192.168.0.#なのでカンマと192.168.0.0/24と追加します。

クライアント側の設定

アクセスする側でも同じように192.168.0.0/24と追加します。Android、iPhoneアプリのWireGuardならピアの項目一番下Allowed IPsに追加するだけです。

定期的に再起動設定

毎日再起動ならsystemdをいじるのがよさそうですが週イチだとcronになります。定期的な再起動で安定運用していきます。

$ systemctl status cron.service

でactive (running) であることを確認したら、

$ sudo crontab -e

でnanoでもvimでもお好きなものを選択して、例えば火曜日の午前4時なら

0 4 * * 2 /sbin/reboot

と記載します。記述ルールは「分 時 日 月 曜日 <実行コマンド>」です。例えば毎週月曜日午後2時半なら

30 14 * * mon /sbin/reboot

となります。曜日は0から7(0と7が日曜日)もしくはsunからsatで指定できます。最後の行に記載すればokです。

$ sudo crontab -l

でちゃんと追記されていればあとは勝手に再起動してくれます。

 

ちょっと長くて疲れたけどこれで広告なし+VPNで出先からも家の中にアクセスできる環境が整いました◎

コメント

タイトルとURLをコピーしました