マルチキャストトラフィックがNetfilter接続追跡システムに穴を開けることがある

マルチキャストトラフィックがNetfilter接続追跡システムに穴を開けることがある

自宅にIPTVソリューションがあり、ISPは10.4.4.5ポートからポートに10毎秒239.3.5.3数百の大きなUDPデータグラムを送信します10。つまり、マルチキャストを使用します。現在のiptables着信トラフィックの設定は非常に簡単です。

~# iptables -L INPUT -v -n --line-numbers
Chain INPUT (policy DROP 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1       19   845 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
2     1146  275K ACCEPT     all  --  eth0   *       0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED /* established/related connections */
# 

ルールiptables-save形式:

# iptables-save -c
# Generated by iptables-save v1.6.0 on Sun Aug 26 12:51:11 2018
*nat
:PREROUTING ACCEPT [44137:4586148]
:INPUT ACCEPT [6290:1120016]
:OUTPUT ACCEPT [419:75595]
:POSTROUTING ACCEPT [98:8415]
[26464:2006874] -A POSTROUTING -o eth0 -m comment --comment SNAT -j MASQUERADE
COMMIT
# Completed on Sun Aug 26 12:51:11 2018
# Generated by iptables-save v1.6.0 on Sun Aug 26 12:51:11 2018
*filter
:INPUT DROP [72447:97366152]
:FORWARD ACCEPT [77426:101131642]
:OUTPUT ACCEPT [148:17652]
[17:787] -A INPUT -i lo -j ACCEPT
[333:78556] -A INPUT -i eth0 -m conntrack --ctstate RELATED,ESTABLISHED -m comment --comment "established/related connections" -j ACCEPT
COMMIT
# Completed on Sun Aug 26 12:51:11 2018
# 

eth0上の写真はISP用のNICです。奇妙なことに、このマルチキャストトラフィックはカウンタによって破棄されていますが(チェーンのデフォルトポリシーカウンタは数MB / sずつ増加します)、実際にはマルチキャストトラフィックがmplayer原因であるようです。 netfilter接続追跡システムの抜け穴に問題があります。これを確認するために使用できますconntrack -L。例:

# conntrack -L | grep --color 239.3.
udp      17 29 src=10.4.4.5 dst=239.3.5.3 sport=10 dport=10 [UNREPLIED] src=239.3.5.3 dst=10.4.4.5 sport=10 dport=10 mark=0 use=1
conntrack v1.4.4 (conntrack-tools): 130 flow entries have been shown.
# 

を実行しても上記のconntrack -F項目が再び表示され、からビデオストリームを見ることができますmplayer。ただし、最終的に(約5分後)エントリが消え、ストリームがすぐに停止します。

ちなみに、このLinuxベースのルータには9つの物理インターフェイスがあります。

# ip -br link
lo               UNKNOWN        00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP> 
eth2             DOWN           00:a0:c9:77:96:bd <NO-CARRIER,BROADCAST,MULTICAST,UP> 
eth1             UP             00:14:bf:5f:de:71 <BROADCAST,MULTICAST,UP,LOWER_UP> 
eth0             UNKNOWN        00:50:8d:d1:4f:ee <BROADCAST,MULTICAST,UP,LOWER_UP> 
eth3             DOWN           00:a0:c9:4b:21:a0 <NO-CARRIER,BROADCAST,MULTICAST,UP> 
eth4             UP             00:20:e2:1e:2e:64 <BROADCAST,MULTICAST,UP,LOWER_UP> 
eth5             DOWN           00:20:fc:1e:2e:65 <NO-CARRIER,BROADCAST,MULTICAST,UP> 
eth6             DOWN           00:20:fc:1e:2e:8e <NO-CARRIER,BROADCAST,MULTICAST,UP> 
eth7             UP             00:20:fc:1e:2f:67 <BROADCAST,MULTICAST,UP,LOWER_UP> 
wlan0            UP             00:21:91:e3:20:20 <BROADCAST,MULTICAST,UP,LOWER_UP> 
br0              UP             00:14:bf:5e:da:71 <BROADCAST,MULTICAST,UP,LOWER_UP> 
# ip -br address
lo               UNKNOWN        127.0.0.1/8 
eth2             DOWN           
eth1             UP             
eth0             UNKNOWN        192.0.2.79/24
eth3             DOWN           
eth4             UP             
eth5             DOWN           
eth6             DOWN           
eth7             UP             
wlan0            UP             
br0              UP             192.168.0.1/24
# 

私が言ったように、eth0ISPに接続しました。eth1プラスは、eth7名前wlan0の付いたブリッジの一部ですbr0。ルーティングテーブルは次のとおりです。

# ip -4 r
default via 192.0.2.1 dev eth0 
192.0.2.0/24 dev eth0 proto kernel scope link src 192.0.2.79 
192.168.0.0/24 dev br0 proto kernel scope link src 192.168.0.1 
# 

すべてのインターフェイスのさまざまなネットワークパラメータはここにあります。

# ip -4 netconf 
ipv4 dev lo forwarding on rp_filter off mc_forwarding off proxy_neigh off ignore_routes_with_linkdown off 
ipv4 dev eth2 forwarding on rp_filter off mc_forwarding off proxy_neigh off ignore_routes_with_linkdown off 
ipv4 dev eth1 forwarding on rp_filter off mc_forwarding off proxy_neigh off ignore_routes_with_linkdown off 
ipv4 dev eth0 forwarding on rp_filter off mc_forwarding on proxy_neigh off ignore_routes_with_linkdown off 
ipv4 dev eth3 forwarding on rp_filter off mc_forwarding off proxy_neigh off ignore_routes_with_linkdown off 
ipv4 dev eth4 forwarding on rp_filter off mc_forwarding off proxy_neigh off ignore_routes_with_linkdown off 
ipv4 dev eth5 forwarding on rp_filter off mc_forwarding off proxy_neigh off ignore_routes_with_linkdown off 
ipv4 dev eth6 forwarding on rp_filter off mc_forwarding off proxy_neigh off ignore_routes_with_linkdown off 
ipv4 dev eth7 forwarding on rp_filter off mc_forwarding off proxy_neigh off ignore_routes_with_linkdown off 
ipv4 dev wlan0 forwarding on rp_filter off mc_forwarding off proxy_neigh off ignore_routes_with_linkdown off 
ipv4 dev br0 forwarding on rp_filter off mc_forwarding on proxy_neigh off ignore_routes_with_linkdown off 
ipv4 all forwarding on rp_filter off mc_forwarding on proxy_neigh off ignore_routes_with_linkdown off 
ipv4 default forwarding on rp_filter off mc_forwarding off proxy_neigh off ignore_routes_with_linkdown off 
# 

これが予想される動作ですか?私の最初の考えは、conntrackモジュールがIGMP "Membership Report"メッセージをチェックしてトラフィックが到着することを許可できるということ239.3.5.3でしたが、それでもトラフィックがどのように許可されるかは説明されていませんconntrack -F

答え1

同様の設定を使用した後pimd、私は次の結論を出すことができます。

  • filter/FORWARDこのフローに対してマルチキャストルーティングが有効になっている限り、汎用(データ)マルチキャストパケットが転送されます。 conntrackエントリudp 17 29 src=10.4.4.5 dst=239.3.5.3 sport=10 dport=10 [UNREPLIED] src=239.3.5.3 dst=10.4.4.5 sport=10 dport=10 mark=0 use=1は転送されたフローであり、このコントラクトエントリをトリガする新しいパケットである1だけ合計nat/PREROUTINGカウンタをインクリメントします。nat/POSTROUTING
  • リンクローカルマルチキャストパケット(224.0.0.{1,22}のIGMPパケットと224.0.0.13のPIMv2)が停止しますfilter/INPUT
  • フローが以前に有効になっている場合、マルチキャストルータは一定期間その特定のマルチキャスト宛先への転送を有効にします。設定されたタイムアウトが発生し、ファイアウォールが原因でLANからIGMPレポートを受信できない場合、またはファイアウォールがPIMv2を受信しない場合は、受信中のクライアントが存在しないか、有効なフローがないと見なされ、そのマルチキャスト配信を停止します。ストリーミング。

最後に、Linuxルーターが次のものを受け取ることを許可する必要があります。

  • ルータが受信しているマルチキャストクライアントを知ることができるLAN上のIGMPパケット:

    iptables -A INPUT -i br0 -p igmp -j ACCEPT
    
  • 私の特定の設定はpimdPIMv2を使用しています。そのプロトコルが常に使用されているかどうかはわかりませんが、ソースIPが192.0.0.1でない場合は、DROPポリシーを維持しながらPIMプロトコルが機能することを許可する必要があります。 2.1(ただし10.4.4.5):

    iptables -A INPUT -s 192.0.2.1 -i eth0 -p pim -j ACCEPT
    
  • ISPルーターでIGMPパケットを許可する必要があるかもしれませんが、私の特定の設定ではそれを必要としません。

    iptables -A INPUT -s 192.0.2.1 -i eth0 -p igmp -j ACCEPT
    

修正する:

チェーンのDROPポリシーはfilter/INPUTまだヒットを示しています。 Linuxルーターの独自のIGMPおよびPIMv2パケット(マルチキャスト)は、外部に送信されるとローカルシステムにループバックされるため、上記のNot Enabledルールによって(害を受けずに)破棄されます。適切なルールを追加した後、PIMv2で奇妙な動作が発生し、.naルールも制限するようにパケットを表示するfilter/OUTPUT必要がありましたfilter/INPUT。最後に、次の規則を使用すると、filter/INPUTマルチキャストトラフィックを転送するときにDROPポリシーカウンタは常に[0:0]のままになります。

# Generated by iptables-save v1.6.2 on Mon Aug 27 01:01:48 2018
*nat
:PREROUTING ACCEPT [1:56]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [1:56]
[0:0] -A POSTROUTING -s 192.168.0.0/24 -o eth0 -m comment --comment SNAT -j MASQUERADE
COMMIT
# Completed on Mon Aug 27 01:01:48 2018
# Generated by iptables-save v1.6.2 on Mon Aug 27 01:01:48 2018
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [1533311:325676232]
:OUTPUT ACCEPT [75:3724]
[0:0] -A INPUT -i lo -j ACCEPT
[1:56] -A INPUT -i eth0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
[40:1800] -A INPUT -i br0 -p igmp -j ACCEPT
[14:774] -A INPUT -s 192.0.2.1/32 -i eth0 -p pim -j ACCEPT
[28:1288] -A INPUT -s 192.0.2.1/32 -i eth0 -p igmp -j ACCEPT
[17:932] -A INPUT -s 192.0.2.79/32 -i eth0 -p igmp -j ACCEPT
[28:1392] -A INPUT -m mark --mark 0x1 -j ACCEPT
[28:1392] -A OUTPUT -p pim -j MARK --set-xmark 0x1/0xffffffff
COMMIT
# Completed on Mon Aug 27 01:01:48 2018

マルチキャストクライアントをシミュレートして標準出力にダンプできます。socat(複数のインタフェースがある場合はローカルIPを指定してください):

socat -u UDP4-RECV:10,ip-add-membership=239.3.5.3:0.0.0.0 -

関連情報