VPN
 Computer >> コンピューター >  >> ネットワーキング >> VPN

Raspberry PiでOpenVPNサーバーを構築する方法【ステップバイステップ完全解説】

Raspberry PiでOpenVPNサーバーを構築する方法【ステップバイステップ完全解説】

こんにちは!本記事では、Raspberry PiにOpenVPNを用いて自分専用のVPN(Virtual Private Network:仮想プライベートネットワーク)サーバーを構築する方法を解説します。さらに、サーバー構築後にObfsproxyを使った難読化サーバーを追加設定し、トラフィックがVPN通信であることを偽装できるようにします。これにより、一部の検閲や通信規制を回避できるようになります。

なぜVPNを使うべきなのか?

まず、VPNサーバーを利用する主なメリットを見ていきましょう。

  1. 中間者攻撃(MITM)の防止:ローカルネットワーク内に悪意あるユーザーがいる場合(ルームメイトでさえも)、暗号化されていない通信を監視・改ざんされる恐れがあります。VPNによる暗号化はこうした脅威から守ってくれます。
  2. ISPや大学などからの通信内容の隠蔽:インターネットサービスプロバイダ(ISP)や大学のネットワーク管理者に、自分の通信内容を覗き見されないようにできます。
  3. サービスへのアクセス制限の解除:筆者の大学ではUDP(User Datagram Protocol)パケットがすべてブロックされており、メールクライアントやオンラインゲーム、Gitさえも使えませんでした。VPN経由ならこうした制限を回避できます。

筆者は自宅の回線にRaspberry PiでVPNサーバーを立てることにしました。こうすれば大学にいても自宅ネットワークへ安全に接続できます。もし海外など別の国にVPNサーバーが必要な場合は、DigitalOceanなどで月5ドル程度のVPS(仮想プライベートサーバー)を借りるのも有効な選択肢です。

OpenVPNのインストール

この作業はとても簡単です。インストール用のシェルスクリプトを活用するため、ほぼ「次へ」を進めていくだけで完了します。

インストールにかかる時間は選択した鍵長(key size)によって異なります。筆者のRaspberry Pi 3 Model Bでは約3時間かかりました。

GitHubのAngristan/OpenVPN-installリポジトリにアクセスし、記載された手順に従ってください。このスクリプトはDebian、Ubuntu、Fedora、CentOS、Arch Linuxなど主要ディストリビューションに対応しています。

サーバーのIPアドレスが不明な場合は0.0.0.0を入力しましょう。筆者はポート番号に443、プロトコルにTCP(Transmission Control Protocol)を選択しました。

注意:ここは非常に重要です。筆者の大学ではTCP/80とTCP/443以外のポートがほぼブロックされているためです。さらに、ObfsproxyはTCPでのみ動作するため、必ずTCPを選んでください。

スクリプトの実行が完了すると、.ovpnファイルが生成されます。お好みのVPNクライアントにインポートすれば、そのまま動作するはずです。

接続テスト

.ovpnファイルをVPNクライアントにインポートし、IPアドレスを0.0.0.0からRaspberry PiのローカルIPへ変更します。ネットワーク構成によりますが、一般的には192.168.*.*のような形式です。

注意:このテストは、Raspberry Piと同じWi-Fiネットワークに接続している場合にのみ有効です。

Raspberry PiでOpenVPNサーバーを構築する方法【ステップバイステップ完全解説】

ViscosityがVPNサーバーへの接続に成功した様子

筆者はルーター側でPiに固定IPアドレスを予約設定しています。同様の設定を行う場合は、お使いのルーターの管理画面を確認してください。

接続に成功したら、おめでとうございます!これでVPNサーバーの完成です。ただし、現時点ではまだ外部からはアクセスできません。

難読化プロキシが不要で、OpenVPNサーバーだけが必要な場合は、次の「ポートフォワーディング」セクションまでスキップして構いません。

難読化プロキシ(Obfs4)の導入

Obfs4はスクランブル型プロキシの一種で、インターネットトラフィックをまるでノイズのように見せかけます。通信を覗き見する第三者には何をしているのか分からず、中国のグレートファイアウォール(GFW)が用いるアクティブプロービング攻撃からも身を守れます。

注意:相手側のネットワークがホワイトリスト方式で特定の通信のみ許可している場合、この手法は機能しません。

プロキシサーバーのセットアップ手順

  1. 必要なパッケージをインストールします。
    apt-get update && apt-get install obfs4proxy
    
  2. 設定ファイルを保存するディレクトリを作成します。
    sudo mkdir -p /var/lib/tor/pt_state/obfs4
    
  3. 設定ファイルを作成します。
    sudo nano /var/lib/tor/pt_state/obfs4/obfs4.config
    

    設定ファイルには以下の内容を貼り付けます。

    TOR_PT_MANAGED_TRANSPORT_VER=1
    TOR_PT_STATE_LOCATION=/var/lib/tor/pt_state/obfs4
    TOR_PT_SERVER_TRANSPORTS=obfs4
    TOR_PT_SERVER_BINDADDR=obfs4-0.0.0.0:444
    TOR_PT_ORPORT=127.0.0.1:443
    

    TOR_PT_SERVER_BINDADDRは、プロキシが新規接続を待ち受けるアドレスです。ここでは0.0.0.0:444としました。なぜ444で443ではないのか?それは、現在443番ポートで待ち受けているOpenVPNサーバーの設定を変更したくなかったからです。この444番ポートは後ほどポートフォワーディングで443にマッピングします。

    TOR_PT_ORPORTはOpenVPNサーバーを指定します。筆者の場合、サーバーは127.0.0.1:443で稼働しています。

  4. SystemDサービスファイルを作成します。
    sudo nano /etc/systemd/system/obfs4proxy.service
    

    以下の内容を貼り付けてください。

    [Unit]
    Description=Obfsproxy Server
    
    [Service]
    EnvironmentFile=/var/lib/tor/pt_state/obfs4/obfs4.config
    ExecStart=/usr/bin/obfs4proxy -enableLogging true -logLevelStr INFO
    
    [Install]
    WantedBy=multi-user.target
    
  5. 難読化プロキシを起動します。

    OpenVPNが稼働中であることを確認したうえで、以下のコマンドを実行し、プロキシの起動とシステム起動時の自動起動を有効にします。

    sudo systemctl start obfs4proxy
    sudo systemctl enable obfs4proxy
    
  6. 証明書キー(cert KEY)を保存します。

    サービス起動後、以下のコマンドを実行してcert KEYを控えておきましょう。

    cat /var/lib/tor/pt_state/obfs4/obfs4_bridgeline.txt
    

    キーはBridge obfs4 <IP ADDRESS>:<PORT> <FINGERPRINT> cert=KEY iat-mode=0という形式で出力されます。VPN接続時に必要になるので大切に保管してください。

  7. 接続をテストします。

    VPNクライアントを開き、接続先ポートを443から444に変更して、OpenVPNサーバーではなくプロキシ経由で接続するようにします。

    続いて、VPNクライアントの「Pluggable Transport(プラグ可能トランスポート)」オプションでobfs4に対応しているか確認します。Raspberry PiでOpenVPNサーバーを構築する方法【ステップバイステップ完全解説】

    Viscosityはobfs2、obfs3、obfs4、ScrambleSuitなど複数の難読化方式をサポートしています

すべて正常に動作すれば準備完了です!おめでとうございます。あと少し調整すれば、外部からもこのVPNを利用できるようになります。

ポートフォワーディングの設定

外部からOpenVPNサーバーへアクセスするには、ルーターでポートを開放する必要があります。前述のとおり、筆者はPiのIPアドレスを192.168.1.125に固定しているため、Piが再接続したりルーターが再起動したりしてもIPアドレスが変わりません。

Raspberry PiでOpenVPNサーバーを構築する方法【ステップバイステップ完全解説】

TL-WR841Nのポートフォワーディング設定ページ

この前提のもと、ポートフォワーディングテーブルに以下のルールを登録しました。

  • 443 → 444:外部ポート443宛ての接続を、難読化プロキシのポート444へ転送します。難読化サーバーを使わない場合は「443 → 443」にしてください。
  • 25 → 22:ポート25をPiのSSHポート22へ転送しています。これは筆者自身の利便性のための設定です。
  • 444 → 443:難読化プロキシを経由せず、直接OpenVPNサーバーへ接続したい場合のためのルールです。

「サービスポート」とは、パブリックIPアドレスと組み合わせて使用される外部(WAN側)のポートです。自分のパブリックIPはwhatsmyip.comなどのサービスで確認できます。「内部ポート」は内部(LAN側)のポートで、同じネットワーク内にいるときにのみ使用されます。

注意:最初のルールは「PUBLIC_IP:443宛ての接続をすべて192.168.1.125:444へリダイレクトする」という意味になります。

テスト手順

  1. パブリックIPを確認し、.ovpnファイルまたはVPNクライアントの設定内にある旧IPアドレスをパブリックIPに置き換えます。
  2. VPNに接続します。

以上で完了です。

Dynamic DNS(ダイナミックDNS)の活用

多くの家庭用回線ではIPアドレスが動的に変化します。これに対処する一つの方法として、Pi上で小さなプログラムを動かし、毎日のように自分のIPアドレスをメールで通知させるやり方があります。FirebaseなどのオンラインデータベースにIPを記録しておくのもよいでしょう。

筆者のルーター(TL-WR841N)にはDDNS(Dynamic DNS)機能が搭載されているため、NoIPのようなDDNSサービスを利用すれば、常に自分のパブリックIPアドレスを指し示すexample.no-ip.comのようなドメインを取得できます。

Raspberry PiでOpenVPNサーバーを構築する方法【ステップバイステップ完全解説】

TL-WR841NのDDNS設定ページ

その他の参考資料

  • A Child's Garden of Pluggable Transports
  • Viscosity – Obfuscation(難読化)設定ガイド
  • Pluggable Transports公式サイト(各トランスポートの一覧)

質問がある場合は、Twitter(X)でお気軽にご連絡ください。

無料でプログラミングを学べるfreeCodeCampのオープンソースカリキュラムは、これまでに40,000人以上の人々を開発者として就職へ導いてきました。

  1. 私のアカウントのセキュリティ上の弱点を暴いた5つの危険信号

    オンラインセキュリティを真剣に考えている人ほど、意外にも油断してしまうものです。私もその一人でした。複雑なパスワードを使い、ときどきセキュリティ設定を見直し、「何かあればプラットフォームが警告してくれるはず」という根拠のない自信を持っていました。 しかし年月を重ねるうちに、いくつかのサインを通じて、自分のアカウントが思っていたほど堅牢ではないことに気づきました。劇的なハッキング被害や銀行口座の不正出金に遭ったわけではありませんが、一連の警告信号は、私のデジタルライフが想像以上に露出していることを示していました。ツールがリスクを可視化してくれたのは確かですが、脅威を最小限に抑える鍵となったのは、

  2. Hotspot Shield徹底レビュー:軍事級のセキュリティと圧倒的な使いやすさを両立するVPN

    VPNの利用を考えているものの、何から始めればよいかわからない——そんな方は多いのではないでしょうか。単にインターネットに安全に接続してプライバシーを守りたい、あるいはNetflixの地域制限を回避したり、トレントを匿名でダウンロードしたいだけかもしれません。選択肢が多すぎて迷っているなら、シンプルなVPNクライアントこそが必要なものです。そして「Hotspot Shield(ホットスポット・シールド)」は、まさにその答えになり得る存在です。Hotspot Shield VPNの料金はいくら?仮想プライベートネットワーク(VPN)は、今やインターネット接続においてほぼ必須と言えるツールです。P