40块钱解决IPTV内网融合

起因

去年的这个时候,解决了家里组网的问题:《我的家庭AC+AP分体组网高性价比满血方案》。最近,由于家里要看直播的需求开始骚动,于是把目光投向了电信的IPTV。

之所以选择运营商的IPTV,主要是因为互联网三方直播走的是公网,遇到节假日直播,非常容易卡顿。而运营上IPTV具有独立带宽、vlan专网、不占用互联网带宽、有4K信号源等优点,使用感受上非常稳定,尤其是看世界杯直播、晚会直播有相当优势。

基础知识

运营商的IPTV直播一般使用igmp 组播协议。认证上,主要有两种,一种是电信机顶盒上PPPOE拨好,一种是IPoE, 也就是DHCP+r认证:

DHCP+OPTION扩展字段进行认证,又称为IPoE认证方式。用来作为DHCP扩展的OPTION字段主要为OPTION60和OPTION82。其中,OPTION60中带有Vendor和Service Option信息,是由用户终端发起DHCP请求时携带的信息,网络设备只需要透传即可。其在应用中的作用是用来识别用户终端类型,从而识别用户业务类型,DHCP服务器可以依赖于此分配不同的业务IP地址。OPTION82信息是由网络设备插入在终端发出的DHCP报文中,主要用来标识用户终端的接入位置,DHCP OPTION82信息可以由DHCP SNOOP-ING或DHCPRELAY设备进行插入。

成都地区是第二种认证方式,也是当前把IPTV融合到内网最简单的方式。

网络结构及设备

家里设备挺多,但是结构尽量保持简单:光猫桥接,在主路由A进行拨号;电信IPTV直插电信盒子。主路由A下面挂了两个10口千兆交换机,且都不支持vlan, 两个交换机之间通过光纤连接。弱电箱空间足够,且网线预留充足,因此就不考虑vlan单线复用方案了。

从海鲜市场40包邮购入了一个今天主角——新路由mini,并刷入padavan作为路由器B待接入内网。

IPTV内网融合设置方法

  1. 光猫IPTV的LAN口接入独立的路由器B的WAN口。路由器B只有个作用:接收组播的IPTV数据,然后将它通过udprxy转为http供内网客户端访问。路由器
  2. 设置路由器B的WAN口。因为IPTV的LAN口是组播,成都地区IPTV虽然采用了IPoE认证,但是因为我们不需要看回放,因此只需要随意设置一个IP即可,注意改IP不要跟主路由A在同一个网络。
  3. 路由器B的LAN口接入路由器A的LAN口。设置路由器B的LAN地址为主路由A的某地址,这里我设置为 192.168.10.252。关闭路由器B的DHCP功能,避免跟主路由A的DHCP冲突。
  4. 开启路由器B的udprxy,设置端口 8848。 以成都地区为例,在VLC上就可以通过 http://192.168.10.252:8848/rtp/239.93.1.12:2224 观看CCTV-5的直播了。
  5. 开启主路由器xUPNPd, 然后上传网友分享的m3u节目表单,实现在内网任何设备通过DLNA共享节目列表的功能。

使用感受

  1. 因为使用路由器B进行了udp转http到内网,因此可以完全在内网关闭组播协议,IPTV融合到内网后,对内网没有任何影响。
  2. 如果想保留电信的IPTV LAN口,可以把光猫上的LAN口多绑定一个到光猫的IPTV配置上(一般为 _OTHER_B_VID_XX)。
  3. 便宜购买的新路由mini价格便宜,但是一个百兆路由。然后,实际测试下来,发现1路1080P占用带宽约 10mbps, cpu占用20%,也就是说同时播放5路1080P已经达到CPU极限,但是带宽仅占用到50mbps。一路4K占用带宽 25mbps, cpu占用 60%, 同样也是先达到CPU极限。完全不用纠结百兆路由带宽的问题。
  4. 家里宽带使用的是电信。4K信号源还是比较少,目前使用下来CCTV的奥运频道4K无论是内容还是信源都是最值得观看的。

而立之年的妥协

生活有时候非常神奇,在特定的时间点会递上特殊的经历。而在自己身上,则是非常戏剧的两年。

去年前的今天,蚂蚁按下了暂停键,当时的自己在楼下看着logo上的霓虹灯,心中毫无波澜,心里想的是今日今岁不唐捐。

今年的今天,我接受了外部的和解,也跟自己做了妥协。我知道我内心并不接受这样的结果。但是,所谓妥协,跟接受和认同无关,只是学会了和解自己,也不再为难他人。

我不知道这两年生活在这两个同一时间点上的经历是礼物还是考验。几天前,脑子里总会浮现出屈原的一些词句,放弃了回忆当时那几句话在课本里面备注的含义,却很自然的理解了那些诗句的感受和含义。

我不知道什么时候才能消解内心深处的焦虑与愤怒,但是我希望自己在越来越车轻路熟处理眼下事情的时候,能保持对自己的持续感受和鞭策。

从今以后,我出发的地方,已无法归来。

可至今日,已是一种眷顾与幸运。

远去,不归。

nginx使用certbot自动更新https免费证书

个人博客的 HTTPS 证书一直使用的是免费的 Let's Encrypt 。证书获取和自动 renew 方案是参考 Jerry Qu 提供的 acme-tiny. 这个方案脚本短小精悍,是自己喜欢的风格。

但前几天发现网站的证书过期了,尝试手动运行更新脚本,发现已经无法运行。想来这个方案已经用了6年多了,索性这次迁移到使用官方的 certbot 方案。简单记录了一下迁移步骤:

https://certbot.eff.org/lets-encrypt/ubuntubionic-other

1. 安装 snapd

需要说明的是 snapd 在 Ubuntu 16.04 及以后版本都是预装的,可以跳过这个步骤。而我的服务器还停留在 14.04, 需要安装手动安装一遍:

apt-get install snapd

If you’re running Ubuntu 16.04 LTS (Xenial Xerus) or later, including Ubuntu 18.04 LTS (Bionic Beaver), Ubuntu 18.10 (Cosmic Cuttlefish) and Ubuntu 19.10 (Eoan Ermine), you don’t need to do anything. Snap is already installed and ready to go.

2. 安装 Certbot

sudo snap install –classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

3. 申请证书

因为服务器上部署了很多服务,有开源的nginx,也有自己编写的web服务,因此我仅使用 certbot 来获取和更新证书即可。证书的使用通过 post hooks 来集成。而我又不想停止我线上的服务,因此,这里使用 certonly 模式来获取证书

sudo certbot certonly –webroot -w /var/www/challenges -d www.liudanking.com -d liudanking.com

需要注意一点,需要映射一下 http 服务 /.well-known/acme-challenge path 与本地 directory 的关系。以nginx为例,可以这样配置:

To use the webroot plugin, your server must be configured to serve files from hidden directories. If /.well-known is treated specially by your webserver configuration, you might need to modify the configuration to ensure that files inside /.well-known/acme-challenge are served by the webserver.

一般,获取的证书会保存到 /etc/letsencrypt/live/DOMAIN_NAME 文件夹下,同时certbot后台也会运行一个定时调度任务,自动更新证书,防止证书过期。

4. 配置后处理钩子脚本

/etc/letsencrypt/renewal-hooks/post 添加后处理脚本renew_post.sh。这里我只需要见到的reload nginx即可:

nginx -s reload

这样,每次更新完证书,最新的证书就可以在nginx中应用生效了。

小结

certbot 整体流程还是比较简单的。但是绑定 snap 的方式不是自己喜欢的风格。考虑到这是 Let's Encrypt 官方推荐的方式,希望能够长期稳定吧。

之前在 Jerry Qu 的网站学习和参考了挺多 HTTPS 的知识和实践经验,挺感谢站长以及他的网站。今天回头看的时候,发现他已经有挺长时间没更新了,心有所触。不知道个人blog时代是不是已经远去不可及,也不知道自己还能坚持,权当是闲暇时候的反观世界时的喃喃自语吧。