それマグで!

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

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

netatalk をアップデートしてmacのタイムマシンを作る

netatalk を更新した

mac のタイムマシンに samba が使えるのは知ってるんだけど、ずっとnetatalk なので引き続き使ってます。いまのところ特に問題ないし、現代のsambaは設定が煩雑すぎて目的を見失って沼に嵌りそうですし。

過去記事

netatalkでLinuxサーバーをNAS TimeCapusleサーバーにする。 - それマグで!

インストール

cd /usr/local/src
curl -LJO 'http://prdownloads.sourceforge.net/netatalk/netatalk-3.1.12.tar.bz2?download'
tar jxvf netatalk-3.1.12.tar.bz2
cd netatalk-3.1.12


sudo apt -y install \
build-essential \
libssl-dev \
libgcrypt*-dev \
libkrb5-dev \
libpam0g-dev \
libwrap0-dev \
libdb-dev \
libtdb-dev \
default-libmysqlclient-dev \
libavahi-client-dev \
libacl1-dev \
libldap2-dev \
libcrack2-dev \
systemtap-sdt-dev \
libdbus-1-dev \
libdbus-glib-1-dev \
libglib2.0-dev \
tracker \
libtracker-sparql*-dev \
libtracker-miner-*-dev 


./configure \
   --with-init-style=debian-systemd \
   --with-libevent=no \
   --with-cnid-tdb-backend=no \
   --with-tdb=no \
   --with-cracklib \
   --enable-krbV-uam \
   --with-pam-confdir=/etc/pam.d \
   --with-dbus-daemon=/usr/bin/dbus-daemon \
   --with-dbus-sysconf-dir=/etc/dbus-1/system.d \
   --with-tracker-pkgconfig-version=2.0


sudo dpkg -r netatalk3.1.11

sudo checkinstall \
   --pkgname=netatalk3.1.12 \
   --pkgversion="1:$(date +%Y%m%d%H%M)" \
   --backup=no \
   --deldoc=yes --fstrans=no --default


sudo systemctl daemon-reload
sudo systemctl status netatalk
sudo systemctl start netatalk
sudo systemctl status netatalk

設定ファイルをリンク作成

etc に持ってきておく

sudo ln -s /usr/local/etc/afp.conf /etc/afp.conf
sudo ln -s /etc/afp.conf /etc/netatlk.conf

afp.conf で有ることを忘れるので netatalk.conf にしておく

afp.conf

[Global]
    uam list = uams_dhx.so uams_dhx2_passwd.so
    mac charset = MAC_JAPANESE
    hostname = acid-afp
    vol preset = default_for_all_volumes
    log file = /var/log/netatalk.log
    #log level = default:maxdebug
    log level = default
    cnid scheme = cdb

    dbus daemon = /usr/bin/dbus-daemon

    mimic model = MacPro
    ;mimic model = RackMac

    dsireadbuf = 120 ; default 12
    dircachesize = 16384

[default_for_all_volumes]
    file perm = 0600
    directory perm = 0700

[Homes]
    basedir regex = /home
    follow symlinks = true
    time machine = no
    spotlight = true
    home name = $u's home(afp)
[My Time Machine Volume]
    path = /home/takuya/.backups/time_capsule/
    time machine = yes
    vol size limit = 450000

systemd のaccounts-daemon がCPU使用率を100%で上がってくるので止めた

ubuntu server の cpu 使用率

ubuntu server を入れてしばらくしていたときに、cpu 使用率をモニタリングしていたら、使用率が定期的にSPIKE してることに気づいた。

cpu 使用率が定期的に上がる

f:id:takuya_1st:20200221090747p:plain
cpu 使用率

4コアのうち1コアを完全に使い切る

一時的であるが accounts-daemonが cpu にピークを作っていることがわかった。

f:id:takuya_1st:20200221091918p:plain

消しちゃえ

accounts-service は、主に GNOMEデスクトップで使うものであるし、パーソナルユースのマシンではあまり役に立たないし.

しかも、Ubuntu CoreのServer版である。 要らない。と判断した

sudo systemctl stop   accounts-daemon
sudo systemctl disable   accounts-daemon
sudo systemctl mask  accounts-daemon

何に使うかは未だによくわからない。

ストップしてから1週間ほどですが、全く影響がない。ホントなんだったんだろう

参考資料

https://unix.stackexchange.com/questions/383138/should-i-disable-accounts-daemon

macOSからlinuxのvirt-managerのkvm+qemu の仮想マシンを管理する

macOSから 仮想マシンを管理したい。

macから仮想マシンを管理したいと思っても、フロントのアプリケーションがこれというものがありません。

virt-managerを 無理やり起動する brew もあるのですがイマイチです。

git にある tap を読み込んだ場合

brew tap jeffreywildman/homebrew-virt-manager
brew install  virt-manager virt-viewer
virt-manager -c 'qemu+ssh://takuya@192.168.1.144/system?socket=/var/run/libvirt/libvirt-sock'

ステータスを見るくらいしか出来ない。

起動はするが、詳細を設定できない。 f:id:takuya_1st:20200220105617p:plain

X11 に頼る。

古代魔術となってしまったOSXX11 を動かすやつを macOSになった今再度動かすことにする。

brew  cask install  xquartz 

再起動してライブラリを反映

reboot 

ssh 経由でXServerを使う。

どこか適当な踏み台となる、Ubuntu Desktop で Xを実行してそこから virt-managerを開ける。

ssh -X 192.168.1.111

リモートセッションのX11virt-manager

リモートワークしましょう。

f:id:takuya_1st:20200220105317p:plain

linux仮想マシンのフロント

詳細設定をGUIで設定することを考えると、ESXi や vCenter が良いのかもしれない。

普段だと ubuntu desktop を用意していてそこに XRDPするのですが、 今回は、dist-upgrade 中に gnome がエラー吐きまくってubuntu Desktopが一切使えなくなったので苦肉の策。

apt searchは正規表現で絞り込む

apt search で grep すると警告が出るんですね。

takuya@:~$ apt search docker | grep cockpit

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

9:cockpit-docker/stable,now 188-1 all [インストール済み]
10:  Cockpit user interface for Docker containers

apt の結果を grep しちゃうと駄目なんですね。昔にaptitude を使ってた癖でgrep しちゃうんですが。grep じゃ駄目なんですね

apt search の引数は正規表現

apt search の引数って apt-cache と同じで「正規表現」がそのまま使えるんですね。

 apt search 'cockpit|docker$'

ということはで、正規表現をsearchに使うと便利です。

パッケージ名に対して正規表現が出来ます。

takuya@:~$ apt search '^cockpit.*docker$'
ソート中... 完了
全文検索... 完了
cockpit-docker/stable,now 188-1 all [インストール済み]
  Cockpit user interface for Docker containers

takuya@:~$

個人的には、正規表現よりワイルドカードのほうが便利なんですが、grep するより簡単ですね。

aptコマンドでインストール済みを検索する

apt の結果をgrep するといつも警告が出る。

takuya@:~$ apt list --installed | grep docker

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

いつもこれどうしたものかとかと悩んでたんですが。ある日偶然タイプミスして解決方法に気づいたのでメモ

apt の引数にワイルドカードがつけられる。

docker のapt を消して snapd に変更しようとしてて、ワイルドカードを使ってる。

apt purge docker*
apt install docker*
apt list docker*

ワイルドカードが使えるんですね。apt の引数には

apt list の引数は ワイルドカードが取れる

ということは、ワイルドカードで検索ができる。

takuya@:~$ apt list --installed *docker*
一覧表示... 完了
cockpit-docker/stable,now 188-1 all [インストール済み]
docker-ce-cli/now 5:19.03.6~3-0~debian-stretch amd64 [インストール済み、ローカル]
docker-ce/now 5:19.03.6~3-0~debian-stretch amd64 [インストール済み、ローカル]
docker-compose/stable,now 1.21.0-3 all [インストール済み]
golang-docker-credential-helpers/stable,now 0.6.1-2 amd64 [インストール済み、自動]
python3-docker/stable,now 3.4.1-4 all [インストール済み、自動]
python3-dockerpty/stable,now 0.4.1-1 all [インストール済み、自動]
python3-dockerpycreds/stable,now 0.3.0-1 all [インストール済み、自動]

シェルの引数展開ではなくapt

シェルのワイルドカード展開かなともおもってエスケープしたり引数をクォートした。ちゃんとワイルドカードで取ってくれるのがわかる

takuya@:~$ apt list --installed \*docker*
takuya@:~$ apt list --installed \*docker\*
takuya@:~$ apt list --installed '*docker*'
一覧表示... 完了
cockpit-docker/stable,now 188-1 all [インストール済み]
docker-ce-cli/now 5:19.03.6~3-0~debian-stretch amd64 [インストール済み、ローカル]
docker-ce/now 5:19.03.6~3-0~debian-stretch amd64 [インストール済み、ローカル]
docker-compose/stable,now 1.21.0-3 all [インストール済み]
golang-docker-credential-helpers/stable,now 0.6.1-2 amd64 [インストール済み、自動]
python3-docker/stable,now 3.4.1-4 all [インストール済み、自動]
python3-dockerpty/stable,now 0.4.1-1 all [インストール済み、自動]
python3-dockerpycreds/stable,now 0.3.0-1 all [インストール済み、自動]

便利です。

インストール済みのパッケージを探したり、まとめて消すときや、関連するパッケージをまとめて探すのがとても便利になった。

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