ipv6とtlsでトラブル発覚

Sakura VPSにおいてあるマシンから、自ドメイン宛にメールを送信した際、
Sakura側のmtaとして使っているexam4に以下のログが残っていたので調査
(送信後,5分ほど経過してから受信していたので、何かおかしいんだろうなと
思ってはいたものの放置してた。)

2017-10-10 08:31:05 1e1hQz-000487-Cd H=mta [mta ipv6 addr] TLS error on connection (gnutls_handshake): timed out

結果として,根本的な原因は不明なままだが,
mtaへipv4で接続すれば,見た所はエラーは解消した為,
dnsのエントリからmtaのAAAAレコードを削除することで対処した。

追記:
自ドメイン側でipv6 Path MTU Blackholeを発生させていたことが原因でした.
ルータの設定を見直して対処完了です。恥ずかしい x)

以下は、調査履歴と泣き言。

続きを読む ipv6とtlsでトラブル発覚

メモ: import_tasks の探索順

ansible 2.4 での import_tasks の探索順

playbook ... (0) カレントディレクトリ
+ import.yml ... (I0)
+ roles
  + role_a
    + tasks
      - main.yml ... (1)
      - import.yml ... (I1)
    + handlers
      - main.yml ... (2)
      - import.yml ... (I2)

(1)でimport_tasksを実行 -> (I1) が優先, 無ければ(I0)
(2)でimport_tasksを実行 -> (I2) が優先, 無ければ(I1), (I0)の順で探索

配置がややこしくなるので、handlers以下にはmain.ymlだけを置いて
タスクはtasks以下に配置するのがよさげ.

todo

private docker registry のイメージ管理を行いたいので自前でイメージ管理スクリプトの作成
-> とりあえず作った 要python3 オレオレ仕様
https://github.com/mokemoke88/docker_reg_helper

自前ビルドしたDockerイメージを、registryに登録する際の手順を考える

今の所の想定
手元でビルド -> <image名>:build(local)

Jenkins で ビルド ( master or releaseブランチは自動ビルド対象から外しておく)
<registryパス>/<image名>:gitブランチ名 を registryからpull
<image名>:gitブランチ名-日付-ビルド番号 でビルド
<registryパス>/<image名>:gitブランチ名 でtaggingして、registryへpush

最終成果物は個別で作成
git にtagging (0.0.1 とか)
<registryパス>/<image名>:latest を registry から pull
<image名>:release-日付-ビルド番号 でビルド
<registryパス>/<image名>:<gitのtag> で tagging して、registryへpush
<registryパス>/<image名>:latest でtagging して、registryへpush

ゴミがいっぱい残りそうなのと、最終成果物の生成がうまくいきそうになくて、もやもやする。

Debian jessie 導入したdocker daemon へ Macのdocker-machieからアクセスする

やってみたら、ダラダラ面倒だったので、メモ

デフォルトで導入したままだと、unix socketでしかlistenしていないのでtcpでもlistenするようにする.
tcpでlistenする際、sslでの認証が必要になるので、ssl証明書やら、キーも作成する.
(といっても公式やらに書いていることやるだけ)

SSL証明書やらの作成

認証局の秘密キーと公開キーを作成

[認証局秘密キー ca-key.pem]
$openssl genrsa -aes256 -out ca-key.pem 4096
(パスフレーズの問い合わせがあるので、入力)
[認証局公開キー(証明書) ca.pem]
$openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
(認証局秘密キーのパスフレーズ入力)
(Common Name の入力で、ホストのFQDNを入力)

サーバ鍵と証明書署名要求の作成

[サーバ鍵 server-key.pem]
$openssl genrsa -out server-key.pem 4096
[証明書署名要求 server.csr]
$openssl req -subj "/CN=$HOST" -sha256 -new -key server-key.pem -out server.csr
($HOSTは、対象のFQDN)
[証明書の追加情報 extfile.cnf]
$echo subjectAltName = IP:www.xxx.yyy.zzz,IP:127.0.0.1 > extfile.cnf
(www.xxx.yyy.zzzは対象のIPアドレス)

サーバ証明書の作成

[認証局署名付きサーバ証明書 server-cert.pem]
$openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem ¥
  -CAcreateserial -out server-cert.pem -extfile extfile.cnf
(出力メッセージのsubject=/CN=FQDN が証明書署名要求で使ったFQDNになっていることを確認)
(認証局秘密キーのパスフレーズの問い合わせがあるので入力)

クライアント鍵と証明書署名要求の作成(docker-machine側で使用)

[クライアント鍵 key.pem]
$openssl genrsa -out key.pem 4096
[証明書署名要求 client.csr]
$openssl req -subj '/CN=client' -new -key key.pem -out client.csr
[クライアント認証用の追加設定ファイル extfile.cnf]
$echo extendedKeyUsage = clientAuth > extfile.cnf

認証局署名付きクライアント証明書の作成

[認証局署名付きクライアント証明書 cert.pem]
$openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem ¥
  -CAcreateserial -out cert.pem -extfile extfile.cnf
(認証局秘密キーのパスフレーズの問い合わせがあるので入力)

証明書署名要求ファイルは必要なくなったので、削除。

$rm -v client.csr server.csr extfile.cnf

鍵を本人しか触れないようにパーミッション変更

$chmod -v 400 ca-key.pem key.pem server-key.pem

証明書は変更できないように書き込み権限を落としておく

$chmod -v 0444 ca.pem server-cert.pem cert.pem

Debian(Docker-engine)側の設定変更

作成したサーバ鍵、証明書、認証局証明書を/etc/docker以下に移動

$mv ca.pem server-cert.pem server-key.pem /etc/docker/

dockerデーモンの起動設定はsystemdで制御されているので,デフォルト設定ファイル/lib/systemd/system/docker.serviceを/etc/systemd/system/以下にコピーしてから編集

$cp /lib/systemd/system/docker.service /etc/systemd/system/
[変更前]
ExecStart=/usr/bin/dockerd -H fd://
[変更後]
ExecStart=/usr/bin/dockerd ¥
 --tlsverify ¥
 --tlscacert=/etc/docker/ca.pem ¥
 --tlscert=/etc/docker/server-cert.pem ¥
 --tlskey=/etc/docker/server-key.pem ¥
 -H fd:// ¥
 -H tcp://0.0.0.0:2376
[変更前]
ExecStart=/usr/bin/docker -H fd://
[変更後]
ExecStart=/usr/bin/docker ¥
  --tlsverify ¥
  --tlscacert=/etc/docker/ca.pem ¥
  --tlscert=/etc/docker/server-cert.pem ¥
  --tlskey=/etc/docker/server-key.pem ¥
  -H fd://

/etc/systemd/system/docker-tcp.socket を以下の内容で作成

[Unit]
Description=Docker Soccer for the API

[Socket]
ListenStream=2376
BindIPv6Only=both
Service=docker.service

[Install]
WantedBy=socket.target

(2017.02.06 更新)

systemdに設定の変更を教え込んで、デーモン再起動

$systemctl daemon-reload
$systemctl stop docker
$systemctl enable docker-tcp.socket
$systemctl start docker-tcp.socket
$systemctl start docker

Debian側、これにて終了。続いてMac(Docker-machine)側

Mac(Docker-machine)側の設定

docker-machineに新規マシン登録

$docker-machine create -d "none" --url tcp://www.xxx.yyy.zzz:2376 DOCKER_HOST
 (www.xxx.yyy.zzzはdebianのIPアドレス)
 ($DOCKER_HOSTはdocker-machineに登録する名前)

~/.docker/machine/machines/以下にDOCKER_HOSTなディレクトリが作成され、設定ファイル config.jsonが生成されているので、とりまディレクトリに移動

$cd ~/.docker/machine/machines/DOCKER_HOST

先に生成したクライアント秘密キー, 証明書,認証局証明書(key.pem, cert.pem, ca.pem)を何とかして、ここにコピー

docker-machineがコピーしたファイルを見るようにconfig.jsonを変更

"AuthOptions": {
  "CertDir": "/Users/hogehoge/.docker/machine/certs",
  "CaCertPath": "/Users/hogehoge/.docker/machine/machines/DOCKER_HOST/ca.pem",
  "CaPrivateKeyPath": "",
  "CaCertRemotePath": "",
  "SeverCertPath": "",
  "ServerKeyPath": "",
  "ServerCertRemotePath": "",
  "ServerKeyRemotePath": "",
  "ServerCertSANS": [],
  "ClientKeyPath": "/Users/hogehoge/.docker/machine/machines/DOCKER_HOST/key.pem",
  "ClientCertPath": "/Users/hogehoge/.docker/machine/machines/DOCKER_HOST/cert.pem",
  "StorePath": "/Users/hogehoge/.docker/machine/machines/DOCKER_HOST"
}

docker-machine ls とかして、接続できているか、確認

$docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
DOCKER_HOST - none Running tcp://www.xxx.yyy.zzz:2376 v1.13.0

バージョンが表示されていれば、とりま動作しているかと思われる。
そして、息切れ。以上。

Debian jessie にDocker入れた時のメモ

docker公式そのまんまだけども。

事前に必要になるパッケージインストール

>sudo apt install curl
>sudo apt install apt-transport-https
>sudo apt install ca-certificates
>sudo apt install software-properties-common

レポジトリ用のgpgキーを取得、登録

>curl -fsSL https://yum.dockerproject.org/gpg | sudo apt-key add -

OKとか出る。
一応指紋確認

>apt-key fingerprint 58118E89F3A912897C070ADBF76221572C52609D

dockerのレポジトリ追加

>sudo add-apt-repository ¥
"deb https://apt.dockerproject.org/repo/ ¥
Debian-$(lsb_release -cs) ¥
main"

パッケージリストを更新して、ぶっこむ

>sudo apt update
>sudo apt install docker-engine

消すときは

>sudo apt purge docker-engine
>sudo rm -rf /var/lib/docker

自動起動を停止する

>sudo systemctl disable docker

自動起動する

>sudo systemctl enable docker

いちいちdocker弄るのにsudoすんのがウゼェ場合

>sudo groupadd docker
>sudo usermod -aG docker $USER

 

uefiを有効化したvirtualbox上のubuntuのboot (長えよ)

仮想マシンをシャットダウンした後、bootloader情報が飛ぶみたいなので、無理やり起こす

とりま何とか立ち上げる.
デフォルトのbootloaderはboot/bootx64.efiで動くようなので、以下のようにbootloaderをコピーしてでっち上げる.

sudo su -
cd /boot/efi/EFI
cp -a ubuntu boot
cd boot
mv grubx64.efi bootx64.efi
sync;sync;sync;
reboot