Raspberry Pi 3 Model B で Wi-Fi VPN ルータを作ってみた

■要件
・Raspberry Pi 3 Model B で作るWi-Fi VPN ルータ
・Access Point を複数立て、接続するAPごとに異なるVPNへブリッジできるようにする
・ただし、Wi-Fi ルータとしての機能も残す
・Raspberry Pi 3 Model B の OS は、CentOS 7 とする
・初期設定は極力シンプルに
・出所がはっきりしているものだけで構成

■使用したもの
・Raspberry Pi 3 Model B
・USB ACアダプタ
・microSD 8GB
・WLI-UC-GMN2
・WLI-UC-AG300N

■CentOS 7 arm7hl (32bit) のインストールについて
公式のWiki参照
 https://wiki.centos.org/SpecialInterestGroup/AltArch/Arm32/RaspberryPi3

■成果物:ブートストラップ3つ
1:Raspberry Pi 3 Model B の初期設定実施
2:Wi-Fi AP として設定
3:Wi-Fi AP を2つ追加し、SoftEther VPN Bridge の導入
  ※SoftEther VPN Bridge の設定は、別記事参照。
Raspberry Pi 3 Model B VPN Router

【各ブートストラップの概要】
■Raspberry Pi 3 の初期設定を行うブートストラップ
・スクリプト実行時に、ホストネームを引数にしているか確認
・microSD の全領域まで / パーティションを拡張
・/ と swap パーティションで Block Discard (Trim / UNMAP) 有効化
・root パスワードの設定 ★あえて手動入力
・ホストネームの設定
・タイムゾーンの設定
・キーマップの設定
・localhost を IPv4 のみに限定化
・可能な限り network-latency のチューニングを投入
・ntpd のインストールと設定
・パッケージアップデートの実行
・ifconfig やその他過去の Enterprise Linux で使えた管理コマンドの有効化
・iptables コマンドの有効化
・Wi-Fi 制御用コマンドの有効化
・ローカルリポジトリ作成用パッケージのインストール
・firewalld, iptables, ip6tables の停止
・Raspberry Pi 3 の Wi-Fi モジュールの有効化
・非特権ユーザ (admin) の作成とパスワードの設定 ★あえて手動入力
・SSH経由でパスワード認証を利用した root ログインの拒否設定
・非特権ユーザで RPM ビルド環境の整備
・ローカルリポジトリの作成
・ローカルリポジトリを利用するように設定
・乱数ジェネレータのビルドとインストール
・Wi-Fi の規制範囲設定ツール (crda) のビルドとインストール
 ※必要となる m2crypto がビルドは成功するがテストが失敗するので、テストを無効化してビルドする

■Wi-Fi AP として設定するブートストラップ
・Wi-Fi AP 用に、ifcfg-wlan0 を再作成
・ルータ動作用のため、IP Forward 有効化
・iptables 設定スクリプトの生成と iptables 設定および有効化
・DHCP サーバのインストールと設定
・DNS サーバのインストールと設定
・Wi-Fi AP サーバ (hostapd) のビルド、インストールと設定
・インターフェース利用状況モニターツール (iftop) のビルド、インストールと設定
・Webmin のインストール

■Wi-Fi AP を2つ追加し、SoftEther VPN Bridge を導入するブートストラップ
※物理的に Wi-Fi アダプタを2つ追加必要
・ifcfg-wlan1, ifcfg-wlan2 の作成
・Wi-Fi AP サーバ (hostapd) の再設定
・SoftEther VPN Bridge のインストールと設定

■未来の自分用メモ
・tuned パッケージは、python-perf が無いとビルドできない。
 →今のラズパイ用CentOS7公式イメージは、それがない。
  64bit版が公式にアナウンスされたら行けるかも。
・Wi-Fiでほとんどのチャンネルが利用不能だった。
 →crda を入れることで、カントリーコード設定が有効になった。
  むしろこれが arm7hl のリポジトリにデフォルトで存在しないのが謎・・・。
  もしかして、m2crypt のせいだろうか。
・EPEL には arm7hl がないんだけど。
 →RHEL 的には、aarch64 をメンテナンスしてるようだ。
  なので、CentOS側がaarch64なイメージを出せばいろいろ楽になりそう。
・MAC Address はちょっと特殊。
 イーサネット:「B8:27:EB」 + CPU のシリアル
 Wi-Fi:Wi-Fi機器のMACアドレス無視してる気がする。
     オンボード、後付の両方ともに。
     wlan0 hw ether aa:bb:cc:dd:ee:ff で変えれるし。。。
・ブラウザからシャットダウンできるように Webmin いれたけど、もっとスマートにしたい。

カテゴリー: めも パーマリンク

22 Responses to Raspberry Pi 3 Model B で Wi-Fi VPN ルータを作ってみた

  1. ピンバック: Raspberry Pi 2 / 3 向け CentOS 7 Kernel RPM の作成 | まこぴかっと

  2. ピンバック: 20170216 はれ | まこぴかっと

  3. ピンバック: 過去に作った CentOS7 on Raspberry Pi 3 向けブートストラップスクリプトを、7.4 向けに修正した | まこぴかっと

  4. ヨウヘイ のコメント:

    いきなりすみません。わたくし、ヨウヘイと申します。

    こちらの記事を拝見させて頂き大変勉強になりました。
    わたくしも、raspberrpi3でwifiを使用しsoftetherVPNを動作させて頂きたくご助言いただきたくコメントしました。

    筑波大学のページを見たときにwifiにはプロミスキャスの対応していないので難しいと記載がありました。今回この記事でUSB子機を使用してVPNしていると思うのですが、どのようにプロミスキャス対応のUSB子機を探されたのでしょうか

    • makopi のコメント:

      初めまして、まこぴです。
      読んでいただきありがとうございます。

      私もいくつかの Wi-Fi 子機を試してみたのですが、結果的には「Linux Kernel が何もせずに wlanX として認識する Wi-Fi 子機ならばイケる。」という結論に到達いたしました。
      ※プロミスキャス云々よりも、nl80211 対応のが大事かもしれないです。

      最近簡単に入手可能なものは Ralink RT3070 とか乗っているものがよさげですが、これが大体「2.4GHz」しか対応してないです。。。

      で、5GHz 対応が必要であれば、二つの手段があると思います。
      1:普通に対応しているアダプタを探す
      2:RPi3+ の Wi-Fi を使う
      RPi3+ に搭載されている Wi-Fi チップが、うれしいことにプロミスキャス対応してます。
      なので、RPi3+ を入手するのも一つの解答かもしれません。

      もし、対応アダプタを探す場合
      “Linux hostapd Realtek Ralink 利用可能 Buffalo Planex”
      などで Google 検索すると、利用可能チップが乗ったアダプタがまとまっているページがヒットするようです。

      • ヨウヘイ のコメント:

        まこぴさん
        こちらこそご助言いただきありがとうございます。
        すごく勉強になります!

        >1:普通に対応しているアダプタを探す
         →バッファローにもアイオーデータにも問い合わせましたがプロミスキャスが対応してないことで断られてしまいました。
        対応してもプロミスキャスの問題が残ってしまいますよね。。。
        >2:RPi3+ の Wi-Fi を使う
        >RPi3+ に搭載されている Wi-Fi チップが、うれしいことに>プロミスキャス対応してます。
         →本当ですか?!!出所だけ教えていただきたいです。
          ただもうRPi3modelBを買わせてしまった手前高い出費になりそうな気がしています。。。

        • makopi のコメント:

          さくっと試してみました。

          ■Buffalo WLI-UC-GNM2 を試してみた
          ・USB の接続ログ

          # dmesg
          [   82.101731] usb 1-1.5: new high-speed USB device number 5 using dwc_otg
          [   82.247598] usb 1-1.5: New USB device found, idVendor=0411, idProduct=01ee
          [   82.247815] usb 1-1.5: New USB device strings: Mfr=1, Product=2, SerialNumber=3
          [   82.248020] usb 1-1.5: Product: 802.11 n WLAN
          [   82.248149] usb 1-1.5: Manufacturer: Ralink
          [   82.248272] usb 1-1.5: SerialNumber: 1.0
          [   82.351743] usb 1-1.5: reset high-speed USB device number 5 using dwc_otg
          [   82.490833] ieee80211 phy2: rt2x00_set_rt: Info - RT chipset 3070, rev 0201 detected
          [   82.517524] ieee80211 phy2: rt2x00_set_rf: Info - RF chipset 0005 detected
          [   82.518970] ieee80211 phy2: Selected rate control algorithm 'minstrel_ht'
          

          ・アダプタ情報
           Device 004 は WLI-UC-GNM2
           Device 005 は WLI-UC-GNM2S
           ・・・Sついてるほう、パッケージデザイン変わっただけで中身は同じだったらしい。

          # lsusb
          Bus 001 Device 005: ID 0411:01ee BUFFALO INC. (formerly MelCo., Inc.) WLI-UC-GNM2 Wireless LAN Adapter [Ralink RT3070]
          Bus 001 Device 004: ID 0411:01ee BUFFALO INC. (formerly MelCo., Inc.) WLI-UC-GNM2 Wireless LAN Adapter [Ralink RT3070]
          

          ・SoftEther VPN Bridge 起動前の WLI-UC-GNM2S 情報

          # ifconfig wlan2
          wlan2: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
                  ether 84:af:ec:52:c5:98  txqueuelen 1000  (Ethernet)
                  RX packets 0  bytes 0 (0.0 B)
                  RX errors 0  dropped 0  overruns 0  frame 0
                  TX packets 0  bytes 0 (0.0 B)
                  TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
          

          ・SoftEther VPN Bridge 起動後の WLI-UC-GNM2S 情報

          # ifconfig wlan2
          wlan2: flags=4355<UP,BROADCAST,PROMISC,MULTICAST>  mtu 1500
                  ether 84:af:ec:52:c5:98  txqueuelen 1000  (Ethernet)
                  RX packets 0  bytes 0 (0.0 B)
                  RX errors 0  dropped 0  overruns 0  frame 0
                  TX packets 0  bytes 0 (0.0 B)
                  TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
          

          ・hostapd でアクセスポイントとして稼働後の WLI-UC-GNM2S 情報

          # ifconfig wlan2
          wlan2: flags=4354<BROADCAST,PROMISC,MULTICAST>  mtu 1500
                  ether 84:af:ec:52:c5:98  txqueuelen 1000  (Ethernet)
                  RX packets 0  bytes 0 (0.0 B)
                  RX errors 0  dropped 0  overruns 0  frame 0
                  TX packets 82  bytes 9944 (9.7 KiB)
                  TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
          

          なので、Buffalo WLI-UC-GNM2S であれば、VPN ルータのアンテナとして使うことができそうです。
          なお、Wi-Fi 子機として利用しつつ親機のアンテナとして動かすことは無理だとおもうので
          子機として動いてるときは、プロミスキャスが使えないという意味かもしれないです。たぶん。

          あと補足ですが、今売っている Buffalo の Wi-Fi 子機で 5GHz 対応のものは、全部使えないはずです。
          少なくとも Linux Kernel 4.14.68 でもそのままじゃ hostapd で使えないため。。。
          どうしても 5GHz の VPN AP を立てたい場合は、RPi3+ を入手するのが手っ取り早いかもしれません。

          もし、Wi-Fi に接続してる RPi そのものを VPN に接続したいのであれば・・・やったことないので近々試してみます。
          VPN ルータとしてしか作ったことないので。。。

  5. ヨウヘイ のコメント:

    ハードにあまり詳しくなく話にあまりついていけなくなってしまってました。。。
    やりたいこととしては(いまのところ)2.4/5G問わず、raspberrpi3でVPNサーバにしたいです。なのでたぶん、raspberrpiがvpnクライアントになることはないです.

    eth0(有線)で仮想ローカルブリッジ接続を行いvpnseverは組んだことがあるのですが、wifiになると問題に上げているプロミスキャスの問題(rap3では対応してない?)があるので優先の時のようにwifiと仮想ローカルブリッジではできない認識でいます。。。

    • makopi のコメント:

      おっと、VPN Server にしたいのですね。
      てっきり、別建てしてある SoftEther VPN Server に対して RPi から VPN Bridge でカスケード接続して、RPi 経由でスマートフォンなどを VPN 通信するのかと思ってました。
      そのため、今までの会話の前提が、以下のような感じだったのです。

      ■ハードウェア構成
      wlan0:RPi3 オンボード Wi-Fi(2.4GHz)
      wlan1:Buffalo WLI-UC-GNM2S(2.4GHz)

      ■ネットワーク設定
      wlan0:Wi-Fi でどこかに接続。アップリンク。
      wlan1:SoftEther VPN Bridge でローカルブリッジ接続。hostapd で Wi-Fi AP として動作させる。

      ■SoftEther VPN Bridge の設定
      別の VPN Server サーバに対してカスケード接続。

      Wi-Fi アップリンクの VPN Server はちょっと試したことないので、試してみます。

      • makopi のコメント:

        遅くなりましたが確認しました。

        結論としては、私の方で認識の不足と謝りがありました。
        ・VPN Bridge でのローカルブリッジは、プロミスキャス完全対応していなくても動作可能
        ・VPN Server でのローカルブリッジは、プロミスキャス完全対応していないと動作不能
        なので、私が作成したとき、VPN Bridge で作成していたため、問題なく動いてしまっておりました。
        なお、見た目上はプロミスキャスが有効となり、ローカルブリッジも正常に動いてるように SoftEther 管理コンソール上は見えてましたが、実際は VPN Client からの通信は消失することを確認できました。

        また、RPi3+ のオンボードチップがプロミスキャス対応であることも誤りでした。
        Linux 上でプロミスキャスモードが ON にできるだけであり、プロミスキャスができているわけではない動きが確認できました。
        申し訳ございません。

        本記事の場合、最上位には「VPN Server」が立っており、RPi では「VPN Bridge」をインストールして、カスケード接続を行うように作っておりました。
        hostapd で Wi-Fi アダプターをアクセスポイントとして稼働させ
        そのアクセスポイント (wlan0) に対してローカルブリッジを作成することで、L2 延伸してます。
        このように VPN Bridge でカスケード接続を行う場合は、プロミスキャス対応は不要であるような動きをすることを確認できました。

        そして一番最初のところで、プロミスキャス完全対応という謎のワードが出ておりますが、プロミスキャス対応していないデバイスは本来 SoftEther のローカルブリッジ作成のところに出てこないはずが Linux 版の SoftEther の場合、出てきてしまうようでした。
        対応していなくても、Linux 上で PROMISC フラグを立てれるようなので、そのせいでこのように変な動きしているようです。
        bool NoPromiscuousMode false となっている状態でも、未対応のデバイスが出てくることを確認できました。

        以上のような感じとなりましたが、もし何か疑問点などありましたら追加で確認したいと思います。

        • ヨウヘイ のコメント:

          いえ、ここまで検証、調査頂きありがとうございます。
          頭が上がらないほど感謝しております。

          プロミスキャスが完全対応しない限りwifi接続でのVPN serverは難しいですかね。。。
          有線以外でなにか回避策があればご教授頂きたいです。

          • makopi のコメント:

            いろいろ検証したのですが、Wi-Fi でアクセスポイントに接続し、そのインターフェースにローカルブリッジを作成して VPN Server を運営する方法は見つかりませんでした。
            外部の VPN Server に対して ラズパイ上にインストールしたVPN Bridge からカスケード接続したいのであれば、やはりアクセスポイントとして動かす Wi-Fi アダプタに対してローカルブリッジを作成すればうまく行きますが、おそらく今回は Wi-Fi 接続な VPN Server を作成したいのが要件だとおもうので、たぶん違いますよね。。。

            なお、イーサネットコンバータにて Wi-Fi を有線 Ethernet に変換してラズパイの Ethernet ポートに接続し、ローカルブリッジを作成した場合はうまく動きました。
            なので、Wi-Fi アダプタ側の制限となりそうです。

            すみません、上記のような結果となりました。
            もう一つ、行けるかもしれない手段が思いついてはいるのですが、ちょっと時間が足りなくて試せてないので、週末に試してみます。

          • makopi のコメント:

            結論から言えば、だめでした。

            ■試したこと
            現在入手できる Linux 上でドライバビルドせずに使える Wi-Fi アダプタ複数で以下の試験
            – 4addr Mode を有効にしてみる
            – TAP デバイスを作成し、そこにローカルブリッジ
            – TAP デバイスと Wi-Fi アダプタでブリッジ作成し、ローカルブリッジをそれらに作成(一つずつ試す)
            – Kernel を弄ってみた

            やっぱり VPN Bridge は簡単にうまくいきますが、VPN Server は Wi-Fi で作るのは無理そうです。

  6. ヨウヘイ のコメント:

    いろいろ試して頂いてありがとうございます。ほんとなにからなにまで感謝しかないです。
    イーサのみでしかブリッジできないのは認識していました。

    これraspiとwifiの中継器をLANで結線して、中継器と親機はwifiでつなぐ方法だと
    うまくいかないかご相談させて頂きたいです。
    なんとなくですが、L2にイーサで接続しているのでこれでブリッジは出来そうな気がしています。

    • makopi のコメント:

      おっしゃる通り、数日前に試したとき、次の構成でうまくいきました。
       Wi-Fi Router:NEC Aterm WG2600HP3
       Wi-Fi Bridge:I-O DATA WN-AG/C
      Bridge で有線 Ethernet に変換し、それを RPi3 の Ethernet ポートに接続して、VPN Server でローカルブリッジを作成したところ、問題なく機能しました。
      なので、無線を優先に変換しても良い場合は、こういう手も行けそうですが、一つだけ気になった点が出てきちゃったので追加で試しておきます。

      • makopi のコメント:

        次の構成でもうまくいきました。
         Wi-Fi Router:NEC Aterm WG2600HP3
         Wi-Fi Bridge:NEC Aterm WG1200HP2
        Bridge する機器によってはだめかもしれない?と思ったので、最近手に入る機器でも試してみました。
        ただ、残念ながらこれ以外の Wi-Fi 親機 or Bridge はいま手元にないので試せてません。
        親機 or Bridge によってはだめかもしれませんが、一応稼働したという情報だけ書き残します。

        • ヨウヘイ のコメント:

          本当に何から何まで申し訳ございません。
          逆にそこまで機器が揃っていることにびっくりしております。本当にありがとうございます!
          機器選定に時間を要しそうだなと思いましたがmakopiさんの結果でBridgeの機種は引用させて頂きたいです。ありがとうございます。

          Routerは自宅がNECのもの、実際に構築する建屋ではbufforoなので問題があるとすればRouter機能になると思います。これRouterの方の設定をいじくることはしていないですよね。建屋の方はRouterを設定する権限を与えてられないので。。。。vpn用にportを開けてる以外にBridgeするのに設定は不要な認識です。

          makopiさんのもとでネットワークについて勉強したくなりました

          • makopi のコメント:

            特に上位ルータの方は何もしておりません。
            デフォルトの設定でもうまくいったのです・・・が、おそらく「プライバシーセパレータ」や「ネットワーク分離機能」が有効になっていたら、ダメな気がします。
            Wi-Fi 接続してるとき、ほかの端末が見える環境であれば、問題はないと思います。
            VPN 用に Port が開いてれば OK というのは、私も同一認識です・w・b

  7. ヨウヘイ のコメント:

    承知しました。上位ルータを触るのにいろいろ申請が必要なので、、、良かったです。ファイルサーバを立てて他の人が使えるぐらいなのでセパレータ機能はないと思われます。

    ここまで議論して頂いて申し訳ないのですが、私が建てようとしているvpnサーバとまこぴさんが構築されたvpnルータはなにが違うんですかね、、、、もともとは一緒だと思ってこの記事にたどり着いたのが発端だったんですが。。。(あんまりねとワークが詳しくないのが露見してもうしわけないですが。。)

    • makopi のコメント:

      多分ですが、実は全然別物じゃないかという結論に達してますw

      ■私が作ったもの
      ・すでに存在する SoftEther VPN Server に「カスケード接続」を行うルータ
      ・Raspberry Pi には VPN Bridge をインストール
      ・VPN Bridge からは、既成の VPN Server に「カスケード接続」を実施

      ■ヨウヘイさんが作成しようとしているもの
      ・Raspberry Pi に VPN Server をインストールを行い、外部ネットワークにいる PC を Raspberry Pi がいるネットワークに接続したい
      ・そのため、Raspberry Pi には VPN Server をインストール

      なので、ネットワークパケットをコネコネしている場所が微妙に異なるのが原因だと思ってます。

      • ヨウヘイ のコメント:

        まこっぴさん
         いろいろご助言頂きながらご連絡ができず申し訳ございませんでした。
         先月は検証含めいろいろご指導、ご指摘頂きましてありがとうございました。
         今月やっと構築に着手し検証いただいたNEC Aterm WG2600HP3を購入し実機で試し上手くいきました。
         ずっとあれこれ考えてこのサイトにたどり着き、ご指導を仰げてホントに感謝しかありません。本当にありがとうございます。

        またraspberrypi絡みでサイトを拝見すると思いますので、またご指導いただけると幸いです。
         

        • makopi のコメント:

          丁寧にご連絡ありがとうございます。
          こちらこそ色々勘違いとかで至らないことがありすみません。
          いろいろ見直すことができ、私の方も学ぶことができました。

          また何かご協力できそうなことがあったら気にせず分投げてください。
          出来そうなことであれば、責任は一切持てませんが、興味が尽きるまでがんばります・w・

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です