iptables是Linux系統(tǒng)提供的一個強(qiáng)大的防火墻工具燎猛,可以實(shí)現(xiàn)包過濾、包重定向照皆、NAT轉(zhuǎn)換等功能重绷。iptables是免費(fèi)的,iptables是一個工具膜毁,實(shí)際的功能是通過netfilter模塊來實(shí)現(xiàn)的昭卓,在內(nèi)核2.4版本后默認(rèn)集成到了Linux內(nèi)核中。
一爽茴、 iptables的構(gòu)成
1. 規(guī)則(rules)
規(guī)則是iptables對數(shù)據(jù)包進(jìn)行操作的基本單元葬凳。即“當(dāng)數(shù)據(jù)包符合規(guī)則定義的條件時,就按照規(guī)則中定義的動作去處理”室奏。
規(guī)則中定義的條件一般包括源地址/端口火焰、目的地址/端口、傳輸協(xié)議(TCP/UDP/ICMP)等胧沫。而規(guī)則定義的動作一般有放行(ACCEPT)昌简、拒絕(REJECT)和丟棄(DROP)等。
配置iptables實(shí)際上就是增刪修改這些規(guī)則绒怨。
2. 鏈(chains)
鏈?zhǔn)菙?shù)據(jù)包傳播的路徑纯赎,每條鏈中都有若干個規(guī)則。當(dāng)一個數(shù)據(jù)包到達(dá)一條鏈時南蹂,iptables會按照規(guī)則的順序犬金,從該鏈的第一條規(guī)則開始往下檢查,如果有條件匹配的規(guī)則,則按照規(guī)則定義的動作執(zhí)行晚顷;否則繼續(xù)檢查下一條規(guī)則峰伙。如果該數(shù)據(jù)包和鏈中所有的規(guī)則都不匹配,則iptables會根據(jù)該鏈預(yù)先定義的默認(rèn)策略來處理數(shù)據(jù)包该默。
3. 表(tables)
iptables內(nèi)置了4個表瞳氓,即filter表、nat表栓袖、mangle表匣摘、raw表,分別用于實(shí)現(xiàn)包過濾裹刮、網(wǎng)絡(luò)地址轉(zhuǎn)換音榜、包修改和數(shù)據(jù)跟蹤處理等功能。每個表中含有若干條鏈必指,具體的規(guī)則就是根據(jù)實(shí)現(xiàn)目的的不同囊咏,添加到不同表的不同鏈中。
如下圖所示塔橡,各個表相關(guān)的鏈:
raw表有2條鏈:PREROUTING梅割、OUTPUT
mangle表有5條鏈:PREROUTING、POSTROUTING葛家、INPUT户辞、OUTPUT、FORWARD
nat表有3條鏈:PREROUTING癞谒、POSTROUTING底燎、OUTPUT
filter表有3條鏈:INPUT、FORWARD弹砚、OUTPUT
4個表的優(yōu)先級為:raw > mangle > nat > filter
二双仍、iptables的傳輸過程
當(dāng)數(shù)據(jù)包到達(dá)網(wǎng)卡時,首先會進(jìn)入PREROUTING鏈(注意桌吃,raw表處理完后就不會再進(jìn)入nat表了)朱沃,完成PREROUTING鏈中規(guī)則的匹配和執(zhí)行后(比如DNAT),iptables根據(jù)數(shù)據(jù)包的目的IP是否為本機(jī)地址茅诱,判斷是否需要將該數(shù)據(jù)包轉(zhuǎn)發(fā)出去逗物。
1.? 如果數(shù)據(jù)包的目的IP為本機(jī)地址,它就會進(jìn)入INPUT鏈瑟俭◆嶙浚可以在filter表的INPUT鏈中添加包過濾規(guī)則,限制哪些數(shù)據(jù)包可以訪問本機(jī)摆寄;經(jīng)過INPUT鏈中的規(guī)則處理后失暴,剩下的數(shù)據(jù)包在本機(jī)上任何進(jìn)程都可以收到坯门,并根據(jù)需要對它們進(jìn)行處理;當(dāng)進(jìn)程處理完后逗扒,需要發(fā)送出去的數(shù)據(jù)包會經(jīng)過OUTPUT鏈的處理田盈,然后到達(dá)POSTROUTING鏈,經(jīng)過處理(比如SNAT)后輸出缴阎。
2. 如果數(shù)據(jù)包的目的IP不是本機(jī)地址(比如做了DNAT、或者只是作為默認(rèn)網(wǎng)關(guān)時走過來的包)简软,并且系統(tǒng)內(nèi)核開啟了轉(zhuǎn)發(fā)功能(ip_forward參數(shù)為1)蛮拔,則數(shù)據(jù)包會進(jìn)入FORWARD鏈;此時可以在filter表的FORWARD鏈中設(shè)置相應(yīng)的規(guī)則進(jìn)行處理痹升;經(jīng)過FORWARD鏈的數(shù)據(jù)包再走到POSTROUTING鏈中處理(比如執(zhí)行SNAT)建炫,最后輸出。
綜上疼蛾,數(shù)據(jù)包在iptables中的傳輸鏈路有兩種情況:
第一種:PREROUTING -> FORWARD -> POSTROUTING
第二種:PREROUTING -> INPUT -> LOCALHOST -> OUTPUT -> PUSTROUTING
所以肛跌,要想對數(shù)據(jù)包進(jìn)行控制,主要可以在上面幾條鏈路中添加規(guī)則察郁。
(可以發(fā)現(xiàn)LVS的NAT模式下衍慎,會經(jīng)過PREROUTING鏈(nat表) -> FORWARD鏈 -> POSTROUTING鏈(nat表),請求的轉(zhuǎn)發(fā)在PREROUTING鏈中進(jìn)行DNAT皮钠,響應(yīng)在POSTROUTING鏈中進(jìn)行SNAT稳捆。無論時請求還是響應(yīng)都不會走到INPUT鏈和OUTPUT鏈中)
三、 iptables的使用
iptables對鏈的操作方法有:-I(插入)麦轰,-A(追加)乔夯,-R(替換),-D(刪除)款侵,-L(顯示)
注意末荐,-I是將規(guī)則插入到第一行,-A是將規(guī)則追加到鏈的最后一行新锈。
iptables -F:清除所有的規(guī)則
iptables -F -t nat:清除nat表的規(guī)則
iptables -P INPUT DROP:配置INPUT鏈的默認(rèn)規(guī)則為DROP
示例:
iptables -t filter -A INPUT -s 192.168.1.10 -j ACCEPT
這是一條簡單的規(guī)則甲脏,表示在filter表的INPUT鏈中追加一條規(guī)則,規(guī)則的匹配條件是數(shù)據(jù)包的源IP為192.168.1.10壕鹉,執(zhí)行動作為允許(ACCEPT)剃幌,即允許源IP為192.168.1.10地址的消息訪問本機(jī)。
iptables中晾浴,默認(rèn)表名就是filter负乡,所以上面的規(guī)則也可以寫成:
iptables -A INPUT -s 192.168.1.10 -j ACCEPT
iptables規(guī)則的匹配條件中常用的參數(shù)有:
-s匹配源地址
-d匹配目的地址
--sport匹配源端口
--dport匹配目的端口
-p匹配協(xié)議
-i匹配輸入的網(wǎng)卡
-o匹配輸出的網(wǎng)卡
!取反
-j規(guī)則的執(zhí)行動作
示例:配置NAT轉(zhuǎn)發(fā)實(shí)現(xiàn)內(nèi)網(wǎng)節(jié)點(diǎn)訪問公網(wǎng)
環(huán)境假設(shè):
路由節(jié)點(diǎn):
Lan口:192.168.1.10/24 eth0
Wan口:50.75.153.98/24 eth1
內(nèi)網(wǎng)節(jié)點(diǎn):192.168.1.92
1. 在內(nèi)網(wǎng)節(jié)點(diǎn)上配置默認(rèn)網(wǎng)關(guān)為路由節(jié)點(diǎn)的Lan口脊凰,確保內(nèi)網(wǎng)節(jié)點(diǎn)的包都能走到路由節(jié)點(diǎn)抖棘。
route add default gw 192.168.1.10
2. 在路由節(jié)點(diǎn)上打開linux的路由轉(zhuǎn)發(fā)功能茂腥。
sysctl -w net.ipv4.ip_forward=1
3. 將FORWARD鏈的默認(rèn)策略設(shè)置為DROP
iptables -P FORWARD DROP
這樣確保對內(nèi)網(wǎng)的控制,只把允許訪問公網(wǎng)的IP添加到規(guī)則中切省。
4. 允許任意地址之間的確認(rèn)包和關(guān)聯(lián)包通過最岗。
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
這條規(guī)則很關(guān)鍵,否則即使后面添加了允許IP訪問的規(guī)則也沒用朝捆。
5. 允許指定IP地址訪問公網(wǎng)
iptables -A FORWARD -s 192.168.1.92/24 -j ACCEPT
6. 配置一條SNAT規(guī)則般渡,將內(nèi)網(wǎng)節(jié)點(diǎn)的源IP轉(zhuǎn)換為公網(wǎng)IP后,再將消息發(fā)出芙盘。
iptables -t nat -A POSTROUTING -s 192.168.1.92 -j SNAT --to 50.75.153.98
示例:配置NAT轉(zhuǎn)發(fā)實(shí)現(xiàn)公網(wǎng)用戶訪問內(nèi)網(wǎng)節(jié)點(diǎn)
環(huán)境假設(shè):
路由節(jié)點(diǎn):
Lan口:192.168.1.10/24 eth0
Wan口:50.75.153.98/24 eth1
內(nèi)網(wǎng)節(jié)點(diǎn):192.168.1.92
1.? 在路由節(jié)點(diǎn)上打開linux的路由轉(zhuǎn)發(fā)功能驯用。
sysctl -w net.ipv4.ip_forward=1
2. 將FORWARD鏈的默認(rèn)策略設(shè)置為DROP
iptables -P FORWARD DROP
這樣確保對內(nèi)網(wǎng)的控制,只把允許訪問的IP添加到規(guī)則中儒老。
3. 允許任意地址之間的確認(rèn)包和關(guān)聯(lián)包通過蝴乔。
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
這條規(guī)則很關(guān)鍵,否則即使后面添加了允許IP訪問的規(guī)則也沒用驮樊。
4. 允許訪問指定的IP地址
iptables -A FORWARD -d 192.168.1.92 -j ACCEPT
5. 配置一條DNAT規(guī)則薇正,將訪問路由節(jié)點(diǎn)的公網(wǎng)地址轉(zhuǎn)換為訪問內(nèi)網(wǎng)節(jié)點(diǎn)的私網(wǎng)地址。
iptables -t nat -A PREROUTING -d 50.75.153.98 -j DNAT --to 192.168.1.92
PS:用iptables的raw表解決ip_conntrack:table full, dropping packet的問題
raw表中包含PREROUTING鏈和OUTPUT鏈囚衔,優(yōu)先級最高挖腰,可以對數(shù)據(jù)包在進(jìn)入NAT表的PREROUTING鏈之前對消息進(jìn)行處理。當(dāng)用戶啟用了RAW表练湿,消息在經(jīng)過RAW表的PREROUTING鏈處理后曙聂,將跳過NAT表和ip_conntrack處理,不再做地址轉(zhuǎn)換和數(shù)據(jù)包的鏈接跟蹤處理鞠鲜。
所以raw表可以用在那些不需要做nat和鏈接跟蹤的情況宁脊,提升系統(tǒng)性能。因?yàn)閱⒂面溄痈檿r贤姆,系統(tǒng)會建立一個鏈接跟蹤表榆苞,每個消息進(jìn)來時,都會去查詢鏈接跟蹤表霞捡,當(dāng)系統(tǒng)業(yè)務(wù)量過大時坐漏,可能會引發(fā)系統(tǒng)CPU消耗過高。
可以通過在RAW表的PREROUTING鏈中配置NOTRACK標(biāo)記碧信,使數(shù)據(jù)包不再進(jìn)入nat表赊琳,達(dá)到不做鏈接跟蹤的目的,如:
iptables -t raw -A PREROUTING -p tcp -d 192.168.1.10 --dport 80 -j NOTRACK
iptables -A FORWARD -m state --state UNTRACKED -j ACCEPT
表示對訪問192.168.1.10:80服務(wù)的消息在raw表的PREROUTING鏈中添加NORTRACK標(biāo)記砰碴,以后訪問這個服務(wù)的消息都不會再進(jìn)行鏈接跟蹤躏筏。
另外,再附上鳥哥的iptables流程圖呈枉,可以看到各個鏈也是根據(jù)不同的表區(qū)分優(yōu)先級的趁尼。