ebtables-filter-mcast: Segment IGMP/MLD domain
Filter IGMP/MLD messges so that we can have an IGMP/MLD querier per node. Segmenting the IGMP/MLD domain on a per node basis allows us to *not* rely on a central querier (on a gateway for instance) to take advantage of multicast snooping. Even though we receive no more reports from other nodes anymore then, the "multicast_router" bridge port setting will ensure to always forward multicast packets towards bat0 (unless filtered by another ebtables rule). Note that IGMP/MLD are filtered for multicast traffic coming from the mesh, too (new MULTICAST_IN), as unfortunately there seem to be other queriers somewhere in the mesh at least for Freifunk Lübeck. Such queriers would potentially confuse / silence the querier on a node. Signed-off-by: Linus Lüssing <linus.luessing@c0d3.blue>
This commit is contained in:
		
							parent
							
								
									f63d4a27ea
								
							
						
					
					
						commit
						c5ce1525e6
					
				@ -1 +1,2 @@
 | 
			
		||||
chain('MULTICAST_OUT', 'DROP')
 | 
			
		||||
chain('MULTICAST_IN', 'ACCEPT', 'nat')
 | 
			
		||||
 | 
			
		||||
@ -1 +1,4 @@
 | 
			
		||||
rule 'MULTICAST_OUT -p IPv6 --ip6-protocol ipv6-icmp --ip6-icmp-type 130 -j DROP' -- MLD query
 | 
			
		||||
rule 'MULTICAST_OUT -p IPv6 --ip6-protocol ipv6-icmp --ip6-icmp-type 131 -j DROP' -- MLDv1 report
 | 
			
		||||
rule 'MULTICAST_OUT -p IPv6 --ip6-protocol ipv6-icmp --ip6-icmp-type 143 -j DROP' -- MLDv2 report
 | 
			
		||||
rule 'MULTICAST_OUT -p IPv6 --ip6-protocol ipv6-icmp -j RETURN'
 | 
			
		||||
 | 
			
		||||
@ -1 +0,0 @@
 | 
			
		||||
rule 'MULTICAST_OUT -p IPv4 --ip-protocol igmp -j RETURN'
 | 
			
		||||
@ -0,0 +1 @@
 | 
			
		||||
rule('MULTICAST_IN -p IPv4 --ip-protocol igmp -j DROP', 'nat')
 | 
			
		||||
@ -0,0 +1,3 @@
 | 
			
		||||
rule('MULTICAST_IN -p IPv6 --ip6-protocol ipv6-icmp --ip6-icmp-type 130 -j DROP', 'nat') -- MLD query
 | 
			
		||||
rule('MULTICAST_IN -p IPv6 --ip6-protocol ipv6-icmp --ip6-icmp-type 131 -j DROP', 'nat') -- MLDv1 report
 | 
			
		||||
rule('MULTICAST_IN -p IPv6 --ip6-protocol ipv6-icmp --ip6-icmp-type 143 -j DROP', 'nat') -- MLDv2 report
 | 
			
		||||
@ -1,2 +1,4 @@
 | 
			
		||||
rule 'FORWARD --logical-out br-client -o bat0 -d Multicast -j MULTICAST_OUT'
 | 
			
		||||
rule 'OUTPUT --logical-out br-client -o bat0 -d Multicast -j MULTICAST_OUT'
 | 
			
		||||
 | 
			
		||||
rule('PREROUTING --logical-in br-client -i bat0 -d Multicast -j MULTICAST_IN', 'nat')
 | 
			
		||||
 | 
			
		||||
@ -24,12 +24,15 @@ exec_file() {
 | 
			
		||||
	local file="$1"
 | 
			
		||||
 | 
			
		||||
	/usr/bin/lua -e "
 | 
			
		||||
		function rule(command)
 | 
			
		||||
		function rule(command, table)
 | 
			
		||||
			table = table or 'filter'
 | 
			
		||||
			os.execute($EBTABLES_RULE)
 | 
			
		||||
		end
 | 
			
		||||
		function chain(name, policy)
 | 
			
		||||
		function chain(name, policy, table)
 | 
			
		||||
			table = table or 'filter'
 | 
			
		||||
			os.execute($EBTABLES_CHAIN)
 | 
			
		||||
		end
 | 
			
		||||
 | 
			
		||||
	" "$file"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -48,8 +51,8 @@ exec_all() {
 | 
			
		||||
 | 
			
		||||
start() {
 | 
			
		||||
	(
 | 
			
		||||
		export EBTABLES_RULE='"ebtables -A " .. command'
 | 
			
		||||
		export EBTABLES_CHAIN='"ebtables -N " .. name .. " -P " .. policy'
 | 
			
		||||
		export EBTABLES_RULE='"ebtables -t " .. table .. " -A " .. command'
 | 
			
		||||
		export EBTABLES_CHAIN='"ebtables -t " .. table .. "  -N " .. name .. " -P " .. policy'
 | 
			
		||||
 | 
			
		||||
		if [ -z "$1" ]; then
 | 
			
		||||
			exec_all ''
 | 
			
		||||
@ -61,8 +64,8 @@ start() {
 | 
			
		||||
 | 
			
		||||
stop() {
 | 
			
		||||
	(
 | 
			
		||||
		export EBTABLES_RULE='"ebtables -D " .. command'
 | 
			
		||||
		export EBTABLES_CHAIN='"ebtables -X " .. name'
 | 
			
		||||
		export EBTABLES_RULE='"ebtables -t " ..	table .. " -D " .. command'
 | 
			
		||||
		export EBTABLES_CHAIN='"ebtables -t " .. table .. " -X " .. name'
 | 
			
		||||
 | 
			
		||||
		if [ -z "$1" ]; then
 | 
			
		||||
			exec_all '-r'
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user