Openwrt をインストールした raspberry pi3 B+ で動く Web 閲覧専用自作ルータの作成について
(編集履歴)
2021/12/11
- 誤植修正(Ⅳ 章に加えた修正: br-lan の扱い方、interface の追加方法、無線 LAN と物理 LAN ネットワークの紐づけ方)
- 記事タグの追加
もし、誤植等を教授頂けるとよろこびます。
本記事では、いわゆるバックエンド、サーバサイド領域の IT エンジニアに必須なネットワーク知識の基礎とネットワーク機器管理方法の概要について、ルータを操作しながら、実践的に学ぶことができます。
想定している読者層は「IT パスポート」、高等学校「情報Ⅰ、Ⅱ」と同等の知識を有し、ネットワーク、LAN、WAN、や IP アドレスなどの言葉が何を意味するのかなんとなくでもいいので分かっている方達です。
本記事で遊ぶのに追加で必要なものは、パソコンとネット回線を既に持っていると仮定すると、 raspberry pi3 B+ と micoroSDHC カード、USB-LAN 変換器と LAN ケーブルだけ。10,000 円もあれば予算は足ります。
実際に手を動かしリモート接続用アプリの Teraterm と Linux 系の OS をインストールした raspberry pi3 B+ を操作しながら IT システムの裏側をのぞいてみましょう。
重要(免責事項)
本記事では、悪意のあるサイバー攻撃から通信を保護するファイヤーウォール機能を有するルータを作成しますが、正しくルータを設定できなければその効果を十分に得ることができないどころか、逆にサイバー攻撃を受けやすくなります。
知識が無い方は、必ず脆弱性対策を実施されたネットワークの中でご自身の責任の元作業を行ってください。
製造メーカが定義するおすすめのセキュリティ設定のうち、最強の設定を選んで施した市販のルータ直下に 自作ルータ(raspberry pi3 B+) を置けば、まあ、大丈夫だと思います。
- 重要(免責事項)
- はじめに(記事のまとめ方の方針)
- Ⅰ.概要
- Ⅱ.今回使ったハードウェアとソフトウェア
- Ⅲ.OpenWRT のインストール
- Ⅳ.OpenWRT の初期設定
- 1.初期パスワードの設定
- 2.タイムゾーンの設定
- 3.インターネットへの接続と wifi の解放
- (1).Wifi を有効にする
- (2).パソコンで Wifi 接続する
- (3).物理 LAN ポートを WAN 接続専用に、SSID を LAN 専用にする
- 4.USB-LAN 変換器の接続とドライバインストール
- (1)必要なソフトウェアパッケージのインストール
- (2) OpenWrt に物理 LAN ポート( USB-LAN 変換器)を新たに追加する
- 5.Wifi(SSID)を物理 LAN ネットワークと紐づける
- (1)Bridge device (br-lan)に eth1 の LAN を接続してみる
- (2).SSID(wifi)と USB-LAN 変換器を同一の LAN(セグメント)内に設定する
- Ⅴ.OpenWRT のセキュリティを高める
- 1.SSH 接続に 2 要素認証(公開鍵暗号方式と鍵のパスフレーズ)を設定する
- (1).公開鍵・秘密鍵ペア(キーペア)の生成
- (2).Openwrt への公開鍵(.PUB ファイル)登録
- (3).Teraterm から 2 要素認証を使って自作ルータに SSH 接続試行
- 2.SSH 認証について、 ID とパスワードのみの認証と Wifi からの SSH 接続を禁止する
- 3.SSH 接続に用いるポート番号を Well Known Port から変更する。
- 4.ファイヤウォール(ホワイトリスト型)を設定する
- (1) ファイヤウォールの設計方針を立てる
- (2) OpenWRT の設定情報をバックアップする。
- (3) ルータの通信ログをとる
- (4) WEB ブラウジングに必要な通信をホワイトリストに登録する
- (5)ホワイトリスト以外の通信を原則として禁止する(最後の確認)
- (6)iPhone や Android スマホ等で不便無く、Web ブラウジングするには
- Ⅵ.終わりに(自作ルータを使い続けるために必要なこと)
- 余談
はじめに(記事のまとめ方の方針)
本記事は機器の操作を円滑にすること、IT の基礎知識と機器の設定・操作を結びつけることに重点を置きました。
初学者向けに、操作と意図を詳しく解説し、自分の進み具合を確認しやすいように操作画面のスクリーンショットを載せました。
一方で、細かい理論の話は注釈で少し話す他はリンク先の記事に任せました。理論的な話はすでに素晴らしい記事がまとまっていたのでここでは書きません。
たとえば、ネットワークの IP アドレスを正しく理解するためには 2 進数の概念を理解する必要があります。高校数学の美しい物語の記事がおすすめです。
本記事の所々に国家試験である情報処理技術者試験の過去問と解説を提供するサイト等へのリンクを張らせて頂いています。とても解説が詳しいので、もっと知識を着けたい方、国家試験の中で本記事の知識を確認したい方は是非足を運んで下さい。ちなみに、筆者も受験勉強で使っています。www.fe-siken.com
Ⅰ.概要
今回は、raspberry pi3 B+ にオープンソースの OpenWRT をインストールしてルータを作成します。
本記事では、 WAN と LAN または WAN と 無線 LAN の間でファイヤウォール付の有線・無線ルータとして機能する自作ルータの構築について説明します。
今回、構築するルータの構成は次図.自作有線・無線ルータ(HW: raspberry pi3 B+, OS: OpenWRT) のとおりです。
インターネット(WAN)側のモバイルルータと自作ルータを接続するのに LAN ケーブルを使っています。しかし、raspberry pi3 には LAN ポートが 1 つしかありません。よって、raspberry pi3 B+ から自宅のパソコンなどに LAN ケーブルをつなぐためには LAN ポートを増やす必要があります。
そこで、 raspberry pi3 B+ の USB ポートに Buffalo の USB-LAN 変換器 LUA4-U3-AGTE を接続しました。
Ⅱ.今回使ったハードウェアとソフトウェア
次に今回使用したハードウェア(HW)とソフトウェア(SW)を紹介します。
1.ハードウェア
(1).raspberry pi3 B+ × 1
(microUSB はスマホのを代用)
ルータ本体
(2).micro SDHC 8GB × 1
OpenWRT インストール先
昔、スマホに使っていたもの。
本当は、こんなに容量は必要ないです。1 GB 弱あれば足ります*1。
(3).USB-LAN 変換器 LUA4-U3-AGTE × 1
パソコン(LAN)側につなぐ LAN ケーブル用
(4).LAN ケーブル × 2
WAN 側用、LAN 側用
2.ソフトウェア
(1).raspberry pi3 B+ 用 OpenWRT
自作ルータの OS 。にゃののんさん(nyanonon)の記事を見てインストールしました。
OpenWRT に追加でインストールしなければならないパッケージがあります。
今回インストールしなければならないパッケージは次のとおりです。
① usbutils(および依存パッケージ): USB デバイスの診断コマンドに必要
② kmod-usb-net(および依存パッケージ): USB - Ethernet 変換アダプタの利用に必要
(本記事では、USB-LAN 変換器 LUA4-U3-AGTE 内蔵チップである ASIX AX88179 専用の Linux カーネルモジュールファイルである ax88179_178a.ko を自動で取得することができる kmod-usb-net-asix-ax88179 をインストールしました。各々、お手元の USB-LAN 変換器に搭載されているチップセットに対応した kmod-usb-net の派生パッケージをインストールしてください。チップセットの特定方法は、Ⅳ. 4. (1). ② で説明します。
(2).balenaEtcher
Micro SDHC に OS を焼く(インストール)するソフト
筆者は以前、FlightAware 公式の手順で ADSB 受信用に OS を焼いた際に使いました。
同じことをできるソフトならなんでもいいです。
(3).USB-Ehternet 変換器の内蔵チップに対応した Linux カーネルモジュール
USB Ethernet ICs で USB3.0 を 10/100/1000M Gbit イーサコントローラに変換するために必要。本記事では、OpenWRT の WEB-GUI で kmod-usb-net-asix-ax88179 をインストールすることにより、USB-LAN 変換器 LUA4-U3-AGTE の内蔵チップASIX AX88179 専用の Linux カーネルモジュールファイル ax88179_178a.ko を自動で取得しました。
(4).Tera Term
USB-LAN 変換器に搭載されているチップセットを特定するために使います。
Amazon Web Services 基礎 からの ネットワーク& サーバー 構築 改訂 3 版でも紹介されていました。クラウドサーバの保守にも使えます。
使い慣れた Windows 端末から Linux サーバを保守できるので、古くから親しまれてきたソフトです。Linux サーバの保守結果を Windows 端末の Word を使って、すぐに報告書にまとめられると考えると便利ですね。
たしか、窓の杜からインストールしました。
同じことをできるソフトならなんでもいいです。
Ⅲ.OpenWRT のインストール
それでは、OpenWRT を raspberry pi3 B+ にインストールしていきます。
raspberry pi シリーズは通常 micro SD カードにインストールされたコンピュータの基本ソフトウェアであるオペレーションシステム(OS) を boot して使用します。
今回は balenaEtcher を使って、raspberry pi3 B+ 用の OpenWRT をインストールします。
私は openwrt-21.02.0-bcm27xx-bcm2710-rpi-3-ext4-factory.img.gz をインストールしました。
下記が詳細な手順です。
1.Open WRT 公式から OS をダウンロード
2. balenaEtcher を使って OpenWRT を micro SDHC に焼く。
Flash (焼く)する先を間違えないようにしてください。
焼いた先に大事な写真とかがあるとすべて消えてしまいます。
絶対に、C ドライブにだけは決して焼かないでください。パソコンが壊れます。
Flash するイメージと Flash 先の micro SDHC を選択して、Flash を選択!
このあと、コマンドプロンプト(cmd)がこのコンピュータに変更を加えることを許可しますか?と聞かれるので、許可してください。
このあとすぐに、エクスプローラが勝手に動くことがありますが、エクスプローラは操作しないでください。操作すると、Flash に失敗することがあります。
Flash Compleet と表示されたら成功です。
Ⅳ.OpenWRT の初期設定
とりあえず、raspberry pi3 B+ を自作ルータとして機能するようにします。
1.初期パスワードの設定
raspberry pi3 B+ に micro SDHC を差し込み、mico USB type-B で給電します。
お手持ちのスマホを普段充電するのに使っているケーブルで給電できます。
赤いランプが点灯し、電源が供給されていることを確認したら、LAN ケーブルで直接 raspberry pi3 B+ とパソコンをつなぎます。
Ege、Chrome などの Web ブラウザを立ち上げて、アドレスバーに「192.168.1.1*2」と入力して Enter キーを押します。192.168.1.1 は OpenWRT にデフォルトで設定されているプライベート IP アドレスです。
このアドレス値はよく他のルータ等とかぶりやすいらしいので、後で変更します。
OpenWRT の設定画面へのログイン画面が表示されます。
パスワードの設定を求められるので、タブ「system」→「administoration」を開き、パスワードを設定します。
2.タイムゾーンの設定
初期状態では OS が公開(作成)された日のままで OpenWRT の時計が動いているので、現在時刻を取得するためにブラウザの時計と同期させます。
タブ「system」を選択し、プルダウンリスト「timezone」を選択。日本の標準時刻(JST = UTC + 9 時間)で利用するので、選択するタイムゾーンは「Asia/Tokyo」です。
タイムゾーン設定後、現在時刻が表示されます。
3.インターネットへの接続と wifi の解放
raspberry pi3 B+ には通信用に LAN ポートと 5 GHz 帯の wifi アンテナがそれぞれ 1 つずつあります。これらを次のように設定します。
①.LAN ポート(eth0*3):インターネット側(WAN)接続専用
②.Wifi(wlan0*4) :自宅端末側(LAN)接続専用
インターネット(WAN) に接続することによって、インターネットから追加のソフトウェア等をダウンロードすることができます。
(1).Wifi を有効にする
セキュリティ対策でデフォルトで Wifi は無効になっています。自作ルータ作成後、セキュリティ対策に自信のない人は、普段は Wifi を無効にし、自作ルータを使う時だけ、Wifi を有効にしましょう。ただし、後述する USB-LAN から自作ルータに接続できるようにしておかなければ、2 度と自作ルータに接続できません。そうなったら、本記事の手順を最初からやり直せば OK です。壊したら簡単に直せることが raspberry pi 等、評価ボードのメリットです。
タブ「ネットワーク」→「wireless」を選択
SSID OpenWRT のボタン「Enable」を押して、一番下のボタン「Save & Apply」を押す。
有効になったら、SSID OpenWRT のボタン「Edit」を押す。
これから SSID(Wifi 接続ポイント)の名前や SSID のセキュリティを設定します。
まず、名前を変更します。
Interface Configuration のタブ「General Setup」を押します。
デフォルトの SSID の名前は OS と同じで「OpenWRT」です。今回はデフォルトから
「test4wifi」という名前に変更しました。
次にタブ「Wireless Security」で暗号方式を設定します。おすすめは協力な共通鍵暗号方式である AES を使用する WPA2-PSK です。詳細はリンク先の基本情報技術者試験過去問道場のページで勉強してください。
次にパスワードを設定します。Key と書いているスペースに入力してください。大小のローマ字と数字、記号を組み合わせた 8 ~ 12 字位のパスワードを自動で生成してくれるホームページ等で作るとよいです。パスワードは必ず控えておいてください。
設定の変更を完了したら、右下のボタン「Save」を押します。
設定の変更を完了したら、右下のボタン「Save & Apply」を押します。
(2).パソコンで Wifi 接続する
設定の変更が終わったら、LAN 線を抜いて、Wifi から自作ルータに接続してみましょう!
パソコンをの Wifi 検索画面で自分でつけた SSID の名前を探してみてください。
残念ながら、raspberry pi3 B+ 内蔵のアンテナは 5 GHz 帯の wifi しかサポートしていないので、2.5 GHz 帯の wifi しか使えないスマホやパソコンからは接続できません。
SSID につなげることができたら、先ほど有線からアクセスしたプライベートアドレス「192.168.1.1」にアクセス( F5 ボタンを押してweb ページをリロード)してみてください。OpenWRT の設定画面を開けたら wifi から自作ルータへアクセス成功です。
(3).物理 LAN ポートを WAN 接続専用に、SSID を LAN 専用にする
Wifi から OpenWRT の設定画面にアクセスできたら、物理 LAN ポート eth0 を WAN 接続専用にして、自作ルータをインターネットにつなげましょう。
また、SSID を LAN 専用にして、自作ルータの wifi を通じてスマホやパソコンをインターネットに接続ましょう*5。
① 物理 LAN ポートを WAN 接続専用にする。
いま、(2)の手順で、現在、自作ルータの SSID に接続しています。この状態で、「Network」の「Interface」を選択し、ボタン「Add new interface」を押します。
ここで、出現するフォームに次のように値を入力し、raspberrypi3 B+ の物理 LAN ポートをインターネット接続専用にします。入力が終わったら、ボタン「Create interface」を押します。
①.Name: WAN
②.Protocol: DHCP cliant
③. Device: eth0
終わったら、次のように WAN のファイヤーウォール設定を WAN に設定します。
Interface>>WAN >> タブ「fire wall」assign firewall-zone:wan
設定したら、ボタン「save」を押します。
ここで、赤い帯がついた「WAN eth0」と書かれた Interface が出てきたのを確認します。青い文字で「interface has 3 pending changes」と書かれていると思います。この状態では保存した設定が実際には自作ルータに反映されていないので、反映します。
ボタン「Save & apply」を押してください。
② SSID を LAN として設定する。
次に、自分で名前を付けた SSID の Wifi を LAN 専用にします。
ボタン「Add new interface」を押して、次のように設定します。
- Name: WLAN(お好みのアルファベット)
- Protocol: Static address(固定 IP アドレス、後ほど指定します。)
- Device: wlan0(本記事では raspberry pi3 B+ の組み込み wifi モジュール)
設定を入力したら、ボタン「Create interface」を押します。
新しく作成した wlan0 の LAN (本記事では WLAN と名付けました。)の設定をしましょう。WLAN の「Edit」ボタンを押して次のように設定してください。
- General Settings → Device: wlan0
- General Settings → IPv4 address: お好みのプライベート IP (本記事では、172.16.123.1 としました。)
- General Settings → IPv4 netmask: お好みのサブネットマスク(本記事では、255.255.255.0 としました。)
設定を入力したら、「Save」ボタンを押してください。
画面が遷移したら、先ほどと同様にボタン「Save & apply」を押して変更した設定を自作ルータに反映してください。
さて、ここまでくると自作ルータの wifi を通してインターネットに接続する準備がほとんど整いました。
先ほど WAN 専用に設定した raspberrypi 3 B+ の物理 LAN ポート eth0 をインターネットに接続するために、自宅の IP アドレスを確認して、必要に応じて自宅ルータの IP アドレスを変更しましょう。
IP アドレスが何を表すのか理解していない人は、総務省の HP や基本情報技術者試験の解説等で理解してください。
さらに、IP アドレスの理解には 2 進数という概念を理解する必要があります。
私たちが普段使っている「1, 2, 3, ... ,10, 11, 12, 13, ... 20, ...」という数の数え方は 10 進数という数の数え方の概念を使っています。 10 進数がわかれば 2 進数も簡単にマスターできます。
2 新数では「0001, 0010, 0011, 0100」というように 1 と 0 だけであらわされます。桁の中で 1 より数が大きくなるときに、その桁で桁上がりが発生します。
2 進数について理解していない方は、調べて理解してください。おすすめは「高校数学の美しい物語」の「二進法と十進法の変換方法と計算例」という記事です。
IP アドレスは、ネットワークのグループであるセグメントまでを表すネットワーク部と同じネットワーク内に存在する機器に割り当てることができるアドレスを表すホストアドレス部に分けることができます。
また、IP アドレスのうち、どこまでがネットワーク部でどこからがホストアドレス部なのか見分けるためにサブネットマスクといいます。
たとえば、自作ルータの IPv4 アドレスが「192.168.1.1」でサブネットマスクが「255.255.255.0」であった場合、ホストアドレスは「192.168.1」までで、ホストアドレス部は「1」だけです。このとき、自作ルータ下の機器には「192.168.1.1 ~ 192.168.1.255」までのアドレスを割り当てることができます*6。
ただし、この時、「192.168.1.0」と「192.168.1.255」については、それぞれ、ネットワークそのものを表す「ネットワークアドレス」と「ブロードキャストアドレス*7」という特別なアドレスに割り当てる番号なので、普通は機器に割り当ててはいけません。
同じセグメント内では同じ IP アドレスのグループになるように IP アドレスを設定する必要があります。
また、同じセグメント内に同一の IP アドレスは存在してはいけません。
つまり、自作ルータの LAN 側 IP アドレスと同じグループで同じグループ内で他の機器に割り当てられていない IP アドレスを自作ルータに割り当ててあげればよいです。
4.USB-LAN 変換器の接続とドライバインストール
Ⅱ. 1. (3) で紹介した USB-LAN 変換器 LUA4-U3-AGTE を自作ルータで使えるようにします。
今回使用している openWRT をインストールした raspberrypi3 B+ の USB ポートに USB-LAN 変換器を挿すだけではドライバが自動でインストールされることは無く、使うことはできません。
windows や一般的によく使われている Linux ディストリビューションの ubuntu 等だと USB を挿すだけでマウスやキーボード等の機器を使うことができるので、windows や ubuntu が他の玄人仕様 OS と比べていかに便利な OS なのか身に沁みます。
(1)必要なソフトウェアパッケージのインストール
まず、 USB-LAN 変換器 LUA4-U3-AGTE で使われているチップセットを特定して、必要なソフトウェアパッケージをインストールします。
手順の概要は「Teraterm で自作ルータに SSH ログイン → lsusb コマンドの実行 → チップセットの特定 → チップセットに対応したソフトウェアパッケージのインストール」です。
あらかじめ、USB-LAN 変換器に搭載されているチップセットを特定できていれば特定する手順(usbutils インストールと lusb の実行)を省いても構いません。
① OpenWRT ソフトウェアパッケージのインストール
自作ルータで USB を使うためには、 OpenWRT に追加でソフトウェアをインストールしなければなりません。
そこで、ソフトウェアパッケージをいくつかインストールします。
たとえば、USB デバイスに内蔵されているチップセットを特定するために必要なコマンド「lsusb」を実行するためには、ソフトウェアパッケージ「usbutils」が必要なので、このパッケージのダウンロードとインストールを例に説明します。
今回インストールしなければならないパッケージの一覧は前述の 2.(1)にまとめたとおりです。
Linux 上級者向けのパッケージインストールは CUI: Character User Interface という真っ黒な画面にコマンド入力が必要な作業であることが多いのですが、OpenWRT では GUI: Graphic User Interface が提供されており、上級者ではなくとも簡単にインストールできます。
それでは、パッケージ「usbutils」をインストールする手順を例にして操作していきます。
まず、ボタン「Update Lists」を押して最新のソフトウェアパッケージを取得します。
最新のパッケージ一覧が表示されたら。Filter の入力欄に「usbutils」と入力してみましょう。
パッケージ「usbutils」が表示されたら、ボタン「install」を選択します。インストールご、ボタンに「installed」と表示されたら、インストール完了です。
USB-LAN ケーブル変換器を使うために必要なパッケージ「kmod-usb-net」も同様にインストールします。
ここで、自分が使っている変換器に内蔵されているチップセットが特定できており、そのチップセット専用のパッケージが公開されていたら、そのパッケージをインストールしてください。本記事では、USB-LAN 変換器 LUA4-U3-AGTE 内蔵チップである ASIX AX88179 専用の Linux カーネルモジュールファイルである ax88179_178a.ko を自動で取得することができる「kmod-usb-net-asix-ax88179」をインストールしました。
「.ko」という拡張子を持つファイルは、「Linux kernel module files」という種類のファイルです。Linux の機能を拡張するためのファイルで、Windows で USB 機器を使用するときに自動的にインストールされるドライバのようなものです。
次図のとおり、関連する依存パッケージを全てインストールするか聞かれるのですべてインストールしてください。
チップセットが特定できていなければ、特定する手順を ② で説明するので、先に ② の手順を実行してから、ここに戻ってきてください。
お手元の USB-LAN 変換器内蔵チップセットに対応するパッケージが無い場合は手動で Linux カーネルモジュールファイルを取り込むことを、他の OS では簡単にできるようですが、OpenWRT だと残念ながら難しいようです*8。
できた方がいれば、やり方をご教授ください。
② 自作ルータへ SSH 接続し、USB デバイスのチップセット特定する(既に特定していれば省略可)
本項目では、USB-LAN 変換器に搭載されているチップセットがわからない場合の対処方法を説明します。
それでは、① でインストールしたパッケージ「usbutils」を使って、 USB-LAN 変換器 LUA4-U3-AGTE に使われているチップセットを特定します。
手順の概要は「usbutils」で使えるようになったコマンド「lsusb」の実行です。コマンドの実行はパソコンから自作ルータにアクセス( SSH 接続)して、自作ルータ上で実施します。
今回、SSH 接続には Teraterm を使用しました。SSH 接続するソフトウェアを持っていなければ、窓の杜からインストールできます。
SSH 接続とは、サーバへの遠隔ログインに使われている技術で安全な通信で利用者認証を行い、通信内容の盗聴や通信相手のなりすましを防ぐ技術です。詳細は基本技術者試験ドットコム等で勉強してください。
それでは、Teraterm で自作ルータへ SSH 接続します。
まず、Teraterm を起動して、入力欄「ホスト」へ自作ルータのプライベートアドレスを入力して OK ボタンを押します。
TCP ポートに入力されている 22 の番号は、ポート番号のうち、Well Known Port 番号という特別なルールで SSH 接続に割り当てられている番号です。TCP ポートと Well Known Port 番号については後述します。
OK ボタンを押した後、セキュリティ警告がでますが、無視して、ボタン「続行」を押してください。
次に、SSH 認証を行います。ここで使用するユーザ名とパスフレーズは、ウェブブラウザで自作ルータにログインするときのものと同じものです。
ログインに成功すると、下の図のように黒い画面に「OpenWrt WIRELESS FREEDOM」という文字が表示されます。
それでは、自作ルータに USB-LAN 変換器 LUA4-U3-AGTE を接続して、コマンド「lsusb」を実行してみます。
teraterm の黒い画面上で「lsusb」と入力して Enter キーを押すと、自作ルータから teraterm へ次の応答が返ってきました。
この結果から、USB-LAN 変換器 LUA4-U3-AGTE には ASIX のチップセットが使われていることが分かったので、4.(1)① で「kmod-usb-net-asix-ax88179」を インストールしました。
筆者のものとは違う機器を使用している人で、asix 以外のチップセットが必要な場合は、各自、該当するチップセットに対応した「usb-net」の派生パッケージを OpenWRT で探してください。
BusyBox v1.33.1 (2021-08-31 22:20:08 UTC) built-in shell (ash)
_______ ________ __
| |.-----.-----.-----.| | | |.----.| |_
| - || _ | -__| || | | || _|| _|
|_______|| __|_____|__|__||________||__| |____|
|__| W I R E L E S S F R E E D O M
-----------------------------------------------------
OpenWrt 21.02.0, r16279-5cc0535800
-----------------------------------------------------
root@OpenWrt:~# lsusb
Bus 001 Device 005: ID 0b95:1790 ASIX Elec. Corp. AX88179 # ←この USB デバイスに内蔵されているチップセット名
Bus 001 Device 003: ID 0424:ec00
Bus 001 Device 004: ID 1ea7:0066 2.4G Mouse
Bus 001 Device 002: ID 0424:9514
Bus 001 Device 001: ID 1d6b:0002 Linux 5.4.143 dwc_otg_hcd DWC OTG Controller
root@OpenWrt:~#
(2) OpenWrt に物理 LAN ポート( USB-LAN 変換器)を新たに追加する
カーネルモジュールをインストールできたら、自作ルータに USB-LAN 変換器を 2 つ目の物理 LAN ポートとして認識させます。3.(3).② で SSID(wifi)を LAN として自作ルータに設定したときと同様の手順を踏みます。
USB-LAN 変換器を raspberry pi3 B+ に接続し、OpenWrt の「Network → Interface」で「Add new interface」ボタンを押して次のように設定します。
- Name: USBLAN(お好みのアルファベット)
- Protocol: Static address(固定 IP アドレス、後ほど指定します。)
- Device: eth1(本記事では raspberry pi3 B+ に接続した USB-LAN 変換器)
設定を入力したら、ボタン「Create interface」を押します。
新しく作成した eth1 の LAN (本記事では USBLAN と名付けました。)の設定をしましょう。USBLAN の「Edit」ボタンを押して次のように設定してください。
- General Settings → Device: eth1
- General Settings → IPv4 address: お好みのプライベート IP (本記事では、10.2.3.0 としました。)
- General Settings → IPv4 netmask: お好みのサブネットマスク(本記事では、255.255.255.0 としました。)
設定を入力したら、「Save」ボタンを押してください。
5.Wifi(SSID)を物理 LAN ネットワークと紐づける
(1)Bridge device (br-lan)に eth1 の LAN を接続してみる
初期状態からある Bridge device の設定を書き換えましょう。
OpenWrt の「Network → devices」で br-lan の「Configure」ボタンを押して次のように設定してください。セキュリティのため、WAN に設定した eth0 とは切り離してください。本記事では「WAN ポート(eth0)→ ファイヤウォール → LAN ポート(eth1)」という構成をつくります。よって、eth0 と eth1 との間に橋を架ける(bridge device に eth0 と eth1 を追加する)とファイヤウォールを通らないで LAN ポートにつながります。
- General device options → Bridge ports: eth0 を外す(インターネット側(wan)から切り離す)
- General device options → Bridge ports: eth1 を選択する。
Bridge device では、物理的なポートを結びつけます。例えば USB-LAN 変換器を認識させて、「eth1、eth2、eth4、...、eth(n)」を選択すると、LAN 側のセグメントに、(n) 個の物理ポートを持つ*9ルータとして使えます。
物理的なポートを接続できますが、無線デバイス(wlan)を結びつけることはできません。無線デバイスと USB-LAN 変換器を同一の LAN(セグメント)内にする設定は(4)で説明します。
この「Network → Devices」の設定で Device の Type を V-LAN に設定した device を作成すると、本記事では詳細に解説しませんが、V-LAN を切り出すこともできます。
V-LAN には、ルータやスイッチングハブ、L2 スイッチ等のネットワーク機器を増やしたり減らしたりせずにネットワーク機器の構成を柔軟に変えることができるというメリットに加えて、副次的な効果として、セキュリティ向上のメリットがあります。
ただし、V-LAN を破壊する脆弱性も報告されており、必ずしも V-LAN を入れておけばセキュリティが万全ということはありません。
(2).SSID(wifi)と USB-LAN 変換器を同一の LAN(セグメント)内に設定する
OpenWrt の Network → Wirelesses で SSID の「Edit」ボタンを押して次のように設定してください。
- Interface Configuration → General Setup → Network:lan または eth1 の LAN(本記事ではUSBLAN)、wlan を選択
本記事では、LAN 側のポートは USB-LAN 変換器のポート eth1 だけなので、eth1 のLAN ポートに付けた名前(本記事では)USBLAN だけ選択すれば足ります。
ここで、bridge device の名前を(openwrt がデフォルトで設定している bridge device なら、lan)選択すれば、bride device に紐づいている物理ポート全てを一度に SSID と同一のネットワークに紐づけることができるはずです。もし、USB-LAN 変換器を追加で raspberry pi3 B+ に挿入していた場合、(3)で bridge device に (n) 個の物理ポートを紐づけていれば、wifi から (n) 個の物理ポートに接続したプリンター等のデバイスに接続できるはずです。
また、v-lan と ssid だけを紐づければ v-lan 専用の wifi として無線 LAN を使えるはずです。
Ⅴ.OpenWRT のセキュリティを高める
1.SSH 接続に 2 要素認証(公開鍵暗号方式と鍵のパスフレーズ)を設定する
Ⅳ 章では、Teraterm で自作ルータに SSH 接続する際に、ユーザ ID とパスワードのみを使用してログインしましたが、Ⅴ 章 2 節では 2 要素認証を使ってログインにおけるセキュリティを高めます。
2 要素認証とは、それぞれ異なる特性を持つ 2 種類の識別情報を用いてユーザ ID の本人認証を行うことを言います。識別情報の特性は、次の 3 つに大別されます。
- ユーザの記憶によるもの(例:パスワード)
- ユーザが所持しているもの(例:SMS で受信するワンタイムパスワード)
- ユーザの身体的特徴によるもの(例:指紋)
本節では、1 (鍵のパスフレーズ)と 2 (公開鍵暗号方式の秘密鍵)を用いた 2 要素認証で SSH ログインします。
(1).公開鍵・秘密鍵ペア(キーペア)の生成
Ⅳ 章でも使用した Teraterm では Ed25519 アルゴリズムのキーペアで SSH ログインできます。
本記事では、Microsoft の公式ドキュメントに従って、 Windows 10 に元々備わっている実行ファイル ssh-keygen.exe を使用してキーペアを作成しました。
Windows 10 を使用している方は公式ドキュメントに従って Ed25519 アルゴリズムのキーペアを作成し、キーのパスフレーズをメモしてください。その他の方は、すみません。他の方法を探してください。
(2).Openwrt への公開鍵(.PUB ファイル)登録
次図のように OpenWRT の WEB-GUI の「System → Administration → SSH-Keys」からキーペアの公開鍵をデプロイ(アップロード)します。
ドラッグアンドドロップで簡単にデプロイできます。
キーペアは複数使用することができ、異なる複数の公開鍵を登録し、それぞれに対応した秘密鍵でログインすることができます。
例えば、システム保守を行う複数のエンジニアに対して、それぞれ固有の秘密鍵を渡し、秘密鍵は自分以外に渡してはいけないというルールをでシステムの保守を実施するとしましょう。そうすれば、同じ root ユーザ権限で自作ルータの保守を行ってもシステムログをみれば、いつ誰がどのような保守を行ったか特定できることになります。
(3).Teraterm から 2 要素認証を使って自作ルータに SSH 接続試行
次に、今 WEB-GUI から自作ルータにデプロイした公開鍵のペア秘密鍵とキーペア生成時に定めたパスフレーズで自作ルータに SSH 接続してみましょう。
次図のように Teraterm の 「SSH 認証画面 → 認証方式」で「RSA/DSA/ECDSA/ED25519 鍵を使う」にチェックを入れると、今までチェックが入っていた「プレインパスワードを使う」が外れます。
「秘密鍵」のところに先ほど生成した公開鍵とペアの秘密鍵のアドレスを入れて(「...」ボタンを押して、秘密鍵のファイルを選択する)、PowerShell でキーペアを生成した時に決めたパスフレーズを「パスフレーズ」の欄に入力します。
認証に成功すると、ブレインパスワード(OpenWRT の WEB-GUI ログイン用パスワード)でログインした時と同じ画面が出てきます。
2.SSH 認証について、 ID とパスワードのみの認証と Wifi からの SSH 接続を禁止する
悪意を持った他者が勝手に root で自作ルータにログインする(root 権限を奪取される)と、致命的なセキュリティインシデントにつながります。
root 権限を使えば、例えば、システムの重要な情報(ログインパスワード等、システムの動作に不可欠なアプリ)を簡単に変更削除できてしまいます。
ここでは重要なファイルについて、細かく解説しませんが、例えば、root でログインした状態で /lib/modules/[ビルド(バージョン)番号] のディレクトリには本記事でインストールする USB-LAN 変換器を動作させるのに必要不可欠なカーネルモジュールファイル .KO ファイルが保管されています(下のコマンド実行例を見てみましょう)。root 権限を持つユーザはパスワードを入力せずに、rm コマンド一つで .KO ファイルを破壊することができます。
実際に、rm コマンドを実行しませんが、.KO ファイルの操作権限を調べてみましょう。
コマンド「cd /lib」を実行し、絶対パスで「/lib」へ移動することができます。
または、次の手順で相対パスを使って「/lib」へ移動することができます。
# ホームディレクトリに移動する。
root@OpenWrt:/boot# cd ~
root@OpenWrt:~#
# 自分が今いるディレクトリ(カレントディレクトリ)を確認する。
root@OpenWrt:~# pwd
/root
root@OpenWrt:~#
# カレントディレクトリの上位ディレクトリに移動する(相対パス参照)。
root@OpenWrt:~# cd ../
# 自分が今いるディレクトリ(カレントディレクトリ)を確認する。
root@OpenWrt:/# pwd
/ # 最上位ディレクトリに移動したことを確認できた。
# カレントディレクトリ内のファイル一覧を取得する。
root@OpenWrt:/# ls
bin etc lost+found proc sbin usr
boot lib mnt rom sys var
dev lib64 overlay root tmp www
# ディレクトリ「lib(相対パス参照)」へ移動する。
root@OpenWrt:/# cd ./lib
# 自分が今いるディレクトリ(カレントディレクトリ)を確認する。
root@OpenWrt:/lib# pwd
/lib
「/lib」に移動したら、ファイル一覧を取得するコマンド「ls」を実行してみましょう。
ここでは、黄緑色のファイルはとても重要なファイルなので削除しないように気を付けてください。
このリストの中に目的のディレクトリに近づく「modules」がありました。
相対パスを使って「modules」を開き、コマンド「ls」を実行してみましょう。ピリオド「.」が数個入った数列で名づけられたディレクトリが見つかりました。これは、自作ルータの OS、OpenWRT のバージョンを表す番号で、どのバージョンを使用しているかによって、番号が違います。
それでは、目的のディレクトリが見つかったので、「ls ./『バージョン番号』」と入力して、このバージョン番号を表す数列で名づけられたディレクトリに移動します。
「.ko」という拡張子を持つファイルがが見つかりました。これらは、「Linux kernel module files」というものです。Linux の機能を拡張するためのファイルで、Windows で USB 機器を使用するときに自動的にインストールされるドライバのようなものです。
これら「.KO ファイル」も不用意に削除しないようにしてください。
つぎに、コマンド「ls -l [ファイル名]」を実行し、ファイルの閲覧、変更、削除の権限を調べましょう。
# ファイル一覧を取得して、次に移動するべきディレクトリを探す。
root@OpenWrt:/lib# ls
config libubox.so.20210516
firmware libubus.so.20210630
functions libuci.so
functions.sh libustream-ssl.so
ld-musl-aarch64.so.1 libvalidate.so
libblobmsg_json.so.20210516 modules
libc.so netifd
libfstools.so network
libgcc_s.so.1 preinit
libjson_script.so.20210516 upgrade
libsetlbf.so wifi
# ディレクトリ「modules」に移動する。
root@OpenWrt:/lib# cd ./modules
root@OpenWrt:/lib/modules# ls
5.4.143 # 【注意】 この番号は使用しているソフトのバージョンを表し、必ずしもこの番号とは限らない。
# 目的のディレクトリへ移動する。
root@OpenWrt:/lib/modules# cd 5.4.143
root@OpenWrt:/lib/modules/5.4.143# ls
brcmfmac.ko nf_log_common.ko snd-timer.ko
brcmutil.ko nf_log_ipv4.ko snd.ko
cfg80211.ko nf_log_ipv6.ko soundcore.ko
compat.ko nf_nat.ko usbhid.ko
crc-ccitt.ko nf_reject_ipv4.ko vfat.ko
evdev.ko nf_reject_ipv6.ko x_tables.ko
fat.ko nls_cp437.ko xt_CT.ko
hid-generic.ko nls_iso8859-1.ko xt_FLOWOFFLOAD.ko
hid.ko nls_utf8.ko xt_LOG.ko
ip6_tables.ko ppp_async.ko xt_MASQUERADE.ko
ip6t_REJECT.ko ppp_generic.ko xt_REDIRECT.ko
ip6table_filter.ko pppoe.ko xt_TCPMSS.ko
ip6table_mangle.ko pppox.ko xt_comment.ko
ip_tables.ko slhc.ko xt_conntrack.ko
ipt_REJECT.ko snd-bcm2835.ko xt_limit.ko
iptable_filter.ko snd-compress.ko xt_mac.ko
iptable_mangle.ko snd-hwdep.ko xt_mark.ko
iptable_nat.ko snd-mixer-oss.ko xt_multiport.ko
nf_conntrack.ko snd-pcm-dmaengine.ko xt_nat.ko
nf_defrag_ipv4.ko snd-pcm-oss.ko xt_state.ko
nf_defrag_ipv6.ko snd-pcm.ko xt_tcpudp.ko
nf_flow_table.ko snd-rawmidi.ko xt_time.ko
nf_flow_table_hw.ko snd-seq-device.ko
root@OpenWrt:/lib/modules/5.4.143#
root@OpenWrt:/lib/modules/5.4.143# ls -l ax88179_178a.ko
-rw-r--r-- 1 root root 26496 Jul 2 11:31 ax88179_178a.ko
# ↑ 左から所有者(このファイルの所有者はroot)、所有グループ、その他ユーザの権限
# root ユーザは読み込み(r)と書き込み(w:ファイルの内容変更(削除を含む))の権限を持っている。
root@OpenWrt:/lib/modules/5.4.143#
もっとファイル権限の読み方について知りたい人はググって(google 検索して)ください。
なんとなく、root 権限を悪意のある人物に乗っ取られる危険が分かったでしょうか?
これで、悪意のある人物が root 権限を持てば、あなたのデバイスを動かすプログラムを何か意図しない他のものに変えてしまうことも、破壊してしまうこともできるのです。
root 権限への認証試行を簡単にできないようにする必要があります。
① ID と PW のみによる SSH 認証の禁止
そこで、まず、他者が容易に自作ルータへ root 権限で SSH 接続できないように、パスワードのみによる root 権限での SSH 接続を禁止し、かつ本章 2 節で解説した公開暗号方式のキーペアを使用した 2 要素認証でしか root 権限で SSH 接続できないようにします。
次図のように OpenWRT の WEB-GUI で「System → Administration → SSH Access」で 「Allow root logins with password」のチェックを外し、「Password authentication(Allow SSH password authentication)」のみにチェックを入れます。
これで、公開暗号方式のキーペアでしか SSH 接続ができなくなりました。
試しに、先ほどと同じように WEB-GUI と同じパスワードだけを使って root 権限で自作ルータに SSH 接続してみましょう。次図のように認証に失敗します。
② Wifi からの SSH 接続の禁止
次に、Wifi からの接続を禁止しましょう。Wifi から root への SSH 認証をできるようにしていた場合、電波が届くところならだれでも root への SSH 認証を試すことができます。
誰でも試せるということだけでも、セキュリティ上のリスク足りえます。
自作ルータを触れない人は root に SSH 接続できなくしてしまいましょう。
「Interface」で本記事で「usbLAN」という名前を付けた LAN 接続に用いる電気的接続点である「eth0」からのみ root へ SSH 接続を試せるようにします。
3.SSH 接続に用いるポート番号を Well Known Port から変更する。
インターネット上でホームページの閲覧、メールの送信、そして本記事で解説している SSH 接続にはそれぞれ、Well Known ポート番号という固有の番号が割り当てられています。
ここでいうポート番号とは、TCP/IP のポート番号のことを言います*10。 Web ブラウザ(例:Edge、Firefox、Chrome、Safari)、メーラー(Outlook、Thunderbird、Gmail)等のアプリを識別するための番号であり、正しく識別できなければうまく通信ができません。
Well Known ポート番号の値は世界各国共通なので、世界中どの国からインターネット上でホームページの閲覧、メールの送受信をしても問題なく通信ができます*11。
逆に、自作ルータに簡単にアクセスできないように、自作ルータへ SSH 接続するときに使うポート番号を世界共通の Well Known ポート番号(SSH リモートログインプロトコルのポート番号は 22 番)から Well Known ポート番号を割り当てられていないその他の番号へと変更します。
次図のように OpenWRT の WEB-GUI で「System → Administration → SSH Access」で Port に入っている「22」を削除し、Well Known でなく、かつ、使用している OS で制約のない動的に充てることができる任意の番号を入力し、「Save $ Apply」を押します。
たとえば、windows10 なら、IANA が提言する範囲「49152 ~ 65535」のどれかを指定すると無難です。
変更が完了したら、新たに指定したポート番号で SSH 認証してみましょう。
4.ファイヤウォール(ホワイトリスト型)を設定する
セキュリティが強固な「ホワイトリスト型」ファイヤウォールを設定します。
普通、私たちが使っているスマホや家庭用ルータでは基本的にほどんどの通信を許可し、危ない怪しい通信だけを遮断する「ブラックリスト型」と呼ばれるファイヤーウォールを適用しています。
ちなみに、ホワイトリスト型を細かく設定するととても難しいです。細かい設定ができるようになれば、高度情報処理技術者試験の域に達するんじゃないでしょうか?しらんけど(私自身ホワイトリストとの細かい設定何も分からんですし、情報処理技術者試験も持っていません)。
今回は、元なんちゃってテレフォン情シス*12の私でも設定範囲を把握できる内容にします。
UbuntuによるEco Linuxサーバ構築記さんの記事を参考に OpenWRT のファイヤウォールを設定しました。
元の記事では V-LAN という概念についても設定を行っています。もっと勉強したい方は元の記事へ。
(1) ファイヤウォールの設計方針を立てる
設定の意図となる細かい話は注釈の参考文献の中から拾ってきました。
① ホワイトリスト方式で通信を許可(Windows10 専用)
原則すべての通信を無視又は拒否。例外を「ホワイトリスト」に登録して、通信を許可する。※ 本記事では Windows10 用のホワイトリストを設定ました。iOS、Andoroid についてはご自身で追加の設定をして頂くか、別な対応をする必要があります。別な対応方法は6.② に後述します。
② インターネット ⇒ WAN の通信は原則無視
WAN がインターネットに一切の応答を返さないので、WAN はインターネットから存在を認知されない。
自分のネットワーク内の情報を盗み見られないようにできるというメリットがあります。不用意に不特定多数の相手に応答を返していては、自身のネットワーク情報をスマホやパソコンでどんなアプリケーションを使っているかということまで盗撮される恐れがあります。最悪の場合、この盗撮結果で得た情報とアプリの脆弱性情報を使った悪意のあるハッキングやクラッキングの被害にあってしまうかもしれません*13
③ LAN → WAN の WEB ブラウジングに必要な通信を許可する(ホワイトリスト登録
WEB ブラウジングに必要な DNS、NTP、HTTP、HTTPS 通信をホワイトリストに登録し、通信を許可する*14
NTP: Network Time Protocol は時刻補正に必要なプロトコルです。WEB ブラウジングに必ずしも必要不可欠ではありませんが、デバイスの時刻がインターネットの時刻とずれているとアプリが正常に動かないことがありますので、許可します。たとえば、OpenWrt の OS から OpenWrt の Web サイトに向かってソフトウェアパッケージのダウンロードを要求する際(本記事 Ⅳ.(4)でも、usb-net と usbutil をダウンロードしました)、自作ルータの時刻を適切に補正できていなければ、エラーが発生して、ソフトウェアパッケージをダウンロードできません。
④ LAN ⇒ WAN の通信を原則拒否
LAN が WAN の存在を 認知できるが通れない。3 で許可した(ホワイト)リストに登録した通信だけが通れる。
(2) OpenWRT の設定情報をバックアップする。
OpenWRT の WEB-GUI 「System → Backup/ Flash Firmware」でバックアップを保存します。
Backup のボタン「Generate archive」を押すと、バックアップを保存することができます。
Restore のボタン「Upload archive」を押すと保存したバックアップを読み込めます。
(3) ルータの通信ログをとる
ログをとれるようにして、意図しない動作不良が生じたときの解析につかいます。
OpenWRT の WEB-GUI 「Network → Firewall → General Settings」で Zoons の「Edit」ボタンを押し、「Advanced Setttings」に入り、「Enable logging on this zone」にチェックを入れてください。
「 lan → wan 」と「 wan → lan 」について、それぞれ設定してください。
LAN、WAN、usbLAN(Wifi の LAN も、USB-LAN アダプターで追加した eth1 の LAN も 「 lan → wan 」で設定できます。)
設定入力が完了したら、「Save & Apply」を押すのを忘れずに。
(4) WEB ブラウジングに必要な通信をホワイトリストに登録する
ファイヤーウォールにホワイトリストの設定を追加する前に、OSI 参照モデルまたは TCP/IP プロトコルスイートで TCP について復習しましょう。Teraterm のログイン時にも出てきた TCP ポート番号とは、トランスポート層の TCP(Transmission Control Protocol) でパケットのやり取りを行うために、各アプリケーションに割り振られる番号のことです。
最もよく使われるアプリケーションに専用の TCP ポート番号として、それぞれ Well Known Port 番号が割り当てられています。SSH 接続なら 22、Web ブラウジング通信なら、443(HTTPS 通信)と80(HTTP 通信)です。残りの本記事に必要な Well Known Port 番号は後述します。
では、設定作業に戻ります。ファイヤウォール(FW)の防御力を体感するために、管理用のメンテナンス通信(LAN 内から root への SSH 接続と WEB-GUI のブラウジング)以外を拒否してみましょう。
① LAN から root への SSH 接続を許可する
保守用として、同一セグメント内からの WEB-GUI のブラウジングと、root への SSH 接続を許可します。OpenWRT の WEB-GUI 「Network → Firewall → Traffic Tules」で次図のように設定してください。
次図のように設定してください。Sorce ポート欄に入力した「49152-65535」は windows10 の中で Welknown ポート以外であり、自由に使うことができるポート番号です。windows10 ではユーザが使用する WEB ブラウザ等のアプリに対してこれらの番号をランダムに割り当てます。
Destination address を「192.168.1.1」だけに限定したのは宛先を自作ルータに限定するためです。
3.で SSH 接続につかるポート番号を Well Known の「22」番から変更していれば、Destination ポートにその変更後のポート番号を追加するのを忘れないようにしてください。本記事では「14378」に変更しましたので、この番号を追加しました。
設定入力が完了したら、「Save & Apply」を押すのを忘れずに。
② LAN から WEB-GUI へのブラウジングを許可する
HTTPS 通信と HTTPS 通信を許可します。HTTPS 通信とは暗号化した通信のことです*15。残念ながら、自作ルータはデフォルトでは HTTP 通信しかしてくれません。SSL/TSL 証明書*16をインストールする追加の処置が必要です。興味があるかたは調べてみてください。
次図のように設定してください。
Destination address を「192.168.1.1」だけに限定したのは宛先を自作ルータに限定するためです。
ポート番号「443」は HTTPS 通信の Well known port 番号、「80」は HTTP 通信の Well kown port 番号です。
設定入力が完了したら、「Save & Apply」を押すのを忘れずに。
では、試しに、原則として全ての通信を遮断してみましょう。
「 wan → lan 」の通信は原則として無視します。Input、Output、Forward を全て「drop」に設定してください。
続いて、「 lan → wan 」の通信を次図のように全て reject します。
さて、この状態で WEB-GUI の画面を更新し、さらに、インターネットブラウジングをしてみましょう。筆者は、次図のように、WEB-GUI と google を開いてみました。
OpenWRT の WEB-GUI には入ることができましたが、インターネットを見ることができません。これが、パケット型フィルタリングの防御力です。
Teraterm を用いて SSH ログインも試してみましょう。認証に成功するはずです。
ただし、2.② で Wifi からの SSH 認証を禁止していれば、Wifi からは SSH 認証ができません。
③ インターネット WEB ブラウジングに必要な通信を許可する
次の表に従って、同様に設定を追加していきます。
OpenWrtのFirewall設定を読み解きVLAN含めてセキュアなフィルタ設定を行うさんの記事からのほぼコピペですが、次の変更を加えました。
- lan 側の SourcePort : Windows10 用の Well Known 以外に書き換えています。
- wan ←デバイス→ lan の通信:② で原則 Drop にしているので、443(HTTPS) と 80(HTTP) を許可(accept)※ 本設定は Windows 10 用であり、iOS 等他の OS でWEB ブラウジングする際には追加の設定を自身でして頂くか、別な対応をする必要があります。別な対応方法は、6.② に後述します。
これらのルールを決めるためには WEB ページがどのような手順を踏んで画面に表示されるかを理解する必要があります。
53 と 67 は DNS: Domain Name System プロトコルの Well known port 番号です。 WEB ページを開くためには、見たい WEB サイトのグローバル IP アドレスを知っているか、URL を知っている必要があります。URL で WEB サイトを開くときには、DNS を使って、URL をグローバル IP アドレスに変換しています。
また、123 は NTP: Network Time Protocol といい、機器の時刻を何かしらの基準に合わせるためのプロトコルです。基準の時刻はシステムにより、それぞれ違います。インターネットの時刻だったり、NTT の時報だったり、独自に受信した GPS: Ground Positioning System の時刻情報だったりします。
また、最後の Source Zone が「デバイス」「wan」になっている 2 行は、あなたの WEB ブラウザで WEB ページを表示する際に、からインターネット上に WEB ページを公開している WEB サーバから送られてくる情報( HTTP レスポンス)を LAN 側に通過させるための設定です。※ これらは Windows 10 用であり、iOS 等他の OS でWEB ブラウジングする際には追加の設定を自身でして頂くか、別な対応をする必要があります。別な対応方法は(6).② に後述します。
表.追加で必要な設定
名前 | プロトコル | Source Zone | Source Port | 宛先ゾーン | Destination Port | Action |
Allow-LAN-to-System-TCP | TCP | lan | 49152-65535 | デバイス | 53 80 443 | accept |
Allow-LAN-to-System-UDP | UDP | lan | デバイス | 53 67 123 | accept | |
Allow-LAN-to-System-UDP-Ret | UDP | デバイス | 53 67 123 | lan | accept | |
Allow-DeviceOutput2WAN-4WinWebBrowsing | TCP/UDP | デバイス | 49152-65535 | wan | 53 67 123 80 443 | accept |
Allow-DeviceOutput2WAN-4WinWebBrowsing | TCP/UDP | wan | 53 67 123 80 443 | wan | 49152-65535 | accept |
以上の設定を完了すると、インターネット(wan)側からあなたのネットワーク(lan)側へ通れる通信は、あなたが WEB ページを閲覧したいと要求した結果、インターネット側から返答として送られてくる情報だけになりました。
ただし、HTTP レスポンスを装った返答は防ぐことができず、lan 内に侵入する恐れがあります。しかしながら、HTTP レスポンスを装った通信を投げるだけでは、プライベート IP アドレスもアプリを識別するための TCP ポート番号も lan の外からは簡単にわからないので、あまり気にする必要はありません。
また、同様に改ざんされた HTTP レスポンスに埋め込まれた悪意のあるウィルスも防ぎきれません。これを防ぐためには、本記事で使用している静的なフィルタ「パケット型フィルタリング」ではなく、動的なフィルタ「スティト・フル・インスペクション」の採用あるいは、ウェブ・アプリケーション・ファイヤウォール(WAF)、ウィルス対策ソフト等、アプリケーションプログラムの構造や動作を OSI 参照モデルレイヤ 7 のレベルで解析するソフトウェアが必要です。セキュリティは多段防御が基本です。ルータのファイヤウォールだけでは無く数個のセキュリティ対策を講じましょう。
どの対策をとるかは、個人、組織が扱う情報の重要さや組織の規模によって異なります。
(5)ホワイトリスト以外の通信を原則として禁止する(最後の確認)
(4)で試した手順です。すでに設定されているかもしれません。
「 wan → lan 」の通信は原則として無視します。Input、Output、Forward を全て「drop」に設定してください。
続いて、「 lan → wan 」の通信を次図のように全て reject します。
以上で、WEB 閲覧専用ホワイトリスト型ファイヤウォールの設定が完了しました。
確認作業として、インターネットで何かを閲覧してみましょう。
(6)iPhone や Android スマホ等で不便無く、Web ブラウジングするには
① iPhone や Andoroid でホワイトリスト型ファイヤウォールを不便無く使うには
本記事で設定したホワイトリストは Windows10 専用です。(4).② の表最後の 2 行に追加したポート番号「49152-65535」は、3.の冒頭で紹介したとおり、 Windows 10 で各アプリに動的に割り当てられるポート番号です。例えば、Microsoft Edge の各タブ毎に別々のポート番号が割り当てられます。
Windows 10 用の TCP ポートのみ(4).② の表最後の 2 行に追加した状態では、例えば、iOS 15.1 の Microsoft Edge で twitter を閲覧しようとすると、次の図のように、タイムラインを表示することができませんでした。
iOS には「Apple ソフトウェア製品で使われている TCP および UDP ポート」というものが独自に定義されています。これらから必要なものを追加すると、この問題を解決できると思われます。本記事では挑戦していません。
Andoroid デバイスについては、デバイスを持っていなかったので、 twitter が開けないなどの問題があるか確かめていません。
② iPhone や Android でインターネットブラウジングを快適にするためにホワイトリスト型をやめる。
完全なホワイトリスト型のファイヤウォールを諦めて、部分的にブラックリスト型を適用します。
具体的には、インターネット側からの応答を原則 accept します。
まず、「Network → Firewall → Traffic Rules」で(4).② の表最後の 2 行について、次図のように Enable のチェックボックスを外して「Save & Apply」ボタンを押して無効にします。
次に、fairewall の「General Settings」タブで次図のように wan → [REJECT(空白)] の Output を「accept」に変更して「Save & Apply」ボタンを押します。
これで、iPhone の edge でも問題なく twitter タイムラインを見ることができるようになりました。
ただし、現在、セキュリティホールが空いています。インターネット側(wan 側)からの HTTP レスポンスがルータ、ルータ直下にある端末の脆弱性のある TCP ポートへアクセスできるようになっています。
そこで、wan 側からのレスポンスのうち、一般的に脆弱性のあるポートに対するものを reject しましょう。「Network → Firewall → Traffic Rules」で次の表のように設定してみましょう。
名前 | プロトコル | Source Zone | Source Port | 宛先ゾーン | Destination Port | Action |
REJECT-Device2LAN4WinSecurity | TCP/UDP | デバイス | 1-52 54-66 68-79 81-122 124-442 444-1023 | lan | any(空白) | reject |
REJECT-WAN2Device4WinSecurity | TCP/UDP | wan | any(空白) | デバイス | 1-49151 | reject |
ただし、これは windows についてしか考慮していません。windows では、windows のアプリケーションに対して、 必ず「49152-65535」のポート番号を割り振るので、これらを一切含まない Well Known Port 番号を基本的に全て reject しました。
ただし、Well known port のうち、自作ルータの保守に必要な「デバイス → lan」方向への「80(HTTP)」「443(HTTPS)」「22 と 14378(SSH)※ 本記事で Well Known の 22 に代わって独自に定義したものを忘れずに」の通信と名前解決と時刻補正の通信に必要な「53(DNS)」「67(DHCP)」「123(NTP)」については reject の対象としていません。
iOS と Andoroid については自身で調べてみてください。
reject にしているので、ログを調べ、どのポートの通信が reject されているか特定できれば、追加で必要な設定がわかるかもしれません。drop に設定している通信はガン無視され、ログも残りません。
一般的な脆弱性だけを網羅すれば完璧だということは無く、緊急性の高い脆弱性で更新プログラム(セキュリティパッチ)の公開がまだのものに対して応急処置として閉じて(reject)おくべきポート番号も存在します。例として 2019 年に公開された windows の脆弱性を巻末の宿題に挙げているので、見てみてください。緊急性の高い脆弱性は常に公開され続けているので、すべてをアマチュアの人間が把握することは難しいでしょう。
Ⅵ.終わりに(自作ルータを使い続けるために必要なこと)
本記事は以上です。楽しんでいただけたでしょうか?市販品と同等にセキュリティ対策を施した Web 閲覧専用の自作ルータが完成しました。
また、ファイヤウォールでセキュリティを維持する大変さを体験してもらえたかと思います。
1.最新のセキュリティ対策を施すことの重要性
しかし、今万全のセキュリティ対策を施していたとしても、明日にはこの自作ルータにセキュリティホールが空いてしまうかもしれません。
セキュリティホールには既に攻撃が確認されているものとベンダや国等の公的機関が先んじて公開し、注意を促しているものの未だ攻撃が確認されていないものがあります。
いわゆる悪意のあるハッカー、クラッカーと呼ばれる悪者達が常にこれらのセキュリティホールからあなたのパソコンやスマートフォンに入っている大切な情報を狙っています。
彼らにあなたの大切な情報を渡さないためにも、セキュリティホールに対するパッチ(更新ソフト)が公開されたら、あなたの自作ルータに速やかに適用してください。
宿題1:パッチを当てる(更新ソフト適用)の手順を調べて実行(既に最新の状態なら後日)
2.障害時に復旧するための config について
また、ソフトを更新した直後に、更新ソフトが原因でシステム障害が起こるなんてことも IT システムの世界ではしょっちゅうおこります。皆様も iPhone やスマホのアプリを更新したとたんに不具合に見舞われたことは 1 度や 2 どでは無いはずです。
こんな時、すぐに更新前の状態にもどしたいですよね?ゲームのセーブポイントみたいなものがシステムにもあれば簡単に戻せるのにと思いませんか?
なんとあるのです。色々な呼び方があると思いますが、OpenWRT を含む多くのネットワーク機器ではこのセーブポイントを「config」と呼んでいます。
宿題2:「config」の使い方を復習、最新の「config」を(PC 側に)保存、Teraterm で「config」の権限を確認
OpenWRT の「config」バックアップ方法を復習して、最新の「config」バックアップを自作ルータ上に作成し、Teraterm を使って自作ルータから PC 上にダウンロードしましょう。
壊れたらすぐに直せる raspberry pi を使っていたとしても、何度も初期設定を繰り返していると辛いものがあります。定期的なアップデートや緊急パッチ等その他のシステムに変更を加える操作の前にはしっかりとバックアップを取る習慣をつけましょう。
筆者も本記事を執筆中に Firewall の設定に失敗し、OS を Flash するところからやり直すハメとなり、バックアップからすべての設置を復元しました。
ファイヤウォールの設定ファイルがあるディレクトリにさえ、root ならパスワード認証も無しにアクセスすることができます。root を乗っ取られると大変なことになります。本記事終了後にファイヤウォールの設定ファイル(config)を root で探し、ls -l で権限を確認してみてください。
3.保守用端末の IP アドレスによる制限について
宿題3:firewall で root への SSH 認証、および WEB-GUI 管理画面へのアクセスできるデバイスの IP アドレスを制限する
本記事では同じネットワーク内からならどの端末からでも、IP アドレスを知ってさえいれば、自作ルータに SSH 接続試行することもできます。
Firewall を設定し直して、特定の IP アドレスにだけ管理用 IP アドレスへの通信を許可してみましょう。これを行うには自作ルータの保守を行う端末の IP アドレスを固定する必要があります。
4.緊急性の高い脆弱性に対して、ファイヤウォールでできる応急対応
宿題4.緊急性の高い脆弱性に対して、ファイヤウォールでできる応急対応してみる
緊急性の高い脆弱性に対する更新プログラムが未だ公開されていなくても、ファイヤウォールを使えば、脆弱性に対する応急対応をとれるかもしれません。
例えば、マイクロソフト公式が公開している脆弱性情報『Web Services on Devices API のメモリ破損の脆弱性」の回避策 - CVE-2009-2512*17』では「受信 TCP ポート 5357、5358 および送信 UDP ポ ート 3702 をブロックする」という手法を総会しています。
リンク先の記事では、windows 10 のファイヤウォールを使うようにアドバイスされていますが、ここでは、自作ルータのブラックリストとしてブロックする方法を考えてみましょう。どのような設定をすればよいでしょうか?
余談
本記事は所属組織の有志で休暇中に集まり、休暇中に実施する自主的な Off-JT*18 で使う研修教材として夜な夜な晩酌しながら執筆しました。技術的な話をこんなにたくさんの文字に起こすのは卒業論文以来の久しぶりで書いていて楽しかったです。
いずれは、システム調達や保守委託管理を担う人材の育成を目的として、本記事と同等以上の体験学習を業務中にさせてもらいたいと勝手に願っています。ただ、アマチュアである私がやるより、プロに執筆と研修開催を外注する方がコスパ的に妥当な気がしますねー(私も受講したい)。
近年、業務の効率化で IT システムを利用する組織が増えて続けています。むしろ、全く IT システムを利用していない組織はほとんどいないのではないでしょうか?
人員の不足等により、この流れはますます加速し、システムの開発・運用の一端に関わる人も増えるでしょう。
本記事を最後まで読んでいただいた皆様は、これだけではシステムを開発する側の領域に達することは到底できませんが、社内ネットワーク等の保守委託管理や調達を任された際に、ネットワーク保守に関する業者の話が少しだけわかるようになったと思います。
最後に、本記事を読んだことがきっかけで、IT システムの裏側であるネットワークの知識が少しでも身に付き、現在・将来の業務に役にたてる人が少しでもいればとてもうれしいです。ありがとうございました。
*1:ただし、使い古してフォーマットを繰り返した SD は容量が小さくなっているので、注意が必要です。
*2:
この数字は IP アドレスといい、ネットワーク上の住所のようなものです。インターネットを含むすべてのネットワークには IP アドレスが割り振られており、コンピュータ達は IP アドレスによって、web サイトや機器のネットワークにおける位置を認識します。
IP アドレスには「グローバル IP アドレス」と「プライベート IP アドレス」の 2 種類があります。
グローバル IP アドレスはインターネット上(世界中に)に 1 つしか存在しません。誰でもアクセスできるインターネット上で、個々のサイトやシステムのありかを区別するためです。同じ住所が重複して存在していると目的地がどっちなのか区別がつかなくなります。
一方、プライベート IP アドレスは世界中に同じものがいくつもあります。プライベートアドレスは会社や家の中の人だけがアクセスでき、外からは見れないネットワークに割り振るネットワーク上の住所です。ネットワークの管理者が自由に割り振ることができますが、会社や家の中で IP アドレスを重複させてしまうと、会社のシステムや家のパソコンが目的地の住所を区別できずに、エラーを吐き出します。
詳しいことは、基本情報技術者試験過去問道場の解説ページを勉強するとよくわかります。プライベート IP とグローバル IP の関係等も学べます。
*3:eth:Ethernet、、eth0:有線 LAN ポート 0 番
*5:今回作成している自作ルータでは raspberry pi3 B+ に搭載されているアンテナの 5 GHz 帯 Wifi に対応していない 2.5 GHz 帯のスマホ等は接続できません
*6:サブネットマスクを用いたホストアドレスの分離には 2 新数の概念について、理解が必須です
*7:ブロードキャストアドレス:同一セグメント下全てのアドレスを対象とするためのアドレス
*8:CentOS などのディストリビューションではチップセット制作会社が提供する Makefile 等一式を使って「make」というコマンドにより、.ko ファイルを生成できるようですが、筆者は OpenWRT でこの手順を再現できませんでした
*10:ルータ、ネットワークスイッチ等のネットワーク機器にも物理的な穴を識別するためにポート番号という番号を振りますが、 TCP/IP のポート番号とは異なります
*11:SHIFT-JIS、UTF-8 の固定などで文字化けの問題が生じることもありますが、ここでは問題としません
*12:電話とメールで保守委託業者との調整するのが主な仕事の人という意味のつもり
*13:参考文献:ホワイトハッカー入門 ( 2020 年 阿部ひろき)pp.53-78
*14:参考文献:インフラ/ネットワークエンジニアのためのネットワーク技術&設計入門 第2版 ( 2019 年 みやたひろし)p.227
*15:参考:SSLの仕組み(「国民のための情報セキュリティサイト(総務省)」
*16:参考: WEB サイトが改ざんされていないことを示すために使う
*17:共通脆弱性識別子CVE(Common Vulnerabilities and Exposures)とは、個別製品中の脆弱性を対象として、米国政府の支援を受けた非営利団体が採番している識別子。