Linux
DS-Lite

【DS-Lite】net.ipv4.ip_forwardを立てちゃうと困る場合はこうだ!【NGN IPoE】

More than 1 year has passed since last update.

一発ネタです。
あなたのLinuxにDS-Liteトンネルを作りたい時の案内がIIJてくろぐ様から公開されています。
http://techlog.iij.ad.jp/contents/dslite-raspi

ここでなんのためらいもなく紹介されているのが以下の設定です:

sysctl.conf
net.ipv4.ip_forward=1

この設定ですが、このスイッチを入れるとこのLinux上のNIC全部が取り扱うIPv4パケットがどれもこれも一つ残らず融通されるというなんだかプロミスカスな感じの設定です。
当然、KVMで仮想スイッチをゴニョってなんか作ろうとしている人とかは仮想スイッチの頭越しにパケットが行き来して大変困ったりすることになります。

「え、全部融通させるか全部遮断するしかないんですか!?」ってなるわけですが、ここで困った時のArchWiki

ヒント: 特定のインターフェイスでのみパケット転送を有効にしたい場合は sysctl net.ipv4.conf.interface_name.forwarding=1 を使ってください。

ははーっ!ありがたや!
さて、ここまでは調べやわかる範囲でありますが、一つ疑問が残ります。

「あれ、NICをふたつ以上選んでそいつらを繋ぎ合わす仕組みじゃないんだ??」

そうなんです。つまり、上記の個別設定といえどどうやってもLinuxカーネルはそいつが単一のスイッチルータになることしか想定していないわけですな。
例えば「eth0とeth1の間をforwardさせて、そいつらとは別にeth3とbr2間もforwardしてもらおう」といった器用なことはさせてもらえないっぽくてまだちょっと危なさが残っております。

そんなわけで「DS-Liteしたい人が設定すべき本当に最小限のForwarding範囲はどこまでか」というのはなかなか分かりづらいのですが、以下が答えとなります。

  1. 自分自身だけが使うトンネルを作る場合
    1. IPv6インターネットにつながっているNICのみをスイッチオン
    2. トンネル自体にこのスイッチは必要ない
  2. DHCPサーバなども受け持ってDS-Liteルータとして振る舞う場合
    1. WANのNIC、
    2. LANのNIC、
    3. そしてDS-Liteトンネルの三者全てにスイッチが必要

自分自身のみが使うトンネル、これは昔ながらのPPPoEではセッション数制限があるため絶対実現しないものですが、DS-Liteの場合そのようなものは無いため各々思い思いに掘ればいいのです。
私はそれといって必要性もないのにLAN内のIPv4パケットを全滅させたいと企んでいるアホなのでFreeBSDやLinuxの一台一台がこいつを採用してます。KVM上にWinからのIPv4をLANに流さないためのFreeBSDなんてのもいますが、何故かICMP通るのにTCP通んなくて大変困っております。

この場合のミソは受信側が必ず送ったNICからパケットを受けなきゃならないといったような制限は一切かかっていないことでして、つまりは「トンネルデバイスがパケットを受けた時点でLinuxカーネルはそのパケットを読めますから、トンネルデバイスからどっちこっちへのforwardingは何らやんなくていいです」っていう理由でIPv6側のみのチェックでうまく動くのですな。

DS-Lite関係はFreeBSDルータの場合の自動設定とかLinuxならsystemdユニットとか色々やっているのですが、公開にはもちっと時間ください。。当方、所詮は蛞蝓でして、流行に乗ろうなんて思っちゃいけませんな。