私は自宅にIPTVソリューションを持っており、ISPは毎秒数百の大きなUDPデータグラムを10.4.4.5
ポート10
から239.3.5.3
ポート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 /秒増加します)、実際には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
#
私が言ったように、eth0
はISPに接続されています。 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「メンバーシップレポート」メッセージを検査できるため、239.3.5.3
へのトラフィックを許可することでしたが、これはconntrack -F
の後でもトラフィックがどのように許可されるかを説明していません。
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
はそのような転送されたフローであり、nat/PREROUTING
およびnat/POSTROUTING
カウンタを(のみ)1つインクリメントします:このcontrackエントリをトリガーした新しいパケット。filter/INPUT
によって停止されます。最後に、Linuxルーターが以下を受信できるようにする必要があります。
LANからのIGMPパケット。ルーターは、どのマルチキャストクライアントがリッスンしているかを認識し続けることができます。
iptables -A INPUT -i br0 -p igmp -j ACCEPT
私の特定のセットアップはpimd
とPIMv2を使用しています。このプロトコルが常に使用されるかどうかはわかりませんが、PIMプロトコルが機能するようにする必要がありましたが、ソースIPが192.0.2.1だけではなく(10.4.4.5)の場合、DROPポリシーを維持します。
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
更新:
filter/INPUT
チェーンのDROPポリシーは引き続きヒットを表示することに注意してください。マルチキャストされているLinuxルーター自体のIGMPおよびPIMv2パケットは、外部に送信されるとローカルシステムにループバックされるため、(無害に)ドロップされます。上記のルール。対応するルールを追加した後、PIMv2で奇妙な動作が発生し、最終的にはfilter/OUTPUT
でパケットをマークして、filter/INPUT
でのループバックコピーを許可する必要がありました。その間、私はNATルールも制限しました。最終的に、次のルールにより、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を指定)を使用して、マルチキャストクライアントをシミュレートし、stdoutにダンプできます。
socat -u UDP4-RECV:10,ip-add-membership=239.3.5.3:0.0.0.0 -