NixOS伪装机顶盒

前言

伪装的好处是家中所有设备均可播放直播,突破机顶盒的物理限制。网上也有很多教程,但主要是用于OpenWRT爱快,我这里是用的Nixos,实际上任何适用于任何使用systemd-networkd配置网络的发行版。

抓包

需要获得以下3个数据,网上教程很多,我这里就不放过程了(主要是我这是后补的记录,很多过程资料都没留存😅)

名称类型示例
MACAddress字符串1a:2b:3c:d4:e5:f6
Hostname字符串android-xxxx
SendOption二进制

配置

其在systemd-networkd的配置大概是下面这样的,此处以nix形式展示,需要注意的是,虽然systemd-networkd已经支持SendVendorOption字段,但该字段似乎只能是字符串,对于机顶盒的二进制值无能为力,只好使用SendOption字段替代,且二进制值全部转码。我也是一点点尝试出来的,后面又没在使用,所以忘记了SendVendorOption字段这样使用是否可以。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
  systemd.network.networks = {
    eth1 = {
      matchConfig = {
        Name = "eth1";
      };
      networkConfig = {
        DHCP = "ipv4";
        IPv6AcceptRA = "no";
        LinkLocalAddressing = "no";
      };
      linkConfig = {
        MACAddress = "1a:2b:3c:d4:e5:f6";
      };
      dhcpV4Config = {
        RouteMetric = 20;
        Hostname = "android-xxxx";
        SendOption = "60:string:\\x00\\x00\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\xe0\\xe0";
      };
    };
  };
}

使用

OpenWRT中,可以使用udproxy方便的转发,但我在NixOS没有找到类似的软件,最后通过sing-box透明代理实现转发。大概配置如下所示。当使用udp协议访问238.1.78.0/23(安徽地区iptv源地址)时,使用eth1接口出栈。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
{
  route = {
    rule_set = [
      {
        tag = "rule_set_iptv";
        type = "inline";
        rules = [
          {
            network = [
              "udp"
            ];
            ip_cidr = [
              "238.1.78.0/23"
            ];
          }
        ];
      }
    ];
    rules = [
      {
        rule_set = "rule_set_iptv";
        outbound = "iptv";
      }
    ];
  };
  outbounds = [
    {
      tag = "iptv";
      type = "direct";
      bind_interface = "eth1";
    }
  ];
}
使用 Hugo 构建
主题 StackJimmy 设计