IPTV速览

@vrqq  February 7, 2026

光猫环境

  • 光猫下设4个接口,所有接口都能通过DHCP获得192.168.18的IP,所有接口都可以直接插电视
  • 前2个接口可以通过PPPoE拨号获得111.xxx的外网IP
  • 打开光猫web管理页面,可见一条配置 2_IPTV_R_VID_47:VLANID=47 组播VLAN=3000
    其实这条配置是说光猫到ISP机房这跟光纤上的VLAN,而不是光猫到用户路由器的VLAN,所有光猫下行包括IPTV的组播信号,都是VLAN untagged的

操作和安全管理

  • 新建wan_tv interface 绑定至'wan' device,协议为DHCP(和PPPoE上网区分开),关闭IPV6各项参数,同时去掉Use default gateway,去掉Use DNS servers advertised by peer,此端口能自动获取到192.168.18.x的IP。同时在防火墙中新建一个zone名叫wan_tv,把这个interface丢进去。
  • 配置路由表 Network-> Routing -> Static IPV4 Routes,新增{Target=192.168.18.0/24, Interface=wan_tv, Gateway=none}
  • 安装udxpy,使用默认配置(监听lan口的tcp连接)
  • 查看网友做好的m3u节目单的,里面有好多地址例如rtp://239.3.1.163:8001,发现目标端口都是UDP 8001,于是我们打开Openwrt luci web界面-> Network -> Firewall -> TrafficRules, 新增{Protocol=UDP, Source=wan_tv, Destination_zone=Device(input), Destination_port=8001, Action=accept}
  • 在电脑上用播放器打开URL: http://192.168.9.1:4022/rtp/225.1.1.120:5002/ 即可直接播放 (192.168.9.1是我的路由器IP)

后记

基本概念:UDP unicast
单播,发送者通过本机{IP=AddrA Proto=UDP Port=PortA} 端口 向目标{IP=AddrC Proto=UDP Port=PortC} 发送消息。
发送时需要知道本地绑定于哪个网卡,对方接收IP地址AddrC和接收端口PortC,

基本概念:组播

  1. 发送者A通过 udp://AddrA:PortA 将消息送给交换机接收地址UDP://AddrB
  2. 接受者C通过 udp://AddrC:PortC 向交换机UDP://AddrB 注册自己的AddrC和PortC,表示我想要所有向AddrB地址投放的AddrB:PortC消息的副本。。
    cpp代码参考: https://github.com/weifengdq/learn_non_boost_asio?tab=readme-ov-file

发送者A事先不知道接受者IP地址,只知道接受者需要通过PortC接受,而交换机的"组播地址"相当于一个中继。
站在A角度: 地址B是接受者C的alias,向地址B的特定端口投消息,就相当于向其背后的所有地址C1, C2, ...的特定端口投消息。

Openwrt网络设备基本概念

  • Network Device: 网口
  • Bridge Device: 即交换机,想象为多个网口插在交换机芯片上了,在上面有L2消息转发
  • Network Interface: 基于XX Device的"软件抽象层" 例如在同一个wan口上,同时存在PPPoE协议链接、和dhcp client作为两个不同的inferface
  • Firewall Zone: 把Network Interface放进组里面。
    Screenshot 2026-02-07 at 17.12.25.png
    Screenshot 2026-02-07 at 17.13.07.png

Openwrt nftable fw4基本概念
一台主机,上面有很多网口(Network Device)

  • 数据包从"网口"进入"cpu上运行的某个程序": 走input表(input chain)
  • 数据包从"cpu上运行的某个程序"发送到"网口"出去: 走output表(output chain)
  • 从一个“网口”收到数据包,目标地址是其他“网口”: 走forward表(forward chain)
    对于每个数据包,系统从表的第一行到最后一行依次匹配,找到放行accept、拒绝reject 或丢弃drop。

举例:openwrt fw4的input表,为了实现上述 firewall zone功能,选择 根据不同的device分别跳转至其他的表(例如去input_wan_tv),然后才是zone的 rule implement。

  • 查看所有防火墙规则: Openwrt_Web页面(luci) -> Status-> Firewall
  • 在Terminal中查看: nft list ruleset
  • 清空input_wan_tv表: nft flush chain inet fw4 input_wan_tv
  • 在input_wan_tv表中添加一条规则{Allow all UDP}:nft add rule inet fw4 input_wan_tv meta nfproto ipv4 meta l4proto udp counter accept
  • 添加一条跳转规则: nft add rule inet fw4 input_wan_tv jump reject_from_wan_tv

nftable注意点: INPUT Chain 不能通过UID, GID做入包过滤
meta skuid(socket UID) 和meta skgid(socket GID) 在INPUT Chain上不能发挥作用,根据操作系统的规则,在包进入防火墙时候,还不知道接收者socket是谁。。

Openwrt自定义高级规则
把文件放进 /etc/nftables.d/, 然后运行 /etc/init.d/firewall reload. 注意若如果没有console线,小心改错规则进不去系统。。


添加新评论