それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

find コマンドで シンボリックリンク以外を表示してduする

シンボリックリンクを隠して一覧を取得したい。

実ファイルの du を取ろうとしたときに、シンボリックリンクがじゃまになる。

find -not -type l 

du を組み合わせて戦う。

du したいときなら ディレクトリと階層を指定する

find -type d   -not -type l  -maxdepth 1 -mindepth 1
du  $(find -type d   -not -type l  -maxdepth 1 -mindepth 1)

mindepth を入れておくと、カレントディレクトリが対象外になる。

find コマンドを ls のように使って、いまいるフォルダの中身を取得することでdu と組み合わせて戦える。

find コマンドってすごく便利ですよね。

/home/takuya の中で容量食ってるやつを探す

ホームディレクトリの中で容量食ってるやつを隠しフォルダ(dotfiles)も含めて探す。ただしMusicとVideoはわかっているので、計算から除外する

du -cksh $(find /home/takuya -type d   -not -type l  -maxdepth 1 -not -name 'Video*' -not -name 'Music*')

find って楽しい。

.cacheとか .nvm とか python と node 関連はホント容量食いますね。。

OpenVPNでeasy-rsaを使ったCA構築でTLS接続をする

ここまで、次のことを試しました。

  • OpenVPNの起動と接続・コマンドから
  • OpenVPNの固定鍵(共有鍵)の作成と仕様
  • OpenVPNで設定ファイルを利用して接続する

TLSを使う。

TLSを使うことにします。UDP/TLSの場合、http3/HTTPSと同じ通信方式なのでパケットフィルタリングで落とされる可能性も低めです。 今どきの暗号化接続はTLSでしょう。

TLS接続のファイルたち

TLSの場合は、いっぱいファイルが出てきます。

証明書を作成するのに、CA作成、クライアント鍵作成、クライアント署名リクエストの作成、署名済み証明書作成、などたくさん手順が必要です。

サーバー証明書(署名済みの公開鍵)を作成するために、CAも秘密鍵・公開鍵のペアを使うので、たくさん手順が必要です。

その他にも 安全な鍵交換のための dh ファイルも出てきます。

そういうわけで、いくつもファイルを作る必要があります。

  • CA
  • サーバー
    • 証明書(公開鍵+CA署名)
  • クライアント
    • 証明書(公開鍵+CA署名)
  • dh

CAの役割や証明書についてはIPA基本情報の教科書でも出てくるものなので、特に触れませんが。

dh もDiffie-Hellman鍵交換 などでググると出てきます。

OpenVPNとeasy-rsa

OpenVPNの記事を見ていると、よくCAの話が出てきますが、CA自体はOpenSSLで作るので、すべてがOpenVPNの話題ではありません。

CAの作成とPKIつまり署名リクエストと署名、証明書作成は openssl の使い方の話になります。詳しくは openssl クックブックを見たほうが速いと思います

これらの手順を簡単にしてくれるのがeasy-rsa です。

どんな方法でもいいので、先のCAと証明書を作れば使えるようになります。*1

easy-rsa

オレオレ認証局のCAを立ち上げて、証明書を作成するのを簡単にしてくれるパッケージです。

今回は easy-rsa自己署名証明書オレオレ証明書)を使います。が、debian では、更に簡易化されたものがありました。easy-rsa と一緒にインストールされます。

Ubunt/Debianの場合

make-cadir というコマンドがあります。easy-rsa と一緒にインストールされます。便利です。

証明書を作るためのディレクトリを作成する。

make-cadir my-easy-rsa/

インストールすると、次のように、コマンド一式がコピーされます。

基本的な手順

make-cadir をしたあとは、コマンドを順番に実行するだけです。

source vars
./build-ca
./build-key-server  server
./build-dh
./build-key client

これでぱぱっと作れます。 試したのはDebian 9 の頃だったのでeasy-rsa コマンドが少し古いです。

easy-rsa のNEWバージョン

最近のeasy-rsa だと次のようになります。

make-cadir my-easy-rsa/
source vars
./easyrsa init-pki
./easyrsa build-ca  nopass
./easyrsa build-server-fuill server nopass
 ./easyrsa build-client-full client nopass
./easyrsa gen-dh

鍵ファイル一式が作れました。

takuya@:my-easy-rsa$ find -type f -name '*key' -o -name '*crt' -o -name '*dh*'
./pki/dh.pem
./pki/issued/client.crt
./pki/issued/server.crt
./pki/ca.crt
./pki/private/server.key
./pki/private/ca.key
./pki/private/client.key

サーバーの起動

これを使って、サーバーを起動します。

sudo openvpn \
  --dev tun1 \
  --ifconfig 10.9.8.1 10.9.8.2 \
  --tls-server \
  --dh    /home/takuya/openvpn/my-easy-rsa/pki/dh.pem  \
  --ca    /home/takuya/openvpn/my-easy-rsa/pki/ca.crt \
  --cert  /home/takuya/openvpn/my-easy-rsa/pki/issued/server.crt \
  --key   /home/takuya/openvpn/my-easy-rsa/pki/private/server.key  \
  --verb 6

クライアントの起動

クライアントに必要なファイルをコピーしてきて、起動します。

sudo openvpn \
  --dev tun1 \
  --remote 192.168.1.1
  --ifconfig 10.9.8.2 10.9.8.1 \
  --tls-client \
  --dh    ./pki/dh.pem  \
  --ca    ./pki/ca.crt \
  --cert  ./pki/issued/client.crt \
  --key   ./pki/private/client.key  \
  --verb 6

あとは ping を打って確認します。

ping 10.9.8.1

ちなみに、verb6 にしておくと、サーバー側、クライアント側でpingごとにログが流れていくので、非常にわかりやすいと思います。

tls-auth の追加

tls-auth を追加すれば、UDPのハンドシェイクが安全になります。追加しておきます。

openvpn --genkey --secret ta.key

クライアント側・サーバー側の双方に、tls-auth を追加します。

ファイルをコピーして共有します。

それぞれ、--tls-auth とパスを起動オプションに追加します。

サーバー側の起動

sudo openvpn \
  --dev tun1 \
  --ifconfig 10.9.8.1 10.9.8.2 \
  --tls-server \
  --dh    /home/takuya/openvpn/my-easy-rsa/pki/dh.pem  \
  --ca    /home/takuya/openvpn/my-easy-rsa/pki/ca.crt \
  --cert  /home/takuya/openvpn/my-easy-rsa/pki/issued/server.crt \
  --key   /home/takuya/openvpn/my-easy-rsa/pki/private/server.key  \
  --tls-auth /home/takuya/openvpn/ta.key  \
  --verb 6

クライアント側

sudo openvpn \
  --dev tun1 \
  --remote 192.168.1.1
  --ifconfig 10.9.8.2 10.9.8.1 \
  --tls-client \
  --dh    ./pki/dh.pem  \
  --ca    ./pki/ca.crt \
  --cert  ./pki/issued/client.crt \
  --key   ./pki/private/client.key  \
  --tls-auth  ./ta.key  \
  --verb 6

クライアントにサーバー証明書のverifyをいれる

ここままでも繋がりますが、クライアントの接続ログを見るとサーバー側の証明書をverify してないぞとメッセージで言われてます。

Tue Feb 18 05:07:12 2020 WARNING: No server certificate verification method has been enabled.  See http://openvpn.net/howto.html#mitm for more info.

サーバーの証明書は build-server-full serverと指定したので名前がserverになってます。なので次のようにクライアント起動オプションに追加します。

--remote-cert-tls server

安全なcipher を使う

サーバー側を起動すると、次のようにメッセージが出てくるので aes-256-cbc を使います。

WARNING: INSECURE cipher with block size less than 128 bit (64 bit).  This allows attacks like SWEET32.  Mitigate by using a --cipher with a larger block size (e.g. AES-256-CBC).

サーバー側に足しておきます。

--tls-server \ 
--ciper aes-256-cbc

クライアントにも入れておきます。

--tls-client \ 
--ciper aes-256-cbc

ここまでで

TLS接続を実現することが出来ました。

*1: 厳密には証明書の形式があって云々

OpenVPNの起動オプションをovpnファイルのconfig にまとめる。

前回まで

前回までで、コマンドからOpenVPN接続、共通鍵による認証を見てきました。

ここでの目標

サーバーとクライアントのそれぞれの起動に使うコマンド引数を、ファイルに纏めて 起動コンフィグファイルを作ります。

サーバー側

openvpn --config my-server.ovpn

クライアント側

openvpn --config my-server-client.ovpn

のように、設定ファイルでシンプルに起動できる 設定ファイルを作成します。

今回は、共有鍵をパスで指定する。共通鍵を設定ファイルに含めるの2種類を見ていきます。

接続ファイルの作成

共有鍵使った接続をを設定ファイルに書きたいと思います。

コマンドラインからオプションを与える代わりに設定ファイルを使えるようになります。

サーバー設定ファイルを作成

最初にサーバー側で設定ファイルを書きました。

myserver-tun0.conf

dev tun0
ifconfig 10.9.8.1 10.9.8.2
secret /etc/openvpn/static.key

ファイルはこのように設置しています。

root@server:/etc/openvpn# ll
-rw-------    1 root     root           636 Feb 14 11:02 static.key
-rw-r--r--    1 root     root             0 Feb 14 11:02 tun0.conf

設定ファイルを使ってサーバーを起動します。

verb は verbose オプションです。詳細なログが出ます。

root@:/etc/openvpn# openvpn --config /etc/openvpn/tun0.conf --verb 6

クライアント設定ファイルの作成

クライアント側がサーバーへの接続ファイルの作成。クライアント側でも設定ファイルを使ります。

準備

クライアント側に、サーバーで作成した固定鍵(共有鍵)を持ってきます。

mkdir ~/openvpn
cd ~/Desktop/openvpn
scp router:/etc/openvpn/static.key .

クライアント側も設定ファイルを作ります。

ほとんどサーバーと同じですが、remote があるのが異なります。

myserver-tun0.conf

dev tun0
remote 192.168.1.1
ifconfig 10.9.8.2 10.9.8.1
secret /Users/takuya/Desktop/openvpn/static.key

鍵ファイルの場所をパスで指定してます。

接続します。

sudo openvpn --config  ~/Desktop/openvpn/tun0.conf  --verb 6

verb は verbose オプションです。詳細なログが出ます。

実際の接続例です

クライアントから起動ログはこんなかんじ。

takuya@openvpn$ sudo openvpn --config  ~/Desktop/openvpn/tun0.conf  --verb 6
Fri Feb 14 11:07:22 2020 us=467027 disabling NCP mode (--ncp-disable) because not in P2MP client or server mode
Fri Feb 14 11:07:22 2020 us=467785 Current Parameter Settings:
Fri Feb 14 11:07:22 2020 us=467792   config = '/Users/takuya/Desktop/openvpn/tun0.conf'
## 略
Fri Feb 14 11:07:32 2020 us=984572 Peer Connection Initiated with [AF_INET]192.168.1.1:1194
## 少し時間がかかります。
Fri Feb 14 11:07:34 2020 us=175172 WARNING: this configuration may cache passwords in memory -- use the auth-nocache option to prevent this
Fri Feb 14 11:07:34 2020 us=175256 Initialization Sequence Completed
## ping を送信してます。
Fri Feb 14 11:09:58 2020 us=450862 UDP WRITE [124] to [AF_INET]192.168.1.1:1194:  DATA len=124
Fri Feb 14 11:09:58 2020 us=453078 UDP READ [124] from [AF_INET]192.168.1.1:1194:  DATA len=124

設定ファイルへの共有鍵を埋め込み

設定と鍵が別々だと、取り扱いが不便。 なので、鍵ファイルを設定ファイルに含めます。

鍵ファイルの中身をを設定に書き込む

先程のファイルに、<secret></secret> タグを書きます。 <secret></secret> なかに、鍵ファイルの中身を書きます。

myserver-tun0.conf

クライアント設定ファイル

dev tun0
remote 192.168.1.1
ifconfig 10.9.8.2 10.9.8.1
<secret>
-----BEGIN OpenVPN Static key V1-----
d862054cc8f4ab583afb71a41da17e53
167de143e89d0ded7449396afe03a3b7
349fc581b6a778ddbb8a000dd2f8134c
691ab43bb039499c6901045752bf7309
6b671f87ed607a378988634d4b074c3c
25f9bc983cfdf945542c20ca254d8127
3184635341bd64d5e42eabe9a3ec0ebc
9260a2fbf8ee8eaefc8edb5c3c9d7c20
d78ad6608ba12fa8f5a03f4369f10668
e047d0f7f86fe2bc44c764e1ad4355b4
5095c6b42c2ee4905f58f843fd214905
6bc48eb4946b6fff827171298afaece5
7cad3833d0d226febf8d890e8143a27d
a366d7468ee20d4ca7d955d86d11a3df
c16ba9c972d244fe8fd07180de3aff2a
4b3d79f168a968468d50c973857b7b20
-----END OpenVPN Static key V1-----
</secret>

これで、各種ソフトウェアから接続ができるようになります。

ほとんどの人は、ここまでの設定で十分だと思います。

拡張子を ovpn に変更

クライアント用 opvn ファイルを作成します。拡張子だけの問題です。

cp myserver-tun0.conf myserver-tun0.ovpn

クライアント設定ファイルを拡張子 .ovpn に変更すると、各種openvpn 対応ソフトで使えます。

tunnelbrickで認識される例。

tunnelbrick でovpn ファイルが認識されて、ダブルクリックで設定ファイルをインポートすると、あとは接続開始します。

f:id:takuya_1st:20200218032212p:plain
ovpnファイルレ
f:id:takuya_1st:20200218032149p:plain
tunnerlbrickで接続完了

接続されました。

まとめ

設定ファイルは、起動オプションをそのまま書いてるだけ --dev tun1 であれば dev tun1

設定ファイルに共通鍵を含める事ができる。ファイルの管理は楽になる。(取り扱いは慎重に)

ただし、共有鍵では「TLS」暗号化はしていません。No X509 PKI です。接続すれば十分な人にはシンプルでいいと思います。

OpenVPNのシンプルな接続に共通鍵(鍵ファイル)による認証を加える

OpenVPNを起動するときに、共通鍵ファイルを使用する

前回で、基本的なつなぎ方とコマンドがわかったので、認証方式を変更します。

鍵ファイルを作成して共有することでパスワード認証と同様に共有鍵でクライアントを認証します。

クライアント・サーバーでお互いに同じファイルを共有し、同じファイルを持っていることで本人確認とします。

固有鍵を作成する。

事前に鍵を共有することで認証します。鍵の作成は openvpn コマンドに含まれています。

openvpn --genkey --secret static.key

実例

固有鍵を作ったときの例です。

root@:~# openvpn --genkey --secret static.key
root@:~# cat static.key
#
# 2048 bit OpenVPN static key
#
-----BEGIN OpenVPN Static key V1-----
8a0487a4ab6a2cb694510238347ea9d7
71f28051d4b00ad49f6d85fc7ffabb4d
bcaa5b5be249b3211dca11ff6ab03dd6
650c03577041a3b27eab9dce57c1b235
0aaa2275f5bff563236b796cc5402c73
7bf696a0f40685637bffb185f706371e
3fa2c8c88a3e178378e6b49ce8da0293
ebab45862b805c2528f217715f5069aa
dfbd1c95ba44ce5e97e352fd6617fce5
a40d0fcafd87004cd831f7c3669ffb7a
e3db41da10358febc6b1162c7ee42f6b
7862442659c229562ef39c96ed83c3d4
6173091a2e405d7fb1d40a890f99b85a
f3b1912eb5e63a39f9c12cfd40b19280
7641dc52bfafe92d42f38e96356ba9d9
0cbefe27eb8e4909f49d057d26f990d2
-----END OpenVPN Static key V1-----

鍵ファイルを任意の場所に設置

今回は、次の場所に、を固定鍵を次の場所に設置しました。

cp secret.key /etc/openvpn/secret.key

サーバーを起動

鍵ファイルを使って認証をするサーバーを起動します。

サーバーの起動方法は前回と同じです。前回と異なるのは、鍵ファイルを指定します。

openvpn --dev tun1 --ifconfig 10.9.8.1 10.9.8.2 --secret /etc/openvpn/secret.key

実際の例です。

root@:/etc/openvpn# openvpn --dev tun1 --ifconfig 10.9.8.1 10.9.8.2 --secret /etc/openvpn/secret.key
Fri Feb 14 14:34:47 2020 disabling NCP mode (--ncp-disable) because not in P2MP client or server mode
Fri Feb 14 14:34:47 2020 OpenVPN 2.4.7 x86_64-openwrt-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [MH/PKTINFO] [AEAD]
Fri Feb 14 14:34:47 2020 library versions: OpenSSL 1.1.1d  10 Sep 2019, LZO 2.10
Fri Feb 14 14:34:47 2020 WARNING: INSECURE cipher with block size less than 128 bit (64 bit).  This allows attacks like SWEET32.  Mitigate by using a --cipher with a larger block size (e.g. AES-256-CBC).
Fri Feb 14 14:34:47 2020 WARNING: INSECURE cipher with block size less than 128 bit (64 bit).  This allows attacks like SWEET32.  Mitigate by using a --cipher with a larger block size (e.g. AES-256-CBC).
Fri Feb 14 14:34:47 2020 TUN/TAP device tun1 opened
Fri Feb 14 14:35:21 2020 WARNING: this configuration may cache passwords in memory -- use the auth-nocache option to prevent this
Fri Feb 14 14:35:21 2020 Initialization Sequence Completed

クライアント側

クライアント側でも共有鍵を使って接続します。

鍵の転送

共有鍵はSCPなどで転送しておきます。

takuya@openvpn$ scp router:/etc/openvpn/secret.key  ~/Desktop/openvpn
secret.key

クライアント側で、共有鍵を使ってサーバーに接続します。

sudo openvpn --remote 192.168.1.1 --dev tun1 --ifconfig 10.9.8.2 10.9.8.1 --secret secret.key

こちらも、起動方法は、シンプルです。鍵ファイルを指定するオプションが前回に比べて増えます。

実際の接続例です。

takuya@openvpn$ sudo openvpn --remote 192.168.2.1 --dev tun1 --ifconfig 10.9.8.2 10.9.8.1 --secret secret.key
Fri Feb 14 14:35:09 2020 OpenVPN 2.4.8 x86_64-apple-darwin17.7.0 [SSL (OpenSSL)] [LZO] [LZ4] [PKCS11] [MH/RECVDA] [AEAD] built on Nov  1 2019
Fri Feb 14 14:35:21 2020 WARNING: this configuration may cache passwords in memory -- use the auth-nocache option to prevent this
Fri Feb 14 14:35:21 2020 Initialization Sequence Completed

もし鍵を指定せずに接続した場合

共有鍵をなしで接続しようとしたら接続開始ができなくて止まります。

takuya@openvpn$ sudo openvpn --remote 192.168.1.1 --dev tun1 --ifconfig 10.9.8.2 10.9.8.1
Fri Feb 14 14:37:52 2020 library versions: OpenSSL 1.1.1d  10 Sep 2019, LZO 2.10
Fri Feb 14 14:37:52 2020 ******* WARNING *******: All encryption and authentication features disabled -- All data will be tunnelled as clear text and will not be protected against man-in-the-middle changes. PLEASE DO RECONSIDER THIS CONFIGURATION!
Fri Feb 14 14:37:52 2020 Opened utun device utun1
Fri Feb 14 14:37:52 2020 UDP link local (bound): [AF_INET][undef]:1194
Fri Feb 14 14:37:52 2020 UDP link remote: [AF_INET]192.168.1.1:1194
## 接続試行をずっとしてる

サーバー側のログには、認証失敗のメッセージが出てきます。

root@:/etc/openvpn# openvpn --dev tun1 --ifconfig 10.9.8.1 10.9.8.2 --secret /etc/openvpn/secret.key
Fri Feb 14 14:35:21 2020 Initialization Sequence Completed
Fri Feb 14 14:38:02 2020 Authenticate/Decrypt packet error: missing authentication info
Fri Feb 14 14:38:12 2020 Authenticate/Decrypt packet error: missing authentication info
Fri Feb 14 14:38:22 2020 Authenticate/Decrypt packet error: missing authentication info
Fri Feb 14 14:38:33 2020 Authenticate/Decrypt packet error: missing authentication info
Fri Feb 14 14:38:43 2020 Authenticate/Decrypt packet error: missing authentication info

共有鍵を使う

ここで試したことは、共有鍵を使って認証してVPNのトンネルを接続が可能になる。 鍵を持っていない認証されてないユーザーを拒否する事ができています。

認証方式には、他にも数限りなく選択肢があります。OpenVPNで一般的なのはCAをつかった証明書ですが、証明書の作り方、それはOpenSSLとCAそのものの話なので、OpenVPNとはかなり別の話題です。

単純な認証であれば、共通鍵で十分だと思います。

その他にも

  • 証明書を使う
  • 共通鍵を使う
  • auth-user-pass を使う
    • Linuxのユーザー名パスワードで認証する( PAM )
    • 独自スクリプトで認証する。

などが可能です。PAM通ればもうなんでもありですよね。PostgreSQLのテーブルに問い合わせるとかもできそう。時間コストに見合わないので流石にやらないけど。

次回

次回は、今回の共通鍵の 接続設定を ovpn ファイルしてみたいと思います。

OpenVPNコマンドで直接起動して接続される状態を体験する。

OpenVPNをコマンドからフォアグラウンドで実行します。

いきなり、OpenVPNをインストールして接続してしまうと、内部がブラックボックスでトラブル時に時間を浪費することになりそう

なので、まずは最低限のシンプルな状態で接続してみます。

コマンドから、OpenVPNサーバーとクライアントをそれぞれ起動して接続します。

参考資料

おもに、Debian Wiki の内容をそのまま辿っています。 https://wiki.debian.org/OpenVPN

実験環境

OpenVPNクライアント macOS

takuya@openvpn$ sw_vers
ProductName:    Mac OS X
ProductVersion:    10.13.6
BuildVersion:    17G6030

OpenVPNサーバー側

takuya@:~$ cat /etc/debian_version
9.11

これらのクライアント・サーバーで、ローカルtoローカルで接続してみます。

OpenVPNのインストール

サーバー側

sudo apt install openvpn

クライアント側

brew install openvpn

コマンドから接続

OpenVPNをコマンドから起動して接続する

OpenVPNを直接起動して使って少しづつ慣れていきたいと思います。 単純にサーバー側とクライアント側でコマンドを叩いて接続します。

まずはじめに、OpenVPNを体験します。

サーバー側のOpenVPN起動

sudo openvpn --dev tun1 --ifconfig 10.9.8.1 10.9.8.2

クライアント側のOpenVPNを起動

sudo openvpn --remote 192.168.1.1 --dev tun1 --ifconfig 10.9.8.2 10.9.8.1

これで繋がります。

ほんとうに楽ちんに繋がります。暗号化や認証やルーティングを全く考慮しなければOpenVPNのコマンドはとてもシンプルです。

これでお互いの端末に vpn 経由で ping が通ります。

接続形態

LAN内部で接続しています。

LAN内部で接続しています。OpenVPNで接続します。
Server ( 192.168.1.1 ) -------<ethernet>--------- クライアント側 ( 192.168.1.100 )
         10.9.8.1      -------<openvpn> -------- ( 10.9.8.2 )

実際の接続のログ

サーバー側の接続例

takuya@:~$ sudo openvpn  --dev tun1 --ifconfig 10.9.8.1 10.9.8.2
(略
Tue Feb 18 02:42:06 2020 disabling NCP mode (--ncp-disable) because not in P2MP client or server mode
Tue Feb 18 02:42:06 2020 ******* WARNING *******: All encryption and authentication features disabled -- All data will be tunnelled as clear text and will not be protected against man-in-the-middle changes. PLEASE DO RECONSIDER THIS CONFIGURATION!
Tue Feb 18 02:42:06 2020 TUN/TAP device tun1 opened
Tue Feb 18 02:42:26 2020 WARNING: this configuration may cache passwords in memory -- use the auth-nocache option to prevent this
Tue Feb 18 02:42:26 2020 Initialization Sequence Completed

サーバー側では暗号化や認証を全く考慮していないので警告が出ています。がここではわかった上でやっているので、スルーしておきます。

クライアント側の接続例

takuya@~$ sudo openvpn --remote 192.168.1.1 --dev tun1 --ifconfig 10.9.8.2 10.9.8.1
## 略
Fri Feb 14 09:03:02 2020 UDP link local (bound): [AF_INET][undef]:1194
Fri Feb 14 09:03:02 2020 UDP link remote: [AF_INET]192.168.1.1:1194
Fri Feb 14 09:03:12 2020 Peer Connection Initiated with [AF_INET]192.168.1.1:1194
Fri Feb 14 09:03:13 2020 WARNING: this configuration may cache passwords in memory -- use the auth-nocache option to prevent this
## コンプリートが出るまで暫く待つ
Fri Feb 14 09:03:13 2020 Initialization Sequence Completed

クライアント側がら接続して、接続が確立するまでに10秒ほどかかかりました。

接続完了後

サーバー側のtun1(クライアント接続後 root@ubuntu:~# ip addr s tun1

21: tun1: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100
    link/none
    inet 10.9.8.1 peer 10.9.8.2/32 scope global tun1
       valid_lft forever preferred_lft forever

クライアント側のtun1 ( サーバーへ接続後

takuya@~$ ip addr show  utun2
utun2: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500
    inet 10.9.8.2 --> 10.9.8.1/32 utun2

mac なので tun1 で指定しても utun2 ですが、そのへんは気にしないでください。

接続だけなら本当にかんたん、接続するだけならね。

念のため、ほんとうにOpenVPNを経由して通信しているか、tcpdump や route を見ておきます。 *1

サーバー側

ip route get 10.9.8.2
sudo tcpdump -i tun1 icmp 

クライアント側

ip route get 10.9.8.1
sudo tcpdump -i tun1 icmp

こうしてパケットを見る方法をあわせて覚えておきます。

疎通確認 / ping

ここまでで、ping を打てます。

ping ( クライアント→サーバー)

takuya@openvpn$ ping 10.9.8.1
PING 10.9.8.1 (10.9.8.1): 56 data bytes
64 bytes from 10.9.8.1: icmp_seq=0 ttl=64 time=1.606 ms
64 bytes from 10.9.8.1: icmp_seq=1 ttl=64 time=1.939 ms
64 bytes from 10.9.8.1: icmp_seq=2 ttl=64 time=1.825 ms
^C

ping ( サーバー → クライアント )

root@:~# ping 10.9.8.2
PING 10.9.8.2 (10.9.8.2): 56 data bytes
64 bytes from 10.9.8.2: seq=0 ttl=64 time=1.813 ms
64 bytes from 10.9.8.2: seq=1 ttl=64 time=2.356 ms
64 bytes from 10.9.8.2: seq=2 ttl=64 time=2.238 ms

無事に通信ができることがわかります。

シンプルな起動を覚えた

openvpn コマンドを使って、「シンプル」に接続し、接続するとどうなるかちゃんと見ることが出来ました。

今回はNATを使った通信や、サーバー側のネットワークとルーティングを使った疎通などはしてません。

ただ。OpenVPNのサーバーとクライアントの間で通信ができることはわかります。

また、なんの認証もしてません。誰でも接続可能です。
また、なにも暗号化もしてもしてません。

そのために接続を安全に使うために、いくつかの設定を検討してアレンジしておく必要があります。

そのために知っておく必要があることがいっぱいあります。。。

まとめ

今回は、openvpn のサーバーとクライアントを起動して接続する方法を覚えました。

サーバー

openvpn --dev tun --ifconfig 10.9.8.1 10.9.8.2

クライアント

openvpn --remote 192.168.1.1 --dev tun --ifconfig 10.9.8.2 10.9.8.1

今回つかった接続はトンネルtun で、 ifconfig はpeer to peer 接続のために、ifconfig 自分のIP 相手のIP として設定しています。

サーバとクライアントの起動の仕分けは --remote があるなしで明確にわかります。

続く

接続ができたので、次は、共通鍵(パスワードではなく鍵ファイル)を使った「認証」を試してみたいと思います。

*1:ローカルLAN内の接続ではip_forwardingでパケットが別経由で流れる可能性もあります、例えばゲートウェイとして使っているforwardingが有効なサーバーでvpn試すと意図通りの経路を通らなくても疎通しちゃうかもしれません、ルーティングテーブルやIPアドレスの範囲など設定によっては疎通できてしまいます。

LinuxでOpenVPNの暗号化通信をする。

OpenVPNで通信を暗号化したい。

OpenVPNをつかって、通信を暗号化したい。とくに、検閲への不安が一番大きい。最近のLTE回線はどう運用されているのか、ほんとうにわからないよね。インターネットもCDN経由で通信はどこで見られてるのか想像がつかない。CDN事業者がサーバー鍵を漏らさない保証は何処にもないわけで。NSAがその気になればサーバー鍵を取り押さえたり、CDNにデータ提供を強制する悪夢も考えられる。本邦の捜査機関は、自由闊達というか自由奔放なので、無限ループすら逮捕してて、昨今の事情を考えると、セキュリティ関連のあれこれを試すのに、VPNくらい持っておいたほうが良いかなと。

OpenVPNで暗号化通信。

OpenVPNは、小規模なネットワークに最適な、VPN構築ツール。

TUN/TAP を使える

tunでトンネルを使える。tapでイーサネットブリッジを使える

UDP/TCPを選べる

パケットを転送を選べる

NAT/DHCPなど

OpenVPNは通常のルータと同等に、DHCPやNATを使えるし、ルーティングテーブルの書き換えもやってくれる。

多様なOS

Windowsはもちろんのこと、LinuxmacOSも、iOSでもソフトウェアが用意されている。

情報が多い

玉石混淆だけど、情報は多い。

GPL

ソフトウェアはGNU Public License で提供されてる

TLS

TLSによる暗号化をサポートしている。HTTPSと同じなのでHTTPSが通ればパケットフィルタリングされない。

https://wiki.archlinux.jp/index.php/OpenVPN

特に問題なのは、ソフトウェアが多くて情報が過多になっている。あれれと思ったときに調べるのに苦労する。

とりあえずインストールしたいとき

openvpn-install.sh が一番らくちんで何も考えずにできる。あとは1194 ポートを開けるだけ。

# curl -O https://raw.githubusercontent.com/angristan/openvpn-install/master/openvpn-install.sh
# chmod +x openvpn-install.sh
# ./openvpn-install.sh

情報が多すぎるOpenVPN

  • 認証方式に、共有鍵、鍵交換、TLSなど、多岐にわたる
  • 接続に、tun/tap と peer to peer など多岐にわたる
  • サーバーOSに、WindowsやらQNAPやOpenWRTやUbuntuなど多岐にわたる
  • クライアントに、WindowsMaciOSなど多岐にわたる
  • 差異を吸収するために、自動化ツールが多種多様ある。
  • これらの設定を簡便化するために、*.ovpn ファイルを多様な方法で作成してる。
  • OpenVPNで設定してくれるけどiptablesやetables やルーティングテーブルでも設定できる。
  • 速度が出ないからチューニングも多岐にわたる

ほんと、多種多様な設定方法があって、ちょっとググってもほんとうにわからないよね。。。。

openvpn-install.shとかあるしさー

OpenVPNを難しいと感じたわけ。

いろいろ試しているうちに、OpenVPNが難しいなと感じたのは、次の点でした。

  • サーバー設定とクライアント設定がある
  • ルーティング関連
  • TLS 関連

サーバーとクライアントを別個に設定を作っていると何処で間違えたのかとか、自動生成に頼ってると見失いそうです。

そこで、シンプルなところから初めて、徐々に慣れていければと思って調べました。

コマンドから試すOpenVPN

まずはじめに、コマンドからシンプルに使います。そこから順に試していきたいと思います。

それぞれ、長いので、別記事になっています。

  1. OpenVPNコマンドで直接起動して接続される状態を体験する。 - それマグで!
  2. OpenVPNのシンプルな接続に共通鍵(鍵ファイル)による認証を加える - それマグで!
  3. OpenVPNの起動オプションをovpnファイルのconfig にまとめる。 - それマグで!
  4. OpenVPNでeasy-rsaを使ったCA構築でTLS接続の準備をする - それマグで!

bash で指定回数ループする方法いろいろ for / while など

bash で指定回数ループする方法のあれこれまとめ

bash で使える方法です。sh では使えません。

while で10回ループ

bash 算術演算のカッコと組み合わせて強いです。

#!/usr/bin/env bash 


while (( cnt++ < 10  )); do

  echo $cnt
done

break も使えます。

break の導入の if 分も比較演算子を (()) で使えます。

#!/usr/bin/env bash 

while (( cnt++ < 10  )); do

  echo $cnt
  if (( cnt > 5 )) ;then 
    break
  fi
done

for で 10 回ループーC言語スタイル

bash には (()) と for を組み合わせ使えるものがあります。

注意 for 中は$i++ でなく、i++ のようになる

#!/usr/bin/env bash 

for (( i=0; i< 10 ; i++ )); do 
  echo $i
done

for もbreak が使えます。

for で 10回ループ - 展開

JavaScriptなどでおなじみの for .. in ループ

for i in {0...9}; do 
  echo $i

  if (( i > 5 )) ;then 
    break
  fi
done

seq コマンドを使う。

seq コマンドを使う事もできます。

for i in `seq 0 9` ; do 
 echo $i;
done

配列を使って10回ループ

ARR=`seq -s ' ' 0 9 `

for i in $ARR ; do 
  echo $i
done

C言語スタイル

通常のプログラミング言語と同じ for も使える。

for (( idx=0 ; idx<10; idx++  )) ; do
  echo $idx;
done

配列と組み合わせてループ

配列の添字にアクセスする(多分あんまり使わない。)

## 配列を作る
ARR=(`seq -s ' ' 1000 1009 `)
echo $ARR
echo ${ARR[2]}

## 配列にアクセス
for (( i = 0; i < ${#ARR[*]}; i++ ))  ; do 
  echo "$i => ${ARR[$i]}"
done

配列の配列を作ることがあれば使えるけど、現代では配列の配列をするくらいなら、名前付きインデックスを使うほうが手っ取り早い気がする。

まとめ

自分でも時々忘れそうになります。再度まとめ直し。

指定回数トライして、成功したら抜ける。みたいなことを書こうとして詰まった

過去記事

bashの似てて紛らわしいもの (( / $(( の丸括弧 - それマグで!

bashで10回ループ(Bashによる指定回ループとファイル名を001にする) - それマグで!

bashでC言語スタイルforループ - それマグで!

bashの似てて紛らわしいもの (( / $(( の丸括弧 - それマグで!

bashで連想配列(assoc array / hash ) を使う。 - それマグで!

bashの配列のまとめ(定義・代入・参照と取得・ループ) - それマグで!

** 2022/10/03

for (( i=0; i<0; i++ )) を追加。

OpenWrt でPPPoEなどWANの接続を再起動する

WAN接続を再起動する。

WAN側の接続を再起動する。WANに指定されているのは、firewall のwan になります。

OpenVPNdhcp、そしてPPPoEで、IPアドレスを再取得して、切り替えます。

WANに設定されたインターフェスの取得

OpenWRTには、network.sh というネットワークを扱うユーティリティ関数が用意されている。

これをつかえば、wanのnif をかんたんに取得できる。

. /lib/functions/network.sh
network_flush_cache
network_find_wan WAN_IF
echo $WAN_IF

再起動する

再起動は、原始的に、ifdown / ifup でいい。

. /lib/functions/network.sh
network_flush_cache
network_find_wan WAN_IF
echo $WAN_IF
## reconnect
ifdown $WAN_IF;
sleep 1
ifup $WAN_IF;
sleep 1;

IPを変えたいときに便利。

IPv4アドレスをぱぱっと変えて、再接続ができるようになると便利なことが多い。

ルーター再起動やWEBからポチポチしなくちゃいけない市販ルーターとは大違いで,便利。

cron と組み合わせて定期的にIPアドレスを変えると便利。子供がゲームをしすぎないように接続を切るのはとても有用だと思います。

OpenWrtでホスト名を変える方法

現在の設定を取得

uci get system.@system[0].hostname

といってもssh ログインしたら見えますね。

設定の変更

uci set system.@system[0].hostname='OpenWrt2'
uci commit system
/etc/init.d/system reload

設定変更後に、再度 ssh ログインすると反映されます。

ホスト名変更

hostname コマンドは存在しないようです。 /etc/hostname も存在しないようです

参考資料

How to change Hostname of OpenWrt ?

Poweroffコマンドが危険すぎるので、sudoersで 自分すら利用制限する

poweroff , powertop の補完が怖い。

powertop を見ようとして、 補完して 間違って poweroff コマンドを実行しちゃったよね。

マジ危険ですよ。危険。

リモートマシンの電源をいれる手段を失いました。

さらにヒストリで暴発。

そして注意してたけど、ヒストリに残って Ctrl-R で履歴から実行しちゃったよね。マジ危険。

ls -l /sbin/{shutdown,halt,poweroff}

シャットダウン関連のコマンド

takuya@:~$ ls -l /sbin/{shutdown,halt,poweroff}
lrwxrwxrwx 1 root root 14 Nov  2 05:33 /sbin/halt -> /bin/systemctl
lrwxrwxrwx 1 root root 14 Nov  2 05:33 /sbin/poweroff -> /bin/systemctl
lrwxrwxrwx 1 root root 14 Nov  2 05:33 /sbin/shutdown -> /bin/systemctl

halt は昔からあったけど、poweroffコマンドなんて出来たんですね。

init スクリプト時代にもあったかなぁ。systemd からだよね、コレ。

poweroffコマンド、引数なしで、確認なしで実行できるのほんと怖いよ。

他にも telinit とかあるけど、引数必須だし、似た名前のtelnet とかさすがに使わないので、暴発する心配はなさそう。

sudoers で poweroff コマンドを制限する。

reboot はまぁ暴発してもなんとかなるさ、poweroff はやばい。まじやばい。

shutdown もまぁまぁやばい。 -h 引数つけなきゃいいんだけど、怖い。制限しよう。

sudo visudo 

sudoers

# Cmnd alias specification
Cmnd_Alias     SHUTDOWN = /sbin/shutdown,/sbin/halt,/sbin/reboot,/sbin/poweroff

# Allow members of group sudo to execute any command
%sudo    ALL=(ALL:ALL) ALL, !SHUTDOWN

暴発防止できる。

takuya@host:~$ sudo poweroff
Sorry, user takuya is not allowed to execute '/usr/sbin/poweroff' as root on host.

ちょっと安心。

これで、ウッカリを防ぐことが出来ますね。

reboot も制限するとさすがに 不便だから reboot だけあとで許可するようにしました。

powertop 入れたときの poweroff はタブ補完で出てくるから本当に怖い。

念の為WOL

うっかりすることがあるとして、失敗学として2重に回避策を作っておけばいいだろうから、Wake On Lanの環境も持っておくといいかもしれない。

ネットワークが繋がらない的なのは、IPv6のフレッツ網内通信でマルチホーミングできるはずなので、PPPoEやIPv6のいずれかが生きてるデュアル回線なので安心だね。

参考

  • man sudoers

sed で出現文字をすべて置換する /g オプション

sedで1行の中に複数回出てくる文字を全部置換

sed で置換していると、普段は気にならないけど、複数回登場する場合に置換漏れが出てくる。

グローバルのマッチング・オプション /g がある。

s/cat/dog/g

時々忘れそうになる

設定ファイルを触っているときには、気にならないことが多いので忘れそうになる。

global マッチオプションの例

ファイルを作ります。

takuya@:~$ echo cat cat cat > sample
takuya@:~$ echo cat cat cat >> sample
takuya@:~$ echo cat cat cat >> sample
takuya@:~$ echo cat cat cat >> sample
takuya@:~$ echo cat cat cat >> sample

ファイルの中身を確認

takuya@:~$ cat sample
cat cat cat
cat cat cat
cat cat cat
cat cat cat
cat cat cat

グローバルオプションなしで置換します。

takuya@:~$ cat sample | sed 's/cat/lion/'
lion cat cat
lion cat cat
lion cat cat
lion cat cat
lion cat cat

グローバルのオプションを有効にしたら

takuya@:~$ cat sample | sed 's/cat/lion/g'
lion lion lion
lion lion lion
lion lion lion
lion lion lion
lion lion lion

置換漏れに注意

dockerfile などを書いている場合は sed をグローバルなしで使ってても本当に気にならない。1行に同じ文字が出てくることはあまりない。

ところがデータファイルを扱うととたんに顕著にミスとして顕れてくる。本当に怖い。

参考

man sed

mac用 のトラックパッドをUbuntuで使う設定

macトラックパッドUbuntuで使う設定 mac 用の MagickTrackpad をUbuntuに差し込んだら、普通に動く。

トラックパッドだけナチュラルスクロール

マウスのホイールスクロールと、トラックパッドのスクロールを同じ向きにすると どうしても違和感が生じます。

そこで、マウスとトラックパッドをそれぞれ別個にスクロールの向きを設定すると便利です。

Macではデフォルトでできないんだけど、Ubuntuなら、マウスとトラックパッドでスクロール方向を逆にできるんですよね。

これは、とくに設定しなくてもデフォルトでなってました。

トラックパッドの右下を右クリックに

マジックトラックパッドは、右下の右隅をクリックすると、右クリックになるのですが。 Ubuntuではデフォルトでは動きません

次の設定をすると動くようになります。

マウスクリックのエミュレーション

設定から、マウスクリックのエミュレーションを選ぶと、右下の隅っこをタップすると右クリックとして動作するようになります。

f:id:takuya_1st:20200203182931p:plain

OpenWrt x86 の リリースのバージョン更新する。

ext4のOpenWrtのバージョン更新。

OpenWrt x86ext4 をdist release upgrade してみた。先月にルーターとして稼働させたばかりだけど、マイナーバージョンのアップデートが来ていたので試した。

2020-01-30 に 19.07.1 がリリースされていたので、 インストールした OpenWrt x86をさっそくアップデートしてみた

やること

  • バックアップの作成
  • curlモジュールのインストール
  • boot のvmlinux の更新
  • カーネルのインストール
  • アップデートスクリプトの実行
  • パッケージ取得バージョンの更新

sysuprade コマンドでもできるようですが、今回は手作業でアップデートをしてみた。

root@MyOpenWRT:~# opkg install curl
Package curl (7.66.0-1) installed in root is up to date.

バックアップの作成

アップデートまえに現在の稼働中のOSをバックアップします。

いろいろな方法があるかと思います。わたしは、KVM+Qemu で動かしているので、virt-manager からディスクイメージをバックアップしました。

こういうとき仮想マシンって便利だね。

現在のインストールを最新版まで上げておきます。

現在インストールされているパッケージを最新版までアップデートしておきます。

root@MyOpenWRT:~# opkg update
root@MyOpenWRT:~# opkg list-upgradable
root@MyOpenWRT:~# opkg list-upgradable | cut -d ' ' -f 1 | xargs opkg upgrade

boot のvmlinuz更新

マウントされていることを確認

root@MyOpenWRT:~# mount  | grep boot
/dev/sda1 on /boot type ext4 (rw,noatime)
/dev/sda1 on /boot type ext4 (rw,noatime)

boot に移動

root@MyOpenWRT:~# cd /boot
root@MyOpenWRT:/boot# ls
grub     vmlinuz
root@MyOpenWRT:/boot# cp vmlinuz vmlinuz.bk

vmlinuz をアップデートするので消してもいいようにバックアップを取っておく。

ダウンロードして更新

root@MyOpenWRT:/boot# curl -LJO https://downloads.openwrt.org/releases/19.07.1/targets/x86/64/openwrt-19.07.1-x86-64-vmlinuz
root@MyOpenWRT:/boot# ls
grub                            vmlinuz
openwrt-19.07.1-x86-64-vmlinuz  vmlinuz.bk
root@MyOpenWRT:/boot# cp  openwrt-19.07.1-x86-64-vmlinuz vmlinuz

これで、vmlinuz は更新された、まだ再起動しません。

kernel image の更新

公式サイトから 、kernel_4.XXX_x86_64.ipk を取得して、インストールします。

root@MyOpenWRT:~# curl -LJO https://downloads.openwrt.org/releases/19.07.1/targets/x86/64/packages/kernel_4.14.167-1-e1dd7676581672f6f0bdb1363506dee1_x86_64.ipk
root@MyOpenWRT:~# ll
drwxr-xr-x    3 root     root          4096 Feb  3 17:45 ./
drwxr-xr-x   19 root     root          4096 Jan 21 03:06 ../
-rw-------    1 root     root         12968 Feb  3 16:11 .bash_history
drwx------    2 root     root          4096 Jan 21 03:17 .ssh/
-rw-------    1 root     root         15511 Feb  3 04:31 .viminfo
-rw-r--r--    1 root     root           798 Feb  3 17:45 kernel_4.14.167-1-e1dd7676581672f6f0bdb1363506dee1_x86_64.ipk

ダウンロードできたのでインストールします。

root@MyOpenWRT:~# opkg install kernel_4.14.167-1-e1dd7676581672f6f0bdb1363506dee1_x86_64.ipk
Upgrading kernel on root from 4.14.162-1-e1dd7676581672f6f0bdb1363506dee1 to 4.14.167-1-e1dd7676581672f6f0bdb1363506dee1...
Configuring kernel.

これで、カーネルインストールができました。

パッケージの更新

パッケージをバージョンに合わせて更新するのですが、まず、バージョンの数字を合わせていきます。

/etc/opkg/distfeeds.conf に、パッケージ取得元のURLが記載されています。

確認します。

root@MyOpenWRT:~# cat /etc/opkg/distfeeds.conf
src/gz openwrt_core http://downloads.openwrt.org/releases/19.07.0/targets/x86/64/packages
src/gz openwrt_base http://downloads.openwrt.org/releases/19.07.0/packages/x86_64/base
src/gz openwrt_luci http://downloads.openwrt.org/releases/19.07.0/packages/x86_64/luci
src/gz openwrt_packages http://downloads.openwrt.org/releases/19.07.0/packages/x86_64/packages
src/gz openwrt_routing http://downloads.openwrt.org/releases/19.07.0/packages/x86_64/routing
src/gz openwrt_telephony http://downloads.openwrt.org/releases/19.07.0/packages/x86_64/telephony

この数字を更新するのですが、sedで更新します。

sed -i はミスると致命的なので、先にcat で試しておきます。

## cat で sedのミスがないか確認
root@MyOpenWRT:~# cat /etc/opkg/distfeeds.conf  | sed  's/19.07.0/19.07.1/'
src/gz openwrt_core http://downloads.openwrt.org/releases/19.07.1/targets/x86/64/packages
src/gz openwrt_base http://downloads.openwrt.org/releases/19.07.1/packages/x86_64/base
src/gz openwrt_luci http://downloads.openwrt.org/releases/19.07.1/packages/x86_64/luci
src/gz openwrt_packages http://downloads.openwrt.org/releases/19.07.1/packages/x86_64/packages
src/gz openwrt_routing http://downloads.openwrt.org/releases/19.07.1/packages/x86_64/routing
src/gz openwrt_telephony http://downloads.openwrt.org/releases/19.07.1/packages/x86_64/telephony

sed でただしく、書き換えられることががわかったので、このファイルをsed -i で直接更新(上書き)します。

root@MyOpenWRT:~# sed -i 's/19.07.0/19.07.1/'  /etc/opkg/distfeeds.conf

これで、パッケージ取得元を変更できました。

opkg の一覧を更新して、アップデートします。

root@MyOpenWRT:~# opkg update

実行例

root@MyOpenWRT:~# opkg update
Downloading http://downloads.openwrt.org/releases/19.07.1/targets/x86/64/packages/Packages.gz
Updated list of available packages in /var/opkg-lists/openwrt_core
Downloading http://downloads.openwrt.org/releases/19.07.1/targets/x86/64/packages/Packages.sig
Signature check passed.
Downloading http://downloads.openwrt.org/releases/19.07.1/packages/x86_64/base/Packages.gz
Updated list of available packages in /var/opkg-lists/openwrt_base
Downloading http://downloads.openwrt.org/releases/19.07.1/packages/x86_64/base/Packages.sig
Signature check passed.
Downloading http://downloads.openwrt.org/releases/19.07.1/packages/x86_64/luci/Packages.gz
Updated list of available packages in /var/opkg-lists/openwrt_luci
Downloading http://downloads.openwrt.org/releases/19.07.1/packages/x86_64/luci/Packages.sig
Signature check passed.
Downloading http://downloads.openwrt.org/releases/19.07.1/packages/x86_64/packages/Packages.gz
Updated list of available packages in /var/opkg-lists/openwrt_packages
Downloading http://downloads.openwrt.org/releases/19.07.1/packages/x86_64/packages/Packages.sig
Signature check passed.
Downloading http://downloads.openwrt.org/releases/19.07.1/packages/x86_64/routing/Packages.gz
Updated list of available packages in /var/opkg-lists/openwrt_routing
Downloading http://downloads.openwrt.org/releases/19.07.1/packages/x86_64/routing/Packages.sig
Signature check passed.
Downloading http://downloads.openwrt.org/releases/19.07.1/packages/x86_64/telephony/Packages.gz
Updated list of available packages in /var/opkg-lists/openwrt_telephony
Downloading http://downloads.openwrt.org/releases/19.07.1/packages/x86_64/telephony/Packages.sig
Signature check passed.

インストール中に/lib/functions.shが実行されないように実行権限を外します。 initスクリプトが何度も実行されないように。(らしい

root@MyOpenWRT:~# ll  /lib/functions.sh
-rwxr-xr-x    1 root     root          8104 Jan  7 01:47 /lib/functions.sh*
root@MyOpenWRT:~# chmod -x /lib/functions.sh
root@MyOpenWRT:~# opkg upgrade base-files
Upgrading base-files on root from 204.2-r10860-a3ffeb413b to 204.2-r10911-c155900f66...
...

最後にパッケージ全部アップデートしていきます。

root@MyOpenWRT:~# opkg list-upgradable | cut -d ' ' -f 1 | xargs opkg upgrade

これでアップデート出来ました。

再起動します。

root@MyOpenWRT:~# reboot

アップデートを確認します。

OSのgitのコミットのバージョン

root@MyOpenWRT:~# cat /etc/openwrt_version
r10911-c155900f66

カーネルのバージョン

root@MyOpenWRT:~# uname -a
Linux OpenWRT_livaZ_VM 4.14.167 #0 SMP Wed Jan 29 16:05:35 2020 x86_64 GNU/Linux

wrt関連の情報

root@MyOpenWRT:~# cat /etc/openwrt_release
DISTRIB_ID='OpenWrt'
DISTRIB_RELEASE='19.07.1'
DISTRIB_REVISION='r10911-c155900f66'
DISTRIB_TARGET='x86/64'
DISTRIB_ARCH='x86_64'
DISTRIB_DESCRIPTION='OpenWrt 19.07.1 r10911-c155900f66'
DISTRIB_TAINTS=''

Linux にある os-releaseの情報

root@MyOpenWRT:~# cat /etc/os-release
NAME="OpenWrt"
VERSION="19.07.1"
ID="openwrt"
ID_LIKE="lede openwrt"
PRETTY_NAME="OpenWrt 19.07.1"
VERSION_ID="19.07.1"
HOME_URL="https://openwrt.org/"
BUG_URL="https://bugs.openwrt.org/"
SUPPORT_URL="https://forum.openwrt.org/"
BUILD_ID="r10911-c155900f66"
OPENWRT_BOARD="x86/64"
OPENWRT_ARCH="x86_64"
OPENWRT_TAINTS=""
OPENWRT_DEVICE_MANUFACTURER="OpenWrt"
OPENWRT_DEVICE_MANUFACTURER_URL="https://openwrt.org/"
OPENWRT_DEVICE_PRODUCT="Generic"
OPENWRT_DEVICE_REVISION="v0"
OPENWRT_RELEASE="OpenWrt 19.07.1 r10911-c155900f66"

これで無事にバージョンが出来ました。

後片付け

kernel.ipkのパッケージを削除しておきます

root@MyOpenWRT:/etc# cd /
root@MyOpenWRT:~# rm kernel_4.14.167-1-e1dd7676581672f6f0bdb1363506dee1_x86_64.ipk

/boot に作ったバックアップを削除しておきます。

root@MyOpenWRT:~# cd /boot
root@MyOpenWRT:/boot# ls
grub                            openwrt-19.07.1-x86-64-vmlinuz  vmlinuz                         vmlinuz.bk
root@MyOpenWRT:/boot# rm vmlinuz.bk
root@MyOpenWRT:/boot# rm openwrt-19.07.1-x86-64-vmlinuz

パーミッションも直しておきました。

root@MyOpenWRT:~# chmod +x /lib/functions.sh

今回省略したこと

ハッシュ値のチェック。はやってません。

sysupgrade などのファームウェアの書き換えもやってません。ext4 に直接いれてるOpenWrt x86 なので

参考資料

Upgrading an OpenWrt 18.06.1 x86_64 ext4 image to 18.06.2 – 文卓的笔记

OpenWrt Project: Upgrading OpenWrt firmware via CLI

市販ルータを諦めて x86_64 マシンliva zを Linuxルータにした。

市販ルータに限界を感じた。

PPPoEの再接続の再起動にいちいち、WEB-UI開くのが面倒だし。
ちょっとルーティングテーブルを管理するのでも面倒だし。
ルーターは電源つけっぱなしだけど、他の用途に使えないし。 SSH で管理できないし
VLANを割り振ってアレコレするのも不便だし。

dd-wrt や OpenWRTでファーム書き換えてもいいんだけど そうすると、電波法おじさんが出現する。技適技適!と言われるからでしょうか、ルーターファーム書き換えなどのノウハウはWEBに蓄積していかないので、ググっても微妙だし。

もう、諦めて、x86 で使えるルータOSを使うことにしました。

ubuntuルーターにするというのも考えたのだけれど、スマホから管理するが面倒なのでやめました。 みんなは金持ちなのでYAMAHAルーター買ってきたりCisco買うんだろうけど、、*1

x86_64 がアレば無敵だよね。

目次

ルーターに使えそうな、機器を調べた

ルーターに使うために検討した条件

  1. NICが複数個ある
  2. 小型サーバーのNUCで低消費電力
  3. AES-NIで暗号化処理にもたつかない
  4. トラブル防止のためにAmazonプライム購入できること
  5. 価格は2万くらい

条件を満たしたLivaZ

あれこれ探していたら、条件を満たしたものがあったのでずっとチェックしてた。価格は頻繁に変動するので注意。

f:id:takuya_1st:20200130020312p:plain:w200

存在は1年ほど前から知っていたのですが、Aliexpress類似商品を比較したり、Livaの進化型商品が販売されるかもしれないので、躊躇してた。またルーター構成するとなると一歩間違うと家族に大迷惑なので、アレコレと知識を得たり、試している間に、時間が経過してしまって1年ごしでようやく試せた。*2

Liva Z の 利点

これらはいいところ。

  • NICが2本刺さる
  • 4コアのCPU N4200
  • TDP 10W
  • OSなし版が選べる。
  • VESAマウンタがついてる

惜しいところ

届いたので開封

写真はあとで

オーディオ端子について

オーディオ端子はiPhoneと同じでマイクとスピーカのコンボの4極なので、デスクトップとして使うには優秀なんだろうけど。HDMIあるしね。Bluetoothあるしね。使うことはないんじゃないかなと。

BIOSの設定

消費電力を抑えるために、使う予定のない、オーディオ端子やWiFiやM.2 関連をバッサリとカット。

Ubuntu Serverで起動後アイドル時の消費電力は5Wを切っていたのでホント優秀。

Liva Z 設定

LivaZ の自動電源の設定。

パワーオフ後に電源復帰で起動してくれなくては困ります。

ルータの用に常時起動する機器は特に挿したら起動がいい。

停電しても起動を気にしたくない。停電後の電源復帰で自動起動してくれればいい。

停電は仕方ないものとしても、自動で起動してくれるとルーターとして使い勝手が格段に向上するよね。

AC復帰後の自動起動の設定が少しわかりにくかったのでメモ

EuP「無効」にしないと、停電解消後のパワーオンが選べなかった。有効にし電源さして起動にした。

f:id:takuya_1st:20200130022458p:plain f:id:takuya_1st:20200130022509p:plain

OSの構成

OpenWRT の x86/64 版を入れることにした。ただし、WiFiを使う予定は全くない。付属のIntel 3165 じゃ、5GhzのAPに出来ない。使い物にならない。*7

Ubuntu ServerをインストールしてKVM上に構築することにした。

KVMホストにOpenWrtをゲストとしてインストール。

NICを、macvtap で渡すことにした。

OpenWrtがうまく行かなかった場合などに、OPNSense / pfSense や x86Seil また Sophos など別のOSを試すと予想して、KVM上に構築することにした。

ホストOSの構成

ルーターOSを入れ替えて試したいので、仮想マシンで構成することにしました。

KVMのホストを作ります。

ホストには、Ubuntu Server 19.10 を採用しました。

ubuntu server ディスク構成

最小インストールでkvm を入れてあります。
またLivaZのN4200はルーターには余るくらいのCPUパワーとAES-NIなので、cyrptsetup でeMMC をフル暗号化にしてあります。

Ubuntu Serverのインストール後、KVMをセットアップしたあとのストレージ構成は次のとおりです。

takuya@livaz:~$ lsblk
NAME           MAJ:MIN RM  SIZE RO TYPE  MOUNTPOINT
loop0            7:0    0 54.9M  1 loop  /snap/lxd/12631
loop1            7:1    0 89.1M  1 loop  /snap/core/8268
loop2            7:2    0 89.1M  1 loop  /snap/core/7917
loop3            7:3    0 64.5M  1 loop  /snap/lxd/13162
mmcblk0        179:0    0 29.2G  0 disk
├─mmcblk0p1    179:1    0  512M  0 part  /boot/efi
├─mmcblk0p2    179:2    0  732M  0 part  /boot
└─mmcblk0p3    179:3    0   28G  0 part
  └─dm_crypt-0 253:0    0 27.9G  0 crypt
    └─vg-lv    253:1    0 27.9G  0 lvm   /
mmcblk0boot0   179:8    0    4M  1 disk
mmcblk0boot1   179:16   0    4M  1 disk

UEFIブート構成

UEFIでブート構成してています。というか普通にインストールしたらUEFIだった。いまどきMBRもないだろうし。

Liva Z のオーナー様のブログやアマゾンのレビューを拝見していると、ブート(UEFI)でトラブった話がちらほら出てくるのですが、書いてるのオッサンばっかなのでEFIブートの慣れの問題じゃないかと思います。

LivaZのTPMバイスの活用

Liva Z N4200モデルのマザーボードにはTPMの項目があり、 /dev/tpm0 が認識されたので TPMでディスクの暗号化鍵を管理しようと思いましたが、うまくいきませんでした。 ストレージのパスワードは、平文で /bootに置くことにしました。

この辺は、ちゃんと調べればBitlocker同様に使えそうだった。そのうちなんとかしたいです。

2020-12-30 更新 TPMを使ったLUKSの自動アンロックは完成した。 → TPMで起動時に自動アンロック

インストール画面

スクショどっかいったので、探しておきます。

KVM のインストール

KVM のインストール は通常のUbuntu Serverと同じです。

sudo apt-get install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils

他には、いつもの通り、openssh-server vim-nox iperf などが入れてあります。

ゲストOSの構成

ルーターとして動かすOSを選びます。

候補としては次のとおりです

候補に関しては、Wikipedia:en のルーターOS一覧が詳しいです。

このあたりを仮想マシンで動かして試していきたい

ゲストの選定

OpenWRTにしました。

OpenWrtだとWebから管理できる。またGNUコマンド類が使える。とくにip(iproute2)コマンドが影響する。OPNsenseだとBSDなので、ネットワーク系コマンドは別系統で辛い。

  • スマホから設定や状態を見たいときにWEBは必須。
  • ネットワークコマンドがip

これらの観点から

OpenWrtのx86版をext4 のイメージを使いました。

ex4のイメージだと uci commitしなくてもデータが永続化するみたい。便利。

ゲストに作成時にVGAはオフにしました。

ルータ用OSであればディスプレイも必要ないでしょう。VGA分のメモリをゲストに割り振る必要もなくなるので、シリアルコンソールのみにしました。

ゲスト設定で注意したところ

設定をしていく上で、ハマったポイントは、主に IPv6絡みでした。

特に注意したところは、macvtap で ipv6の受け取り設定。NTTのHGWからのPDを受け取りたい

kvm のゲストに IPv6マルチキャストのrouter advertise を渡すには、trustGuestRxFilters='yes'が必要らしい。(とりあえずつけた

  <interface type='direct' trustGuestRxFilters='yes'>
    <mac address='52:54:00:af:28:bc'/>
    <source dev='enp3s0' mode='bridge'/>
    <model type='virtio'/>
    <link state='up'/>
    <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
  </interface>

OpenWrtの設定

起動すると 192.168.1.1でWEB-UIのアドミン画面が起動する。
192.168.1.0/24 で DHCPが起動している。
macvtap で外に出しているので、作業用のラップトップから直接通信が届くので便利

設定は、主にWEBから行うが、sshでログインして行えるので楽でいい。

OpenWRTでシリアルコンソールのログインを必須したい

シリアルコンソールを見ていると root でログインした状態になっていて気持ち悪いのでログインを必須にする。

option ttylogin '1'を 突っ込むと ログインが必須に成りました。

root@OpenWrtVM:~# cat /etc/config/system 
config system
        option ttylogin '1'
        option log_size '64'
        option urandom_seed '0'
        option zonename 'Asia/Tokyo'
        option hostname 'OpenWrtVM'
        option log_proto 'udp'
        option conloglevel '8'
        option cronloglevel '5'
        option timezone 'JST-9'

config timeserver 'ntp'
        list server 'ntp.nict.jp'

ホスト名や、タイムゾーン、NTPサーバーなどもここでコピペで流し込んでおきました。

設定の編集のために いつものツールをいれる。

ssh 経由で編集するために vim / bash を入れておく。

opkg update
opkg install vim-full bash diffutils

設定を変数するときに差分を見たいが、vimdiff は提供されていない vimdiff の代わりに vim -d を使うのだが、diffコマンドを導入する必要があった。

chsh コマンドはないので、/etc/passwd を直接書き換えて シェルをbashにする

root@OpenWrtVM:~# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash

シェルをbashに変えれば vim で行番号表示やカラーなどフル機能が使えるようになる。

市販ルータのファーム入換たOpenWrtと違ってx86ならROM容量を気にせず、okpgをガンガン使えるのがいいところ。

OpenWrtの基本

  • 設定は指定されたフォルダにある。
  • 追加ソフトは opkg で
  • サービスの起動は /etc/init.d/のコマンド類を serviceコマンドで呼び出し。

設定について

設定は /etc/config/ のフォルダに集まっています。 設定を書き換えたら uci commit で反映されます。 また設定は yaml っぽい感じの json みたいなものになっています。

設定は直接ファイルを書き換えるのが楽です。

uci コマンドを使えば、ucijson のオブジェクトみたいに辿って設定を書き換えることも可能です。

uci コマンドの例。

## dhcp の設定から rebind_localhost を削除する場合
uci del dhcp.cfg01411c.rebind_localhost

ある程度パターンになってる設定はuci を使ってシェルスクリプトにしてしまえるので、自動化ができますね。 ちなみにWEBの画面は uci を使っているようです。

f:id:takuya_1st:20200130034549p:plain

このように設定の差分をuciで見られます。

wan6 に ipv6をpd でもらってくる

HGWのときは、次の設定が必要だった。日本のv6は早すぎたのでちょっとアレゲ。フレッツ壊れたIPv6*8の網内通信をするために、NTTのホームゲートウェイから、OpenWrtのWAN6インタフェースへ、ipv6を割り振ってもらおうとして苦労しています。

目標として、LAN内部にv6を流さずに、ルーター側だけがv6アドレスを持つようにします。

うちは、PPPoEなので、IPoEはまだ契約していないためです。v6アドレスを流してしまうとDNSフォールバックが発生してどうしてもインターネットが遅くなります。( AAAA レコードどおりに接続しようとして IPoE未契約だとタイムアウト待ちになる)。IPoE契約してもいいんだけど、、ルーター設定終わってから試すことにしました。

/etc/config/network

config interface 'wan6'
        option ipv6 '1'
        option proto 'dhcpv6'
        option ifname 'eth1'
        option reqaddress 'try'
        option reqprefix 'auto'
        option defaultroute '0'

wan6の設定は日本の壊れたIpv6にはうまく対応しないので、ndpなどをオフにしておきました

defaultroute をつけているとv6通信が始まるので、IPoE未契約の場合タイムアウトになります。面倒くさいだけなのでOffです。

/etc/config/dhcp

dhcpはこのようにしていました

config dhcp 'wan6'
        option interface 'wan6'
        option ra 'disabled'
        option ndp 'disabled'
        option dhcpv6 'disabled'
        option master '1'

/etc/config/firewall

config rule
        option target 'ACCEPT'
        option name 'to-cpu'
        option family 'ipv6'
        option proto 'all'
        option src 'NGN'
config zone
        option network 'wan6'
        option name 'NGN'
        option family 'ipv6'
        option input 'ACCEPT'
        option output 'ACCEPT'
        option forward 'REJECT'

バイスの input ( cpu ) 側だけにIPv6のrouter adを通してLANには通さないようにしました。

設定の反映

設定の反映は uci を使います。再起動は service コマンドが /etc/init.d を叩いてくれます。

uci commit network
uci commit dhcp
uci commit firewall
service restart network
service restart dhcp
service restart firewall

ext4 イメージならuci commit しなくてもいいみたいだけど、squashfsのときの癖で・・・

WAN6 に無事に HGWから IPv6 がPDとともに割り振られました。

f:id:takuya_1st:20200130034531p:plain

これで、フレッツの網内折返し通信ができますね。

その他入れたもの

OpenWrtに導入したパッケージです

ネットワーク関連

ip-full
tcpdump
bind-dig
iperf

ip コマンドが簡易版なので、ubuntu などと同じモノを入れました。
また、パケットを見たいのでtcpdumpを入れました。
また、dnsをdigしたいのでdigを導入しています。
また、速度測定のために iperfも入れています。

コマンド・ツール関連

ルーターでのssh作業を少しでも快適にするために、使いました。

vim-full
bash
findutils-locate
lscpu
lspci
lsblk
diffutils

ファイルシステム関連

最初はkvmじゃなくて直接インストールしたので、これを使いました。 KVMゲストだと要らないか。

e2fsprogs
partx-utils
mkf2fs

ルーター機能追加

unbound 
ddns
upnp
openvpn-openssl

DNSupnpなど、ルーターに欠かせないもの。トンネリング関連を入れておきました。

dnsmasq はあるのですが、1.1.1.1 や 8.8.8.8 にクエリを投げつけるのが好きではないので、unboundをいれて、dnsmasqが自分自身のunbound ( localhost#5353 )に訊きに行くようにしました。

unboundが roots.hintで DNSルートサーバーから調べてくれるはずです。

pppoe の設定

フレッツPPPoE特有の問題。

フレッツのPPPでは、mtu の値をfix してあげないと、通信が詰まる感じがあったり、TLS 1.3 のパケットをうまく捌けなくて遅くなる。

config zone 
  option name 'wan'
  option network 'myISP'
  option masq '1'
  option mtu_fix '1'
  option input 'REJECT'
  option output 'ACCEPT'
  option forward 'REJECT'
  option family 'ipv4'

Luci では次の箇所で mss clamping の設定をして、mtu の値をうまく扱ってあげると、パフォーマンスが段違いに良くなる。

f:id:takuya_1st:20200203042507p:plain
mss clamping

フレッツ網内折返しでipipを試してみた

ルーターからipv6で網内折返しができるようになり、ルーターLinuxなので ipコマンドが使える。

なので、網内折返しのついでにipipを使ってみたいと思います。ip4ip6で 簡易 ipip のフォワーディングです。網内の別拠点と通信を試してみました。

設定自体は手作業でもできるのですが。wan6が起動したと同時に自動接続したいのでスクリプト化しました。

/etc/hotplug.d/iface/スクリプトを設置すれば、ネットワーク構成が変更(ifup)される都度呼び出されます。スクリプト内部で、どのインタフェースが起動したのかを調べ、ipv6取得したときルーティングテーブルとipip でトンネリング作成後に経路を書換えます。NATはしません。トンネリング通信を試験的に設定します。

root@OpenWrtVM:/etc/config# cat /etc/hotplug.d/iface/99-ifup-ipv6
#!/bin/sh
## フレッツ ipv6 を接続する
## 2020-01-21
## require ip-full kmod-ip6-tunnel
## config netwotk で dhcpv6 設定

TARGET_INTERFACE=wan6
TARGET_DEVICE=eth1
#logger "ACTION=$ACTION"
#logger "INTERFACE=$INTERFACE"

function create_tun1 {

  ip -6 tunnel del tun2 
  ip -6 tunnel add tun2 mode ip4ip6 remote 2001:xxx0:xxxx:xxxx:e80:63ff:xxxx:c53b  local 2001:xxx3:xxxx:xxxx:5054:ff:xxxx:27bb
  ip link set tun2 up
  ip addr add 172.16.2.1/30 dev tun2
  ip route add 192.168.1.0/24 via 172.16.2.2 dev tun2
  iptables -I INPUT   -i tun2 -j ACCEPT
  iptables -I FORWARD -i tun2 -j ACCEPT
  iptables -I OUTPUT  -o tun2 -j ACCEPT
  iptables -I FORWARD -o tun2 -j ACCEPT



}
function add_ip6_default(){
  # add default すると、通信はできるけど、 opkg が動かなくなるので注意
  # ip6 のdefault route はオフにしてある。
  if ! ip -6 route  | grep 'default via ' > /dev/null ; then
   ip -6 route add default via fe80::225:36ff:xxxx:xxxx dev eth1
  fi
}
function add_ip6_route(){
  ip -6 route add 2001:xxxx:xxxx:3700::/64  via fe80::225:xxxx:fe75:xxxx  dev eth1 proto static metric 512 pref medium
}


## main

[ "$ACTION" = "ifup" -a "$INTERFACE" = "$TARGET_INTERFACE"  ] && {
    logger "iface ipv6 up detected..."
    add_ip6_route;
    create_tun1;
}
exit 0

このスクリプトを実行すると次のような経路が出来があります。

root@OpenWrtVM:# ip -6 route
2001:xxx0:38a8:xxxx::/64 via fe80::225:36ff:xxxx:xx42 dev eth1 proto static metric 512 pref medium

ipv4 もできました。

root@OpenWrtVM:# ip a
7: tun2@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1452 qdisc noqueue state UNKNOWN group default qlen 1000
    link/tunnel6 2001:xxx3:xxxx:a300:xxx:ff:feaf:xxbb peer 2001:xxx0:xxx:3700:e80:xxx:xxx:xx3b
    inet 172.16.2.1/30 scope global tun2
       valid_lft forever preferred_lft forever
    inet6 fe80::2ca8:e3ff:xxxx:xxba/64 scope link
       valid_lft forever preferred_lft forever

あとは、対向ルータも同様に設定して。疎通を確認しました。

KVM仮想マシンでOpenWrtを作っているので、もう1台仮想マシンを起動して仮想マシン間をIPv6で作れば、設定はかんたんに試せました。仮想マシンとmacvtap / bridge のおかげで、遠くのフレッツ利用者に協力を仰がなくても試せるのは素晴らしいですね。

ipipの通信は、通信がないと切断されてしまいます。試験的に設定したものです。永続化するものじゃないです。永続化のため定期的にpingを打つのは現実的じゃないので、設定ができたらopenvpnssh-tun などに切り替えたほうがいいと思います。

使ってみて

スループットは大幅に向上しました。

消費電力もそんなに気になりません。iperfで速度測定しまくってても8W程度でした。

ただ、Liva Z N4200 だと 内蔵スイッチがないのでルーターのようにswconfigが使えないのでタグVLANを管理してネットワークを上手に使うというのはできない感じでした。KVMホストに Open vSwitchを入れたりしないとだめかもね。

来月以降は OPNSense/pfSenseやIIJにSeilx86も試したいと思います。

LivaZおすすめ

OpenWrtを動かすだけなら正直言って4コアもいらんかった気がする。

その他のルーターに使えそうな製品

AmazonJPで色々売られています。 N3350 / N4200 あたりがお手頃でAES-NIがついてる感じですかね。

Celenron J1900とかはAES-NIを非搭載なのでVPNなどで苦労するかもしれません。

NICを複数搭載したマザーボードもありますが、ゲーミングPC用だったりで Core i5 9400とか用意しなくちゃいけない。常時起動にはあまりにオーバースペックすぎる。価格も性能も電気代も。

省電力CPUでソコソコの性能でソコソコの価格でNIC二本挿しが可能なのはLivaZくらいしかありませんでした。ルータにするために誕生したような製品ですね。

Lenovo が Think Centre tiny の Ryzen 2400Eを投げ売りしててそっちも買ったのですが、性能とコスパはよくて消費電力アイドル時で10wくらいでいいんだけど、NICが1本なのなんともなんとも。。。

スイッチングハブのない問題- VLAN対応安かった

x86 のPCをルータとして使う場合、ポートが足りない問題があります。

市販ルーターと違ってスイッチングハブがない問題が出てきます。

ギガビットハブなどは、1500円程度で購入可能です。

またタグVLANやポートVLANに対応したスイッチングハブは2500円で購入可能でした。

VLANが切れるので、フレッツ/56に直結させたり、HGWの/60に接続したり、配線を変更せずにパケットを捌けます。 ネットワーク構成をいじるときに大活躍しました。

WiFiない問題。

WiFiは面倒なのでやめましたが、Atherosのチップを搭載したpci-e ( ngff / m2 key e ) のカードを買えば動くかもしれないです。ただしath10kは市販ルーター用で、カードだけ市販されてないしWindowsでは動作しないっぽい。

そこで、APとして動く中継機だけを買うほうが楽だという結論に至りました。

ルーターよりも、このほうが接続すっきりするじゃん。

無線LANどうするか

仮想マシンで起動していいる OPNSense や OpenWRT に無線LANのAPもやらせたい。その場合はUSBでデバイスをパススルーが一番いいと思う。

もしくは、仮想マシンをやめてLivaZにOpenWrtを素で入れれば、OpenWrt側で無線LANのドライバをうまいこと扱ってくれるでお試しするにはいいと思う。

UTMも作れそう

セキュリティ関係のUTMに近いことも openwrt や opnsense を使って構成していけば作れそうですね。

そういうパッケージもルータOSに用意されてそう。そのうち試したいです。

今回試さなかった構成

PXE BOOT

ネットワーク越しの、ブート ルータなんだし、openwrtをpxeブートに変えたらさらに耐障害性も上がったと思う。そもそもそういうための軽量OSなんだし。仮想マシンではなく、ベアメタルにPXEでよかったかもしんない。

またkvmホスト側もpxeで良かったかもしれない

alpine linux

Dockerでお馴染みのディストリ。KVMホストをubuntu serverじゃなくalpineでよかったかもしれない。

LXD / lxc

kvmを持ち出さないで、dockerコンテナでk8sしてもよかったかもしれない。

DS-liteなどv6技術

IPoE未契約なので試せてない

感想・まとめ

ルーターが自由になると本当に楽しい。

x86のマシンを使っているのでOpenWRTの記事を堂々と書けるのも嬉しい。電波法の技適おじさん怖い

ip コマンドで ip route add したり サブネットを考えたり、NAT転送やforwading とファイアウォールの構成、あとipv6も楽しめる。

自由なソフトウェアとは本当に素晴らしいですね。

OpenWrtをゲスト稼働中のLivaZ の負荷(load)です。

CPUの消費電力が2Wとセンサーからレポートされています。インテルCPUの消費電力ってほんと優秀ですね。

f:id:takuya_1st:20200203183646p:plain

PPPoEの速度です。

いままで使ってた、TP-Linkの c7v5 に比べて100Mbps以上は圧倒的に速い。

f:id:takuya_1st:20200205050735p:plain

修正

一部の誤字脱字を直しました。

2020-02-03

フレッツのPPPoEのMTU設定の言及を加筆

2020/12/30

TPMアンロックについて言及。

*1: 自由なソフトウェアがいい。できればGNUがいい。

*2: ネットワーク初心者なので、IPAのネスペ取得からはじめました。大掛かり

*3: いまさら DDR3L の8Gx2=16GBを買うのはちょっと・・・

*4: 12v / 16v のAC電源でも動いたけどね。実際にはDC12-19Vなんじゃないかな。

*5: N4200はVt-d対応ってIntelは書いてあるけど、有効化する方法が見つからない

*6: 2.4GHz のAPしか作れない

*7: Linux Wireless を参考のこと https://wireless.wiki.kernel.org/en/users/drivers/iwlwifi

*8: 壊れたv6 https://internet.watch.impress.co.jp/docs/news/534357.html

kvm+qemuの仮想マシンのVMへ、シリアルコンソールで接続する。

仮想マシンVMへ、シリアルコンソールで接続する。

virt-managerVGAを使うより、コンソールで接続したい。と思いました。 サーバー版のLinux を使っていて思うんだけど、インストールしても利用しても、本当ににVGAって必要?

Ubuntu Server や openWRT x86をインストールした仮想マシンVGAによるディスプレイモニタが必要なんでしょうか。

昔からのシリアルコンソールでいいんじゃないんですかね。

やったこと

  • シリアルで接続できること確認。
  • VGAをdisabledにする。
  • シリアルコンソールにログを書き出したい。
  • シリアルコンソールにログインを出したい。

これらを実現させれば、仮想マシンマネージャーからも、virsh からもコンソールでテキストだけで解決するしスクロールバッファも取れるしコピペもしやすくなるよね。

仮想マシンマネージャーでの設定例

設定を変更して、シリアルのみにした

f:id:takuya_1st:20200130013333p:plain

ディスプレイをクリックしたらコンソールのみになる。嬉しい。

f:id:takuya_1st:20200130013338p:plain

スクリーンショットは、OpenWrt のx86_64 を起動したところです。

シリアルからのttyログインを有効にする。

Ubuntu server の場合、tty ログインを有効にするには、次のようにする。

sudo systemctl enable serial-getty@ttyS0.service
sudo systemctl start serial-getty@ttyS0.service

昔ながらのmingetty じゃないんですね。

Grubのブート画面もシリアルコンソールへ

GRUB のOS選択画面もシリアルコンソールに出力したいよね。

/etc/default/grub

grub の起動オプションを次のように追記して。

GRUB_TERMINAL=serial
GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"

grub のメニューを更新する

sudo update-grub 

起動時のGRUBへのアクセスも許可するなら

GRUB_CMDLINE_LINUX_DEFAULT="console=tty1 console=ttyS0,115200"

を追記する

コンソールをssh経由で呼び出す。

コンソールでログインできる環境を作っておくと、virsh でかんたんに管理ができる

virsh コマンドでコンソールに接続ができる。便利だわ

takuya@host:~$ virsh
Welcome to virsh, the virtualization interactive terminal.

Type:  'help' for help with commands
       'quit' to quit

virsh # console OpenWrt
Connected to domain OpenWrt
Escape character is ^]

OpenWRT login:root

シリアルコンソールにして便利

VGAだと画面の拡大率やVGAに割り振るメモリや画像処理に余計なCPUパワーを取られるんだけど、シリアルコンソールならあんまり気にしなくていいね