Linuxでv6プラス MAP-Eなルーターをつくる。IPv6, RAも疎通する版

ルーターで遊びたい欲が出てきており、適当なマシンを調達して遊ぶことになりました。 自分の家のルーター(IO DATA WN-AX2033GR)が微妙にIPoE環境だとフルスピードが出ないこと(だいたい200-300Mbpsが限界)や細かい設定ができない不満などがあり、いろいろ代替手段を物色していたんですがちょうどいいマシンを借りれたのでそれでやりました

よくある文献だとv6の設定まで詳しくは書いてなかったりするんですがv6のほうがカプセル化のオーバーヘッドがない分スループット高いはずだし、MAP-Eでセッション(ポート)枯渇することもないので使わない手はないはずなんですよね。

環境

  • 光コラボ回線。NTTフレッツ光ネクスト相当
  • DTI 光。 安いがIPoEが開通するとPPPoEが消滅する
  • IPv4 over IPv6はJPNEのMAP-E
  • おうちに光コンセントが生えているタイプ
  • ひかり電話なし=HGWなし=RAの/64のほう。DHCPv6の/56ではない

ルーター選定

長い道のりがあった。要件としては

  • 回線のスペックを生かしたいので1Gbpsフルで出ること
  • いろいろ細かいところをいじって遊べること
  • 常時運用して邪魔にならないサイズ

コストだけだと市販ルーターにOpenWrtを焼くのが最安なのだが、それだと1Gbps出ないらしい。ハードウェアオフローディングが前提だがOpenWrtだとその辺うまく扱えないとかいろいろな理由により最適化が進んでいないらしい。基本市販ルーターに乗っているチップはスループット要件的には全滅である。そんなこんなでこの辺が候補になった。

  • Raspberry Pi 4 Model B 10000円くらい
  • NanoPi R4S 8000円くらい
  • Celeron J1900を積んだSBC 15000円くらい

価格はすべてケースやらアダプタやらいろいろ込みの概算。NanoPiが最安だがサポート体制もドキュメントもあんまりなさそうなのが難。RasPi 4は結構良いんじゃないかとおもう。Celeron JはいわゆるAtomベースのクアッドコアでx64が動作し互換性やらドライバやらなんやらで悩むことがほとんどないであろうことが約束されているのがうれしい。

とここまで調べたところで、友人がLattePandaを買っていたことを思い出した。Atom Cherry Trailのクアッドコアで性能十分だろうと借りたらLattePanda AlphaでCore m3でオーバースペックすぎるといううれしい誤算がありスタート。

UbuntuにするかOpenWrtにするか悩んだがとりあえずUbuntu Server 20.04でスタート。どっちがいいかは両方は試していないので謎。ルーター用じゃないディストロ使うとよくもわるくもルーターっぽい設定方法はできない

LANポートが1つしかなかったのでUSB 3.0-GbE変換をかった。これはなんでもいい。激安は主にRealtekかASIXらしいがx64 Ubuntuではどっちも無設定で動くし当然1Gbpsでる(OpenWRTの場合はどちらか見極めて別途ドライバインストールが必要らしい)

えらばなかったルーター

最近のはv6やらv4 over v6やらもうまいことハードウェアオフローディングしたりしていてまあまあ高速らしい。完全にオーバーヘッドでなくなっているかは不明ですが手持ちのより速いことは間違いない。機能と安定性はバラバラだったり、JPNE 固定IPは対応していなかったり対応していてもなぜかポート開放できなかったりととにかく機能不足がすごい

  • EdgeRouter X

手持ちで持っているがMAP-E非対応なのと単なるv4 over v6のカプセル化でもハードウェアオフローディングに対応できないのでCPUの能力不足で200-300Mbpsくらいしかでないということで除外

40000円也。富豪~。とはいえ自分がこうやって苦労したようなことが公式ドキュメントみながらササっとできるので金で時間と性能を買えるのはすごい

構成

IPv4, IPv6のデュアルスタックにしたい。したいんだがこれはつまり両方別に設定しつつたまに共通になったりあれこれする魔境である。めんどうったらありゃしない

IPv4

ルーターにDHCPv4サーバーを立ててやります

IPv6

ルーターはRAを中継するだけ。いわゆるL3スイッチに近い(けどちょっと追加で仕事する)

  • radvdでRAを中継
  • radvdで追加で設定できるのでnameserverも書いておく(1.1.1.1サービスのv6アドレスである2606:4700:4700::1111とか)
  • RAのためのICMPv6をいい感じにするのにndppdとかいうやつもいれる
  • DHCPv6は一切使わない

DEV (デバイス名)

ネットワーク周りではdevはdeviceの略称です。最初何?ってなった

  • enp2s0: LAN側NIC
  • enx18ece795bb0b: WAN側NIC
  • ip6tnl0: 使うとうまく動作しない呪われたdev。勝手にできるしなんなのかわからない。ネット情報だとこの名前使ってるやつあるが使うとはまるのでやめましょう
  • ip6tnl1: ip4ip6トンネル。↑ではまったので名前変えたやつ

設定

設定はsystemd-networkdでやり、カバーできないところをipとiptablesでやりました。これがベストなのかは謎

apt purge network-manager netplan.io ifupdown

どっかで見かけてビビったんですがこれは初手としてやったほうがいいです。Ubuntuネットワーク管理するやつが多すぎてこいつらが勝手に動作するとわけわからなくなるのでpurgeは基本。systemd-networkd一本でいきましょう

apt install radvd npdpp isc-dhcp-server
$ cat /etc/systemd/network/10-enp2s0.network
[Match]
Name=enp2s0

[Network]
LinkLocalAddressing=ipv6
Address=192.168.0.4/24
DHCP=no
DNS=1.1.1.1
DNS=8.8.8.8

$ cat /etc/systemd/network/10-enx18ece795bb0b.network
[Match]
Name=enx18ece795bb0b

[Link]
RequiredForOnline=yes

[Network]
DNS=2606:4700:4700::1111
IPv6AcceptRA=yes
DHCP=no
Address=240b:10:xxxxxxxxxxxxxxx/64
Tunnel=ip6tnl1

$ cat /etc/systemd/network/12-ip6tnl1.network
[Match]
Name=ip6tnl1

[Network]
IPForward=ipv4

[Route]
Destination=0.0.0.0/0

$ cat /etc/systemd/network/ip6tnl1.netdev
[NetDev]
Name=ip6tnl1
Kind=ip6tnl

[Tunnel]
Mode=ipip6
Local=240b:10:xxxxxxxxxxxxxxxxx
Remote=2404:9200:225:100::64
DiscoverPathMTU=yes
EncapsulationLimit=none

$ cat /etc/radvd.conf
interface enp2s0
{
    AdvSendAdvert on;
    prefix 240b:10:xxxxxxxxxxx::/64
    {
        AdvOnLink on;
        AdvAutonomous on;
    };
    RDNSS 2606:4700:4700::1111 2001:4860:4860::8888
    {
    };
};

$ cat /etc/ndppd.conf
proxy enx18ece795bb0b {
   router no
   rule 240b:10:xxxxxxxxxxx::/64 {
      auto
   }
}

$ cat /etc/dhcp/dhcpd.conf
# default
default-lease-time 600;
max-lease-time 7200;
ddns-update-style none;

authoritative;

subnet 192.168.0.0 netmask 255.255.255.0 {
  option routers 192.168.0.4;
  option domain-name-servers 1.1.1.1, 8.8.8.8;
  range 192.168.0.100 192.168.0.199;
}

$ cat /etc/sysctl.conf
net.ipv6.conf.all.accept_ra = 1
net.ipv6.conf.enx18ece795bb0b.accept_ra = 2
net.ipv4.conf.all.forwarding=1
net.ipv6.conf.all.forwarding=1
net.netfilter.nf_conntrack_tcp_timeout_established = 3600

設定は試行錯誤しながらやったのでなんか結構不要な設定が混じってそうな感がある。参考程度にお考えください。あとMAP-Eのアドレス計算はググってください。

以下はシェルスクリプト。systemdとかで起動時に自動設定されるようにしたほうがいいやつですね。まだやってない

#!/bin/sh
set -ux

# https://qiita.com/s_ponta/items/5652a7be49198288ae61
RA_RANGE='240b:10:xxxx:xxxx::/64'
BR='2404:9200:225:100::64'
CE='240b:10:xxxxxxxxxxxxxxxxxxx'
IP4='xx.xx.xx.xx'
PSID='xxx'
LANDEV='enp2s0'
WANDEV='enx18ece795bb0b'
TUNDEV='ip6tnl1'

# no way to config this from systemd-networkd https://github.com/systemd/systemd/issues/928
ip -6 r replace $RA_RANGE dev enp2s0 tab 1
ip -6 rule add from all tab 1 priority 1000

iptables -t filter -F
iptables -t nat -F
iptables -t mangle -F

rule=1
while [ $rule -le 15  ] ; do
  mark=`expr $rule + 16`
  pn=`expr $rule - 1`
  portl=`expr $rule \* 4096 + $PSID \* 16`
  portr=`expr $portl + 15`
  iptables -t nat -A PREROUTING -m statistic --mode nth --every 15 --packet $pn -j MARK --set-mark $mark
  iptables -t nat -A OUTPUT -m statistic --mode nth --every 15 --packet $pn -j MARK --set-mark $mark

  iptables -t filter -A FORWARD -p icmp -m mark --mark $mark -j ACCEPT
  iptables -t filter -A FORWARD -p tcp -m mark --mark $mark -j ACCEPT
  iptables -t filter -A FORWARD -p udp -m mark --mark $mark -j ACCEPT

  iptables -t nat -A POSTROUTING -p icmp -o $TUNDEV -m mark --mark $mark -j SNAT --to $IP4:$portl-$portr
  iptables -t nat -A POSTROUTING -p tcp -o $TUNDEV -m mark --mark $mark -j SNAT --to $IP4:$portl-$portr
  iptables -t nat -A POSTROUTING -p udp -o $TUNDEV -m mark --mark $mark -j SNAT --to $IP4:$portl-$portr
  rule=`expr $rule + 1`
done

iptables -t mangle -o $TUNDEV --insert FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

いろんなサイトのコピペになってる

ip -6 r replace $RA_RANGE dev enp2s0 tab 1
ip -6 rule add from all tab 1 priority 1000

こはちょっと大事でして、systemd-networkdだと現状こういうサブネット全体のmetric (ルーティング優先度、低いほうが優先される)を指定する方法がないのでRAなどでつけられたデフォルト優先度に負けないよう上書きしたい場合は手動でやる必要があります。この例だとこのsubnetは標準だとWAN側NICアサインされてしまうのをLAN側NICに戻しています。このサブネットWAN側LAN側両方で使われているのがややこしいというかv6っぽいというか。しかし自分とこでレンジ切り出して再配布できるDHCPv6のほうがらくってのはよくわかりますね。NTT~。ということで最初はmetric変更したrouteを追加していたんですが上位概念としてtable/ruleというのがあるのでそっちで設定したほうが確実そうということでそれをやってます。priorityはtableのpriorityですね。標準のmainは32000くらい。

設定後はこうなる

$ ip -6 rule
0:      from all lookup local
1000:   from all lookup 1
32766:  from all lookup main

$ ip -6 route list tab 1
240b:10:8ac1:e800::/64 dev enp2s0 metric 1024 pref medium

$ ip -6 route list tab main
::1 dev lo proto kernel metric 256 pref medium
240b:10:xxxxxxxxx::/64 dev enx18ece795bb0b proto kernel metric 256 pref medium
240b:10:xxxxxxxxx::/64 dev enx18ece795bb0b proto ra metric 1024 expires 2591640sec pref medium
240b:10:xxxxxxxxx::/64 dev enp2s0 proto ra metric 1024 expires 86177sec pref medium
fe80::/64 dev ip6tnl1 proto kernel metric 256 pref medium
fe80::/64 dev enx18ece795bb0b proto kernel metric 256 pref medium
fe80::/64 dev enp2s0 proto kernel metric 256 pref medium
default via fe80::xxxx:xxxx:xxxx:xxxx dev enx18ece795bb0b proto ra metric 1024 expires 1440sec pref medium

余談ですがipもiptablesもv6とv4で別々に表示されるしv6はオプションつけないと表示されないから注意だ!

速度

適当にはかったとき、v4で600Mbpsくらいは出ている。いままでは200-300Mbpsが限度だったのでルーターの性能によるオーバーヘッドはほぼ消えたといっていいんじゃないだろうか f:id:yayugu:20210217012511p:plain

課題

  • ↑で手動で設定したmetricがなにかのはずみに消えてしまうことがあり、謎。なくなるとv6は疎通しなくなるがv4は通じるので気づきにくかったり
  • セキュリティー。ザルというか無設定なんですがどうなんだろう。v6アドレスの設定方法がどうなっているか調査したりとか、パケット解析してなんか弾くとかやったほうがいいのかね。でもv6では全部グローバルアドレスもっててincoming受け付けられるというのはまっとうなことでは
  • UPnPとか。MAP-Eでどこまで対応する価値あるかはおいといてやりたいときに。可能なportであればできたほうがいい

  • enひかりっていう光コラボのサービスがあるんですが、MAP-Eと固定IPオプションをつけると月3300+180+700=4180円でフルのv4アドレスを持つことができます。これで80やら443やらでサーバー公開できるね!!ということでそれをやりたいと思います。MAP-E + 固定IPオプションは実際にはJPNEの固定IPサービスになるのでごちゃごちゃやる必要があるMAP-EともおさらばできDS-Liteくらいの設定でいけますしセッションが増えた時のポート枯渇にも悩まされなくなります。よさそう!
  • めちゃくちゃ高性能なやつでやってしまったのでどこまで低性能、低価格なルーターで同じスループット出せるかはチャレンジしてみたい。あと一分のチップは最近OpenWrtでハードウェアオフローディング対応したらしいので、市販ルーターのソフトウェアでやっているv4用のハードウェアオフローディングをv6で無理やり使えるようにするハックとかを自分でやるのはおもしろそう(大変そう)

参考文献

https://qiita.com/kakinaguru_zo/items/2764dd8e83e54a6605f2 https://qiita.com/s_ponta/items/5652a7be49198288ae61 https://quintrokk.subness.net/?p=2003 https://gato.intaa.net/archives/25972

IPoE回線で自宅サーバーを公開する

フレッツ光・光コラボをお使いの皆さん元気でしょうか!自宅に固定回線を引いている人の9割はNTTの回線を使っていてそのほとんどがIPoEを使うかもしくはPPPoEからIPoEへの移行を検討されているとおもいます。PPPoEは基本的に死んでいるので当然ですね。

さて回線導入やIPoE移行にあたって色々問題はあるのですが、自宅サーバーを運用している者としての最大の課題はIPv4で外部向けにPortを開放できないことではないでしょうか。DS-Liteでは全ポート、MAP-Eでは一部の割り当てられた番号しか利用できずそれもルーターによっては利用不可であったりします。自宅サーバーの場合は80, 443, その他の任意のポートを開放したいことが多いのでこれは困りますね。

以前私が書いた記事ではサーバーのみPPPoEを利用することでこの制限を回避していたのですが、諸事情で光コラボの事業者をSo-net光からDTI光に変更したところDTIはIPoEを疎通させるとPPPoEは自動で停止となる使用となっており併用ができなくなってしまいました。

vector.hateblo.jp

これは困りました。当然IPv6であれば大量のIPを持って自由に公開できるのですが、v4はありません。対策として次の様な選択肢を検討しました。

  1. IPoE固定IPサービスを使う
  2. VPSクラウドなどでReverse proxyを建ててIPv6経由で転送する
  3. VPSクラウドなどでReverse proxyを建てて自宅サーバー側からトンネルを作成してそれ経由で転送する(リモートのサーバーがv4非対応の場合)
  4. Cloudflareを使う

1は検討したのですが、コストが高めであること、対応ルーターが限られることなどから見送りました。王道っぽいので月の+2~3000円追加で払える方は使ってもいいかもしれません。

自分は4のCloudflareを利用しています。CloudflareではReverse proxyが無料で利用でき、かつ試した結果向け先がアドレスがv4でもv6でも動作することがわかりました。

f:id:yayugu:20201225230137p:plain

じっさいの画面はこんなかんじです。Nameserverを作成しドメインを登録します。その際にオレンジのアイコンをオンオフすることでProxyの有効無効が切り替えられます。更に驚くべきことにProxy有効の場合は勝手にAレコードとAAAAレコードを自動で作成してクライアントがv4しか使えない回線の場合にも対応してくれます。神!

レスポンスタイムなどはめちゃめちゃ速いという印象ではないのですが(流石にproxyなしの方が高速)自分の用途だと気にならないレベルです。

メンテコストがほぼゼロで快適です。v6だとIPがほぼ変化しないので(注: ルーターの設定による。自分の場合2個振られていて、あまりダイナミックに変化しない方を選びました。セキュリティー上の理由でルーター再起動などで変化するものもあります)DDNSなどの設定も省略できます。

無料ですしよかったら試してみるといいのではないでしょうか。

近況報告

少し前に転職しました

from: グリー株式会社
to: 株式会社メルカリ

新しい職場はすごく新鮮で、なんといっても使用言語の9割が英語です。
おれは英語があんまりできなくて職務に差し支えているので勉強しつづけて少しずつマシにしていく必要があるわけです。

いい機会といえば機会だし良かったですね

v6プラス(IPoE MAP-E)とPPPoEを併用する(ルーターが非対応の場合)

フレッツ光・光コラボが深夜めっちゃ遅い問題はここ1年くらい我が家にも到来しており、最近は夜10時以降WifiつながないでLTE回線の方が速い、AbemaTVやニコ生を見ると止まりまくるといった悲惨な状況です。

その時の構成は

これを問題の緩和のためIPoE経由にしてIPv4接続を試そうと思ったのですが課題が色々あり

  • 仕様しているプロバイダ(So-net光コラボ)ではIPoEでv4を通す場合MAP-Eが使われている(というかJPNE経由になる)
  • EdgeRouter X がMAP-E非対応
  • IO DATA WN-AX2033GRがファームウェアアップデートでMAP-E対応した(ラッキー)がPPPoEとの併用は対応しておらず、自宅サーバーに外からアクセスしたいときに困る

といったことになり困っていました。 ルーターを買い換えればいいかというと最近のルーターでもIPoEトンネル系の技術とPPPoEの併用は非対応のものがほとんどで、Synology 2600ac (25000円) や YAMAHA RTX830 (45000円) などスーパーハイエンド機種だけが併用できます。しかし高すぎる

解決策

ONUの下にスイッチングハブをつけて、PPPoE用ルーターとIPoE用ルーターを分岐させるとうまくいった

f:id:yayugu:20180717152019p:plain

WAN側にスイッチングハブという発想はなかったが今の所問題なく動いてしまっている

スイッチングハブルーター2つが3角形のダイヤグラムを描いており不穏さを感じる

注意点としては、当たり前のことだが

  • 2つのルーターのIPがかぶらないよう片方を192.168.0.1以外などに変更しておく
  • PPPoE側(ER-X)ではdhcpはオフにする
  • ER-Xを経由させたいマシンではIPは静的(固定)割当にしてデフォルトゲートウェイにPPPoEしている方のルーターを指定しておく
  • IPoE側ルーターdhcpでは固定しているIPは回避して割り当てるようにする
  • ER-X(PPPoE側)ではIPv6もdisableにした方が良い気がしたためそうした。2つのルーターがWANからRAでv6 prefixを受けたりした場合にどうなるかは試してない

雑感

  • 速度問題が解決したかはしばらく試してから追記予定
    • (追記) いまのところ速度は良好
  • サーバーについては引き続きPPPoEで低速のままだが、そこは深夜帯にヘビーに使うわけではないので自分の用途だと問題なし
  • EdgeRouter直下に1サーバーしかおいていおらず、かつEthernetポートが2つあるので、こいつが直接PPPoEすればER-Xは不要になるがやってない
  • 低価格ルーター2個とスイッチングハブ (1500円)で実現可能で、単体で高機能なルーターを購入するのと比べると圧倒的に安い
  • 自宅のサーバー・ネットワーク機器とケーブルまわりがだいぶグチャッとした
  • グチャッとするので金があるならYAMAHAの方がいいと思う

検討したもの。試したけどうまくいかなかったもの

  • DS-Lite対応のプロバイダへの乗り換え
    • ER-XはDS-Liteであれば使えるのですがDS-Lite対応のプロバイダが一時期よりも激減していて「IIJmio光コラボ」か「インターリンク ZOOT NATIVE」しかない状況らしいです
    • (追記) Excite MEC光も対応していたもよう
    • IIJmio光は知り合いが何人か使っているのらしいのですが転送量制限が厳しくヘビーユーザーの運用には向かないとみんな愚痴っていたので、DS-Lite自体諦める方針に
  • ER-XでIPv6だけパススルー(L2スイッチ)してスイッチングハブを不要に
    • スイッチングハブを持っていなかったので、IPv6だけbridgeしてWN-AX2033GRにわたすふるまいをしたかった
    • 一般的なLinuxだとebtablesなどを使ってできるようですがEdgeRouterはその辺を独自でやっているっぽく、自分のEdgeOS力とかIPv6力の低さ(俺はネットワーク屋さんではないので)もありしばらく試行錯誤して諦めた
  • WN-AX2033GRでPPPoEパススルーしてスイッチングハブを不要に
    • この機種PPPoEパススルー非対応だった
    • 対応機種は結構あるので新しく買うのであればそういうのかうといいんじゃないでしょうか

Cherry MX互換スイッチレビュー

テスターを色々買ったりして、自作キーボード向けのスイッチの知見がたまってきたので個人的な好みを書いておきます

最初に結論

Tactileスイッチは ZealiosSpeed Copper。Clickyは Box White がおすすめ

レビューできていないもの

特にCherry MX系にしぼるつもりはなかったんですが、自然とそうなった。

結構対象を絞ってます。Linearスイッチはあまり使おうと思ったことがないので対象外(いいスイッチに出会えていないだけかもしれない)。vintage系は購入もメンテナンスも大変そうでやっていないので外しています

Matiasはkeycapで遊べないことが致命的なので試してない。MX用のkeycapをmountできるようにするNexus Sliderが評判よかったら考えないといけないかも。Matiasが直接MX keycap互換のスイッチ出して欲しさがある。

Topreスイッチはとても好きなんですが、自作のハードルは高い。Realforceバラシて使う修羅の道っぽいやつも最近はあるみたいですがそこまでつわものではないです https://github.com/tomsmalley/custom-topre-guide

レビューのやり方について

感覚的なことを書いています

数値的なことについてはInput Clubの人の完璧なグラフがあるのでそちらを見るといいですよ。テスタを触りながらグラフを眺めていると感覚とグラフがだんだんリンクできるようになる

plot.ly

Tactile

押した感触、押し下げていくなかで加重に山(peak)があるスイッチで、カチカチクリック音がしないやつのことを言う。

最近は静音系も増えてきたんですがあんまり興味がないので触ってない。もともとtactileはclickyとか軽いlinearと比べるとそんなにうるさくない…よね?

Cherry MX Brown(茶軸)

一番ポピュラーではないかという茶軸。軽いのは好きなんですがTactileが弱いのとTactileの山の始まりが遅いのがあり、今となってはそこまで好みではない

Cherry MX Clear

Tactile強い。スコスコしている。なめらかではない。重め。この重さがいける人ならかなりいいやつだと思います

KBDfans Aliaz 60g, 70g

Zealiosと同じGateronが製造しているkeyboard enthusiast向けスイッチ。Zealiosと同じ透明度の高いハウジングを採用していてきれい。静音スイッチで底打ちと天井打ち(とは言わない気がする。なんていうんだろ)の音を軽減するためにシリコンが入っていて実際静か

打った心地はちょっとmushy (キーボード用語であまり気持ちよくないゴム感のこと)なのと、Tactileが弱い感じ。個人的に特に厳しかったのが、Tactileイベントの一貫性がないことで1回の上下で5〜6回起きているような気持ちになる。押すときは、top housingとシリコンが離れるところ→本来のTactile→bottomとシリコンがつく→完全に押し下げたところ、みたいな感じ。離すときは、bottomとシリコンが離れるところ→本来のTactile→topとシリコンがつくところ→上がりきったところ、みたいな

Topreと似ているというコメントを見かけたけど個人的には似ていないです。こいつに限らずいろんなTactileスイッチがTopreと似ているっていう言葉を言われがちで誤解を招くのでTopreっぽいという表現は避けたい。オリジナリティのある良さを感じよう

Kailh Pro Purple

結構なめらかで悪くないかなっていうスイッチです。Tactileは弱い。見た目はZealiosと似ていますが特性はかなり違います

Kailh Box Brown

CherryのBrownより重め。TactileもCherryのBrownよりは強いけどあんまり強くない。なめらかさは良い。Box Switch特有の生のバネ感(表現が難しい)がある

Kailh Box Burnt Orange

色がRedにしか見えないBurnt Orangeさん。Box Brownを重くしたやつで重くしたことでバランスが良くなっているけど重い。

Kailh Speed Copper

押した瞬間からTactileの山が感じられるおもしろいスイッチ。Kailhの中では一番Tactileもあり、Speedスイッチというだけあってactuation pointが高いためかなりオリジナリティーのあるスイッチになっています。かなり好き。

欠点としてはバネが重くTactileが0mmから始まるので指が触れた瞬間から固く、突き指かよっていう。また指を離した際の跳ね上がりが強く、stemとtop housingと当たったときの衝撃 / 音がデカい。

ZealPC Zealios 65g

Cherry MX Clearを軽く、なめらかにしたスイッチ。Brownよりは少し重いかも。すごく良くて現在も愛用しているがもうちょっと軽くてもいいかなと思うのと、お値段がすごい。とても高い1個$0.75〜0.88くらいするのでキーボード一つ作るのにスイッチだけで五千円とか一万円とかが飛んでいく。

Clicky

会社や家族の前で使えないタイプのスイッチです。

Clickyに関しては比較的最近出てきたKailhのclick barがめっちゃいい

音が圧倒的に心地よいのとスイッチから離す(上にあげる)ときも音がするので連打がやりやすい

金属の安全ピンみたいなバネでstemに抵抗をかけるタイプで、これと比較して旧来のプラスチックどうしでクリック音出すやつはclick jacketなどと呼ばれるようになった

Cherry MX Blue(青軸)

Clickyで一番有名な青軸。音があまり心地よくないのとバネの重さの割にTactile Peakが割と固い(stiff)という特徴があります

テスタなどで2-4mmの押し込みらへんをずっと触っているとギシギシする

Cherry MX Green(緑軸)

バネが重くなった分、相対的にTactile Peakの固さが軽減されている(絶対的な荷重は増えてます)

Cherry MX White(白軸)

緑軸のクリックが穏やかになったやつ。レアキャラ

Gateron Blue

Cherryと比べてstiffさは軽減されている

普通に使ってると関係ないけど、ギシギシはひどくなっている

Kailh Speed Gold

Cherry MX Blueと比較してactuation pointはだいぶ高くなり、Tactile Peak軽いけどしっかりしていて、バネははっきり軽くなっていて、click jacket特有の音が嫌いでなければSnappyで楽しい。

Speed Switchは一応ゲーム用のはずなんですがそんなに連打しやすくないのでゲームには向かないような。JIS / ISO Enterをッターンとやりたい人に向いている。

Kailh Speed Bronze

ここからclick bar搭載スイッチになります

Bronzeはactuation point高め、バネ重め、Tactile小さめの正統派にゲーム用スイッチで高速入力ができそう

Copperと色も名前も似ているのでよく間違える

Kailh Box White

click barで一番王道っぽい製品。バネ軽め。Tactile小さめ(Bronzeよりは感じる)です

それでもすごくいい音鳴らすので普段使いするならこれがいいんじゃないでしょうか

Kailh Box Pale Blue

Box Whiteのバネを重くしたやつ。Bronzeのactuation pointが降りてきたような触り心地になる

Kailh Box Jade

Box Whiteのclick barを強くしたやつ。Tactileめっちゃ強い。ガチャガチャ入力できます

テスタしか触ってないのであれなんですがネットでは戻りが遅い場合があるという報告もちらほらある。バネが軽くてclickの抵抗が強いとそうなっちゃうかなという気はします

音はWhiteよりも大きく、意外にもclick barの中ではそこまでいい音ではない

Kailh Box Navy

バネもclick barも一番重いやつ。指の筋力が有り余ってる人向けです。めっちゃいい音がするが普段使いすると腱鞘炎まっしぐらな気がする。

フィジェットなおもちゃとかに使う場合はこれが一番楽しそう

余談

最近Clickyはclickが聞こえないとTactileがガクッと減るという衝撃の事実を発見してしまった。騒音がひどい場所で使ったりヘッドホンやイヤホンで音楽かけたりノイキャンを使いながら触るのであればTactileの方がいいかも。Clickyはあくまでそのクリック音を耳で楽しむためのものなんだと実感させられる

CDNに動的コンテンツを安全に通すにはどうするべきか

メルカリでCDNにキャッシュされるべきでないページがキャッシュされることにより個人情報の流出が発生してしまうインシデントがありました

自分は動的コンテンツをCDNで配信することにあまり積極的ではない立場だったのですが流出への反応を見るとCDNを利用しているサービスはかなり増えてきているようです

個人情報やユーザーのプライベートデータを決して流出しないようにしつつCDNを利用する方法を考えてみました

CDN利用のメリット

このふたつ

  • 経路が最適化されレイテンシが小さくなる
  • DDoS対策となる

キャッシュされないようにする方法

Twitterで動的コンテンツもCDN通すの当たり前でしょーと言ってる人にリプしてきいてみました

  • CDNとレスポンスヘッダで二重にキャッシュを無効化する
    • キャッシュを細かくコントロールCDNを使う
      • ホワイトリスト方式で特定のパスのみキャッシュを許可
      • ログインセッションを持っている場合にはキャッシュされないようにする
  • CDNを含めた環境でキャッシュ専用のテストケースを作成しテストが必要なすべてのactionについて不正にキャッシュ専用されていないことをチェックする
    • 当然actionの追加があった場合には必ずキャッシュのテストも追加する

なるほど、これくらいしっかりとした対策をたてれば安全に使えそうですね

CDNの選定

設定を細かくできないものはよくなさそうです

ヘッダでしかコントロールできない Google Cloud CDN はヘッダをミスすると即死です

また直感的でない振る舞いをするCDNも避けた方がよさそうです

Fastlyでは Cache-Control: no-store, no-cache がキャッシュ対象となってしまい事故のにおいがします

https://community.fastly.com/t/fastly-ttl/882

CDNを動的コンテンツに使うべきか

用途や傾向ごとに

使うべき

  • アクセスが世界中から来る
    • 日本にサーバーがあって日本からのアクセスが99%とかだと経路最適化効果は薄いでしょう
  • 漏れて困るデータがない
    • 失敗しても失うものはありません、ガンガンいけます
  • DDoSが来ておりそれがCDNで防げるものである
    • 最近はAWSにデフォルトで対策がされていたりして、それで防げているものもありそうです
    • 逆にCDNを導入してもダメなものもあるのではないでしょうか
    • 今攻撃が来ていてそれがCDNで防げるなら導入すればいいと思いますがCDN入れれば完璧というものではない
  • サービス全体について充分な管理が行き届いており CDNの設定についてもサービスとともに管理できる体制が整っている
    • 安全に運用するには適切なコストをかける必要がありそうです

使うべきでない

  • センシティブなデータがある
  • ユーザーとサーバー間のレイテンシが充分に短い
  • DDoSが来ていない
  • サービスが巨大で全体をコントロールすることがむずかしい
  • サービスが放置されがち
  • 安全にキャッシュされないようにしながら導入するコストが効果に見合わない

まとめ

最初は否定的だったのですが、しかるべき手間をかければ安全に運用できそうですね

5年後の担当者が地雷を踏むといった事にならないようにしつつやっていきましょう!

Net Radio ArchiveがDockerで動作するようになりました

対応しました。詳しくはREADME参照

主な経緯としてはこのソフトの依存が割と重めで、そこそこ新しいffmpegやrtmpdumpのHEAD、WebDriverなどを利用しており、特にWebDriverはrubyのライブラリ、GeckoDriver、Firefox本体のバージョンがちょうど動くところでそろっていないと動作しないという問題がありました。

ぶっちゃけ今までに使おうと試してくれたけどセットアップ複雑すぎて放り投げていたという方も多かったのではないでしょうか。

自分もうっかりapt-get upgradeすると動作しなくなるということにうんざりしており、またtrustyからxenialに移行したいと考えていたのでDockerでコンテナ化しておけば安心して移行できるわけです。

WebDriver対応ではSeleniumのDockerfileを参考にしてなんとかFirefoxのバージョンを固定することに成功しました。これで急に動作しなくなることはなくなるはずというわけです

今回のDocker対応ではMySQLは用意していません、マストドンなんかの例のようにdocker-composeでDBまで用意しちゃうという例も多いんですが個人的にはその辺は自分では使わないので、使いたい人は用意してくださいという感じですね。

LinuxだとホストにMySQL建てて127.0.0.1からログインできるようにしておいてネットワークをホストと共用にしておけばOKなんですが。 MacWindowsだと内部的にVMをはさんでいるためネットワークの共用 (docker run –network=host) ができないみたいです。

ググると頑張る方法が乗っていたりもしますがそういう場合はMySQLも別コンテナとして建てるのが楽そう

そんな感じです

github.com