歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux Stateless無狀態NAT-使用TC來配置

Linux Stateless無狀態NAT-使用TC來配置

日期:2017/2/28 15:55:18   编辑:Linux教程

如果想在Linux上配置NAT,那麼大家眾所一言的就是使用iptables的NAT表來配置,iptables提供了靈活豐富的配置來配置SNAT和DNAT,然而我們知道iptables的NAT依賴了ip_conntrack,也就是說,凡是一個命中了NAT表規則的流就會有一條連接追蹤生成,由於ip_conntrack追蹤了所有的數據包,因此當有大量連接經過了本地設備時,ip_conntrack空間將被撐滿,這個在接入區特別容易重現,在骨干網反而不容易重現,然而骨干網卻又幾乎不可能使用Linux。

如果Linux支持無狀態的NAT就好了,這樣就不怕conntrack爆滿了,也不會因為conntrack查找而深深影響效率。然而如此的無狀態NAT也有自己的缺點,那就是你必須為返回流量顯式配置NAT規則,這樣配置規則就整整增加了一倍,畢竟是無狀態的嘛,NAT工作在無狀態的IP層,而IP層是單向的。iptables正是依賴了ip_conntrack才能自動的轉換返回包的地址信息的,因為ip_conntrack根據五元素追蹤了每一個IP流。

幸運的是,Linux一直都實現了無狀態的NAT,只是其很少被人了解罷了。在Linux 2.4內核上,使用iproute2可以實現無狀態NAT,只是在2.6內核上其實現被取消了,這是因為Linux的路由模塊是基於目的地址hash或者trie tree的,然而對於同一目的地址而言,其作為負載均衡或者其它目的的多個表項卻是線性查找的,NAT的實現就是采用多個這樣的表項來完成的,這樣在大量NAT規則存在的情況下,就會增加查找時間而影響效率,www.linuxidc.com 因此自2.6.24開始,Linux使用TC來實現無狀態的NAT,雖然這樣的實現有點變態,然而卻很好的借助了TC固有的高效的查詢匹配方式。

本文不准備詳述Linux的TC機制,僅僅解析其配置NAT的方法。具體來講,NAT分為SNAT和DNAT,如果應用在網絡接口即網卡上而不是應用在協議棧的Netfilter鏈上的話,SNAT將綁定在egress方向,而DNAT將綁定在ingress方向。需要注意的是,由於基於TC的NAT是無狀態的,因此當你配置了ingress的DNAT之後,必須在相反的egress方向顯式配置SNAT,你的配置量因此將增加一倍。以下我們先來配置ingress上的DNAT規則,效果是將訪問本機的一個網卡上的一個IP裝換為該網卡上的另一個IP地址。

IP地址規劃:eth2上的兩個IP:192.168.40.249/24 12.12.12.5/24

和往常一樣,首先建立一個規則隊列,也就是qdisc:

tc qdisc add dev eth2 ingress handle ffff

Copyright © Linux教程網 All Rights Reserved