2017-06-18: VPN 越しの Cisco WLC で WPA2 の SSID に associate できない時の罠

フレッツ光特有の話だと思うので日本語で書きます。

WLC において WPA2 などをかけた SSID に端末が association できず、WLC の syslog に下記のようなエラーが表示されて困る、という奴:

*Dot1x_NW_MsgTask_1: Jun 15 18:59:55.112: %DOT1X-3-PSK_CONFIG_ERR: 1x_ptsm.c:730 Client 08:de:ad:be:ef:00 may be using an incorrect PSK

tl;dr

これは下記の環境の場合、ESP パケット (IPsec の場合) の IPv6 DSCP 値の関係でフレッツ網に一部の CAPWAP パケットを落とされているのが原因であると見て良い気がします。

  • WLC がトンネルや VPN 越し
  • トンネルの経路にフレッツ IPv6 IPoE NGN が挟まっている

NGN に繋がっているインタフェースから送出される DSCP を全部 0x00 にセットしてしまいましょう。ひかり電話を使っているならもうちょい工夫は必要そう。

状況の詳細

実際の MacBook Pro ←→ Cisco Aironet との 802.1X 通信は下記のスクショの通り。Mac からの返答パケット Key (2 of 4) が届いておらず、Cisco から Key (1 of 4) が再送され続けていることがわかる。

実際の通信

VPN 対向ルータでキャプチャするとこうなる。

VPN対向ルータでのキャプチャ

一部の 802.11 フレームを含む CAPWAP パケットに DSCP 値が設定されていて、箱物ルータだと気を効かせて tunnel outer packet に DSCP 値が伝搬される事により、NGN の仕様に従い NTT 局側で drop されることでこうなっていると見られる。ちなみに何故か iPhone 7s は問題なく assoc ができた。

(手元側での CAPWAP パケットのキャプチャはあるけどもう残ってませんでした)

NGN の仕様

にある通り、

尚、各サービスにおいて許容されたプロトコルと転送優先度の組み合わせ以外のパケットに転送優先度を指定することは許容しません。

なので、DSCP 値をよく考えずに NGN 網に流すと黙って局側で drop される事が多いです。OpenSSH とかでも ssh_config, sshd_config で IPQoS オプションを指定しとかないとハマる、というのがありますね。

Published at 2017-06-18 23:36:38 +0900

2017-02-19: フレッツ光ネクスト (ひかり電話あり) 回線において、ひかり電話と自前の設備を IPoE IPv6 的な意味で仲良くさせる

tl;dr ひかり電話ルータ (HGW) のひかり電話だけを生かしながら DHCPv6-PD を自前設備で喋りたい場合、ひかり電話ルータ部の送受信するパケットのうち IPv6 パケットだけフィルタすれば良い。具体的には IPv4, PPPoE だけブリッジすれば良い。一切保証はしないけど…。

近年ではひかり電話はルータ・ONU機能と一体となったホームゲートウェイあるいは「ひかり電話ルータ」 (以下 HGW) から提供される。こちらとしては得体のしれない HGW は使用せず、直接フレッツ NGN 網と通信したい需要しかないので、どうにかする必要がある。

実際、HGW 内部で、ONU とルータ部自体は分離されており、ルータ部と ONU 部の接続を利用者側で奪う事ができる (小型 ONU 不採用 HGW の場合 UNI ポート)。なので、 ONU の接続されているフレッツ NGN に自前の設備を直接ぶら下げる運用は可能とされている。

が、この場合、ひかり電話を生かしたい時に若干面倒になる。HGW ルータ部は通常のルータ同様の挙動を取るため、L2 レベルで ONU の下、自前機器の真横に HGW ルータ部を接続した時に IPv6 について問題が発生する。

これはフレッツ光ネクストにおいて提供されている所謂 IPoE 方式の IPv6 接続性について、ひかり電話契約の有無によって挙動が異なるため。

ひかり電話契約が無い場合は NGN から Router Advertisement (prefix /64) が送出されて SLAAC で IPv6 アドレスを確定、フレッツ側ルータと端末毎に直接通信する形となる。日本の各種家庭用ルータに「IPv6 パススルー」機能がついているのはこのため。このオプションを使用すると L2 レベルで v6 パケットのみ上流 (WAN ポート) とブリッジ (あるいは NDP proxy?) され、無事 NGN 側のルータと直接通信する事ができるようになる。

一方、ひかり電話契約が有る場合、NGN からは Router Advertisement が降ってくるものの m-flag がついていて、DHCPv6-PD の利用が必要になる。現時点で /56 の prefix 委譲がなされ、DHCPv6-PD クライアントはルータとみなされ、委譲された prefix への経路はそのルータに向くようになる。そのため、自前の設備を利用したい場合、だいたいの場合はひかり電話契約を付けて /56 の prefix 委譲を受けたほうが圧倒的に便利。電話として使わなくてもひかり電話には絶対加入しましょう。

しかし今回の回線は諸処の事情により "ひかり電話" も電話としてちゃんと運用する必要があったので、ひかり電話を生かしながら DHCPv6-PD を自前の機器で受ける必要が出てきた。

前述のように HGW ルータ部は通常のルータと同様の挙動を取る。つまり、DHCPv6-PD クライアントとして機能してしまう -- ONU から L2 レベルで直下にいるルータが DHCPv6-PD を喋って prefix 委譲を受けても、HGW ルータ部の気分次第で HGW ルータ部に prefix 委譲が移動して、取り合いが発生してしまう。DHCPv6-PD クライアント機能は無効化できそうになくて不便。

というわけで、IPoE 方式で DHCPv6-PD を自前機器から喋りながら、ひかり電話を利用するための方法を探した。

前提

  • フレッツ光ネクスト ファミリー・ギガラインタイプ (栃木県宇都宮市)
    • 2017/01 オーダ、02/15 開通
  • ひかり電話ルータ PR-400MI
    • 小型ONU。
    • 直近の契約だと黙っていると小型 ONU 採用タイプが来るので、明示的に小型ONU不使用タイプの払出しを希望した

(小型 ONU 採用タイプでは NGN と直接通信するためには SFP 対応スイッチ・ルータが必要になる。さらに auto negotiation 対応が必須の模様で、安い SFP 対応スイッチは対応してない事もあるみたいなので消耗の対象です。)

調査

雑に HGW ルータ部のパケットを覗いて確認すると、

  • ひかり電話自体の通信は IPv4 のみ
  • NGN にいる設備と DHCPv4 で通信している
  • IPv4 で SIP の通信が発生している
  • PPPoE は確認できなかったけど発生する事もある模様? [要出典]

という状態だった。

実装

IPv6 パケットだけフィルタしてみる。NGN と DHCPv4 通信が必要っぽいので一旦 NGN 直下に収容。DHCP relay でもうまく動くのかもと今は思うけど、試してない。

  • HGW の ONU 部 UNI ポートと、ルータ側 UTP ケーブルを取り外す。UNI ポートには自前のスイッチを接続し、ルータ側の UTP ケーブルは RJ-45 中継アダプタを通して別のスイッチあるいは VLAN へ接続する。
  • ONU 部とルータ部を L2 ブリッジして IPv6 のパケットだけフィルタする。
    • 当初は ebtables でも使うかと思っていたけど、通信速度いらないし IX2015 で十分だと気付いたので、HGW 収容・NGN 収容の 2 VLAN を用意して IX2015 でブリッジ設定をした。
bridge irb enable
no bridge 1 bridge ipv6

! Fa0/0 untagged (NGN)
interface FastEthernet0/0.0
  no ip address
  bridge-group 1
  no shutdown
! Fa0/1 tagged dot1q id=3 (HGW)
interface FastEthernet0/1.3
  encapsulation dot1q 3 tpid 8100
  auto-connect
  no ip address
  bridge-group 1
  no shutdown

結果

ひかり電話は上手く動いた。ファームウェア自動取得とかは死んでるのでそこは諦める方向で。

ついでに HGW ルータ側についている LAN スイッチから自前設備への接続を増やしておくとリモートからメンテできたり SIP 接続できて便利だよ。

再起動時、DHCPv6-PD をある程度の時間待つらしく、起動までの時間がやたらかかる様になってしまったのと、起動後も DHCPv6-PD をすごい頑張っていて可哀想な HGW ルータ部を眺める事ができます。

繰り返すけど一切保証しません。ある日とつぜん動かなくなったら困るなあ、とおもいながら設定しました。

その他

Published at 2017-02-19 06:36:16 +0900

2016-10-14: systemd-nspawn で portage の binary package (binpkg) ビルドをいい感じにする

この記事は KMC アドベントカレンダー 2016 の 12 日目です。前日は spi8823 の「Unityでパーティクルをドット絵風にするShader」 でした。
… 2 日遅れです。完全に登録してた事わすれとった。すいませんでした。休暇でシドニー放浪してました。

みなさんは Portage もとい Gentoo 使ってますか? 選択肢がたくさんあり、最新のパッケージがわりとすぐ降ってきて、その上何か足りないものがあっても ebuild 書いて転がしとくだけで気楽にインストールできるの便利ですよね。

わたしはサーバーで Gentoo を使うようになってからかれこれ 4〜5 年ほど経過しています。ただ、まあ、問題となるのは emerge にかかる時間と CPU リソースですよね。VPS の上での emerge -uDNav @world は割と億劫だしつらいものになる。

今年の初めくらいからゆっくりとご家庭インフラの式年遷宮を進めるなかで、運用を見直してちゃんとうどん回せるようにしよう、と Binary package 導入をしてみたのでそのはなしです。

binary package

Portage には binary package 機能 が存在します (以後 binpkg)。Gentoo Wiki にある通り、複数のシステムがあるなかで何度もビルドするのは無駄・ハードウェアのスペックの問題でビルドが困難、といった状況をサポートするためにあります。便利ですね。これを使わない手はない。

そして実際 AWS t2.micro インスタンスで手元の base cookbook を完走させるには swap が数 GB 必要…。さらに 2 時間くらいかかる。なので、何かテストするためにインスタンス立ち上げてセットアップしてもやってられるかって感じである (AMI を作れという話はあるけれど)。つらい。

(余談だけれど、 https://github.com/sorah/gentoo-build というのがあって、systemd based Gentoo box を作るためのシェルスクリプト集と、AMI 作成用の packer script があってめちゃくちゃ便利です。)

binpkg の作り方

いくつかあります: quickpkg コマンド、emerge --buildpkg オプション、または FEATURES=buildpkg

quickpkg はシステム上にインストールされたファイルをパッケージにしてくれます。この方法だと config を含めようともクリーンでない場合があるのでオススメできないとのこと (使ったことないから分からん)。

emergeFEATURES あるいは --buildpkg で渡した場合、ビルドディレクトリからパッケージ生成をするのである程度クリーンになります。

作例

これだけ。

sudo emerge --buildpkg dev-libs/boost

すると、 /usr/portage/packages/dev-libs/boost-1.56.0-r1.tbz2 とかが生成されます。メタデータである /usr/portage/packages/Packages には、

BUILD_TIME: 1480786879
CPV: dev-libs/boost-1.56.0-r1
DEFINED_PHASES: compile configure install preinst prepare setup test
DEPEND: virtual/libiconv[abi_x86_64(-)] app-arch/bzip2[abi_x86_64(-)] sys-libs/zlib[abi_x86_64(-)] !app-admin/eselect-boost =dev-util/boost-build-1.56*
EAPI: 5
IUSE: context debug doc icu +nls mpi python static-libs +threads tools python_targets_python2_7 python_targets_python3_4 abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64
KEYWORDS: alpha amd64 arm ~arm64 hppa ia64 ~mips ppc ppc64 ~s390 ~sh sparc x86 ~ppc-aix ~amd64-fbsd ~x86-fbsd ~amd64-linux ~x86-linux ~ppc-macos ~x64-macos ~x86-macos ~sparc-solaris ~sparc64-solaris ~x86-solaris ~x86-winnt
LICENSE: Boost-1.0
MD5: b3720e94e07a32c7c076cec4c1c0207c
PROVIDES: x86_64: libboost_atomic.so.1.56.0 libboost_chrono.so.1.56.0 libboost_container.so.1.56.0 libboost_date_time.so.1.56.0 libboost_filesystem.so.1.56.0 libboost_graph.so.1.56.0 libboost_iostreams.so.1.56.0 libboost_locale.so.1.56.0 libboost_log.so.1.56.0 libboost_log_setup.so.1.56.0 libboost_math_c99.so.1.56.0 libboost_math_c99f.so.1.56.0 libboost_math_c99l.so.1.56.0 libboost_math_tr1.so.1.56.0 libboost_math_tr1f.so.1.56.0 libboost_math_tr1l.so.1.56.0 libboost_prg_exec_monitor.so.1.56.0 libboost_program_options.so.1.56.0 libboost_random.so.1.56.0 libboost_regex.so.1.56.0 libboost_serialization.so.1.56.0 libboost_signals.so.1.56.0 libboost_system.so.1.56.0 libboost_thread.so.1.56.0 libboost_timer.so.1.56.0 libboost_unit_test_framework.so.1.56.0 libboost_wave.so.1.56.0 libboost_wserialization.so.1.56.0
RDEPEND: virtual/libiconv[abi_x86_64(-)] app-arch/bzip2[abi_x86_64(-)] sys-libs/zlib[abi_x86_64(-)] !app-admin/eselect-boost
REQUIRES: x86_64: ld-linux-x86-64.so.2 libbz2.so.1 libc.so.6 libgcc_s.so.1 libm.so.6 libpthread.so.0 librt.so.1 libstdc++.so.6 libz.so.1
RESTRICT: test
SHA1: bebdceba8188c82399a7d655d97315c79a2a0454
SIZE: 9514605
SLOT: 0/1.56.0
USE: abi_x86_64 amd64 elibc_glibc kernel_linux nls python_targets_python2_7 python_targets_python3_4 threads userland_GNU
MTIME: 1480786898
REPO: gentoo

のように記録される。

あとは /usr/portage/packages を http(s) で見えるところに置いて make.conf の PORTAGE_BINHOST に書いて FEATURES=getbinpkg を指定すれば、emerge 時に Packages ファイルをとりにいって binpkg が利用可能であればそれを利用するようになる。

These are the packages that would be merged, in order:

Calculating dependencies... done!
[binary  N     ] dev-libs/boost-1.56.0-r1:0/1.56.0::gentoo  USE="nls threads -context -debug -doc -icu -mpi -python -static-libs -tools" ABI_X86="(64) -32 (-x32)" PYTHON_TARGETS="python2_7 python3_4" 0 KiB

ちなみにわたしは S3 に置いてます。

binpkg の落とし穴

ビルド時の依存や USE フラグが異なると利用されません。

たとえば、 icu USE flag がオンになっていない binpkg がある状態で、USE=icu emerge -av dev-libs/boost とかするとこうなる。

Calculating dependencies... done!
[ebuild  N     ] dev-libs/icu-58.1-r1:0/58.1::gentoo  USE="-debug -doc -examples -static-libs" ABI_X86="(64) -32 (-x32)" 0 KiB
[ebuild  N     ] dev-libs/boost-1.56.0-r1:0/1.56.0::gentoo  USE="icu nls threads -context -debug -doc -mpi -python -static-libs -tools" ABI_X86="(64) -32 (-x32)" PYTHON_TARGETS="python2_7 python3_4" 0 KiB

Total: 2 packages (2 new), Size of downloads: 0 KiB

!!! The following binary packages have been ignored due to non matching USE:

    =dev-libs/boost-1.56.0-r1 -icu

NOTE: The --binpkg-respect-use=n option will prevent emerge
      from ignoring these binary packages if possible.
      Using --binpkg-respect-use=y will silence this warning.

--binpkg-respect-use=n--binpkg-changed-deps=n を指定すれば存在する binpkg を常に利用しようとするけれど、USEフラグは反映されることはない。依存はABI差で苦しんだり可能性があるってくらいかな。オススメはしない。

なお、複数の USE フラグのコンビネーションが想定される場合は FEATURES=binpkg-multi-instance を有効にすると良い。 (make.conf(5) を参照)
最新 1 binpkg だけでなく、同じバージョンに対するビルドが複数保持されるようになります。そのかわりクリーニングは自分でやらなくちゃいけない、という感じ。

binpkg を便利に運用する

binpkg はうまく運用すれば便利ですが、実際の運用はどうするのが良いでしょう? というのがこのポストの本題です。

需要

  1. emerge -uDNav @world をばしばし実行したいので binpkg 最新のがいろいろ常にあってほしい
  2. 依存が変わった・更新されたら binpkg 更新されてほしい

前者に関しては binpkg 実行するホスト用意して定期的に叩けば良い。
後者が問題で、そもそもサーバーやマシンによっては不要なパッケージハあるし、システムにインストールするのは微妙。 --buildpkgonly でも結局 build dependencies は必要になってしまうのでこれもだめ。

そこで systemd-nspawn を使う

systemd-nspawn とは

systemd-nspawn は systemd が提供している、Linux の namespace を活用したコンテナを実行するためのツールです。シンプルでたいへん便利。init プロセスを実行させ、さらに個別の IP を持たせて実際の仮想マシンの用に使えるコンテナを作る事もできれば、単純に chroot では実現できないので namespace を使ってコマンドを実行したい、といういろんな需要に対応できます。

ArchWiki の systemd-nspawn 記事も参考にすると分かりやすいと思う。

これをいい感じに使うと binpkg 運用に便利ができそうです。自力で chroot するより楽なのもあるし。

やってみる (emerge -uDNv world)

./base に stage3 を展開した物、 ./etc-portage/etc/portage 相当の物がある事が前提にしています (/etc/portage と読み替えても良いが、コピーを推奨。理由は後述)

まずは emerge -uDNav @world の場合。

sudo systemd-nspawn \
  --register=no \
  --bind=/usr/portage:/usr/portage \
  --bind-ro=$(pwd)/etc-portage:/etc/portage \
  --directory=./base \
  emerge --buildpkg -uDNv @world

--bind, --bind-ro は Docker でいう -v で、ホストシステムのディレクトリをコンテナ内でマウントできる。
/usr/portage はバイナリパッケージが置かれるのと、そもそも repo もホストシステムのを使えば良いので書き込み可能で --bind している。 /etc/portage は書き込み不要なので --bind-ro 、という具合。

これで ./base の上にある Gentoo システムを更新しつつ binpkg のビルドもされます。まずはこれを定期実行する事で上記需要の (1) は達成できます。既存のシステムと隔離されていることから、cron (あるいは systemd.timer) で実行する事もできるはず。

やってみる (個別にインストール)

./etc-portage/make.conf に適切な PORTAGE_BINHOSTFEATURES=getbinpkg などを設定した上で、単純に下記のように実行すれば OK。

sudo systemd-nspawn \
  --register=no \
  --bind=/usr/portage:/usr/portage \
  --bind-ro=$(pwd)/etc-portage:/etc/portage \
  --directory=./base \
  --ephemeral \
  emerge --buildpkg -v dev-libs/boost

--directory に実際にファイルの変更を反映させない状態でコンテナを起動できる --ephemeral を指定するのが良いです。これでまずビルド用の rootfs は綺麗に保たれます (なお ./base の親ディレクトリは btrfs である必要があります)。

また、ビルド環境の make.confFEATURES=getbinpkg を指定しておく事で、既にある binpkg が利用可能であればそれが利用されるし、なければ更新が走るという挙動になります (依存含めて)。これで (2) もおおむね達成できる。

ビルド環境の /etc/portage の管理

正直ここはまだ固まっていません。少なくとも、

  • USE フラグ (package.use) は依存含めて揃えておく必要がある
  • package.mask, package.unmask, package.accept_keywords も揃えておいた方が良い、あるいはインストール時に個別に指定しておく

というのが必要です。

つまり、想定しうる全部の package.use 等に書かれる指定をビルド環境の /etc/portage には含めておく必要がある。
全システムで一緒ならそれを使い回せばいいですが、実際場合によって USE フラグが異なる事もしばしばあるでしょう。たとえば net-analyzer/zabbix では agent, server, proxy といった具合に、役割毎に必要となるフラグが違います。

わたしは /etc/portage 以下の変更を itamae と sorah/itamae-plugin-resource-portage で書き換えています。itamae レシピを解析をするのはややしんどそうなので、今のところは全サーバーから package.use などを集めてきて手で整理してます。

(
  for x in rin udzuki mio; do
    ssh -T "${x}" 'sh -c "cat /etc/portage/package.use/*"'
  done
) | sort --key 1 | uniq > /tmp/package.use
vim /tmp/package.use
cp /tmp/package.use ./etc-portage/package.use/hoge

なお先に例に上げた net-analyzer/zabbix を USE=server としているサーバーはまだ式年遷宮されてない…。やるとしたら --ephemeral で実行しつつ emerge 実行前に設定を変更するしかない。

こういうケースを含め、自動実行を踏まえて通知がいい感じに欲しいとか、いろいろ欲求がでてきているので、なんか便利なラッパーツールでも書くかぁ、という気持ちになっています。

まとめ

わたしの運用は現状こんな感じになってます。みなさんも Gentoo でたのしくインフラ運用しましょう。

ツールたぶんそのうち作ります (いや、リポジトリはもうあるんだけどまだいい感じになってません)。

UPDATE (Feb 27, 2017): つくった sorah/binpkgbot

なお、このアドベントカレンダーの翌日担当は walkure の「ゼネコン辞めた話」 だそうです。

Published at 2016-10-14 23:59:59 +0900

2016-04-10: Windows Server 2012 R2 と strongSwan + Quagga で IPsec の Site-to-Site VPN 接続を張る

Remote Access 情報無さすぎてウケる。

さくらの VPS for Windows Server がどうやら無印な VPS とローカルネットワークが別物っぽくて、VPN 張らないと連携が取れないので必要に迫られた (バックエンドが Hyper-V ベースだったりするらしいからその関係なんだろうなあ)。

既に quagga の ospfd と strongSwan と VTI でいくつかのネットワークを結んでるので、まあそこにいい感じに乗っける。ハマりどころとしてはとにかくドキュメントが足りていない RRAS と仲良くすることと、RRAS が投げる IKEv2 Proposal の内容を把握すること。

実験は Windows Server 2012 R2 を AWS の t2.micro インスタンスでたててやりました。接続先はさくらの VPS。

... Continue Reading...
Published at 2016-04-10 08:43:20 +0900

2015-11-02: ISUCON5 で準優勝してきた #isucon

予選に引き続き、チーム白金動物園として rosylilly, mirakuiISUCON 5 の決勝に参加した。

なんと 2 位を獲得した。やったぜ! いや fujiwara 組に負けたのは悔しいけど。

分担は予選とあんま変わってなくて、mirakui がインフラ・分析、rosylilly が実装 (あと博打)、わたしが実装とインフラを良い感じにやっていた。

やったこと

... Continue Reading...
Published at 2015-11-02 08:25:00 +0900

2015-09-28: ISUCON5 予選に参加した (白金動物園) #isucon

A photo posted by Shota Fukumori (@sora_h) on

ISUCON 5 予選に白金動物園として @mirakui, @rosylilly と参加してきました。結果は 15666 点で両日通したランキングの内 top 4 を除いて 5 位 で本戦にはなんとか出場できそうって所。

問題

高負荷に耐えられるSNSコミュニティサイトへようこそ!

まあそのうち公式で解説・講評あがってくると思うから詳しくは書かないけど、ISUxi という SNS Web アプリで、予選にしてはそこそこ MySQL のテーブル数が多くて複雑なもの。 (users, salts, profiles, entries, comments, footprints, relations)

ログイン・ログアウト・プロフィールページ・友達・日記 (友達限定公開あり) の個別ページ、ユーザー日記リスト・足あと、諸々の情報を全部見れる便利なトップページ、などなど。

個人的に問題を読んだ限り倒すべき鍵となりそうなポイントは is_friend?get_user あたり。初期実装ではどちらも愚直に SQL を叩いていて、どちらも N+1 問題らしい感じになっていた。

特にトップページがそれにより重いコードになってて、とりあえずそのへんを潰す事に集中してた。

なおチームの暗黙的了解としていざ仕事で書くとさすがにそれはみたいな感じの奴は避ける、ってのがあった気がする。具体的には過剰なオンメモリとかね。ただアプリケーション仕様を考えて妥当だな、という類のキャッシュはアリ。

やったこと

... Continue Reading...
Published at 2015-09-28 08:15:00 +0900

2015-07-06: #kosendj #kosenvj を支える技術 (バックエンド編)

2015-06-27 16.42.40

#kosenvj を支える技術(フロント編) のバックエンド編です。 高専DJ部 (kosendj-bu) 御用達の「GJ」とよばれる VJ もどきシステムのバックエンドについて説明したい。

GJ? VJ?

詳細は ↑ の @neo6120 が書いたエントリを見てほしいのだけど、簡単に言うとインターネットにありふれた gif を適当につかって VJ をしようみたいな試み。 ↓ の動画をみるとなんとなくわかるかも。

やばいかんじある #kosendj

A video posted by yuya fujiwara (@asonas) on

現場の様子です #kosendj

A video posted by yuya fujiwara (@asonas) on

... Continue Reading...
Published at 2015-07-06 08:11:29 +0900

2015-05-11: GW を利用して家のネットワークを再構築した

GW を利用して家のネットワークを再構築した。

再構築前

  • VDSL modem
    • WG1800HP (PPPoE client, Wi-Fi AP, router)
      • (機器いくつか)
      • Netgear GS108
        • Thinkpad X60 (OpenVPN client, DHCP, DNS)
        • (機器いくつか)

クライアントが利用するサブネットとサーバー類が利用かつ VPN 越しにアクセスできるサブネットが同居していて、クライアント類はルーティングの都合上 VPN 接続先に出ていくときは NAPT されるみたいな構成になってた。同居してるのが一番気持ちわるかった…。あとは WG1800HP の IPv6 パススルーを有効化して上流からの ICMPv6 RA などを通してるんだけど、外部からの接続拒否がなかったりしてちょっと不安だな〜という状態にもなっていた。

それと IPv6 のために FiberAccess/NF 契約しつつ固定 IPv4 のために Livedoor プロバイダを契約してたので、クライアントとサーバーで出ていく IP も変えたりとかそういう遊びもしたいなあとか。

これをなんとかした。

再構築後

A photo posted by Shota Fukumori (@sora_h) on

  • VDSL modem
    • IX2015 (PPPoE client, router)
      • GS108Tv2
        • Thinkpad X60 (OpenVPN client, router, zabbix-proxy, DHCP, DNS)
        • (vlan 300)
          • WG1800HP (Wi-Fi AP, switch)
            • (機器いくつか)
        • (vlan 100)
          • GS108
            • (サーバー類いくつか)

IX2015 はちょっと前に買って転がっていたの、GS108Tv2 は wishlist で送られてきたのを…。ギガビットルータが良いけど結局上流は 100Mbps だし。家庭内のルーティングはまあ 500Mbps くらいになってしまうけど Thinkpad X60 にやらせている。インターネットへのパケットは X60 を通るけど、インターネットからのパケットは直接 IX2015 から流れていく。IX2015 は家庭内のセグメントのルーティングはさせないである。 (細かいアクセス制御を iptables でさせてるので設定の分散を防ぐため)

あと Livedoor プロバイダがサービス終了するらしいので So-net 固定 IP プランに入れ替えた。契約したはいいものの下りが遅くて困る…

IX2015 の設定はこんな感じ。 https://gist.github.com/sorah/c8f335169742472585f4 v6 は PPPoE とか通さなくて流れてくるので適当に VLAN な if に bridge しつつ bridge ipv6 filter で VLAN によっては外部接続拒否してる。

監視

IX2015 と GS108Tv2 は SNMP で監視できるので監視している (zabbix)。SNMP 難しいからようわからんなあと思いつつ network interfaces の監視とメトリック収集は有効にした。

その他

  • いろんな VLAN に顔を出している X60 は IPv6 autoconf 自分との衝突を検知して dadfailed になってしまうのがつらいので固定割り当てにした
    • これどうしようもないですか、というか netifrc で autoconf を無効化できればいいんだけど…。
  • 802.11q 解釈できる Wi-Fi AP が欲しい
  • これの他にもう一個 802.11q 解釈できるスイッチが眠っているけど、イベントとかでちょっと使う気がするので今回は組込まなかった。
  • ケーブリング上手になりたい…
  • OS X で 802.11q 使うのは Network.prefpane の Manage virtual interfaces から
    • 無効化は同じメニューの Make service inactive でできるので IP アドレスの設定とか保持したまま無効化したいときとかはそれで。
    • X11 要らなくなった Wireshark (OS X) 最高です
Published at 2015-05-11 04:23:25 +0900

2015-05-10: ごかつとおか 連休最終日: GW まとめ, gentoo-build

連休最終日… 起きたら 21 時だったよ…

今年の GW はいろいろやろうと思ったけど達成したのはネットワーク再構築と gentoo-build くらいでした。うーん Docker 環境 (Kubernetes 環境) の整理とかもしようと思ったんだけどなあ…。

あとはまあちょっと外に出たり同人誌即売会行ったりとかってのもあったりしたから、こんなもんなのかも。

gentoo-build

https://github.com/sorah/gentoo-build

設定された内容に沿って stage3 展開して最低限のパッケージ、カーネルビルド、grub2-install をしてくれるシェルスクリプト郡を作った。

packer に無駄に対応した結果当初の目的を忘れたけど AWS AMI や Vagrant box (virtualbox) ができたので良しとした。検証しやすくなったかなあ…

もともと自分でセットアップ用のめちゃくちゃ長いシェルスクリプト (秘伝のタレ) があったので、それを整理して systemd や packer, cloud-init, vagrant に対応させつつみたいな感じでつくった。今後の gentoo 環境セットアップでは自分はこれを使うつもり。

おまけ: Packer の amazon-ebs で 0 から AMI を作成する

Packer の amazon-* 系 builder は空っぽのファイルシステムからの構築に対応してない。

というわけでいろいろと考えた結果、適当な source_ami を作業用として起動、cloud-config を user_data に突っ込んでおく。cloud-config 内 bootcfg により /sbin/init 起動前に rootfs を tmpfs にコピー・switch_root ・ root EBS をアンマウントした後に /sbin/init を起動する、というのを仕込んで一度インスタンスを再起動させる。あとは 2 回目に起動してきたインスタンスは root EBS をマウントしていないので、その状態で /dev/xvda とかに対して mkfs とかいろいろやってやれば良い、という事に気付いたのでそんな感じでやっています。

詳細: Building AMI from scratch using packer amazon-ebs builder - blog.sorah

Published at 2015-05-10 23:59:59 +0900

2015-04-15: ドキュメントの件

http://yoshiori.hatenablog.com/entry/2015/04/14/171326

実際にちゃんと日程決めて 1 日なるべくドキュメンテーションする日にしようという事にしてやりました。
ターゲットは主に社内の各種サービス。内部 API とかライブラリとか、そういう類の。

「今日はみんなこれをやる」と決めると、やるかー、っていう気分になるじゃん。いろいろやらなきゃいけないタスクはあるけど、それは置いておいて みんなで やるという空気にするとわたしはやるかーってなる。一人でやるぞーってなるより、やるかー! ってなるんだよな。

どこをとりあえず見ればいいか分かりにくい、ドキュメントのある場所がまちまち、そもそもドキュメントがない! という状態を改善していく。具体的には

  • 置き場所がバラバラ
    • 基本的に、概要や運用寄りの情報は社内 Wiki に統一。みんなだいたい、まずここを検索するような習慣があるから
    • Pull Request して実装の変更とともにレビューできたほうがよい、API リファレンスとかは Git リポジトリに突っ込んで管理。GitHub Enterprise の web view を通して読む (Markdown)
  • どこを見ればいいのか分かりにくい
    • Wiki ページ先頭を見て概要と、Getting Started / Tutorial 的ページへのリンクを置いておく
      • Getting Started ページにもだらだらと書かない、細かい tips はリンクなどに留めて別のところに置いていてスッキリさせる
    • 加えてページを分割する、1 ページにだらだらと書かない
    • Tutorial も体裁を整えて見やすく
  • そもそもドキュメントがない
    • 概要しかない…
    • outdated がすぎる…
    • というわけで書く。

…とはいうもののまだ完璧になっている訳じゃないのでこれからも精進が必要だしわたしも自分の管轄するところで書かれていないドキュメントを書かなきゃならない…。

しかし社内ブログに載せられたやつも自分の口頭での発言がテキストに起こされていた…ってやつなんだけど、これはさすがに美化されすぎなきがする。こんな綺麗な口調で言った覚えはない…ないぞ…

あとはドキュメントを書く習慣を付ける、第三者から見てわかりやすいドキュメントを書くみたいなのはいまだに下手だなぁと思ってるので、なんか良い文献や方法などあったらおしえてくださいませ。

Published at 2015-04-15 01:49:12 +0900

2015-04-12: しがつじゅうににち: draft-ietf-httpbis-http2-17 ある程度読んだ, PERSONA3 THE MOVIE #3 みた

draft-ietf-httpbis-http2-17

メモとりながらある程度読み終えた。 https://github.com/sorah/h2/blob/master/note.ja.md

これで仕様をよく把握してないのに波に乗ってる奴を殴りに行ける。

http-2 gem (igrigorik 氏による pure ruby 実装) があるけど理解のために実装までしようと思っている。HPACK が面倒くさいかなあくらいの気持ち。

RFC およびそれ相当の文章を全編通してちゃんと読むのちゃんとやった事なかったけど、こんな冗長なものなんだろうか。まだ draft だからこれから RFC editor とやらが頑張るんだろうか。Frame Type WINDOW_UPDATE の解説でまた Flow Control の解説しはじめなくてもいいし、ここでいきなり新情報でてくるし、ちゃんと Flow Control の節でやってほしいなあなどと思いながら読んでいたのだった。

PERSONA3 THE MOVIE #3 Falling Down

それとなく感想を述べると「エヴァかな?」って思いました。

P3 未プレイなので新鮮な気持ちで見ています。ところで P5 いつでるんだろう。

あとはトレイラーで亡国のアキトが流れてたけど、5 月のつぎ 7 月にまたやるっぽくて、急にスパンが 1 年から 2 ヶ月くらいになって「まじか」という感想を持った。1 年に 1 回やる映画という認識だったのに…。

(前回: #2 Midsummer Knight's Dream 日記 2014/06/21)

Published at 2015-04-12 23:59:59 +0900

2015-03-10: さんがつとおか: 365 days streak, c4.8xlarge on CentOS 6, マンガボックスなにこれ?

365 days streak

わりと 2014 年は平日に (自分名義の自分のプロダクトだけど) github.com へコードを push していたので気付けば 365 days streak になっていた。

EC2: c4.8xlarge を CentOS 6 で 36 vCPU で起動する

c4.8xlarge は vCPU が 36 個ある。これが古いカーネルだと Xen の PVHVM 対応のバグで、panic なり soft lockup なりして起動しない。

workaround として出た当初というか今もドキュメントには cmdline に maxcpus=32 つけて起動するように EC2 のドキュメントに書いてあるんだけど、4 vCPU が余るよねーという問題があった。

最近リリースされた kernel-2.6.32-504.8.1.el6.centos.plus.x86_64 ではその問題の修正パッチがバックポートされているので上げると 36 vCPUs で起動できる。centos.plus がついているパッケージをいれるのが重要 (--enablerepo=centosplus)。最初 2.6.32.-504.8.1.el6 普通に入れて「あれー?」ってなっていた。

しかし別に c4.8xlarge をフルで活用できるわけじゃないし、パフォーマンス目指すのであれば可能なら Ubuntu なり新しいカーネルを持ったやつのほうがいいと思う。2.6.32 もうつらいよー。

マンガボックス

"境界のないセカイ" という作品が気になって、これがここで連載してるので使ってみたんだけどあまりにも酷すぎてビックリした。

  • Web 版で作品紹介リンク押すとなぜかトップページに飛ぶんですが…………なんなの…
  • Web 版で各話リスト https://www.mangabox.me/reader/231/episodes/ が見れるのはなぜか Android の UA のみ
  • アプリに誘導するからアプリ DL したけど、そもそも読んでいた作品をどこから読んでいいかまったくわからない
    • どうやら初回起動時は検索 UI や設定画面へのリンクが無い?
    • どれか作品をよまなければいけない。しかし自分が読んでいた作品はその最初のリストに出てこないんだよな。全く何をすれば読めるのか分からなかった。
  • Android 版は各話リストがなんかおかしい。配信されている話が全部でてこない
    • Web 版で各話リスト見れるのはそれが理由なんだろうか…
  • アプリ DL リンク周辺に別にアプリへ飛ぶリンクがあるわけではない。ダウンロードボタンを再度タップすると普通にアプリ内のトップ画面に飛ぶ
    • 最初に何か作品を読まないかぎり通常の検索 UI や通常の配信作品リストが見れるビューにいつまでも飛べないので、本当にただ作品が読みたいだけなのに読めなくてうんざりする
    • Android からみると Web で他の配信話見れたけど、iOS だとこれどうしようもないのでは。
  • Web 版も Android 版も iOS 版もページめくりまわりの処理がつらい
    • まぁこれは目をつむれるレベル。他が酷すぎる

そして作品の紹介がしたいのに作品紹介ページみたいな安定したリンク先がないんだよ! なんてこった…

とにかくただ気になった作品をよむためだけなのにプラットフォームのゴミさ加減にうんざりしてしまった。残念なプラットフォームでしか配信されてない良いなぁと思っている作品、本当につらい。作品も作者も何もわるくなくて、プラットフォームが悪。

Published at 2015-03-10 23:59:59 +0900