May the #! be with you

搭建网关系列 —— 路由篇

| Stephen Zhang | Comments

策略路由简介

使用过vpn的同学可能手动配置过一些路由设置,不过大多数时候可能做的都是目的路由, 也就是基于目的地址的选路。目的路由大概的样子如下:

ip route add 8.8.8.8 via XX dev $vpn
ip route add $blocked-network via XX dev $vpn
ip route replace 0/0 via dev $pppoe
...

但是在为一个稍有规模的网络配置路由时,目的路由有时候会力不从心。例如这些需求:

  • 小明想要所有的流量全都走 isp1 出去
  • 小红想要所有的流量全部走 isp2 出去
  • 小华想要所有443的流量全部走 isp1,其他流量走 isp2
  • ……

这样的需求,单纯使用目的路由肯定就不够了,对于相同的目的,不同的人希望走不同的路由 ...

搭建网关系列 —— iptables篇

| Stephen Zhang | Comments

做网关,iptables是必备的工具,也是一枚神器。 简单的说,iptables的功能就是对所有流过网关的包进行修改,并决定是放行还是丢弃。 当然,网关最重要的功能一个是防火墙,另外一个是路由。 iptables本身无法决定路由,但是它可以影响每一个包的路由。

iptables基本概念

iptables的概念说复杂也复杂,说简单其实也很简单。 要解释清楚每一条规则是怎么运作的很麻烦,需要有许多背景知识,不过大多数规则都能从字面看懂含义。 这篇文章里可能有些地方只会点一下,有些地方会稍微讲的深入一些,我能力有限,也无法把握好这个度。

首先说一下看教程时能够看到的几个名词:table, chain, target, rule。

通常来说,我们看到的iptables脚本(其实是bash脚本)里的每一条iptables命令都会创建一条规则(rule), 每条规则会包含三个元素:table、chain和target。

其中table通常用来从大方向上区分这条规则是干什么的, 比如filter表主要是决策符合条件的包是被丢弃或放行或进一步处理, nat表主要用来做对ip包头的源、目标地址进行修改, mangle表主要用来对数据包的内容进行修改。 但这样分表的主要原因是因为不同的工作需要用到不同的内核模块,这应该是实现所需。 就通常使用而言,我们不需要深入的去理解、区分每一个表究竟能干什么,死记硬背(记不清时查man page)其实挺好的。

链(chain ...

搭建网关系列 —— VLAN篇

| Stephen Zhang | Comments

为何使用vlan

在接触vlan之前,总是觉得vlan是一个很高大上的东西,感觉这辈子我不可能用上。 (许多码农都这样吧,所有不明真相的东西都是高大上的东西。) vlan的作用简单的说就是隔离,在上学时看到这个东西,认为或许只有大公司人很多的时候采用的上吧。 初次接触vlan是在公司里,有一阵子大家突然发现有许多ip冲突,虽然ip冲突的主要原因是因为不规范 的手动配置ip,但根本原因是设备越来越多。 于是我就脑子一热,让公司买了个支持vlan的交换机,将大家按部门划分网段,每个部门一个网段, 每个网段内的主机数量都比较少了,这时候跟大家约定每个网段里有一个不太大的dhcp池, 手动指定ip时请避开dhcp池,于是基本没有了ip冲突。这里就通过vlan来将大家划分网段。

那么家里的网络为何要使用vlan呢?根据预告篇的介绍, 现在家里有两个isp接入,如果直接接到路由器上,那么路由器至少要有三个网卡(两个上联,一个局域网)。 现在2个以上网口的设备并不多(要么自己攒一台多网卡的主机,要么是很贵的专用路由设备)。 VLAN在起到隔离作用的同时,其实也为路由器虚拟出多个网卡。

vlan基本概念简介

这里并不打算解剖vlan的以太网帧头这类细节,感兴趣的童鞋可以作为课外作业自己充电。 这里更注重实用主义,知道的东西够用就行了。

vlan可以简单的理解为对每一个正常的以太网包 打上一个tag,用来区分不同的网络,这个tag可以是1-4096。 那么vlan具体如何工作呢?我们对照下图(openwrt的vlan配置 ...

搭建网关系列 —— 预告篇

| Stephen Zhang | Comments

最近离职了,回家休息一阵子。闲下来,花点时间总结一下这两年的工作。 也将其中一些有意思的东西整理出博客文章来。 这两天好好折腾了一下家里的网络,所以第一波打算写写关于搭建网关的事。

打算写一系列文章,介绍与搭建网关会用到的概念、工具和使用,初步计划包括以下内容:

  • VLAN篇 将介绍VLAN的基本概念,在debian中如何使用。
  • iptables篇 将介绍如何使用iptables配置防火墙、转发、NAT等功能。
  • 路由篇 将简单介绍iproute2套件,讲述简单的目的路由、策略路由,以及如何实现自定义( 智能)路由。
  • 隧道篇 将介绍常用的隧道,如ipip、gre、sit,未解决某些国情造成的问题,隧道的效果比 vpn要好很多。

超线程竞争问题引发的思考

| Stephen Zhang | Comments

问题起因

Varnish有一个bug(或者说feature也许更合适一些),有一个项资源sess_mem,对应一个计数器n_sess, 有人要用就+1,用完就-1,另外有一个函数会根据这个数字来决定是否要预分配更多的空间。 这里,为了避免太多的性能损耗,所以对n_sess的操作并没有加锁。在多线程(本文中多线程均指软件概念上的线程, 超线程指CPU的超线程技术)的环境下对同一个变量进行不加锁的读写肯定是有问题的,但是,因为在一段时间内+- 的数量相当,因此一个线程中+和-操作被其他线程吞没的概率也相当,所以最终n_sess距离精确值的偏差(后面称漂移) 应该在一个比较小的范围内(即误差应该比较小),varnish认可这个误差,通过其他方式来定期的校准一下(例如定期 的数一下实际被使用的sess_mem有多少个)这个值。

然而,问题来了,有人发现,在启用了超线程(Hyper-Threading)的机器上,varnish经常会出现疯狂的分配 ...