Raspberry Pi OSを久々にインストールしたところ便利機能に今更気づいた

Raspberry Pi OSの64bit版をインストールするにあたり,windows用のイメージ書込みソフトを使ってみると
オプション欄に無線LANやらSSHやらの設定項目があることに今更気づく。
これさえあればディスプレイやマウス,キーボードを繋げる必要もなくSSHで遠隔接続すれば済むので大変便利。

IPアドレスDHCPにより割り当てられるが,サーバとして使いたい場合は固定IPを設定したい場合がある。
固定IPを割り当てるに当たりネットだとdebianだと/etc/network/interfacesの中身をいじればいいとの情報だったが,いざ開いてみるとほぼ空っぽに近かった。
昨今のRaspberry Pi OSは/etc/dhcpcd.confに設定を記述する形になるようだ。

interface wlan0
static ip_address=割り当てるIPアドレス
static routers=ルータのIPアドレス
static domain_name_servers=ルータのIPアドレス

ネットワーク設定を反映するためネットワークサービスを再起動させようと思ったが,何故かできなかったため本体を再起動させた。

$ sudo reboot

IP-PBX(Asterisk)を用いた簡易的な内線構築について

オープンソースIP-PBXソフトウェアAsteriskを用いて簡易的な内線構築したためメモを残す。

前提条件

  • 公衆回線には接続せずLAN内で完結させる。
  • ソフトフォンとVoIPアダプタを接続した電話機間での通話を可能とする。

ソフトウェア

  1. Debian11(Widnows10のHyper-V環境下)
  2. Asterisk16
  3. AGEphone

使用物品

  1. VE-TA10
  2. 黒電話

Asterisk導入

パッケージ管理システムにてインストールできるバージョンの確認。

$ apt policy asterisk
asterisk:
インストールされているバージョン: (なし)
候補: 1:16.16.1~dfsg-1+deb11u1
バージョンテーブル:
1:16.16.1~dfsg-1+deb11u1 500
500 http://security.debian.org/debian-security bullseye-security/main amd64 Packages
1:16.16.1~dfsg-1 500
500 http://ftp.jp.debian.org/debian bullseye/main amd64 Packages

wikiによるとバージョン16.Xは年内でサポート終了するようなので,
長期的に使うのであれば18.Xを仕入れたほうがいいと思われる。

今回は手軽に導入することを目指し,aptでインストールする。

$ sudo apt install asterisk

インストール完了した後設定ファイルをバックアップ

$ sudo cp /etc/asterisk/sip.conf /etc/asterisk/sip.conf.orz
$ sudo cp /etc/asterisk/extensions.conf /etc/asterisk/extensions.conf.orz

元ファイルを削除しまっさらな状態から新設定ファイルを作成する。

$ sudo rm /etc/asterisk/sip.conf
$ sudo rm /etc/asterisk/extensions.conf

$ sudo vi /etc/asterisk/sip.conf
[general]
context=default
port=5060
bindaddr=0.0.0.0
srvlookup=yes
disallow=all
allow=ulaw
allow=alaw
allow=gsm
language=ja

[201]
type=friend
defaultuser=201
secret=pass
canreinvite=no
host=dynamic

[202]
type=friend
defaultuser=202
secret=pass
canreinvite=no
host=dynamic

$ sudo vi /etc/asterisk/extensions.conf
[default]
exten => 201,1,Dial(SIP/201,30,r)
exten => 201,2,Hangup()
exten => 202,1,Dial(SIP/202,30.r)
exten => 202,2,Hangup()

Hyper-Vのネットワーク設定変更

デフォルトのスイッチ設定だとNAT環境下のためLAN内から接続ができない。
接続の種類を外部ネットワークに設定した仮想スイッチを作成し,ネットワークアダプタに設定した。

Debian環境にてネットワークアダプタが追加されていることを確認し,接続する。

接続後同一セグメント内のIPアドレスが割り振られていることを確認する。

クライアントアプリインストール

android端末とWindows10にそれぞれクライアントアプリをインストールする。
今回はAGEphoneを使用した。

ドメインSIPサーバアドレス:サーバのIPアドレスDebian環境のIPアドレス
ユーザIDor内線番号:201もしくは202
認証ID:201もしくは202
パスワード:pass

うまく電話がかかり,通話もできることを確認した。

VE-TA10セットアップ

VE-TA10のネットワーク端子にLANから分岐させたLANケーブルを挿入し,設定端子には設定用パソコンとLANケーブルを直結する。
電源を入れて設定用PCから「http://setup.html」にアクセスする。
WAN側設定の動作モードをアダプタモードに指定し,DHCPにてIPアドレスを自動取得させる。

050IP電話設定画面にて設定を入力する。

市外局番:空欄
発信者番号通知:する
IP着信中ランプ表示:しない
VoIP電話番号:201もしくは202
VoIPサーバ:サーバのIPアドレスDebian環境のIPアドレス
サービスドメイン:サーバのIPアドレスDebian環境のIPアドレス
VoIPユーザID:201もしくは202
VoIPユーザパスワード:pass


接続テストを実施しても何故か接続できない時があるが,一度設定を登録させてから再挑戦したところうまくいった。
VoIPアダプタを増やせば固定電話同士での内線電話ごっこも可能になると思う。

Debianにおける一般ユーザに対するsudo権限付与

Debianにてaptコマンドを使用してインストールしようとしたらエラーが出た。

$ sudo apt update
[sudo] sansuke のパスワード:
sansuke は sudoers ファイル内にありません。この事象は記録・報告されます。

UbuntuRaspberry Pi OSではデフォルトで作成したユーザがsudoグループに所属していたが
Debianでは完全に一般ユーザとしての権限しか与えられていないようだ。

$ su

root権限に切り替える。この際にわざわざsudo を頭につけたら弾かれる。(冷静に考えれば道理だが)

# cat /etc/group
sudo:x:27:

グループへのユーザ割当状態を確認する。今のところsudoグループには何も割り当てられていない模様。

# gpasswd -a sansuke sudo
ユーザ sansuke をグループ sudo に追加

ユーザ追加のコマンドは他にもあったが,(usermod)他のコマンドではオプション忘れにより予期しない設定が置き換わる危険性があるためこちらを選択。

これでsudoが使える様になるはずだがなぜかできない。
ターミナルやGUI画面をログアウトしてもだめだったが,再起動したらうまくいった。

$ sudo apt update
[sudo] sansuke のパスワード:
ヒット:1 http://ftp.jp.debian.org/debian bullseye InRelease
ヒット:2 http://ftp.jp.debian.org/debian bullseye-updates InRelease
ヒット:3 http://security.debian.org/debian-security bullseye-security InRelease
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
パッケージはすべて最新です。

windows10のNAT-T設定をONにする

実家に設置したRTX810にリモートアクセスを試みたが以下のメッセージが出てつながらない。

リモートサーバーが応答しないため,使用するコンピュータとVPNサーバー間のネットワーク接続を確立できませんでした。
これは使用するコンピュータとリモートサーバー間のネットワークデバイスファイアウォール,NAT,ルーターなど)の1つがVPN接続を許可するように構成されていないことが原因だと考えられます。
管理者またはサービスプロパイダーに問い合わせて,どのデバイスが問題を引き起こしているのかを判断してください

同じルータにぶら下がっているスマートフォンは問題なくVPNアクセスができるのだが…?
どうも使用している無線LANルータがIPsecパススルーに対応していないのが主な要因のようだ。
ただ,NAT-Tの設定もされているのでそれでアクセスを試みればよいではないかと思ったが*1,windows10はNAT-Tが標準でOFFになっているらしい。
NAT-TをONにするためにはレジストリをいじる必要があるためここに備忘録代わりに記載する。

  1. スタートメニューの検索窓に「レジストリエディター」と打って検索する。
  2. 「HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PolicyAgent」を開く
  3. 右クリック→新規→DWORD(32ビット)値
  4. 新規作成された項目の名前を「AssumeUDPEncapsulationContextOnSendRule」に設定。
  5. 「AssumeUDPEncapsulationContextOnSendRule」を右クリック→修正
  6. 値のデータを0→2に設定
  7. 再起動

これで問題なくできるようになった。

*1:現にスマートフォンはNAT-Tで接続している

拠点間VPN調べたこと まとめ

はじめに

中古で7,000円くらいで売っていたyamahaのRTX810を購入した。
ネット上では最新のRTX830と比較してスループットが劣るとの評価があったが,
前まで使ってたbuffaloのPPTPサーバよりは安定感抜群で,しかもL2TP/IPsecに対応しているとの事もあり
特に不満なく使用していた。
ただ,今度は実家にもRTX810を設置し,拠点間VPNを張ってみたくなってしまった。
もう一台RTX810を調達したはいいものの調べてみると拠点間VPNには色々と種類があることが分かった。
とりあえずセキュリティが高ければいいという素人丸出しの意識しかなかったため,リモートアクセスみたくルータ間でL2TP/IPsecを張ればいいのではないかと思っていたがそんな単純なものでもないらしい。
とりあえず設定の前にお勉強することを備忘録代わりに記しておく。

RTX810で対応している方式

まず,RTX810で対応しているVPN方式は以下の四つだ。

IPsec
最も安全性の高い方式で、各拠点のLAN同士を接続(LAN間接続)したい場合
L2TP/IPsec
安全性を確保して、スマホなどからリモートアクセスしたい場合
PPTP
1つの接続方式でLAN間接続とリモートアクセスを併用したい場合、または、Windows PCから気軽にリモートアクセスしたい場合
IPIP
機密性の高い閉域網などを使って、簡単な設定でLAN間接続を実現したい場合
L2TPv3
拠点をLAN間接続して、同一セグメントのネットワークを構築したい場合

出典:
VPN接続方式

この内L2TP/IPsecはリモートアクセス用の方式であり拠点間VPNには適さないことから除外。
また,PPTPについてはセキュリティの問題から除外したいと思う。
また,IPIPは暗号化がされず機密性の高いネットワーク(フレッツ光NGN網等)が必要になるが,拠点間VPNを張る予定の拠点がフレッツ光を使用していないため除外となる。
すると残るのがIPsecとL2TPv3となる。この2つの方式について調べることとした。

IPsec

単純に単語からあたってみると以下の記述が見つかる。

IPsec(Security Architecture for Internet Protocol)とは、暗号化によってパケットの秘匿や改ざん検知を実現するプロトコルです。主にインターネットを介して拠点間を接続する、インターネットVPNを実現するためのプロトコルとして広く利用されています。
出典:
IPsecとは?意味・定義 | ITトレンド用語 | NTTコミュニケーションズ

主として暗号化に関わるプロトコルであるという記述が分かる。
ただ,IPsecは全体の総称であるとの記述もある。

実のところIPSecというのは、暗号化通信を実現する複数のプロトコルの総称である。本稿では、中核をなす以下の3つのプロトコルについて説明する。

IKE(Internet Key Exchange)
ESP(Encapsulating Security Payload)
AH(Authentication Header)
出典:IT管理者のためのIPSec講座 (3/3):技術解説 - @IT

IKEは暗号鍵作成のためのプロトコル,ESPはパケットの作り方に関するプロトコル,AHは直接暗号化には関わらないプロトコルらしい。
IKEは深く追求すると数学屋さんのテリトリーに入ってしまいそうなので暗号化技術についてはさておいて,通信に用いる暗号化方式に関する取り決めを安全にできるように双方のホスト間でやり取りするものであるようだ。L2TP/IPsecでも事前共有鍵を入力していたがIPsecを直接暗号化している鍵ではなく,あくまでIPsec成立の際に必要なものだったわけで成立後はホスト間が取り決めた暗号鍵でやり取りしているということだろう。
ちなみに鍵交換自体はISAKMPというのがやっているらしいが別プロトコルだと書いてあったり,IKEの一部だと書かれていたりとよくわからない。

ESPにはトンネルモードとトランスポートモードの2つのモードがある。
各モードの説明は以下のサイトに詳しく記述があるが今回のような拠点間VPNに用いられるモードはトンネルモードといえるだろう。
www.infraexpert.com
トランスポートモードでは発信元から直接データ部分のみを暗号化しヘッダをつけて送信するが,トンネルモードは発信元からGWなりで一旦受信し,発信元からのヘッダもろとも暗号化し新たにヘッダを付けて投げてやっているということらしい。GWなりが発信元の代わりに暗号化とヘッダの取り付けを行ってくれているので発信者はIPsec通信が行われていることを感じずにいられるという仕掛けなんだろう。

便利そうなトンネルモードでのIPsecだが,一つ弱点がある。NAT越えの問題だ。
通常のご家庭はNAPT機器を経由して通信を実施しているが,その際にポート番号を使って管理している為IPsecのようにポート番号も暗号化してしまいNAPT機器によりポート変換ができないと言う問題がある。しかしながらRTX810にはNATトラバーサル機能がある。

NATの内側でIPsecを利用するときに生じる制約や運用の難しさを改善します。 ESPパケットをUDPパケットの中に押し込めて送信することで、 次のような改善を引き出します。

NATの設定が簡単になります。 通常はESPパケットをNATで変換する設定が必要になりますが、 この機能を使うと、そのような設定が不要になります。
NATの内側で、複数の機器がIPsecを利用できるようになります。
出典:IPsec NATトラバーサル 外部仕様書

手法としては
1.IKEの処理途中でISAKMPメッセージを相手に渡すときにポート番号(UDP500)が変更されてないかIPsec機器は注視。(ISAKMPにはUDPヘッダが付いている)
  この際受信側がNATトラバーサルに対応しているかも送信。
2.ポート番号が変更されていたらNAPT機器が挟まっていると判断し,送信元にUDPを追加するように求める。

ESPには通常はないTCP/UDPのポート番号を与えてやることでNAPTが通常通りポート番号変更してもうまく通信を成り立たせられるようになる機能というところだろうか。
なお,家庭用ルータの設定によくあるIPsecパススルーはNAPTを素通りさせてやる設定のことらしい。
つまりIPsec発信元の方でなんとかするのがNATトラバーサルで,ルータの方でなんとかするのがIPsecパススルーなんだろう。
NATトラバーサルとIPsecパススルーの内容については以下のサイトで詳しく記載されている。
program.sagasite.info

ただし,IPsecはL3-VPNのため基本的には接続先と元でセグメントが異なる構成が基本となっている他,プロトコルはIPしか使えない。(広域なネットワークだと管理が煩雑にならずにすむというメリットも有るようが)
具体的にはWOLとかか。ただ,ルーティングを設定等することによりうまくやれる場合があるとのことだ。
イメージ的にはルータ同士を直接結びつけておいてるというところか。

L2TPv3

単語の意味合いを調べると以下の意味が出てくる。

L2TPv3 (Layer 2 Tunneling Protocol version 3) は、データリンク層(L2)でのVPN接続 (L2VPN)を実現するトンネリングプロトコルです。L2フレームをIPパケットとしてカプセル化することでルーター間でのL2フレーム転送を可能にし、複数の拠点で同一セグメントのネットワークを構築することができます。
出典:L2TPv3を用いたL2VPN

リモートアクセスに利用しているL2TPはL2TPv2というバージョンであり,L2TPv3はルータ間でのL2-VPNに対応した方式といえるようだ。
なお,バージョンと記載があるが最新バージョンが機能を内包しているというわけでもなく別プロトコル扱いという認識で良さそうだ。
ただ,L2TPには暗号化機能がないことから別に暗号化技術を仕入れる必要があるが,RTX810の場合はIPsecのトランスポートモードを併用して暗号化を実施するという。
先程までメインを張っていたIPsecがここでは女房役にまわるというわけだ。
L2TPv3にはL2TPv3 over IpとL2TPv3 over UDPの2方式があり,RTX810はL2TPv3 over UDPに対応しているとのこと。違いとしてはIPでパケットを作るか,UDPでパケットするかという違いのよう。L2かL3のどこでデータを纏めてくれるのかというところか。ちなみにIPsecの例のようにNAPTが介在する環境下ではポート番号をつけてやらないと通信が成立できないためNAPT環境下では実質L2TPv3 over UDPの一択になるようだ。
L2TPv3で相互接続されたトンネルの両端を家庭内LANとブリッジさせてやれば概念上は相互のLAN内のHUB同士をあたかも長いLANケーブルで結んだような動作が期待できるというのが一番のメリットだろう。正直家庭用程度の小規模なネットワークではこれが一番わかり易いと思う。
ただデメリットもあり,IPsecとの併用によるデータ処理工程の増加に伴う通信速度の低下が挙げられることや,同一セグメントでの通信が前提になるため,もし違うセグメントだった場合変更しなければならない手間が発生することか。

まとめ

IPsec,L2TPv3についてそれぞれまとめたが個人的には家庭内LANを手軽に結ぶ上ではL2TPv3/IPsecが妥当かと判断した。セグメントをわざわざ分けるほど複雑なネットワークではないしイメージがしやすいのが最たる理由だ。無論速度の低下は痛いところだが,なにより構成がわかりやすいというところが素人にはありがたい。

Raspbianの各種設定を行う

前説

前回仮想環境化にRaspbianをインストールすることに成功したが、初期状態では使いにくいため機能を追加する必要があるのだが、よく分からなくなるため備忘録的に記録しておくことにする。

Guest Additionsの導入

Oracle VM VirtualBoxには追加キットとでも言うべきGuest Additionsという物がある。
デスクトップの解像度やシームレスなマウス移動などこれを入れないと機能的に制約を受ける場合があるので、入れておいたほうが無難だろう。

a.ISOイメージを使用する
 (1)デバイスー「Guest Additions CDイメージの挿入」をクリック。
 (2)「LXTerminal」を開き、「sudo bash /media/cdrom/VBoxLinuxAdditions.run」と入力。*1

ユーザ名の変更

Raspberry Piのデフォルトのユーザ名は「pi」となっており、オートでログインする使いやすい配慮がされているが、往々にして利便性とセキュリティは相反するもののため、ユーザ名とパスワードの変更をする。
大まかな手順としては以下の通り。

1.ダミーユーザを作成し、権限を与える。
2.ダミーユーザでログインし、piユーザの名前を変更。
3.ダミーユーザを削除

なお、こちらのサイト様に詳しく載っているため、参照させていただいた。
jyn.jp

なお、このページに「グループ」という単語が出てくるが

 Linuxのシステムを管理する上では、「どのユーザーの権限で何ができるか」がとても大切であり、ユーザーごとに使用できるディレクトリなどが決められています。そして、ユーザーの権限などを効率よく管理するために「グループ」が使用されます。

Linuxのユーザーとグループって何だろう? (1/2):“応用力”をつけるためのLinux再入門(10) - @IT

とのことらしい。ユーザごとに権限を割り当てる方法よりも、グループでざっくりまとめるほうが分かりやすいでしょって事なんだろうか。

日本語入力

日本語入力システムはいろいろありますが、個人的には「Mozc」がお気に入りだ。
「sudo apt-get install fcitx-mozc」

日本語フォント

Notoフォントを選択。
「sudo apt-get install fonts-note」

コマンドライン日本語化

起動時はCUIにした上で、GUIを使いたいときは「startx」するのがなんとなくお気に入りなのだが、コマンドラインで日本語表示をしようとすると■■■みたいに何のコッチャかわからないので、日本語を表示できるようにする。
「sudo apt-get install jfbterm」
ちなみに自動起動はしてくれないので、必ず自分で起動させること。

「パッケージ 'jfbterm' にはインストール候補がありません」旨のエラーが出る。どうも相当古いパッケージのためいろいろ限界のようだ。いっその事コマンドラインはすべて英語で表示するようにすれば良いのか・・・?

*1:bashは記述されたテキストを実行させるためのコマンドっぽい

仮想PCにRaspbianを入れる

前説

Raspberry Piを購入して、はやウン年。
最初はサーバーとか入れたりしてみて弄っていたが、自分の住む地域を度々襲ってくる原因不明の停電による給電停止や、ミスによる電源切断によりパソコンにおける基本的な「絶対にやってはいけないこと」である「急に電源を落とさない」を繰り返してしまったためSDカードが犠牲になってしまった。*1

急に電源を落としてもちゃんと息を吹き返してくれる家庭用機器をイメージして、起動時にデータを読み取って後はメモリ上だけで動作する読み取り専用化を試みたが、動作を見てみるとどうもなんかうまく行っていない様子で不安になった。*2

そんなこんなでモチベーションが低下したため物置の肥やしとなっていたが、仮想PC上でエミュレーションし、良い結果が出たものについては実機にフィードバックすれば良いと先日思いついたため*3調べることにした。

RaspbianはRaspberry Pi以外でも使えるのか?

そもそも仮想PC上でRaspbian*4は動くのか。
www.raspberrypi.org
公式のダウンロードページを覗いたらシステムの必要要件とか記載があるかと考えたが、「Raspberry Piすべてのモデルで動作します」くらいのさらっとした事くらいだった。そりゃそうか。
ただ、ダウンロードページの下部にRaspberry Pi Desktopなるものを発見。Raspberry Pi以外のパソコンへのインストールに使うものらしく、説明文には「仮想マシンでも動きますよ」的な記載があった。別で用意されているようだ。*5

導入

1. 公式ダウンロードページから「Debian Stretch with Raspberry Pi Desktop」を調達。
   www.raspberrypi.org

   f:id:sudo210:20190715115939p:plain

2.仮想マシンの設定を行う。なお、「Oracle VW VirtualBox」を使用。
   

f:id:sudo210:20190715124924p:plain
設定画面
  ※注意 ビデオメモリ16MBだと動きません。*6目安としては64MBにすること。

3.仮想マシンに「Raspberry Pi Desktop」をインストール。
  ダウンロードしたISOファイルを仮想マウントし、メニューから「install」を選択。
  他のメニューからはLiveCDの様にインストールせずに起動も可能。
   f:id:sudo210:20190715125654p:plain
4.画面に従い設定を行う。
 (1)Configure the keyboard:「Japanese」
 (2)partition disks
  f:id:sudo210:20190715130201p:plain
  ・Guided - use entire disk(自動設定)
  ・Guided - use entire disk and set up LVM(暗号化しないLVM*7
  ・Guided - use entire disk and set up encrypted LVM(暗号化するLVM)
  ・manual(自分で頑張る)
  意味は以上の通り。面倒は嫌なので「Guided - use entire disk」を選択。
  次の画面では、仮想上のディスクは一つしかないので、それを選択。
  f:id:sudo210:20190715131618p:plain
  ディレクトリごとにパーテーションを分けられるようだが、「All files in one partition」を選択。
  次の画面で「Finish partitioning and write changes to disk」を選択。
  f:id:sudo210:20190715132716p:plain
  最後に確認して、「Yes」を選択。
 (3)Install the GRUB boot loader on a hard disk:「Yes」
  GRUBブートローダーをメインにしますか?と聞かれているようだ。
  f:id:sudo210:20190715133756p:plain
  メインでブートするドライブを選択する。
 (4)Finish the installation:「continue」
  再起動するんで、メディア抜いとけよ!って言ってると思われる。
  ちなみに仮想マウントは自動的に外れていた。

デスクトップが立ち上がったら完了。
もう環境を壊してSDカードに新規のイメージを書き込む手間もなくなるので、一安心だ。

*1:読み取りはできるけど書き込みとフォーマットができない

*2:kernelを弄らないお手軽な方法だったと記憶

*3:遅すぎる発想

*4:余談だが正式になんて読むのか不明。Googleはラスプビアンって読んだのでそれに習う

*5:ARMアーキテクチャx86/x64アーキテクチャの違いによるものだろうか

*6:スプラッシュ画面で固まります

*7:複数のディスクやパーテーションを一つのボリュームに見せかけることができる技術