b-shock. Fortress

XubuntuをOpenVPNクライアントに。解決編

追記(2017/10/21) 続きあり。
XubuntuをOpenVPNクライアントに。(Xubuntu 17.10)

前回の続き。解決編。
予告した通り、tunneldiggerを使用したらあっさりつながった。

パッケージの導入

1
2
sudo apt install openvpn
sudo apt install tunneldigger

前回の記事の通りにやってたら、openvpnは既に入ってるだろうけど。
成功事例ではないと言ってるのに、やった人はおらんだろうからw

設定

1
2
cd /etc/openvpn
sudo ln -s ~/Dropbox/Documents/OpenVPN/bshock.ovpn ./client.conf

設定ファイルはDropboxに既に置いてあったので、そこから拝借してる。
前回記事でもお見せしたが、内容は大体こんな感じ 。

追記(2017/10/21)
Xubuntu 17.10に含まれるバージョンのOpenVPNでは、 /etc/openvpn/client.conf を シンボリックリンクにすることは出来なくなった。
XubuntuをOpenVPNクライアントに。(Xubuntu 17.10)

接続・終了

VPN接続時は、sudo service openvpn start
終了させるときは、sudo service openvpn stop

GUIじゃなくても問題にならないお手軽さ。
実用上問題なし。

ログ設定

ここまでで一応終わりだけど、ログを見やすくするには、以下のような設定をすると いいんじゃないだろうか。
別にそんな必要なしって人は、とばしてよし。

まず、/etc/rsyslog.d/openvpn.confをこんな感じで書く。

続いて、/etc/logrotate.d/openvpnをこんな感じで。

ここまでやったら、sudo service rsyslog restart
/var/log/openvpn.logに、OpenVPN関連のログが抜粋されるようになる。 rsyslogやlogrotateについては、ググればよい資料があると思うので、 詳細は割愛。

現状の問題点

うちの環境だと、OpenVPN接続時に以下の問題があった。
そのうち調べる。

Sambaに接続できない。

さほど大きな問題ではない。
sftpなら問題ないので、緊急時にSamba上にある同じファイルを取得することは可能。

追記(2017/10/31)
解決した。→OpenVPN越しにSamba

KVM上の仮想環境から、ホストOS以外に接続できない。

KVM上のFreeBSDから、ネットワークを使用した大半の作業が不能に。
これはイマイチだが、当面は、OpenVPNとゲストOSを同時に使わない様にする。

追記(2017/10/03)
その後、この件は解決。
OpenVPNとKVM、その後。

以上。

XubuntuにOpenVPNクライアントを導入しようとして、難儀してる話

追記。解決編あり。
XubuntuをOpenVPNクライアントに。解決編

風邪をひいたのか、少々頭痛がする。
ほんとは、ここ数日がんばってる、監視系をNagiosからSensuにリプレイスしている 途中経過を書こうと思ってたのだが、そんなヘビーな記事を書ける状態ではなさそうなので、 ライトな話題でお茶を濁そうという次第。

タイトルをみてもわかると思うけど、成功事例ではないです。
結果だけ欲しい人には参考になる記事ではないので、そのような人は読んでも無駄かも。 あしからず。

経緯

事務所では、Archer C3150 というルータを使ってる。
これを買う直前の数日間は、FreeBSDで自作したWi-Fiルータを使ってたが、イマイチ安定 しなかったのと(数日〜数時間で切れることも)、思ってたより速度が出なかったので、 不本意ながらもアマゾンで高評価だったこちらの製品に乗り換えた次第。
Wi-Fiルータの自作は割と楽しかったので、詳しい経緯はそのうち書くかも。

話を戻すと、C3150にはOpenVPNサーバの機能があり、VPNをお手軽に構築することが可能。
お手軽というならかつてはPPTPがお勧めだったが、セキュリティ上の理由からかmacOSにも 載らなくなったし、すっかりオワコン化。
その点OpenVPNならば、今のところは問題なさそう。

macOSとiOSでは、OpenVPNのクライアントはすぐに見つけられた。(既に実用もしてる) AndroidやWindowsにも、 同様のクライアントがあるみたい。
あとはXubuntu。とくにGPD Pocketを携帯することを考えると、このマシンにこそ是非 導入したいところだ。

パッケージの導入

1
2
sudo apt install openvpn
sudo apt install network-manager-openvpn-gnome

以上の手順で、OS標準のNetworkManagerをOpenVPN対応に拡張できる。
この点、MacやWindowsより対応度が高い。いや、ちゃんと動けばの話だけど。

NetworkManagerの設定

画面右上、無線アイコンをクリックし、メニューから接続を編集する…を選択。 以下のウィンドウが開くので、

追加ボタンをクリック。OpenVPNが選べる様になっているはずなので、こいつを 選択すると、以下のウィンドウが出てくる。

接続名 は適当に。
Gateway は、OpenVPNサーバ(今回の場合はArcher C3150)のFQDNかIPアドレスを。

User Certificate から Private Key までの3箇所は、証明書関連のファイルを指定。
これらのファイルは、ルータの管理画面から生成できる設定ファイル(以下)から 作ることが出来るので、事前に用意しておく。

certでくくられた部分がUser Certificate、同様にcaがCA Certificate、keyが Private Keyに該当する。
これらを別々のファイルとして保存し、各欄に埋め込んでいくという手順。

MacやiOSのクライアントでは、そんな面倒なことはせず、ひとつにまとまった 設定ファイルを直接読み込ませることが出来たのだけどな。

まだこれでは終わりではなく、更にAdvancedボタンをクリック。

User custom gateway portは、あえて1194を明示的に指定してるけど、この設定は 恐らく不要。
Use a TCP connectionは、設定ファイルをみても分かる様に、恐らく必須。
Set virtual device typeも、TUNへの指定が恐らく必須。

設定は以上、のはずなのであるが。

うまくいかない。

接続の操作をすると一見うまくいくし、ifconfig -a でインターフェースが作成 されることも確認できるが、すぐに接続が切れてしまう。

以下のあたりまではよいのだが、

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
2017-09-16T21:53:20.867785+09:00 jara NetworkManager[849]: <info>  [1505566400.8674] audit: op="connection-activate" uuid="598c0965-32a1-444a-a58d-b225c060a5c5" name="hoge.example.com" pid=1856 uid=1000 result="success"
2017-09-16T21:53:20.882277+09:00 jara NetworkManager[849]: <info> [1505566400.8818] vpn-connection[0x55a088f670f0,598c0965-32a1-444a-a58d-b225c060a5c5,"hoge.example.com",0]: Started the VPN service, PID 5924
2017-09-16T21:53:20.906530+09:00 jara NetworkManager[849]: <info> [1505566400.9061] vpn-connection[0x55a088f670f0,598c0965-32a1-444a-a58d-b225c060a5c5,"hoge.example.com",0]: Saw the service appear; activating connection
2017-09-16T21:53:20.941673+09:00 jara NetworkManager[849]: <info> [1505566400.9414] vpn-connection[0x55a088f670f0,598c0965-32a1-444a-a58d-b225c060a5c5,"hoge.example.com",0]: VPN plugin: state changed: starting (3)
2017-09-16T21:53:20.943954+09:00 jara NetworkManager[849]: <info> [1505566400.9437] vpn-connection[0x55a088f670f0,598c0965-32a1-444a-a58d-b225c060a5c5,"hoge.example.com",0]: VPN connection: (ConnectInteractive) reply received
2017-09-16T21:53:23.405090+09:00 jara nm-openvpn[5927]: /usr/lib/NetworkManager/nm-openvpn-service-openvpn-helper --debug 0 5924 --bus-name org.freedesktop.NetworkManager.openvpn.Connection_22 --tun -- tun0 1500 1559 10.8.0.6 10.8.0.5 init
2017-09-16T21:53:23.408369+09:00 jara NetworkManager[849]: <info> [1505566403.4077] manager: (tun0): new Tun device (/org/freedesktop/NetworkManager/Devices/15)
2017-09-16T21:53:23.443295+09:00 jara NetworkManager[849]: <info> [1505566403.4421] vpn-connection[0x55a088f670f0,598c0965-32a1-444a-a58d-b225c060a5c5,"hoge.example.com",0]: VPN connection: (IP Config Get) reply received.
2017-09-16T21:53:23.455314+09:00 jara NetworkManager[849]: <info> [1505566403.4550] devices added (path: /sys/devices/virtual/net/tun0, iface: tun0)
2017-09-16T21:53:23.456213+09:00 jara NetworkManager[849]: <info> [1505566403.4551] device added (path: /sys/devices/virtual/net/tun0, iface: tun0): no ifupdown configuration found.
2017-09-16T21:53:23.456883+09:00 jara NetworkManager[849]: <info> [1505566403.4552] vpn-connection[0x55a088f670f0,598c0965-32a1-444a-a58d-b225c060a5c5,"hoge.example.com",16:(tun0)]: VPN connection: (IP4 Config Get) reply received
2017-09-16T21:53:23.460127+09:00 jara NetworkManager[849]: <info> [1505566403.4598] vpn-connection[0x55a088f670f0,598c0965-32a1-444a-a58d-b225c060a5c5,"hoge.example.com",16:(tun0)]: Data: VPN Gateway: 203.141.xxx.xxx
2017-09-16T21:53:23.461059+09:00 jara NetworkManager[849]: <info> [1505566403.4599] vpn-connection[0x55a088f670f0,598c0965-32a1-444a-a58d-b225c060a5c5,"hoge.example.com",16:(tun0)]: Data: Tunnel Device: "tun0"
2017-09-16T21:53:23.461943+09:00 jara NetworkManager[849]: <info> [1505566403.4599] vpn-connection[0x55a088f670f0,598c0965-32a1-444a-a58d-b225c060a5c5,"hoge.example.com",16:(tun0)]: Data: IPv4 configuration:
2017-09-16T21:53:23.465501+09:00 jara NetworkManager[849]: <info> [1505566403.4600] vpn-connection[0x55a088f670f0,598c0965-32a1-444a-a58d-b225c060a5c5,"hoge.example.com",16:(tun0)]: Data: Internal Gateway: 10.8.0.5
2017-09-16T21:53:23.469968+09:00 jara NetworkManager[849]: <info> [1505566403.4600] vpn-connection[0x55a088f670f0,598c0965-32a1-444a-a58d-b225c060a5c5,"hoge.example.com",16:(tun0)]: Data: Internal Address: 10.8.0.6
2017-09-16T21:53:23.474217+09:00 jara NetworkManager[849]: <info> [1505566403.4600] vpn-connection[0x55a088f670f0,598c0965-32a1-444a-a58d-b225c060a5c5,"hoge.example.com",16:(tun0)]: Data: Internal Prefix: 32
2017-09-16T21:53:23.479209+09:00 jara NetworkManager[849]: <info> [1505566403.4601] vpn-connection[0x55a088f670f0,598c0965-32a1-444a-a58d-b225c060a5c5,"hoge.example.com",16:(tun0)]: Data: Internal Point-to-Point Address: 10.8.0.5
2017-09-16T21:53:23.481252+09:00 jara NetworkManager[849]: <info> [1505566403.4601] vpn-connection[0x55a088f670f0,598c0965-32a1-444a-a58d-b225c060a5c5,"hoge.example.com",16:(tun0)]: Data: Maximum Segment Size (MSS): 0
2017-09-16T21:53:23.483013+09:00 jara NetworkManager[849]: <info> [1505566403.4602] vpn-connection[0x55a088f670f0,598c0965-32a1-444a-a58d-b225c060a5c5,"hoge.example.com",16:(tun0)]: Data: Static Route: 192.168.100.0/24 Next Hop: 10.8.0.5
2017-09-16T21:53:23.485919+09:00 jara NetworkManager[849]: <info> [1505566403.4602] vpn-connection[0x55a088f670f0,598c0965-32a1-444a-a58d-b225c060a5c5,"hoge.example.com",16:(tun0)]: Data: Static Route: 10.8.0.1/32 Next Hop: 10.8.0.5
2017-09-16T21:53:23.486757+09:00 jara NetworkManager[849]: <info> [1505566403.4603] vpn-connection[0x55a088f670f0,598c0965-32a1-444a-a58d-b225c060a5c5,"hoge.example.com",16:(tun0)]: Data: Forbid Default Route: no
2017-09-16T21:53:23.487541+09:00 jara NetworkManager[849]: <info> [1505566403.4603] vpn-connection[0x55a088f670f0,598c0965-32a1-444a-a58d-b225c060a5c5,"hoge.example.com",16:(tun0)]: Data: DNS Domain: '(none)'
2017-09-16T21:53:23.488251+09:00 jara NetworkManager[849]: <info> [1505566403.4604] vpn-connection[0x55a088f670f0,598c0965-32a1-444a-a58d-b225c060a5c5,"hoge.example.com",16:(tun0)]: Data: No IPv6 configuration
2017-09-16T21:53:23.488902+09:00 jara NetworkManager[849]: <info> [1505566403.4605] vpn-connection[0x55a088f670f0,598c0965-32a1-444a-a58d-b225c060a5c5,"hoge.example.com",16:(tun0)]: VPN plugin: state changed: started (4)
2017-09-16T21:53:23.489607+09:00 jara NetworkManager[849]: <info> [1505566403.4718] vpn-connection[0x55a088f670f0,598c0965-32a1-444a-a58d-b225c060a5c5,"hoge.example.com",16:(tun0)]: VPN connection: (IP Config Get) complete
2017-09-16T21:53:23.518919+09:00 jara NetworkManager[849]: <info> [1505566403.5162] manager: NetworkManager state is now CONNECTED_LOCAL
2017-09-16T21:53:23.520412+09:00 jara NetworkManager[849]: <info> [1505566403.5164] manager: NetworkManager state is now CONNECTED_GLOBAL
2017-09-16T21:53:23.536045+09:00 jara systemd[1]: Starting Network Manager Script Dispatcher Service...
2017-09-16T21:53:23.547185+09:00 jara whoopsie[1248]: [21:53:23] The default IPv4 route is: /org/freedesktop/NetworkManager/ActiveConnection/22
2017-09-16T21:53:23.552455+09:00 jara whoopsie[1248]: [21:53:23] Not a paid data plan: /org/freedesktop/NetworkManager/ActiveConnection/22
2017-09-16T21:53:23.553310+09:00 jara whoopsie[1248]: [21:53:23] Found usable connection: /org/freedesktop/NetworkManager/ActiveConnection/22
2017-09-16T21:53:23.565636+09:00 jara systemd[1]: Started Network Manager Script Dispatcher Service.
2017-09-16T21:53:33.424514+09:00 jara NetworkManager[849]: <info> [1505566413.4238] dhcp4 (wlp1s0): address 192.168.100.26
2017-09-16T21:53:33.426656+09:00 jara NetworkManager[849]: <info> [1505566413.4239] dhcp4 (wlp1s0): plen 24 (255.255.255.0)
2017-09-16T21:53:33.428152+09:00 jara NetworkManager[849]: <info> [1505566413.4239] dhcp4 (wlp1s0): gateway 192.168.100.1
2017-09-16T21:53:33.429850+09:00 jara NetworkManager[849]: <info> [1505566413.4240] dhcp4 (wlp1s0): server identifier 192.168.100.175
2017-09-16T21:53:33.431126+09:00 jara NetworkManager[849]: <info> [1505566413.4240] dhcp4 (wlp1s0): lease time 600
2017-09-16T21:53:33.432323+09:00 jara NetworkManager[849]: <info> [1505566413.4241] dhcp4 (wlp1s0): nameserver '192.168.100.175'
2017-09-16T21:53:33.433530+09:00 jara NetworkManager[849]: <info> [1505566413.4241] dhcp4 (wlp1s0): domain name 'example.local'
2017-09-16T21:53:33.435687+09:00 jara NetworkManager[849]: <info> [1505566413.4242] dhcp4 (wlp1s0): wins '192.168.100.175'
2017-09-16T21:53:33.437810+09:00 jara NetworkManager[849]: <info> [1505566413.4242] dhcp4 (wlp1s0): state changed bound -> bound

しばらくすると、以下のようなログを吐いて切れてしまう。

1
2
3
4
5
2017-09-16T21:54:00.837526+09:00 jara nm-openvpn[5927]: /usr/lib/NetworkManager/nm-openvpn-service-openvpn-helper --debug 0 5924 --bus-name org.freedesktop.NetworkManager.openvpn.Connection_22 --tun -- tun0 1500 1559 10.8.0.6 10.8.0.5 restart
2017-09-16T21:54:00.857334+09:00 jara NetworkManager[849]: <error> [1505566440.8569] platform-linux: do-add-ip4-route[16: 0.0.0.0/0 50]: failure 101 (ネットワークに届きません)
2017-09-16T21:54:00.858433+09:00 jara NetworkManager[849]: <warn> [1505566440.8572] default-route: failed to add default route 0.0.0.0/0 via 10.8.0.5 dev 16 metric 50 mss 0 src vpn with effective metric 50
2017-09-16T21:54:00.872429+09:00 jara NetworkManager[849]: <info> [1505566440.8719] devices removed (path: /sys/devices/virtual/net/tun0, iface: tun0)
2017-09-16T21:54:00.888212+09:00 jara NetworkManager[849]: <warn> [1505566440.8874] vpn-connection[0x55a088f670f0,598c0965-32a1-444a-a58d-b225c060a5c5,"hoge.example.com",16:(tun0)]: VPN plugin: failed: connect-failed (1)

さてどうしたものか。
NetworkManagerがOpenVPNに対応する前、 Ubuntuユーザーたちはtunneldiggerという ツールを使っていたようだ。残念ながらGUIではないのだけど、贅沢は言ってられない。
今度、外出してGPD Pocketを携帯してるタイミングがあれば、是非試してみたいところだ。

以上。

FreeBSDでDovecotのセットアップ

2018.4.4 追記
この記事は古いです。以下も併せて。
Dovecot 2.3への更新

インフラ構築、特にメールまわりはあまり得意ではないと自覚してて。
メールサーバ構築は、チューニングが不要で、せいぜい10アカウント程度ぐらいまでの場合のみお請けしている。 メールサーバのホスティングなんて安いところがいくらでもあるし、そちらを使ってくださいと。

おれが構築した数少ないメールサーバでは、全て送信(SMTP)にはPostfix、 受信(POP3,IMAP)にはDovecotを使用している。
で、今回はDovecotの話。

FreeBSDでDovecotのインストールを行うと(ごく最近、パッケージ名がdovecot2からdovecotに変わった)、 /usr/local/etc/dovecot ディレクトリが作られる。
配下の /usr/local/etc/dovecot/conf.d に細かい設定ファイルがたくさん作られ、 /usr/local/etc/dovecot/dovecot.conf から、それらがインクルードされる仕組み。

個人的には、この手の設定は煩雑なので好まない。
インクルードされるファイルの多くは、大半がコメントであり、必要な記述は正味数行しかない。
見通し悪いことこの上ない。

小規模な用途では特に、設定ファイルはひとつにまとまっていた方が圧倒的に使いやすい。
そこで、以下の様な設定ファイルを生成する手順を、Chefレシピ化した。

どうよ、このわかりやすさは。本来必要な記述は、たったこれだけだったはずなんだ。
読んで頂ければ大体意味はわかると思うけど、特筆すべきは、

  • OSのアカウントで認証。
  • 証明書はLet’s Encryptのものを使用。
  • 認証はPLAINとLOGINのみ。
    Let’s Encrypt等によるSSL化を必須とするので、問題ないという判断。
  • TCPWrapperを使用。
    ブルートフォースを試す馬鹿を自動でリジェクトする為に必要。
  • SASLの認証機能をPostfixむけに提供。
    送信と受信は同じアカウントを使用する。

といったぐらいか。
ソケットのファイルモードが0666なのは、ちょっとアレかもしれぬ。近々調整。

FreeBSD上のMastodonを1.6にアップグレードした。

いつも通りの手順と思ったら、ハマった。
ストリーミングAPIへのGETが502を返してた。502を返すのはNginxで、要するにストリーミングAPI自体が 起動してない。

実は、ストリーミングAPIの動作要件は、Node.js 8.xではない。前バージョンである6.xだった。
以下の手順でNode.jsのバージョンを落とし、無事起動。これもマニュアル嫁案件ですね。反省です。

1
2
3
4
5
6
su
pkg delete node
pkg install node6 npm3
cd ~mastodon
yarn install
service mastodon_streaming start

serviceコマンドは、実際には /usr/local/etc/rc.d/mastodon_streaming をラップしてるだけ。
Mastodonを構成する3サービス(本体, Sidekiq, ストリーミングAPI)のrcファイル、 自分が構築した頃はまだ公式のportsがなかったので、ほかのrcファイルに倣って手書きした。

FreeBSDにMastodonを構築した手順は、(rcファイル含め)そのうち書こうと思う。
今はmastodonってそのものズバリのportsがある様で、こっちを使ったほうがラクなのかも。 でもどんな環境になるのかわかったもんじゃないし、という感はある。
Dockerが使えなかったり、1.5のリリース直前にFreeBSDだけハブにされたりw、 細々と問題は発生するけど、Mastodonに限っては自分で構築するほうが性に合ってるようだ。

FreeBSDのZFSでスナップショットを撮る

GPD Pocketで、KVM上のFreeBSDに、ZFSのスナップショットを設定した話。
ずっと前に対応済みだったけど、一応メモ。

ZFSの導入

FreeBSD自体のインストーラーではデフォルトはUFS2だが、ZFSに変更できる。
とても簡単。恐らく、これより簡単にZFSを導入できるLinuxディストリビューションはない。
インストーラー上の操作だけなので、手順は割愛。

freebsd-snapshotのインストール

ZFSが導入済みなら、zfs snapshotコマンドでいつでもスナップショットが撮れるわけだが、 FreeBSDにはfreebsd-snapshotというラッパーがあるので、こいつを使用する。
freebsd-snapshotは最近pkgngから削除され?portsからインストールするしかない様だ。 非推奨扱いというわけでもないだろうに。

以下実行。

1
2
3
4
su
cd /usr/ports/sysutils/freebsd-snapshot
make install clean
pkg lock freebsd-snapshot

portupgradeがインストール済みの場合は、以下の様な感じ。
余談だが、portupgradeはオワコン扱いされることが多い様だが、個人的にportmasterは使いづらく感じる。

1
2
3
su
portinstall freebsd-snapshot
pkg lock freebsd-snapshot

いずれにしてもportsからインストールしたパッケージは、pkg upgrade時に上書きされない様に、 たとえその必要がなくともロック推奨。

anacronの設定

freebsd-snapshotインストール後に、 /etc/crontab を書き換えるように指示があるはず。
/etc/crontab に、以下を追記せよとあるが…

常時起動ではない環境にこんな設定を行っても、hourly以外はあまり意味がない。
この様な環境では、crontabにはhourly分だけを残して、代わりにanacronをインストールする。(以下)

1
sudo pkg install anacron

/etc/crontab に、以下追記。

/usr/local/etc/anacrontab に、以下追記。

periodic.conf 設定

/etc/periodic.conf に、以下追記。

最初のdaily_status_zfs_enableはスナップショットとは無関係で、 日次のメールでZFSの状態を報告させる様にする設定。
今回は開発用途ゆえ対応不要だが、本番環境では、ZFSのステータスは監視対象になることが多いと思う。
日次のメールにZFSのステータスが載っても即効性はなく、あまり意味はなさそうではあるが、まぁ一応。

snapshot_enable以降が本題。2行目は必須、3行目はスナップショットを撮るスケジュールに関するもの。
/usr/home を日次で撮って、履歴は10回分残すという設定。

.zfsディレクトリを可視に

以下実行。

1
2
3
su
zfs set snapdir=hidden zroot
zfs set snapdir=visible zroot/usr/home

実行後、スナップショットへのアクセスが容易になる。

1
2
cd /home/.zfs/snapshot
ls -l

lsコマンドだけでなく、sftpからでもアクセスできるようになり便利。root権限不要。

スナップショットのリスト

スナップショットのリストは、 /home/.zfs/snapshot でlsする以外にも、以下の方法でも確認可能。 root権限不要。

1
zfs list -t snapshot

sshfsをセットアップ

GPD PocketにKVMのセットアップが完了した時点で、開発環境の構築は概ね完了。
仕上げに、KVM上のホームディレクトリをホストOSにマウント出来るようにする。 当然、sshfsを使用。

sshfsのインストール

1
sudo apt install sshfs

簡単すぎて拍子抜けするけど!

マウントを実行

インストール後はsshfsコマンドでマウント実行できるだが、 コマンドが長くて微妙に面倒なのでツールを書いた。

ホスト名が jara なホスト上で、このコマンドを以下のように使うと、

1
./mount.rb dev1

KVM dev1.jara.local 上のホームディレクトリが ~/mount/dev1 にマウントされる。
マウントポイントのディレクトリが存在しなければ、一応作成することを試しはするw

ソースを読んで頂けるとわかるけど、

  • ホストOSとゲストOSに同名のユーザーが居る。
  • ゲストOSのホスト名は、 hoge.jara.local という命名規則。

であることを前提とする。

自分で使うものなので、汎用的な用途を想定してないし、 エラー処理もほとんどやってません。
手を抜いてすみません。

開発環境、今後の課題

ちょっと重い

非力なCPUなので、仕方ないところではある。
PHP開発では是非利用したいxdebugだが、外さざるを得なかった。

手動で起動しなければいけない問題

Wi-Fiインターフェースが接続するまでに若干のタイムラグがあることに由来して、 仮想ネットワークとゲストOSは手作業で起動する必要がある。 (→前エントリ
この為、ゲストOS上のホームディレクトリをマウントするのも、ゲストOS起動後 でなければならない。 インターフェースが接続した後に、どうにかしてフックスクリプト的なものを 動かすことは可能?要調査。

周辺ツールの不足

今まで開発は主にMacでやってて、今後もそれは変わらないんだけど、 GPD Pocketもサブ環境として使っていこうと思っている。
Xubuntu(Ubuntu)の開発環境としての運用にはあまり知見がなく、 ここ数日ググって知ったわずかな情報で、以下のツールをだましだまし使ってる状況。

これでもまだ微妙に足りない。他にぱっと思いつくのは、JSONの専用エディタとか、 SQLiteクライアントとか。
当然ながら、Ubuntuは今までもずっと開発環境として使われ続けてきたわけだし、 満足できる環境はIDEなしでも必ず構築できると信じる。 よいツールを探す為の情報収集は、今後も続けたい。

Xubuntu@GPD PocketのKVMに、FreeBSDをセットアップ

MySQLに続き、PowerDNSについてのエントリーを上げようとセットアップしていたが、 大変なことに気づいた。
KVM環境の一要素であるlibvertに、目的とするネームサーバ機能が内蔵されており、 PowerDNSの構築は実際には不要だったのである。

確認したところ、ホストOSのresolv.confやhosts上の要素も全て透過的に参照可能で、 LAN内にあるサーバーも、今後構築予定の仮想環境(hostsに名前だけは登録済み)も 全て名前解決できた。今後新しい仮想環境を追加する時も、単にhostsに登録すれば いいみたい。
libvertのネームサーバ機能(及びDHCPサーバ機能)については、まだよくわかってない ことが多いので近々調べるとして、当初の予定を変更してKVM環境の構築の際に行った 手順について述べることにする。

ちなみに、ホストOS上のMySQLは不要になったので削除した。開発用のMySQLも確かに 必要ではあるが、検証目的の環境はゲストOS側に構築すべきと思われたので。
XubuntuにMySQLを構築した(地雷にハマった)経験は無駄ではなかったので、まぁ よしとする。以前ほぼ同じ環境(Ubuntu Server 16.04 LTS)にセットアップした時は、 もっとすんなり行ったのだけどな。

KVMの導入を行う際、以下のページを参考にした。

どちらも若干古い記事で、実際には、これらのページに書かれている多くの手順は 対応不要だった。
以下、実際に必要だった手順についてのみ述べる。

KVMをインストール

1
sudo apt install kvm libvirt-bin bridge-utils virt-manager

ブリッジの登録を確認

以下を実行すると、

1
brctl show

virbr0というブリッジが登録されているので、そのまま使えばよいはず。通常は作業不要。
virbr0を誤って削除してしまった場合は、以下の手順で再登録できた。

1
2
3
sudo brctl addbr virbr0
sudo brctl stp virbr0 on
brctl show #登録されたことを再度確認

NetworkManagerを削除したり、/etc/network/interfacesを修正したりする手順が 案内されているが、GPD Pocketではこれは やってはいけない 。Wi-Fiが一切 動かなくなってハマる。

余談だが、もし削除してしまったら、USBポートにお手持ちのEthernetアダプタを挿して (持ってなかったら、いますぐAmazon等へ!2,000円ぐらいで買えるはず)、

ifconfig -aを実行して、そのアダプタのインターフェース名を確認。
私の場合は enx343dc49a00fb だったので、 /etc/network/interfaces に以下を 追記してリブート。

リブート後に有線接続できるようになるので、以下を実行すれば、

1
sudo apt install network-manager

Wi-Fi接続が復旧できる。
とはいえ割と煩雑な手順なので、GPD PocketではNetworkManagerを削除せぬ様、注意したい。

仮想ネットワークの登録を確認

ウィスカーメニューから、システム→仮想マシンマネージャーを起動。
仮想マシンマネージャーはよく使うので、お気に入り登録を推奨。

起動したら、編集→接続の詳細。
「QEMU/KVM接続の詳細」というウィンドウが開くので、「仮想ネットワーク」タブを 開く。defaultという仮想ネットワークが、virbr0ブリッジに紐付けられているはず なので、通常はこれを使えばよいはず。

但し、「自動起動」のチェックは外したほうがいいかも。Wi-Fi接続のタイミングに よっては、リブート後に仮想ネットワークが自動起動しないことが多かった。
リブートの度に、この画面の左下の方のほうにある「ネットワークの開始」ボタンを 押下し、手作業で起動操作を行うほうが動作が安定する。少々煩わしいけど。

追記(2017/10/03)
その後、この件は解決。自動起動で問題なし。
OpenVPNとKVM、その後。

新しい仮想ネットワークをここから登録することも出来るが、NAT先はwlp1s0を明示的に 指定すると安定するかもしれない。

新しい仮想マシンの作成

以下のサイトで、前もってFreeBSDのインストーライメージを取得しておく。

FreeBSDを入手する

仮想マシンマネージャーのウィンドウで、「新しい仮想マシンの作成」ボタンを押下。
取得したインストーライメージのisoファイルを指定し、接続先ネットワークには 上記手順で確認した仮想ネットワークが指定されていることを確認。あとは指示に従う。
ここから先は難しいところはなかった。また、FreeBSD以外のOSでも導入の手順は 全く同じと思われる。

仮想マシンも仮想ネットワーク同様、自動起動にしないほうがよさそう。
仮想ネットワークが起動している状態でないと、仮想マシンは起動できないので。

追記(2017/10/03)
その後、この件は解決。自動起動で問題なし。
OpenVPNとKVM、その後。

仮想マシンの起動

GPD Pocketのリブート後は、仮想ネットワーク→仮想マシンの順に手動で起動する。
この手順が結局、一番安定した利用ができた。

Xubuntu上でMySQL 5.7のセットアップ

Xubuntuへの開発環境の構築に着手した。
KVM上のFreeBSDを中心とし、ホストOS(Xubuntu)にPowerDNSやsshfsを導入して、 最終的にひとつのものにまとめる予定。

本稿では、PowerDNSの構成要素として、MySQL 5.7系を導入していく。
5.7系に地雷がたくさんある(その一方で性能も向上しているため、一概に避けるべき とは言えない)ことは承知していたが、実際には当初の予想も超えるトラブルに 見舞われた。
MySQLの導入なんて何度もやってるのに、ほんのちょっとのバージョン番号の違いで こんなに手こずるとは。古い話だが、4.1と4.0がまるで別物だったことを思い出す。

パッケージのインストール

1
sudo apt install mysql-server-5.7

これを入力したあとに出てくるパスワードに関する設問に要注意。極力パスワードは 入力して、空にはしないほうが、余計なトラブルを抱えずに済む。
ちなみに、 このパッケージをChef(のapt_packageリソース)から導入する場合、 空のパスワードを指定した扱いになる様なので、後述する手順でrootのパスワードを 変更する必要がある。

my.cnf設定

以下を実行すると、 /etc/my.cnf を直接記述するのと同様の要領で、 /etc/mysql/conf.d/local.cnf から設定変更が行えるようになる。
大本のmy.cnfにはほとんど何も書かれておらず、local.cnfをインクルードする 仕組みになってるみたい。いや、こっちのほうがシンプルで使いやすいな。

1
sudo update-alternatives --set my.cnf /etc/mysql/my.cnf.fallback

local.cnf に書き込む内容は、最低限のものとして以下のものを入れてる。
ローカルのPowerDNSから利用することを想定したMySQLなので、チューニングに関する 設定などは不要と思われる。

内容は大まかに、以下の通り。

  • パスワードは無期限に。
  • デフォルトのエンコーディングはutf8mb4。
  • ログはsyslogに出力する想定。
  • secure-file-privは別にどこでもいいけど、何かしら指定しないとwarning。

特筆すべきはパスワードの期限(default_password_lifetime)。MySQL 5.7系の 初期、明示的に0を指定しないと約1年でパスワードが使えなくなってしまう時期が あった。
言うまでもなく運用に重篤な支障がある為、現在はさすがに0がデフォルトになって いる。だが、一度このような機能が実装されてしまった以上は信用できない感があり、 5.7以降の全てのMySQLにおいて、default_password_lifetimeを明示的に 0に設定することを強くお勧めする次第。

その他お好みの設定を加えて頂き、設定を反映するためにMySQLを再起動。

1
sudo service mysql restart

rootパスワード変更

インストール時に空のrootパスワードを指定してしまった場合、結局空には ならないので、パスワードの再設定が必要。
Chefから導入を行った場合も、パスワードの指定が出来ない為、このケースに該当。 (default_password_lifetimeだけでなく、パスワードまわりは地雷満載だわ)
rootパスワードの更新については、以下の記事を参考にした。

Ubuntu16.04にaptでMySQL5.7を入れる時にrootを空パスワードにするとどうなるか

OSのroot権限からMySQLに接続する方法が紹介されているが(以下)、

1
sudo mysql

apt実行時にデフォルトで作成される特権ユーザー(rootユーザーと同様の操作が可能) を利用するのでもよい。
接続情報は以下の手順で確認できるので、お手元のEvernote等に控えておくと、 あとあと便利。

1
sudo cat /etc/mysql/debian.cnf

いずれかの方法でMySQLに接続したら、以下のSQLを実行し、rootパスワードの 変更を実行。

1
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';

WITH mysql_native_password が肝のようだ。

また、MySQLには古くから、mysql.userテーブルを直接修正するという方法もあるが、 mysql_native_passwordに変更してからでないとテーブルを書き換えても反映しない ので注意。
mysql_native_passwordに変更したあとであれば、従来通り、以下の手順でパスワードの 更新が可能。

1
2
UPDATE mysql.user SET authentication_string=password('your_password') WHERE user='root';
FLUSH PRIVILEGES;

従来通り?
かつてmysql.userテーブルにはpasswordというフィールドがあったはずだが、何故か、 authentication_stringなるわかりにくい名前に変更された。わけわからん。

このMySQLはPowerDNSで使用する想定なので、rootユーザー以外は不要と思われるが、 通常の用途では他にもユーザーを登録するはず。
確かMySQL 5.7系の初期では問題なかったと記憶するが(自信なし)、GRANTはあくまで 権限の付与を行うだけになり、存在しないユーザーを指定した時にユーザーを作成する という振る舞いは廃止された様だ。

また、aptで設置した場合は該当しないが、validate_passwordなるプラグインが有効の 場合、パスワードの更新時に多くの制限が課せられる様だ。
個人的には理不尽なほど厳しいルールに感じる。ご興味の向きはググって頂ければ、 この機能に関する知見や苦言がたくさんヒットするので参考にして頂ければと。

GUIクライアント

MacではSequel Proを愛用しているので、同様の GUIクライアントがほしいところ。通常の用途ではなく、PowerDNSのストレージとして 使用する想定の為、なおさら。
取り急ぎ、aptからも導入できる純正クライアントをインストールしとく。

1
sudo apt install mysql-workbench

機能が多すぎて、その一方でテーブルビューがわかりやすくなくて、正直使いづらい。
ググったらでてきた以下のページをみると、

Top 10 MySQL GUI Tools

HeidiSQLなるWindowsむけのツールをwineで動かすのも悪くないかもと思った。
Workbenchを使い続けることに我慢できなくなったら、挑戦するかも。

2017/11/14追記
その後、HeidiSQLを導入した。
XubuntuでHeidiSQL

FreeBSDでUserminをセットアップ

追記(2018/10/02)
リバースプロキシを併用した新しい手順の記事もあり。

ユーザー自身にパスワードを設定してもらう為に、FreeBSDサーバに Userminをセットアップした。

最初はパスワード変更ツールをPHPで書いてて、動くものが一旦は出来たのだが、Apacheの 実行ユーザー(FreeBSDではwww)をsudoerに加えてpwコマンドのみ実行を許す実装しか思いつかず (もちろん、手間をかければなくはないんだけど)、このままでは危険と判断した。 PHPにはpecl-pamというPECLモジュールもあるが、こちらも 本質的に同様の問題を抱えており、これを利用した実装が許される状況は 基本的にはない のでは ないかと思われる。w

Usermin自体はrootで実行されるが(パスワードの変更を行う為に、そうせざるを得ないのだが)、 パスワード変更機能のみをroot権限で実行する方がまだマシと判断した。

以下、実際の手順。
全て、suした後にroot権限で。

パッケージインストール

1
2
pkg install usermin
sysrc usermin_enable="YES"

セットアップスクリプト

1
2
cd /usr/local/lib/usermin
./setup.sh

対話形式で設問に回答すると、 /usr/local/etc/usermin が作成される。

設定ファイルを編集

1
2
cd /usr/local/etc/usermin
vi miniserv.conf

以下の項目は修正必須。

  • 何故かSSLオフがデフォルトだが、利用目的と矛盾するんじゃないの?
  • SSL3どころかSSL2も許可できるようになってて、さすがにデフォルトではオフになってるが、 今後オンにすることはあり得ないのでは?w
  • rootの接続は当然拒否すべき。デフォルトでそうなっていないのはどうなのよ?

以下、実行。

1
echo 'user: procmail changepass' > webmin.acl
  • デフォルトで非常にたくさんの設定が行える様に設定されているが、 一般ユーザーに開放すると危険な設定項目が満載。最低限のものにするべきではないか?
  • procmailが含まれているのは、ユーザー自身がメール転送の設定を行う想定で。 procmailを使用していないなら、当然この項目も削除していい。

証明書更新

Let’s Encryptによる example.com というコモンネームの証明書があると仮定して。
以下、実行。

1
2
mv miniserv.pem miniserv.pem.org
cat /usr/local/etc/letsencrypt/live/example.com/fullchain.pem /usr/local/etc/letsencrypt/live/example.com/privkey.pem > miniserv.pem

また、Let’s Encryptを運用しているなら、通常はcertbot renewを含んだシェルスクリプト等、 何かしら証明書の自動更新を構築しているはず。
Userminはcertbotが生成した証明書をそのままでは利用できないので、certbot renewの実行後に 上記コマンド(証明書の結合)も実行し、なおかつUsermin自体を再起動する必要があるだろう。

起動

以下、実行。又はサーバをリブート。

1
service usermin start

以上。

NautilusをSMB3対応に

先日のXubuntuのセットアップに関するエントリーで、コマンドライン環境の 設定については「以下割愛」と手抜きしたがw、SMB3についてのことだけは 書いとく。この件を調べるのには、相当に時間を要したので。

XubuntuからWindows Server製品やSamba等、SMBプロトコルベースのファイル サーバに接続する際、デフォルトでは非常に古いプロトコル(確かNT1相当)を 使用する。
自分はNautilusを使ってるけど、標準のThunarでも事情は同じだったはず。

これらのファイルマネージャは、実はSambaのクライアントライブラリを使用して いる為、 /etc/samba/smb.conf を適切に設定することで最新のSMB3を使用する ことが可能。パフォーマンスやセキュリティが大幅に改善される。
/etc/samba/smb.conf の global 節の下に、以下追記。