WEB开发网
开发学院操作系统Linux/Unix Linux实现基于Loopback的NVI(NAT Virtual Interfa... 阅读

Linux实现基于Loopback的NVI(NAT Virtual Interface)

 2013-10-04 13:48:57 来源:WEB开发网   
核心提示:32764: from all fwmark 0x64 lookup loop32766: from all lookup main 32767: from all lookup default说明:这是一个策略,匹配一个FWMARK,Linux实现基于Loopback的NVI(NAT Virtual Inter
32764: from all fwmark 0x64 lookup loop
32766: from all lookup main
32767: from all lookup default
说明:这是一个策略,匹配一个FWMARK,该MARK由RAW表打上,用于识别是第一次路由查询还是第二次路由查询,第一次路由查询用来实现NAT和一切和conntrack相关的操作,第二次查询实现真正的IP路由。

主路由:
default dev lo scope link
说明:主路由表中什么都没有了,就有一条默认路由通过loopback接口发出。如上所述,这次的路由查询是“第一次有关NAT”的路由查询,目的就是要让数据包经过一次PRE-ROUTING和POST-ROUTING。

策略路由表loop:
192.168.40.249 dev eth2 scope link
192.168.2.0/24 dev eth1 scope link src 192.168.2.249
192.168.40.0/24 dev eth2 scope link
default via 192.168.40.254 dev eth2
说明:我是将所有的main路由表中内容全部搬到策略路由表了,包括直连的链路层路由。因为我希望我的这套地址仅仅作为IP路由+NAT的辅助地址存在,就连直连的主机也不能通过直连路由发出了,因为main表中不再有直连路由了,所以直连流量也会进入loopback,完成故作的第一次路由之旅。凡是数据包打上了100标签,就会去查询loop路由表,如上所述,这次路由查询是“第二次真正的路由查询”。此次查询就可以用source做policy routing了,因为源地址转换已经完成了。

Local路由表:
local 192.168.2.249 dev eth2 proto kernel scope host src 192.168.2.249
local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
说明:参与SNAT的地址要从Local表中删除。因为IP路由不允许从本机发起的包经过loopback接口发往其它地方,如果SNAT将过路数据包的源地址转换成了一个本机的IP地址,那么在反向路由验证的时候,就会失败。详细点说还是由于Linux对待loopback流量的方式导致,由于Linux协议栈在output的时候就设置input的路由项,所以根本就不会到达ip_route_input,因此不允许loopback流量被forwarding。 但是,将物理网卡上的IP地址移出Local表有个副作用,那就是ARP逻辑不会再回复针对这些IP的ARP请求,因为将地址移出Local表相当于放弃了该地址的所有权。但是针对这个“下一跳解析协议”的问题有很多解决方法,比如静态设置,比如专门配置一个代理,比如arping。

缺陷:本实现虽然大体实现了NVI的功能,但是还缺点什么。比如数据包经过loopback接口这么一绕,原始的入接口信息就会丢失,需要复杂的conntrack规则才能将其映射到IP-FWMARK。

分离的IP地址用途的体现
本例中,内网口和外网口上配置的IP地址完全用于路由,不再属于本机,你不能指望通过这些IP地址来访问BOX本身,因为为了让反向路由检查可以通过,这些地址标示的Local路由已经从Local表中被删除了,所以它们不再标示主机。另外值得注意的是,不单单如此,该BOX连针对这些配置在物理网卡上IP地址的ARP请求都不会回复,因为Linux是否回复ARP请求是基于可以在Local表中查到该IP表示的路由这个前提的。

上一页  1 2 3 

Tags:Linux 实现 基于

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接