blog.monophile.net

コンピュータに関するメモ。

著者

山本一彰(Takaaki Yamamoto)

東京工業大学において計算機科学と応用数学を学び、 情報科学芸術大学院大学[IAMAS]においてメディア表現を専攻し修了。 2015年にコンビネータ論理を基に計算完備な計算手法 "論理珠算"を開発し、 それを含む体系である"算道"を構成した。 その成果により、2016年に 第19回 文化庁メディア芸術祭 アート部門 新人賞 (文部科学大臣賞) を受賞。 現在はSRE(サイト信頼性エンジニア)として生計をたててている。

投稿

socat で tap インターフェースを作成して認証も暗号化もしないVPN

概要

socat で TUN/TAP インターフェースを扱えるらしく、 UDP で転送すれば簡単な VPN が構成できそうだったので、やってみた。 認証も暗号化も行わない。 想定する環境は↓。

サーバ クライアント
OS Linux Linux
UDPで接続するIP 192.168.1.1 192.168.1.2
tap1のIP 10.0.0.1/24 10.0.0.2/24

サーバ側

サーバ側で↓を行うと UDP の1194番ポートで Listen される。

一応、↑では range オプションでクライアントのIPからのみ許可するように設定しているが、 セキュリティ的にはよくはない。

そして、この段階ではまだサーバ側には tap1 インターフェースはできていないはず。

クライアント側

サーバ 192.168.1.1:1194 につなぎに行くように↓を行う。

するとクライアント側に tap1 インターフェースが作成された。

IPアドレス 10.0.0.2/24 も付加されている。

ping をクライアントからサーバへ打つ

この状態で ping をクライアント側からサーバ側 10.0.0.1 へ打ってみると ping が返ってくる。

そして、サーバ側に tap1 インターフェースが作成されていることがわかる↓。

MTUの調整

上記で作成された tap1 インターフェースの MTU をサーバ側とクライアント側の両方で設定しておく。

Layer byte
IP 20
UDP 8
Ethernet 18

tap デバイスはイーサネットのフレームも含むため、 L3 までに含まれるの各種ヘッダの量は↑である。 したがって、VPN を張りたい経路の MTU が 1500 の場合、 tap1 に設定されるべき MTU は (1500 - 20 - 8 - 18) => 1454 と計算できる。

備考

TUN/TAP のうち TAP にしたかったのは仮想ブリッジに接続したかったからだが、 仮想ブリッジの作成まで記事に含めるのは冗長な気がしたので、 tap1 インターフェースに直接 IP を振った。

ちなみに、socat は openssl も使えるため暗号化できそうだが、 残念ながら TCP をバインドしてしまって、UDP では不可能だった。 一方で、openssl s_server で DTLS を指定すると UDP をバインドすることは確認できたので、 そのうち socat も対応してくれそうな気がする。

参考