linux網(wǎng)絡(luò)——iptables與網(wǎng)關(guān)
最近做關(guān)WiFi家庭網(wǎng)關(guān)項(xiàng)目,接觸到很多新的知識(shí),本文對(duì)linux的iptables、網(wǎng)關(guān)中的NAT轉(zhuǎn)換、DMZ、端口映射和端口觸發(fā)等概念進(jìn)行總結(jié)
linux iptableslinux iptables是linux2.6內(nèi)核以后使用的一套網(wǎng)絡(luò)工具,對(duì)其進(jìn)行合理的配置,可實(shí)現(xiàn)防火墻、NAT轉(zhuǎn)換等網(wǎng)關(guān)功能
好,那么iptables怎么配置,這些配置是如何實(shí)現(xiàn)的呢
iptables配置方法應(yīng)用層的iptables是一個(gè)可執(zhí)行程序,iptabltes- h可看到命令幫助,這里首先要說明一下iptables中的3個(gè)層次遞進(jìn)的概念:表(table)、鏈(chain)和規(guī)則(target),iptables應(yīng)用程序命令就是對(duì)某個(gè)表的某個(gè)鏈的某個(gè)規(guī)則操作
iptables默認(rèn)有4張表,nat、filter、mangle和raw,項(xiàng)目中使用了nat和filter,所以這里只說nat和filter
每個(gè)表都有幾條默認(rèn)的鏈,nat默認(rèn)有PREROUTING、INPUT、OUTPUT、POSTROUTING4個(gè)鏈,filter默認(rèn)有INPUT、FORWARD、OUTPUT3個(gè)鏈,表不可增減,但是表中的鏈可自定義增加或刪除
命令格式 : iptables -t [table] -[opt] [chain] -j ...
命令的格式變化太多,且無(wú)需記住所有命令,關(guān)鍵是實(shí)際中如何使用,常用哪些,后續(xù)再說
這里不會(huì)分析源碼,只注重大局和框架,上圖最方便
上圖表示的是網(wǎng)絡(luò)數(shù)據(jù)從網(wǎng)卡驅(qū)動(dòng)接收程序中跳轉(zhuǎn)到協(xié)議層后,都經(jīng)歷了哪些東東,這些過程屬于linux的net子系統(tǒng),與設(shè)備無(wú)關(guān)
所有報(bào)文都經(jīng)過這個(gè)圖,從PREROUTING這里,報(bào)文的mac已經(jīng)被剝離,即從以后是三層處理,主要關(guān)注報(bào)文的ip地址,先拋開這些點(diǎn)是干嘛的,理一理數(shù)據(jù)報(bào)的流向
PREROUTING點(diǎn)表示還未進(jìn)行路由之前,經(jīng)過路由后,報(bào)文的流向無(wú)非是兩個(gè)結(jié)果,要么該報(bào)文是發(fā)往本機(jī)的,即上面一條路,要么是發(fā)往其他設(shè)備的,走下面一條路
如果是發(fā)往本機(jī),則經(jīng)過IUPUT點(diǎn),到達(dá)Localhost,即發(fā)往上層協(xié)議處理,處理之后,還會(huì)經(jīng)過一個(gè)路由,判斷發(fā)往哪里
如果是發(fā)往其他設(shè)備,則經(jīng)過FORWARD點(diǎn)進(jìn)行轉(zhuǎn)發(fā)
最后所有數(shù)據(jù)報(bào)都會(huì)經(jīng)過POSTROUTING點(diǎn),出設(shè)備
這些點(diǎn)和iptables中的表和鏈?zhǔn)鞘裁搓P(guān)系?此即彼
iptables在內(nèi)核中的實(shí)現(xiàn)是通過netfilter完成的,本質(zhì)上是在這些預(yù)先設(shè)置好的點(diǎn)上添加各種內(nèi)核鉤子函數(shù),當(dāng)程序執(zhí)行到這些點(diǎn)上時(shí),按照iptables應(yīng)用程序配置的規(guī)則進(jìn)行處理,是接收、丟棄、轉(zhuǎn)發(fā),還是NAT轉(zhuǎn)換…,iptables和內(nèi)核通信通過netlink完成,當(dāng)然出于某些特殊需求,你也可以自己添加鉤子函數(shù),怎么添加,看/linux-2.6-xxx/net/netfilter/下的幾個(gè)源碼自然會(huì)了
NAT轉(zhuǎn)換NAT轉(zhuǎn)換是干嘛?轉(zhuǎn)換ip地址,為什么要轉(zhuǎn)換?一是地址不夠了,二是保護(hù)內(nèi)網(wǎng)
地址不夠的問題就要涉及到網(wǎng)絡(luò)地址劃分了,不展開說,地址分為A、B、C、D、E五類,所有地址中選取一些地址作為私有地址,只用于內(nèi)網(wǎng),它們是
10.0.0.0 ~ 10.255.255.255
172.16.0.0 ~ 172.31.255.255
192.168.0.0 ~ 192.168.255.255
怎么保護(hù),外網(wǎng)不可訪問內(nèi)網(wǎng),內(nèi)網(wǎng)可以訪問外網(wǎng)
iptables的表nat專門用于設(shè)置和處理NAT轉(zhuǎn)換的規(guī)則,內(nèi)網(wǎng)訪問外網(wǎng)資源時(shí),將源ip地址轉(zhuǎn)換為一個(gè)外網(wǎng)地址,該過程叫SNAT,iptables設(shè)置后,也可以讓外網(wǎng)訪問內(nèi)網(wǎng)部分資源,將目的ip地址轉(zhuǎn)換為一個(gè)內(nèi)網(wǎng)地址,該過程叫DNAT,說白了,核心在于對(duì)網(wǎng)絡(luò)結(jié)構(gòu)的理解,對(duì)iptables進(jìn)行配置,以控制數(shù)據(jù)流的走向
DMZDMZ是干嘛的,官話是位于外網(wǎng)和防火墻之間的一個(gè)區(qū)域,可放置一些私人服務(wù)器資源,供外網(wǎng)訪問,上圖來(lái)理解
上圖中,共有三個(gè)區(qū)域,外網(wǎng)、DMZ和內(nèi)網(wǎng),一般用戶家中如果不放置私人服務(wù)器等東東,沒有DMZ
外網(wǎng)在網(wǎng)關(guān)左側(cè),DMZ和內(nèi)網(wǎng)在網(wǎng)關(guān)右側(cè),表明DMZ和內(nèi)網(wǎng)都是私有地址,內(nèi)網(wǎng)包括用戶會(huì)使用的PC、手機(jī)等設(shè)備,這些設(shè)備必須與外網(wǎng)嚴(yán)格隔離,不可被外網(wǎng)入侵,DMZ區(qū)域放置一些可以被外網(wǎng)訪問的服務(wù)器
一般的規(guī)則是:外網(wǎng)可訪問DMZ,不可訪問內(nèi)網(wǎng),DMZ不可訪問外網(wǎng)和內(nèi)網(wǎng),內(nèi)網(wǎng)可訪問外網(wǎng)和DMZ
但是規(guī)則都是人定的,關(guān)鍵在于iptables的配置,怎么玩都行其實(shí)