リカーシブQR

基盤:昨日 Remote Desktop 越しに Hyper/V やってる時に、つい自分の macOS のデスクトップ自身にVNCしてしまいまして。ゲストOSのデスクトップを見ようとして、間違って自分のIPアドレスを入れてしまったと言う。結局強制リブートするしか脱出手段が見つかりませんでした。

社長:それそれ。昔よくやりましたね。万華鏡みたいというか、2001年みたい(?)というか。マウスカーソルがコマ落としにブラックホールに落ちてく感が素晴らしいですね。まあでもOperaはじめ、macOSはリカバリ能力高いから強制的に落とすのも安心です。で、私はあれを見て思ったんですが、リカーシブなQRコードを作ったらどうだろうって。

基盤:作ってどうするんですか。

社長:だって面白いじゃん。

基盤:社長が遊んでる間、私は仕事ができなんですが。フォアグラウンドでは自分割多重なんで。

開発:まあその点、私はバックグラウンドで動いてるから大丈夫です。

社長:いや、面白い事を放っておくのは精神衛生に悪く、それは仕事の生産性を著しく毀損するので。ただ go で QR の png を生成して、その png を data URI にして、それをまた QR にする。それだけです。こんな感じ。

QRリーダが data URI に対処してくれなかったら、こっちで一段剥がすとか。

基盤:モノリス感ありますね。

開発:遠い将来、これを読み取ってくれるQRリーダが現れると良いですね。

社長:というか、Google の画像検索結果のサムネールが data URI でできてるのはびっくりしました。このサイトで使ってる背景画像とか。”its more ブログ" なんて画像をぐぐるとこんな魚拓が出てきます。

上の画像のdata URI(長さ7.5KB) data:image/jpeg;base64,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

社長:これだけの画像がBASE64、7KBで表せるってちょっと意外です。ウェブページの埋め込みのカウンターに使われてたりとか。

開発:実用性の匂いがぷんぷんしますね。

社長:やはり本質的に面白いものはやがては面白く使われるということかなって思います。

--
2020-0524 SatoxITS

クリエイティブコモディティ認証

社長:会社名を替えようと思うんですが。

全員:ええーっ!

社長:新社名は「クリエイティブコモディティ」、略称「CC」です。

経理:さっきドメイン名取ってましたね。

開発:コンパイラ屋ですか?

社長:独自の一貫した視点から、これは素晴らしい!という身の回り製品を勝手に認証して「CC認証」マークを授与し、顕彰する会社です。

基盤:抱きつき商法?

広報:なるほど、わかりやすいですね。イメージが湧いてきました。バナーを考えます … とりあえずこんなんでどうでしょう?

社長:ややごちゃっとしているけど、イメージは近いですね。

基盤:グッドデザインとかモンドコレクションのノリですかね。

営業:認証料を取るんでしょうか?2年間で1万円とか。

開発:QRのクリック数で課金するというのはどうでしょうね?

経理:アフィリエィトで食っている会社って感じですね。

営業:でもやっぱり、ほかにも予定している事業はあるわけですから… 

社長:うーん、じゃあCC認証事業部ということにしますか。

基盤:てか社長、createive ってこれミススペルですよね。

社長:ご…

広報:すみません、間違えました。

経理:幸いドメイン名のほうは正しい綴りで取れていますから大丈夫です。

2020-0524 SatoxITS

ipマスカレードで快適e環境

社長:それで、VPN のほうはどうなりましたかね。

基盤:VPN はやめようと思います。

社長:ご…

基盤:基本、素で IP をフォワードした場合よりも大幅に遅くなるのは目に見えていますし、意味なく複雑、リスクも増す、かつお金もかかる。

開発:素性も中身も知れたアプリケーション・プロトコルだけを、特定のターゲットに中継するのは安全ですからねぇ。

社長:つまり NAT というか、NAPT するルータだけ社外のクラウドに置こうということですか。なんか、出発点に戻りましたね。

開発:元々公海をやってきたパケットを公海を通って転送するだけですので、セキュリティ上のリスクは増しませんね。

社長:どうもそういうサービス、レンタルクラウドルータみたいなのが見当たらないので、何か技術的に困難な問題があるのかと思っていたのですが。

営業:需要が少ないからじゃ無いですかね。クラウド業者の儲けにもならなそう。

基盤:とりあえず、Azure で2つ IP を買ってあったので、やってみました。使った道具は Linux の ip route と iptables。結果的には、いたってカンタンでした。

社長:iptables、懐かしス。

基盤:ただともかく昔にちょこっと使ったきりなので、やり方を全く忘れていて、苦労しました。問題はまず、マルチホームでのルーティングの問題です。うちの Azure 上の仮想ネットはこうなってるわけです。VMをもう一つ買うのをためらったので、一つに2枚挿しにしました。

社長:マルチホーム、超懐かしス。行きと帰りが違う道になっちゃって迷子になる問題ですね。

基盤:それです。2つのネットワークインタフェースからやって来た TCP/IP の接続に、それぞれ元来た道で帰ってもらうというあれです。TCPソケットの場合、帰りのパケットのソースは自動的についてますから、IPのソースルティングだけでできるはずです。実際、答えはこうでした。

# ip route add from X.X.X.X oif ethX

社長:そうですか… 私がやってたころはまだ BSD が元気で、あちらはあちらで流儀が違ったよね。

開発:当時は BSD のがスッキリしてたような記憶もありますけどね。トランスペアレントプロキシとかやるのに。

基盤:あとは、IP のフォワーディングなのですが、これは iptables でやりました。インタフェース XX に来たのを IP アドレス YY に丸投げするのは、こうなります。

# iptables -t nat -A PREROUTING -i XX --to YY -j DNAT
# iptables -t nat -A POSTROUTING -j MASQUARADE

基盤:ポート番号を変えたり、フォワーディングを有効にしたりするのは、もう少しだけやらないといけないことはあります。Stackexchange で見つけた、そのものスバリの具体例と完璧な解答がこれです。2016年のコメントなので、結構鮮度が高いですね。

質問(やりたいこと、要件)
回答(やりかた、ソリューション)

Linux での IPマスカレードの設定方法
First allow forwarding with

  echo 1 > /proc/sys/net/ipv4/ip_forward

Then set iptable rules with

  IF=eth1
  PORT_FROM=8080
  PORT_TO=80
  DEST=10.32.25.2
  iptables -t nat -A PREROUTING -i $IF -p tcp --dport 
  $PORT_FROM -j DNAT --to $DEST:$PORT_TO
  iptables -t nat -A POSTROUTING -p tcp -d $DEST --dport 
  $PORT_TO -j MASQUERADE

You can put these lines into /etc/rc.local for example. 
Note: since Debian jessie make it executable and enabled the rc.local service via

  systemctl enable rc-local.serviceF=eth1
IPTables - Port to another ip & port (from the inside) https://unix.stackexchange.com/questions/76300/iptables-port-to-another-ip-port-from-the-inside

基盤:これの設定って一瞬で終了なのに、うちのおまけルータ、設定して反映させるのに90秒もかかるんですが、一体全体何やってるんでしょう?ルータがリブートしちゃうからその間仕事にならないんですが。しかも、DHCPのリース記憶を喪失したりして(クソ!)

開発:FPGA構成を生成してしてFlashに書いているとか?

社長:それにしてもこういう基盤系の人たちって、徹頭徹尾CLIだね。ウェブでカンタンインタフェースをつけてやれば楽々設定なのに。

開発:素人には教えたく無い秘伝の技みたいな。

基盤:作っておきます。CGIで十分ですよね(笑)

開発:設定用のHTTPサーバでは、公開鍵を使ったクライアント認証があったほうが良いですね。

営業:それ、売れませんかね?

社長:需要が少なくて、儲けにもならなそうですが。

社長:てか、iptables を双方向にしたら、分散プライベートネットできるよね。ルータなんだし。

開発:リアルプライベーットネットですね。RPNというか。

社長:隠さないといけないプライバシーも無けりゃ無問題かな。

開発:まあ、隠したいデータはトランスポート層でもアプリケーション層でも暗号化されてますしね。要はHTTPだけ通すネットワークみたいな。

社長:で、それならHTTPプロキシ、つまりアプリケーション層のルータだけでできたネットワークでいいんじゃね?ってのが当時の私の考えでしたね。SSHだって必要なの?SSLトンネルでいいんじゃね?とか。その考えは今も変わらないけど。まあ、あとはソーシャルエンジニアリング対策ってやつかなぁ…

開発:ただ、いずれ世の中アプリケーションプロトコル・トランスポートプロトコルはHTTPSだけになるって予感は当たりませんでしたね。

社長:いやいや、この先どうなるかわからんよ。HTTP の最大の問題は効率だと思うんだけど、HTTP2でのパイプラインとか、プロトコルの等価バイナリ化で、かなりイケるんじゃないかと思うんだけどね。

--
2020-0524 SatoxITS