工控网络基础入门篇之建立table概念

你可以认为 table 是一个网络访问请求 (数据流) 的容器。一般情况下,我们可以把符合一定特征的网络访问请求 (数据流) 都收集到一个 table 中,这样当我们需要对有这一类特征的网络访问请求进行处理时,就可以直接操作这个 table 了,而不需要一条一条的去处理。

在 linux 操作系统中,table 就是一个 0 到 255 的数字,当然我们也可以在 “/etc/iproute2/rt_tables” 文件中给 table 数字对应上一个名称,然后就可以用这个名称来操作这个 table 了。例如我们的 OpenWRT 系统里的 rt_tables 文件默认是这样的:

local,main,default,unspec 这些都是系统内建的 ip table,可以看到他们分别都对应了一个数字,你操作 table 254 和操作 table main 其实是完全一样的。我们也可以修改这个文件,建立一个自己的 table,例如我们可以建立一个 ID 为 10,名字叫 vpn 的 table。如果我们想要在访问被封锁网站的时候通过 VPN 接口出去,那我们就可以先对这些数据打上标签4.2.2,然后用 ip rule 命令把有这些标签的数据全部加入一个table。

把数据添加到 table

假定我们现在已经把要访问全部被封锁网站的数据打上了标签 1(fwmark 1),我们又已经建立了一个名叫 vpn 的 table,那么命令就可以这样写:

先阅读一下 man page 上对这个命令的注释:

说明如下: 

1. ip rule add 表示添加一条规则。 

2. fwmark 1 表示符合 fwmark(标签) 值等于 1 的数据。 

3. priority 1984,表示这条规则的优先级是 1984,每条命令必须有独立的优先级。优先级从 0 到 32767,数字越小优先级越高,但 0、32766、32767 一般都是已经分配的,所以你要在这几个数中间选一个数作为优先级。

4. table vpn 表示把这些数据全部添加到 vpn 这个 table 里去。

如果想检查已有的 ip rule,可以用以下的命令: 

一般情况下你会看到如下的回显:

让 table 数据走 VPN 接口 

现在我们已经有了一个 table 了,如何让这个 table 走 VPN 接口呢? 先阅读一下 man page 上的说明:

很复杂? 那我们看看实际用到的命令:

是不是瞬间觉得很亲切了?ip route 和前面的 route 命令几乎是一样的,只不过后面多了一个 table vpn,表示添加默认接口这个动作只是用于 table vpn 里的数据的,这个灵活性就是 route 命令所没有的了。注意!这里的 pptp-VPN 也是要根据你系统实际 VPN 接口的名称修改的。我们这里没有指定网关 IP(例如 “via 10.10.10.10.1”) 之类的,因为一般一个接口连接上之后,如果网关支持 DHCP,那么在分配 IP 的时候也就会把默认网关通告给客户端,不需要我们去额外指定。除非你的 VPN 不支持 DHCP,但这这种 VPN 我还没见过。

如果你想确认某个 table 是不是走了 VPN 接口还是别的接口,可以用如下命令:

如果确实添加默认接口成功了,你应该看到

其实这个添加默认接口的命令是应该早于你往这个 table 添加数据的,以免数据进来了却不知道要从哪里走,所以完整的顺序是:

1. 修改/etc/iprout2/rt_tables 建立一个 table

2. 给这个 table 指定一个默认的网络接口 

3. 给指定的数据打上标签

4. 把打上了标签的数据添加到这个 table 里去