openwrt是居于linux的,所以本质上还是linux下的问题。
1 本地广播即255.255.255.255,正常只能在本地局域网下转发。
wan口到lan口转发:首先通过iptables设置一个DNAT,将255.255.255.255指向lan下的单播IP,然后在iptable_nat.c nf_nat_ipv4_in()下将skb->pkt_type类型变成PACKET_HOST这样就可以了。局限性就是只能向单播IP转发。主要是要保留ip数据包源IP的值。这一接收方才知道是谁发来的。如果只是转发数据包内容,那写一个转发程序就可以了。
lan口到wan口转发:写一个程序,指定端口或端口列表进行转发。重点是socket必须指定网卡接口。发送的socket要指定是广播包。
2 组播的转发
使用pimd-2.1.8即可实现双向转发。igmpproxy只能设置单向转发upstream和downstream。
https://github.com/downloads/troglobit/pimd/pimd-2.1.8.tar.bz2
测试的组播收发程序:Wsend,Wlisten。
注意点1:测试的PC,如果安装了虚拟网卡,则需要禁用虚拟网卡。
注意点2:把wan和lan接口都设置成ACCEPT。
3 单播转发
默认情况下,lan口向wan口转发数据,且lan口ip会masq成wan口ip,类似SNAT。
因此转发指的是wan口到lan口的转发,其实就是iptables设置一个DNAT转发,即将对wan口的访问转发到lan下的指定ip。可以全端口转发,也可以指定端口转发。当转发端口比较明确和固定的时候,建议指定端口转发。