????????通過(guò)一段時(shí)間的學(xué)習(xí),我發(fā)現(xiàn)目前尚未有公開的技術(shù)實(shí)現(xiàn)NAPT的動(dòng)態(tài)配置,僅僅通過(guò)iptables實(shí)現(xiàn)一些固定的配置無(wú)法滿足動(dòng)態(tài)配置的需求。因此,本系列博客目的在于通過(guò)對(duì)Netfilter和Iptables的學(xué)習(xí),通過(guò)內(nèi)核編程實(shí)現(xiàn)Full Cone, Restricted Cone, Port Restricted Cone和Symmetric NAPT的配置。
? ? 介紹iptables和Netfilter的文獻(xiàn)資料相當(dāng)?shù)亩?,隨便一搜就可以搜到一堆詳細(xì)的資料。在這里我僅僅簡(jiǎn)單介紹下iptables和Netfilter,重點(diǎn)在于介紹二者的關(guān)系以及如何運(yùn)用。
? ? 首先,我們要明白iptables位于用戶空間,而Netfilter屬于Linux內(nèi)核,是目前常用的網(wǎng)絡(luò)框架。在此由上圖說(shuō)明iptables和Netfilter的位置。iptables和Netfilter的關(guān)系其實(shí)更像是一種為了方便人們使用Netfilter而設(shè)計(jì)的一套方便的在用戶空間調(diào)用的API接口。通過(guò)getlongopt()設(shè)計(jì)了一整套API,人們使用的時(shí)候只需要在命令行輸入相應(yīng)的iptables命令,即可轉(zhuǎn)化為一套通信“語(yǔ)言”實(shí)現(xiàn)用戶空間和內(nèi)核的通信從而實(shí)現(xiàn)我們需要的配置,即操縱Netfilter。
? ? 也就是說(shuō),iptbles只是一種官方設(shè)計(jì)的方便我們使用Netfilter的用戶空間命令行,而不是必須使用的。如果有必要,我們完全可以自己定義一套自己的API命令行。比如NiuBiIptables ?BALABALA。。。。但是,iptables還是相當(dāng)好用的,功能很全面而且支持?jǐn)U展。因此不是迫不得已完全沒有這個(gè)必要。我們實(shí)現(xiàn)NAT的動(dòng)態(tài)配置也僅僅只是做了iptables的擴(kuò)展,在Netfilter中實(shí)現(xiàn)新的功能,在iptables設(shè)計(jì)新的功能的擴(kuò)展API方便調(diào)用。在后來(lái)自己寫著玩的時(shí)候做了個(gè)類似于tc的擾流工具,又花了些時(shí)間做了基于Netfilter的內(nèi)核網(wǎng)絡(luò)流浪探測(cè)工具(實(shí)現(xiàn)功能類似于Iperf)。這些由于不方便使用Iptables我就自己只做了一些簡(jiǎn)單的工具,而不是使用Iptabes。這些屬于后話,不是本文的核心。
? ? 因此,為實(shí)現(xiàn)NAT類型動(dòng)態(tài)配置,我們需要做以下工作:
(1)擴(kuò)展iptables命令,添加新的命令操縱NAT類型配置
(2)內(nèi)核編程,添加NAT類型配置模塊
? ? 在這里,安利一波Source Insight,看源碼非常好用。iptables和Netfilter的代碼位于不同的位置。本文的配置最終在Openwrt上實(shí)現(xiàn),代碼來(lái)源于Openwrt的源碼,其中iptables位于,Netfilter位于。當(dāng)然在Ubuntu等Linux系統(tǒng)中也是肯定有的,其中Ubuntu14.04kylin的位置分別在。下文中對(duì)于Iptables和Netfilter的源碼分析會(huì)再給出地址。
? ? 為了方便理解,先舉個(gè)例子說(shuō)明整個(gè)iptables到Netfilter的流程:
? ? 比如說(shuō),我們配置一條端口限制型錐型的規(guī)則,讓NAT變成端口限制型錐型。
? ? 首先,我們?cè)诿钚谢蚰_本輸入
? ? iptables -t nat -A POSTROUTING -j ?MASQUERADE
? ? 這條命令中,-t nat指定了配置規(guī)則在NAT表,-A POSTROUTING指定了添加(ADD)在POSTROUTING點(diǎn),-j MASQUERADE表明添加的規(guī)則為端口限制型。這些命令具體用法可以查看相應(yīng)資料,不是本文重點(diǎn)。
? ? 輸入命令后,該命令被iptables中的getlongopt分析并調(diào)用相應(yīng)API,之后通過(guò)內(nèi)核和用戶空間通信將已有規(guī)則拷貝過(guò)來(lái),再根據(jù)我們配置的新規(guī)則進(jìn)行修改,然后將全部規(guī)則回傳給內(nèi)核空間。內(nèi)核空間中Netfilter收到規(guī)則即激活對(duì)應(yīng)代碼。MASQUERADE的對(duì)應(yīng)為ipt_MASQUERADE,該程序調(diào)用的API在對(duì)應(yīng)的nf_nat_MASQUERADE中。由此實(shí)現(xiàn)了整個(gè)流程。
? ? 具體的代碼分析在第二講中繼續(xù)進(jìn)行分析。