ルータ越しの通信において、受信プログラム(アプリ層)がマルチキャスト・パケットを受信できない問題に遭遇しました。当初からReverse Path Filter(以降、RPFと言う)が怪しいことは当たりをつけていたのですが、なんかしっくりこない現象の説明ができず悶々としていたのですが、先程ようやく解決しました。
問題
C7_1
から配布されたマルチキャスト・パケットがC7_2
で受けられません。C7_2
のLANポートには届いている(tcpdump及びWireSharkで確認)。
net.ipv4.conf.eth2.rp_filter = 0
とRPFを無効(パケット・フィルタリングを無効)にしたつもりでも受けられません。
net.ipv4.conf.all.rp_filter = 0
とした場合でも同様に受けられません。
ちなみに、net.ipv4.conf.eth2.rp_filter = 2
だと受けられます。
環境
- GNS3 2.1.21
- ホストOS: Ubuntu 18.04
- ゲストOS: CentOS 7.4 1708(図中のC7_1とC7_2)
ネットワーク・トポロジ
- 両端末にファイアウォールは設定していない
- 両端末(C7_1とC7_2)の間にルーティングは無し(pingは通らない)
- ルータ(R1とR2)ではip pim dense-mode
解決
piyolianさんのウェブページにヒント(というか答え)がありました。
net.ipv4.conf.eth2.rp_filter
とnet.ipv4.conf.all.rp_filter
は、両者の 最大値 を取るようです。つまり、どちらか一方をゼロにしても、CentOS 7の初期値は1なので1、つまり厳格モードとなって受信できなかったようです。
蛇足ですが、piyolianさんのウェブページによると、CentOS 6時代はAND(論理積)だったそうです。
おまけ
両端末(C7_1とC7_2)の間がルーティングされている(pingされている場合)は、net.ipv4.conf.*.rp_filter
を設定(変更)しなくても受信できます。