systemdでサービスの有効化と起動をワンラインで実行する

昨日VPNサーバを構築した際に知ったのですが、比較的新しいバージョンであれば有効化と起動をワンラインでできるようです.

man.kusakata.com

例えばnginxサービスをsystemdで有効化と起動をすると言えば、

systemctl enable nginx
systemctl start nginx

といった書き方でしたが、バージョン220から使えるようになった--nowオプションを使うことでワンラインで実行できます.

systemctl enable --now nginx

無効化と停止も同様に書けます.

systemctl disable --now nginx

昔よく触っていた時代と比べて、便利になっていて助かります.

VPNサーバを構築した記事

khasegawa.hatenablog.com

WireGuardをConoHa VPSで立ち上げてGunfire Rebornをプレイする

Gunfire Rebornというゲームを友人とプレイしようとしていたところ、
特定のフレンドとプレイができなくなるという現象が起きました.
この現象は、弊宅で契約している回線がV6プラスであることが起因していて基本的には解決できない問題です.

とはいえ、回避方法はいくつかありまして、

  • IPoE方式(V6プラスなど)ではなくPPPoE方式でインターネットに接続する
  • VPNサーバ経由でインターネットに接続する

といった方法で回避することはできます.

弊宅ではIPoE方式でもPPPoE方式でも接続できるようにしており、PPPoE方式でプレイすれば問題ないかな?と思っていたのですが
Gunfire RebornではPPPoE方式でまともにプレイできないレベルでのラグが発生してしまい最終的には接続が切れてしまいました.

そのため、今回はWireGuardを経由でプレイできるようにしていきます.

大枠の流れ

  1. ConoHa VPSでサーバを作成する
  2. WireGuardをセットアップする
  3. WindowsにWireGuardクライアントをインストールして接続する

ConoHa VPSでサーバを作成する

ConoHa VPSである理由は特にないので、もしも試してみる場合は各自好きなVPSを使うと良いです.
今回はあくまで検証用途で立ち上げたので、以下の条件でサーバを立ち上げます.

  • プラン ... メモリ1GBプラン(CPU 2core、SSD 100GB)
  • OS ... Ubuntu 20.04
  • 追加ディスク ... 使用しない
  • 接続許可ポート IPv4 ... 全て拒否(後で全て許可に変更する)
  • 接続許可ポート IPv6 ... 全て拒否(後で全て許可に変更する)
  • SSH Key ... 使用しない
  • スタートアップスクリプト ... 使用しない

rootパスワードは1Passwordなどのパスワードマネージャーが自動生成する推測されづらいパスワードに設定しておきます.
ネームタグは分かりやすい名前でもつけておくと良いです.

これでサーバを作成して起動するまで待ちます. 起動ができたら、サーバの詳細画面にあるコンソールを起動してサーバ内で作業できるようにしておきます.

f:id:corrupt952:20210523004905p:plain

WireGuardをセットアップする

WireGuardをセットアップして起動する

サーバで以下のコマンドを上から順に実行していきます.
WireGuardではクライアントと通信するために、任意のポートでUDP通信できるようにしておく必要があるので、
55555ポートでUDP通信できるようにしておきます.

# パッケージのアップデート
apt update
apt upgrade -y

# WireGuardのセットアップ
apt install -y wireguard
cd /etc/wireguard
wg genkey | tee server.key | wg pubkey > server.pub # サーバ側の秘密鍵・公開鍵を生成
wg genkey | tee client.key | wg pubkey > client.pub # クライアント側の秘密鍵・公開鍵を生成
cat <<EOF > wg0.conf
[Interface]
PrivateKey = $(cat server.key)
Address = 10.0.0.1/32
ListenPort = 55555
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -A FORWARD -i %i -j ACCEPT; ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; ip6tables -D FORWARD -i %i -j ACCEPT; ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
PublicKey = $(cat client.pub)
AllowedIPs = 10.0.0.0/24
EOF
chmod 600 server* client* wg0.conf

# sysctlのパケット転送を有効化にする
cp /etc/sysctl.conf{,.back}
sed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/' /etc/sysctl.conf
sed -i 's/#net.ipv6.conf.all.forwarding=1/net.ipv6.conf.all.forwarding=1/' /etc/sysctl.conf
sysctl -p

# ufwのセットアップ
ufw default deny
ufw allow 55555/udp
systemctl enable --now ufw

# WireGuardを起動する
systemctl enable --now wg-quick@wg0

# WireGuardの起動状態を確認する
wg show
# コマンドの結果例
# interface: wg0
#  public key: XXX
#  private key: (hidden)
#  listening port: 55555
#
# peer: YYY
#   endpoint: www.xxx.yyy.zzz:12345
#   allowed ips: 10.0.0.0/24
#   latest handshake: 1minutes, 43 seconds ago
#   transfer: 1.48 MiB received, 20.60 MiB sent

エラーも出ずに終了すればサーバでの作業は終わりです.

各種鍵を控えておく

コンソールの接続を切る前に各種鍵を控えておきます.
クライアントの設定でも必要なのと、サーバが何らかの理由で消えてしまった時用のバックアップとしてパスワードマネージャなどに残しておくのが良いです.

cd /etc/wireguard
cat sever.key # サーバの秘密鍵
cat server.pub # サーバの公開鍵
cat client.key # クライアントの秘密鍵
cat client.pub # クライアントの公開鍵

インターネットからサーバに対して全ポートの通信を許可する

全て拒否に設定していた「接続許可ポート IPv4」、「接続許可ポート IPv6」を全て許可にしておきます.

f:id:corrupt952:20210523015813p:plainf:id:corrupt952:20210523015816p:plain

WindowsにWireGuardクライアントをインストールして接続する

クライアントをダウンロードする

公式サイトからWindows用のクライアントソフトをダウンロードしてインストールします.

www.wireguard.com

接続設定を作成する

インストール後、クライアントを起動して「空のトンネルを作成」を押して接続設定を作成します.
テキストを入力できる画面になると思うので以下を参考にして設定を入力します.

[Interface]
PrivateKey = XXX # client.keyの中身を貼り付け
Address = 10.0.0.2/32 # クライアント側のプライベートIPv4アドレスを入力、今回は10.0.0.2にする
DNS = 1.1.1.1 # DNSサーバを指定、GoogleのやつでもなんでもOK

[Peer]
PublicKey = YYY # server.pubの中身を貼り付け
AllowedIPs = 0.0.0.0/0, ::/0 # 全ての通信をサーバへ流す. ここを変更することで特定の通信のみに絞り込むことも可
Endpoint = www.xxx.yyy.zzz:55555 # サーバのグローバルIPv4アドレス

これらを入力し終えたら「保存」を押して設定を保存します.

接続する

クライアントの画面にある「有効化」ボタンを押して接続を開始します.

f:id:corrupt952:20210523022500p:plain

状態が有効になり、Googleでも何でも良いのでWebサイトが見れれば設定は完了です.
もしも、Webサイトが開けない場合は、サーバ側のPeerかクライアント側のPeerが間違っているので修正してください.

WireGuard経由でGunfire Rebornをプレイ

実際にWireGuard経由でGunfire Rebornをプレイしましたが、ping値は数ms程度の低下で問題なくプレイできることが確認できました.
Gunfire Reborn以外のP2P通信をするマルチプレイヤーゲームはプレイしていませんが恐らく問題ないはずです.

※ PC版のDark Souls 3やMonster Hunter: Worldなどが該当する

さいごに

あくまでゲームをプレイするためにVPNサーバを立ち上げましたが、 今回の構成であれば固定IP用のVPNサーバとしても利用自体は可能です.

問題なくゲームがプレイできるようにはなりましたが、
VPNサーバを別途用意したり、PPPoE方式で接続できるようにしなければならないというのはやはり手間ですし、契約できるのであればNURO光が理想的ですね.

今回は、Gunfire Rebornというゲームで起きていたという話をしていますが、現状把握しているのは

でも、稀に特定のフレンドとの組み合わせでプレイできなくなるという現象を確認しているので、 もしも困っている人がいれば何か参考になればよいなと思います.

おまけ:VPNサーバを立ち上げる時のVPS観点

今回は理由もなくConoHa VPSで立ち上げていますが、もし自分がVPSをちゃんと選ぶ場合の観点を書いておきます.

必須

  • IPv4アドレスが1つ固定で割り振られること
  • 帯域が100Mbps以上であること(ConoHa VPSではIn/Outともに100Mbps)
  • 最低でも1000番以上のポートは全て解放できること

任意

  • WebUIでVNCではなくシリアルで接続できること
  • ブートディスクがSSDであること

おまけ:ArchWiki

wiki.archlinux.jp

Kindleアプリで既読にならない

私はiPadKindleアプリで書籍を読んでいることが多いんですが、確実に最後まで読み切っているのにも関わらず既読の棚に移動しないという現象に1週間ほど悩まされていました.

結論としては、アプリの不具合でも何でもなくてiPadを再起動すれば解決するだけの話だったようです. どうやら起動しっぱなしだと、Kindleだけではなく他のアプリでも様々な不具合が発生するようで、 似たような現象は端末の再起動をとりあえずすれば良くなるというもののようです.

モバイルアプリの開発者ではなく軽く作ったことがある程度なので、何故こういう現象になりうるのかが少し気になりますね.

これからはちゃんと再起動しようと思いました.

MkDocsでmainブランチを利用する

昨今、技術界隈でもポリコレが重要視されている気がする世の中です. GitHubのデフォルトブランチがmainブランチに変更されていますが、MkDocsではmasterブランチがデフォルトのままです. この場合、生成されたHTMLの編集リンクはmasterブランチが参照されるため、GitHubで管理されている場合は404ページが表示されてしまいます.

そこで今回は、MkDocsでmainブランチの編集画面を開く設定を書いておきます.

TL; DR

  • mkdocs.ymlにedit_uri: edit/main/docs/ を追記する

mainブランチの編集画面を開く

公式ドキュメントのedit_uriが今回利用する設定になります. 他の設定値よりも色々と書かれていますが、GitHubで管理しているリポジトリがmainブランチという前提で話を勧めているのため、

f:id:corrupt952:20210226054427p:plain

の部分を参考にしてedit_uriを追記します.

On GitHub and GitLab, the default "edit" path (edit/master/docs/) opens the page in the online editor.

GitHubとGitLabは、edit_uriedit/master/docs/がデフォルトで設定されるということが分かります. というわけで、値のmaster部分をmainに変更して値をmkdocs.ymlに追記すればOKです.

以下がその例です.

site_name: In Docs - MkDocs Prj Templates
repo_url: https://github.com/corrupt952/mkdocs-prj-templates
# これを追記
edit_uri: edit/main/docs/

【随時更新】 2021年買ってよかったもの

2021年に買ってよかったものを随時更新していきます!

家電

HHKB Professional HYBRID Type-S

購入の決め手は、元々HHKB Professinal2を使っていたということと、無線キーボードが欲しいという気持ちが2年間ぐらい続いたことです.
実際に使ってみると、思っていたよりもかなり使いやすく電池の持ちも問題なさそうです.

メリットは、

  • Type-Sモデルなので通常のHHKBと比べて静かなタイプ音
  • リモートワークで複数PCを使っているけれど、PC間の切り替えが容易に行える
  • HHKB慣れしてるので入力しやすい

デメリットは、

  • 値段が高い(35,000円ぐらい)
  • Type-S全般の話だけど、タイプ音が特徴的なので気に入らない人はいる

です.

洗濯乾燥機(BD-SX110FL)

同僚からオススメされたという経緯もあり、引越し後即購入してみました. 実際に使ってみて感じたメリットは、

  • 乾燥機能がついている
  • 洗剤・柔軟剤の自動投入

になります. もちろんデメリットというか面倒な点もあって

  • フィルター関連は都度掃除しなければならない

という点です. とはいえ、圧倒的に便利なので洗濯乾燥機は是非購入検討をしてみて良いかと思います!

臭い戻りが気になるという口コミを見かけますが、これはいくつかの対策を行うことで防げるようなので問題ないかとは思いますが、 心配な方は日立以外のメーカーをしていた方が良いかもしれません.

Hugo向けのDockerfile最新版

個人サイトの www.khasegawa.net からブログをはてなブログに切り出したことで、テーマも変更しました.
それに伴いコンテナイメージを作り直したので、その時のDockerfileを書いておきます.

ちなみに最近のHugoのテーマでは、Sass/SCSSのコンパイルが必要になる場合もあるため、 インストールするHugoはextendedバージョンをインストールしています.

FROM ubuntu:20.04
RUN apt-get update \
    && apt-get install -y --no-install-recommends wget ca-certificates git bash make \
    && wget -O hugo.deb https://github.com/gohugoio/hugo/releases/download/v0.81.0/hugo_extended_0.81.0_Linux-64bit.deb \
    && dpkg -i hugo.deb \
    && rm hugo.deb \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*
WORKDIR /app

個人ブログをはてなブログに移行しました

ほぼ毎年ブログを変えてるような気がしますが、今回は落ち着くことになりそうです.

以前、個人ブログを変更した時の話はこれ

khasegawa.hatenablog.com

Hugoを使っていて不便に感じたこと

元々Hugoを使ってブログの記事内容を含めてwww.khasegawa.netを管理していたのですが、
Hugoを使ってブログを管理する際に1点だけデメリットがありました.

それはブログ記事に画像を埋め込むときです.

恐らくこれmacOSを使っている人は多少マシだとは思いますが、
私の普段の開発環境はWindows+WSL2(Ubuntu)になります.
この環境で画像入りのブログ記事を作る場合にどういった手順が必要になるのかと言うと、

  1. 記事作成スクリプトを実行(画像置き場も作成される)
  2. 記事を書く
  3. Windows側にあるファイルをWSL側にある画像置き場にmvなどで移動する
  4. 記事内にfigureなどのショートコードを利用して画像を参照させる

といった手順になります.
そこまで面倒じゃないように思えるかもしれませんが、3と4の中では移動したりファイル名を変更したり、パスを考えてfigureを呼び出したりと
意外と作業が多く画像を埋め込みたい時にかなり面倒に感じていました.
はてなブログに移行したとは言っても完全に解消されるわけではありませんが、
今の運用よりは圧倒的に楽になりそうです.