Debian 8 -> 9 にあたり sshd_config に必要だった変更
Debian -- jessie の openssh-server パッケージに関する詳細
openssh 6.7
Debian -- stretch の openssh-server パッケージに関する詳細
openssh 7.4
変更点
Protocol は 7.0 のタイミングでコンパイル時にデフォルトで無効、7.6 のタイミングで完全に削除。 説明文も 7.6 では 1.5 と 1.3 についての記載が削除されている。 debian 9 の openssh は 7.4 のため デフォルトで無効にされており、 Protocol の設定は不要(または設定できない?)になる。
OpenSSH 7.0/7.0p1 (2015-08-11) OpenSSH is a 100% complete SSH protocol 2.0 implementation and includes sftp client and server support. OpenSSH also includes transitional support for the legacy SSH 1.3 and 1.5 protocols that may be enabled at compile-time.
OpenSSH 7.6/7.6p1 (2017-10-03) OpenSSH is a 100% complete SSH protocol 2.0 implementation and includes sftp client and server support.
それに伴い下記設定群が不要(設定できない?)になる
- RSAAuthentication
- ServerKeyBits
- RhostsRSAAuthentication
UsePrivilegeSeparation については設定のデフォルトとしては sandbox になる。 手元の debian サーバの 設定は yes になっているが、 yes と sandbox の違いはよくわからない。
参考URL
差分
- https://www.openssh.com/txt/release-6.8
- https://www.openssh.com/txt/release-6.9
- https://www.openssh.com/txt/release-7.0
- https://www.openssh.com/txt/release-7.1
- https://www.openssh.com/txt/release-7.1p2
- https://www.openssh.com/txt/release-7.2
- https://www.openssh.com/txt/release-7.2p2
- https://www.openssh.com/txt/release-7.3
- https://www.openssh.com/txt/release-7.4
今後のバージョン
2018 年まとめ
技術編
- コードをほぼ書かなかった
- 小規模 Minecraft サーバを運用した
- 相変わらず OpenVPN を触っていた
- Kotlin を少し触った
- vue.js を少し触った
- TypeScrypt を少し触った
ゲーム編
2018 年に購入または 2018 年にプレイした形跡があるもの
- PS4
- モンスターハンターワールド
- Child of Light (PS4 では未クリア)
- Fe (未クリア)
- 三國無双9
- ファークライ5
- ソードアート・オンラインフェイタルバレット(未クリア)
- 戦場のヴァルキュリア4
- ダークソウルリマスター(未クリア)
- ライフイズストレンジ Before The Storm (未クリア)
- グランクレスト戦記
- Detroit: Become Human(未クリア)
- ドラゴンズドグマオンライン(未クリア)
- コナンアウトキャスト(未クリア?)
- 蒼き革命のヴァルキュリア(未クリア)
- スパイダーマン
- 無双OROCHI4
- エンドオブエタニティ 4K/HD (未クリア)
- アサシンクリードオデッセイ(未クリア)
- ドラゴンクエストビルダーズ2 (未クリア)
- Switch
- スマートフォン
家財編
- SHARP の空気清浄機を買った
- ダイソン Hot & Cool 空気清浄機を買った
- 無印の超音波式加湿器を買った
- 象印のスチーム式加湿器を買った
- I-O-DATA の NAS 16TB を買った
- CyberPower の UPS を買った
- パナソニックのレッグリフレを買った
ボードゲーム編
- ゲムマに行って2本のゲームを買った
- 友人の作ったゲームをやった
漫画編
- 958 冊買った
映画編
その他
- 冬桜を見に行った
- 入籍した
Minecraft Server の JVM をモニタリングする
目的
Minecraft が高負荷になる場合に FullGC が発生したかなどの JVM 側の負荷なのか 単純に Minecraft 自体での処理が重いのかなどの切り分けを行うためにモニタリングしたい。
方法
自分のサーバは基本的に prometheus によるモニタリングを行っているので Minecraft のサーバ自体のモニタリングが行えるとよい。
手順
前提
- Minecraft が運用されている
- Prometheus が運用されている
- Grafana が運用されている
JMX のメトリクスを取得できるようにする
jmx_exporter によるメトリクスの取得を行うための javaagent の jar を落とす。
$ curl -OLJ https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.3.1/jmx_prometheus_javaagent-0.3.1.jar
jmx_exporter 用の config ファイルを用意。今回は簡単のため空ファイルを作成。
$ touch config.yaml
javaagent のオプションを指定して起動。jmx_exporter の jar ファイルはパス指定でも良さそうだが config.yaml がうまく動かなかったので場所を変えたい場合は要確認。下記は 8080 ポートで開く例。(実運用では jmx_exporter で 8080 はあまり使わない)
java -jar -javaagent:.jmx_prometheus_javaagent-0.3.1.jar=8080:config.yaml -jar minecraft_server.jar nogui
Prometheus で メトリクスを取得するようにする
簡単な例。正確な記述は割愛。
- job_name: jmx static_configs: - targets: ['xxx.xxx.xxx.xxx:port']
グラフの用意
最近の Grafana では公式のページにある程度設定されたダッシュボードがあり、これを import することによってだいたいそのまま使うことができる様子。
https://grafana.com/dashboards/3457
下記のような表示になる。GC カウントも見られ、FullGC が多いかどうかを確認でき、メモリバウンドなのかなどの確認がしやすくなる。
結果
自分のサーバでは特に FullGC が発生してはいなかった。 原因としてログインしているユーザによる牧場で牛や豚が大量にいたことが原因のようだった。
その他
prometheus で minecraft 特有のメトリクスを取得も可能な様子。
https://github.com/sladkoff/minecraft-prometheus-exporter
この exporter は spigot という minecraft server に MOD が導入できる(api 利用が可能になる)ものを利用することによって可能な様子。自分はバニラサーバで動かしているので一旦導入は保留。
Spring Boot 2 アップグレード後に JPA ( Hibernate )が勝手に SEQUENCE を使おうとする問題
問題
Spring Boot 1.5 -> 2.0 に上げたとき MySQL を JPA (Hibernate)経由で利用している場合、 GeneratedValue に AUTO を指定していると INSERT 処理時などに下記のような例外が発生する可能性がある。
Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException Table 'xxx.hibernate_sequence' doesn't exist
原因
Spring Boot の AutoConfiguration では hibernate を使う際に hibernate.id.new_generator_mappings の値のデフォルト値が false になっており、native の id generator が使われていたが Spring Boot 2 になったタイミングでデフォルト値が true になった。 hibernate.id.new_generator_mappings が true の場合、Hibernate 5 では AUTO が指定された場合は常に SEQUENCE 扱いとなる様子。MySQL の場合は SEQUENCE に対応していないため AUTO にしている状態では動かなくなる。
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Migration-Guide
Id generator
The spring.jpa.hibernate.use-new-id-generator-mappings property is now true by default to align with the default behaviour of Hibernate. If you need to temporarily restore this now deprecated behaviour, set the property to false.
Spring Boot 1.5
result.put(USE_NEW_ID_GENERATOR_MAPPINGS, "false");
Spring Boot 2.0
result.put(USE_NEW_ID_GENERATOR_MAPPINGS, "true");
対応案
下記2つの対応が考えられる
- spring.jpa.hibernate.use-new-id-generator-mappings の設定を 明示的に false を使う
- 対象となる GeneratetedValue アノテーションすべてに明示的に IDENTITY を指定する
id generator が false は deprecated とあるので true のほうがよさそうだが デフォルトの AUTO のままでは IDENTITY が使われるルートがなさそうなので一括で対応する方法はなさそう。
参考 URL
letsencrypt の certbot renew を apache plugin から nginx(webroot) に切り替える
環境
- Debian 9.3
- certbot 0.10.2
内容
もともと apache がサポートされていたため apache を利用して letsencrypt を利用していたが nginx を使うように変更したため nginx で直接 https 処理を行うように変更したい。
$ vim /etc/letsencrypt/renewal/example.com.conf
下記のようになっているはず
# Options used in the renewal process [renewalparams] authenticator = apache installer = apache account = ......
これを下記のように書き換える
# Options used in the renewal process [renewalparams] authenticator = webroot installer = None account = ...... [[webroot_map]] example.com = /path/to/webroot
このあとそのまま certbot renew をするとよい。 また cron で自動で確認するようになっていると思うので /etc/cron.d/certbot の内容の一部を下記のように書き換える。reload でもいいかもしれないが自分の環境では特に気にすることもないためそのまま restart している。
.... && certbot -q renew ↓ .... && certbot -q renew --post-hook "service nginx restart"
--post-hook か --renew-hook がいいかは1年ぐらい運用したけど毎回失敗しててよくわからなかった。
BSD + ansible で sysrc を用いて利用可能にする
BSD 系では rc.conf に *_enable="YES"
のような形で設定しないと init script 等で起動しない挙動をするようにするのが一般的な様子?(詳しくは未調査)
ansible でこのあたりを編集するのはつらいのでコマンドを用いて設定できるようにするには sysrc を使うと便利。 sysrc はどうやらデフォルトで入ってなさそう(少なくとも DragonflyBSD においては)なのでこれをインストールするタスクも入れる必要がある。 (汎用的に使うには role に設定して dependences にいれておいたほうが便利そう)
- name: install sysrc package: name: sysrc state: present - name: enable openvpn command: sysrc -ni openvpn_enable="YES" register: openvpn_enable_rc changed_when: (openvpn_enable_rc.stdout == "NO -> YES") or (openvpn_enable_rc.stdout == " -> YES")
上記の動作確認は DragonflyBSD で行ったがこの sysrc は存在してもしなくて return code は 0 を返すため設定に成功したかどうかわからず そのままでは changed 設定ができない。苦肉の策として標準出力を用いている。
sysrc の 実行例
以下はもとに設定がない場合。
n をつけない場合
$ sysrc openvpn_enable="YES" openvpn_enable: -> YES
n をつけた場合
$ sysrc -n openvpn_enable="YES" -> YES
i をつけない場合
$ sysrc openvpn_enable sysrc: unknown variable 'openvpn_enable'
i をつける場合何もかえらない。そのキーが存在しない場合に sysrc: unknown variable 'openvpn_enable'
といったメッセージを出す場合があるので前述の ansible task では 念のためつけている。(影響があるのは 設定する場合と -x で削除する場合)
$ sysrc -i openvpn_enable
e は以下のように ダブルクオーテーションの挙動がなにかおかしいので使ってない。
$ sysrc -e openvpn_enable="YES" openvpn_enable=" -> YES
さくらの VPS 上の DragonflyBSD で ipv6 ネットワーク設定をする
環境
- さくら のVPS
- DragonFly v5.0.2-RELEASE
準備
さくら VPS のコントロールパネルで IPv6 アドレスとゲートウェイを確認する。 自分の場合は特に申請してなくてもついていたのでデフォルトで付いている様子。(契約タイミングやデータセンターによるかもしれない) -この IPv6 アドレスは サフィックスに IPv4 アドレスが付いているパターンのものらしい [1]. - 追記)と思ったけど よーく見るとコンパネの記載にあるのは ドットではなくコロンのため、単純に同じ数字を用いた ipv6 アドレスという可能性のほうが高そう。
設定
vtnet0 インタフェースを用いる場合
/etc/rc.conf
# IPv6 ipv6_enable="YES" ipv6_network_interfaces="vtnet0" # あってもなくてもいい ipv6_defaultrouter="fe80::1%vtnet0" ipv6_ifconfig_vtnet0="inet6 (コントロールパネルに表示されるIPv6アドレス) prefixlen 64"
他の設定については /etc/defaults/rc.conf を確認。
簡単に各項目を説明。
key | default | description |
---|---|---|
ipv6_enable | NO | ipv6 を使う場合に YES ( FreeBSD 9 以降?では 使うべきではないらしい が DragonflyBSD では関係ない様子) |
ipv6_network_interfaces | auto | auto の場合は ifconfig -l の結果が入る。自分の場合は 別の設定名で インタフェースが必要なのでそれを使うという意図で明示している。 |
ipv6_defaultrouter | NO | コンパネで確認する ゲートウェイを入れる。 そのままだとなぜか通じないのでインタフェース名を入れると動く。( netstat -f inet6 -rn などを見ると %lo などがついている場合があったので) |
ipv6_ifconfig_vtnet0 | - | ifconfig で設定する内容 ipv6_ifconfig プレフィックス の設定はipv6_network_interfaces の値に入っている場合に使われる様子 |
設定後は ssh で繋いでる場合は 下記の様にするとおそらく良い [2]。 ipv6 設定を反映するためには /etc/rc.d/network_ipv6 を使ったほうが良さそうな気がしてとりあえず入れているがきちんと検証してない。
$ sudo /etc/rc.d/netif restart && sudo /etc/rc.d/routing restart && sudo /etc/rc.d/network_ipv6 restart
つながっているかどうかは 外から ping6 を実行するなどして確認 [3]。
発生した問題
ping6 や ssh で ipv6 アドレスを直接指定して動かした場合に動作せず、サーバ側のコンソールで下記のようなエラーが出る現象があった。
nd6_storelladdr: sdl_alen == 0 nd6_storelladdr: sdl_alen == 0 nd6_storelladdr: sdl_alen == 0
このエラーが出ている部分はこのあたり。 impossible と書いてあるけど…
/usr/src/sys/netinet6/nd6.c
2091 if (sdl->sdl_alen == 0) { 2092 /* this should be impossible, but we bark here for debugging */ 2093 kprintf("nd6_storelladdr: sdl_alen == 0\n"); 2094 m_freem(m); 2095 return (0); 2096 }
自分の場合の原因は、ipv6 アドレスの設定部分だった様子。 記事によっては ifconfig_vtnet0_ipv6 のような ifconfig プレフィックスになっている場合があるが、 少なくとも自分の環境ではこれでは動作せず、上記のような謎エラーが表示される。
ipv6 を prefix とするような設定にするとたぶん大丈夫。 このあたりは /etc/network.subr 内 network6_interface_setup 関数で呼ばれている様子なので詳しい挙動を見たい場合はこのあたりを参考に。
参考文献
- [1] IPv4アドレスを含むIPv6アドレス表記:Geekなぺーじ
- [2] FreeBSD: How To Start / Stop / Restart Network and Routing Services - nixCraft
- [3] Network Troubleshooting Tools, IPv4 and IPv6
- IPv6アドレスの設定方法 – さくらのサポート情報
- さくらのVPS で IPv4 over IPv6ルータの構築
- https://www.freebsd.org/doc/handbook/network-ipv6.html
- https://www.dragonflybsd.org/~labthug/handbook/firewalls.html