分类 网络 下的文章


玩下认证门户的RFC标准


认证门户(Captive Portal)是生活中非常常见的上网准入方式。当我们连上一个开放式(不需要密码即可连接)的 Wi-Fi 接入点以后,几乎都不能直接访问互联网,而是需要在一个网页上进行一些认证后才可以访问,这就是认证门户。

从这种 Wi-Fi 接入点的准入方式来说,我们很容易就发现一个问题:需要访问网页才能让用户开始准入认证,但怎么才能让用户去访问呢?目前通行的一种做法是直接劫持 DNS 请求或者 HTTP 请求,重定向到认证页面。这种做法在 HTTPS 时代之前很容易做到,但是 HTTPS 时代之后就遇到了困难:由于认证门户并没有用户访问的网站的证书,要劫持用户就势必要用假的证书来进行,这样一来二去也会给用户带来信任不安全证书的坏习惯。

当然,现在的系统也都有自己的做法。比如 Windows 就会尝试用 http 连接 www.msftconnecttest.com,如果请求被重定向了,那么就会弹出页面让用户进行登录。这虽然解决了一部分问题,但是怎么看怎么不清真对吧,所以在 2015 年,RFC 7710 规定了一种方式:如果 DHCP 或 RA 在指定的 option 中发送了一个 URL,那么就引导用户前往该页面进行认证。

RFC 7710 看起来确实解决了一些问题,但是如果用户此前已经登录,其实是没必要再次登录的。这样系统还是绕不开一次互联网连通性的测试,当然 DHCP 服务器可以在通过认证的情况下不发送有关 option,然而 DHCP 服务器并不一定和计费系统是耦合的,做这种耦合也是复杂且不合适的。所以 capport 工作组设计了一套认证门户的标准,也就是 RFC 8908RFC 8910(代替 RFC 7710)。

我了解到 capport 工作组的这些内容,是因为前两天名为菜色狼的群友去了澳门,在澳门线下赌场看完性感荷官在线发牌之后回到了他下榻的喜来登酒店,连上 Wi-Fi 后发现了名为“到期时间”的内容。

csl-android.jpg

// 点开我,里面还有许多内容!


IPv6真的每个地址都能用吗


TL;DR: IPv6 子网内第一个地址是任播地址,没有需求,最好别用。

在网上冲浪的时候,经常看到过类似“IPv6 取消了子网号和广播号,所有地址都能用”这样的言论。也经常看到有人给自己的主机或路由器配上形如 2001:db8:1:2:: 的地址。那么,IPv6 真的每个地址都能用吗?

首先我们先限制一下讨论的范围,要去除各种特殊的地址,例如未指定地址 ::/128、本地回环地址 ::1/128、链路本地地址 fe80::/10 还有多播地址 ff00::/8 等,因为这些地址大家都知道有特定含义、不能乱用。这里说的都是一个普通的单播地址,即全球单播地址(Global Unicast Address,目前是 2000::/3)或者唯一本地地址(Unique Local Address,fc00::/7)范围内的子网的地址。

接着用最近流行的句式讲结论:能,但不是完全能

诚然,IPv6 中没有 IPv4 中子网的第一个地址是网络号不能用、最后一个地址是广播号不能用的规定。但在规定 IPv6 地址结构的 RFC 4291 中,介绍了一种特别的任播地址——子网路由器任播地址(Subnet-Router Anycast Address) 。这个地址似乎一直被人忽略,也很少有人提,所以知道的人并不多。这个地址就是子网的第一个地址,例如 2001:db8:2:33::/64 这个子网(范围为 2001:db8:2:33::2001:db8:2:33:ffff:ffff:ffff:ffff)中的子网路由器任播地址就是 2001:db8:2:33::2001:db8:3:4:5:6:7:8/125 这个子网(范围为 2001:db8:3:4:5:6:7:82001:db8:3:4:5:6:7:f)中的子网路由器任播地址就是 2001:db8:3:4:5:6:7:8

如果了解任播(anycast)的概念应该知道,任播是一组主机共享一个地址。对于一个分组,只有这一组主机中的一台会收到,然后做出一定的响应。子网路由器任播地址就是给需要和子网内任意一台(不是指定的一个,也不是所有的)路由器通讯这种场景所保留的。因此这个地址也是有特殊含义的,应当在特定情况下使用,而不是随意使用。

目前很多系统都支持子网路由器任播地址,例如 Linux。Linux 会在 IPv6 转发处于开启状态的时候,自动绑定上机器目前所有子网的子网路由器任播地址。虽然只有路由器才会转发 IPv6 报文,但是有些时候(尤其是我们这些网络技术爱好者),子网内某些机子很可能会打开它,例如需要给 Docker 配上 IPv6 支持的时候。这样的情况下,如果你想通过子网内的第一个地址访问路由器,就有可能会变成访问了你这台 Docker 主机。当然,你可以在网络设备(如交换机)上设置规则来限制除了你指定的路由器之外的主机响应子网路由器任播地址的邻居请求(Neighbor Solicitation)信息,但是你不应该在完全不知道这个知识去使用子网内的第一个地址。

另外,因为/127 大小的子网只有 2 个、/128 大小的子网只有 1 个地址。因此子网路由器任播地址不会在这两个尺寸的子网内起作用。说到这个也是很有趣的:最初,RFC 3627 以这个理由不让大家在路由器之间使用/127 大小的子网,因为这样的子网只有两个地址,第一个地址同时属于两台路由器,那就只有一个地址提供给单独一个路由器了。显然/127 大小的子网做路由器间互联是最合适的,因为方便计算且只有两个地址。于是后来 RFC 6164 要求子网路由器任播地址不能作用在/127 大小的子网中,这样就可以在路由器之间用/127 大小的子网互联了。原来的 RFC 3627 也在第二年被 RFC 6547 废除了。


BIRD 与 BGP 的新手开场


本文同步发布于 GitHub,如有问题、意见、建议,请移步 GitHub issue

我本来是一直不想写这个这类文章的,因为我一直认为动态路由(包括但不限于 BGP)这玩意儿基本都是学习了计算机网络基础知识的人玩的。这些人大都有足够的阅读、学习经验与能力,根据 BIRD 的官方文档也都能写出基本正确、可用的配置。而且教程往往会导致更多的新手入坑,我并不是很希望什么都不会的人在没有前置知识储备的基础下来研究这个,所以一直没动笔。

但是在我对入坑的新手的行为观察下来,好像有很多人只是想拥有自己的 ASN 然后实名上网,并不想、或没时间对计算机网络、对 BIRD 的配置文件进行深一度的研究和学习,亦或者是因为语言问题,没有去阅读文档。配置文件只是拿别人放出来的进行拼凑(如某些个人博客,和 Vultr 的样例),知其然而不知其所以然,也造成了很多错误的理解。出于这些原因,我还是动笔写下了这篇文章,希望能为新手留下尽量正确的理解。

话虽如此,我还是希望新手能在学习一部分计算机网络的基础后再来,不然有些部分可能会理解困难。

以及建议学习的话选择开几台虚拟机,或者在 DN42(一个世界性的很大的实验性互联网)上进行试验。只有在不满足于在本地或 DN42 实验的情况下,想要真真正正的自己当 ISP,才申请、租用互联网上的 ASN 和 IP 地址资源。

// 点开我,里面还有许多内容!


业务逻辑丢前端,很强


“教育系统很多bug都来自业务逻辑丢前端,以及表单数据处理不严格。”
—— Soha King

0x00 无关的背景介绍

又到了一学期一度的选修课选课时间!已经高二下半学期的Soha将迎来最后一期选修课。高一刚入学的时候选了金老师的某课程,然而之前那个学期并没有开课。这一次听说我们班大部分同学选了这节课,我心里也有点痒。(毕竟这是我们的信息技术任课老师,超可爱)

// 点开我,里面还有许多内容!


刚才抓了三段浙江电信插广告的脚本


<script src="http://61.160.200.223:7701/main.js?v=3.93&amp;sp=311&amp;ty=dpc" type="text/javascript" id="bdstat"></script>
<script type="text/javascript" src="http://61.160.200.252:9988/info.js?sn=ads93971065&amp;time=1462675608898&amp;aid=6956&amp;sp=311&amp;sda_man=BwcFD11LWVpaWlZJ&amp;src=0&amp;mobile=0&amp;mobileFixed=0&amp;width_page=1349&amp;width_screen=1366&amp;url=http%3A//weibo.com/sohaking/home%3Fwvr%3D5%26lf%3Dreg"></script>
<script type="text/javascript" src="http://61.160.200.252:9002/"></script>

有空研究一下