Linux实现基于Loopback的NVI(NAT Virtual Interface)
2013-10-04 13:48:57 来源:WEB开发网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表示的路由这个前提的。
- ››Linux实现基于Loopback的NVI(NAT Virtual Interfa...
- ››Linux远程访问windows时,出现"连接被对端重...
- ››linux中使用head命令和tail命令查看文件中的指定行...
- ››linux swap 分区调控(swap分区 lvm管理)
- ››Linux脚本中用户自定义终止符-EOF
- ››Linux测量kernel子模块加载时间的方法
- ››Linux内核Oracle相关参数信息
- ››linux下用tar命令将当前目录下文件按子目录压缩归...
- ››linux下如何做ghost
- ››linux中多线程解析
- ››linux下用cron定时执行任务的方法
- ››Linux进程阻塞的相关知识
更多精彩
赞助商链接