linux網(wǎng)絡(luò)知識詳解:iptables 規(guī)則介紹
iptables規(guī)則
下圖為數(shù)據(jù)包到達(dá)linux主機(jī)網(wǎng)卡后,內(nèi)核如何處理數(shù)據(jù)包的大致流程
什么是規(guī)則
規(guī)則是管理員對數(shù)據(jù)包制定的一種觸發(fā)機(jī)制,即當(dāng)數(shù)據(jù)包達(dá)到某種條件,就執(zhí)行指定的動(dòng)作。
條件:可以是數(shù)據(jù)包源地址、目的地址、協(xié)議等
動(dòng)作:可以是拒絕、接受、丟棄等;詳細(xì)介紹見下表
動(dòng)作 | 說明 |
---|---|
ACCEPT | 將封包放行,進(jìn)行完此處理動(dòng)作后,將不再比對其它規(guī)則,直接跳往下一個(gè)規(guī)則鏈(nat:postrouting) |
REJECT | 攔阻該封包,并傳送封包通知對方,可以傳送的封包有幾個(gè)選擇:ICMP port-unreachable、ICMP echo-reply 或是 tcp-reset(這個(gè)封包會要求對方關(guān)閉聯(lián)機(jī)),進(jìn)行完此處理動(dòng)作后,將不再比對其它規(guī)則,直接 中斷過濾程序。 |
DROP | 丟棄封包不予處理,進(jìn)行完此處理動(dòng)作后,將不再比對其它規(guī)則,直接中斷過濾程序。 |
MASQUERADE | 改寫封包來源 IP 為防火墻 NIC IP,可以指定 port 對應(yīng)的范圍,進(jìn)行完此處理動(dòng)作后,直接跳往下一個(gè)規(guī)則煉(mangle:postrouting)。這個(gè)功能與 SNAT 略有不同,當(dāng)進(jìn)行 IP 偽裝時(shí),不需指定要偽裝成哪個(gè) IP,IP 會從網(wǎng)卡直接讀取,當(dāng)使用撥接連線時(shí),IP 通常是由 ISP 公司的 DHCP 服務(wù)器指派的,這個(gè)時(shí)候 MASQUERADE 特別有用。 |
SNAT | 改寫封包來源 IP 為某特定 IP 或 IP 范圍,可以指定 port 對應(yīng)的范圍,進(jìn)行完此處理動(dòng)作后,將直接跳往下一個(gè)規(guī)則煉(mangle:postrouting)。 |
DNAT | 改寫封包目的地 IP 為某特定 IP 或 IP 范圍,可以指定 port 對應(yīng)的范圍,進(jìn)行完此處理動(dòng)作后,將會直接跳往下一個(gè)規(guī)則煉(filter:input 或 filter:forward)。 |
MARK | 將封包標(biāo)上某個(gè)代號,以便提供作為后續(xù)過濾的條件判斷依據(jù),進(jìn)行完此處理動(dòng)作后,將會繼續(xù)比對其它規(guī)則。 |
RETURN | 結(jié)束在目前規(guī)則煉中的過濾程序,返回主規(guī)則煉繼續(xù)過濾,如果把自訂規(guī)則煉看成是一個(gè)子程序,那么這個(gè)動(dòng)作,就相當(dāng)于提早結(jié)束子程序并返回到主程序中。 |
使用iptables命令寫入規(guī)則示例:
iptables -t filter -A INPUT -i eth0 -p tcp -s 192.168.1.0/24 -m multiport --dports 443,80 -j ACCEPT #-t:操作那個(gè)表 #-A:在表末追加規(guī)則;-I為表首插入規(guī)則、-D為刪除規(guī)則 #INPUT:鏈名稱;該規(guī)則在那條鏈上生效 #-j:數(shù)據(jù)包處理動(dòng)作;比如接受、拒絕等
整條命令解釋:允許經(jīng)過本機(jī)網(wǎng)卡eth0,訪問協(xié)議是TCP,源地址是192.168.1.0/24 段的數(shù)據(jù)包訪問本地端口是80和443的服務(wù)
什么是表
表主要用來存放具體的防火墻規(guī)則,而規(guī)則具有功能性,比如修改數(shù)據(jù)包源/目的ip、拒絕來自某個(gè)網(wǎng)段的數(shù)據(jù)包訪問本機(jī)等;所以我們可以對規(guī)則進(jìn)行分類,不同的功能存入不同的表
- raw表:主要用于決定數(shù)據(jù)包是否被狀態(tài)跟蹤機(jī)制處理
- mangle表:主要用于拆解報(bào)文修改數(shù)據(jù)包的 IP 頭信息
- nat表:主要用于修改數(shù)據(jù)包的源地址和目的地址、端口號等信息(實(shí)現(xiàn)網(wǎng)絡(luò)地址轉(zhuǎn)換,如SNAT、DNAT、MASQUERADE、REDIRECT)。
- filter表:主要用于對過濾流入和流出的數(shù)據(jù)包,根據(jù)具體的規(guī)則決定是否放行該數(shù)據(jù)包
- security 表:最不常用的表,用在 SELinux 上;用于強(qiáng)制訪問控制(MAC)網(wǎng)絡(luò)規(guī)則,由Linux安全模塊(如SELinux)實(shí)現(xiàn)
其中nat表和filter表最常用
什么是鏈
上文提到表主要存放具體的規(guī)則,但是規(guī)則什么時(shí)候生效呢?比如客戶端訪問VIP,數(shù)據(jù)包到達(dá)本機(jī)后必須先用DNAT(網(wǎng)絡(luò)地址轉(zhuǎn)換)將vip轉(zhuǎn)換成實(shí)際的后端實(shí)例ip,然后才能路由判斷,因?yàn)楹蠖藢?shí)例可能有多個(gè)且分布在不同主機(jī),直接用vip進(jìn)行路由判斷肯定是不行的。所以規(guī)則有生效時(shí)機(jī),根據(jù)生效時(shí)機(jī)可以分為:
- PREROUTING:在數(shù)據(jù)包到達(dá)防火墻時(shí),進(jìn)行路由判斷之前執(zhí)行的規(guī)則
- INPUT:路由判斷之后確定數(shù)據(jù)包流入本機(jī),應(yīng)用其規(guī)則
- FORWARD:路由判斷之后確定數(shù)據(jù)包要轉(zhuǎn)發(fā)給其他主機(jī),應(yīng)用其規(guī)則;linux主機(jī)需要開啟ip_forward功能才支持轉(zhuǎn)發(fā),在/etc/sysctl.conf文件中配置參數(shù)net.ipv4.ip_forward=1
- OUTPUT:本機(jī)應(yīng)用向外發(fā)出數(shù)據(jù)包時(shí),應(yīng)用其規(guī)則
- POSTROUTING:在數(shù)據(jù)包離開防火墻時(shí)進(jìn)行路由判斷之后執(zhí)行的規(guī)則
在每條鏈中,規(guī)則按照從上到下的順序進(jìn)行匹配,當(dāng)一個(gè)數(shù)據(jù)包與某個(gè)規(guī)則匹配成功后,就會按照該規(guī)則的動(dòng)作進(jìn)行處理,并且后續(xù)的規(guī)則將不再被考慮。
表、鏈、規(guī)則三者的關(guān)系是什么
表是區(qū)分相同鏈的上下順序,規(guī)則在每條鏈中的上下順序確定規(guī)則執(zhí)行順序:
- 如果規(guī)則來自不同表,通過表的優(yōu)先級確定鏈的優(yōu)先級: 比如完整的PREROUTING鏈中有來自raw表、mangle表、nat標(biāo)的PREROUTING鏈規(guī)則,通過表優(yōu)先級 (raw>mangle>nat>filter>security) 區(qū)分優(yōu)先級。所以一個(gè)報(bào)文發(fā)送到某臺虛擬機(jī)后,被虛擬機(jī)網(wǎng)卡接收,會進(jìn)入的虛擬機(jī)網(wǎng)絡(luò)協(xié)議棧處理,先經(jīng)過PREROUTING鏈處理,具體來說先走raw表的PREROUTING規(guī)則、再走mangle表、最后在走nat表PREROUTING規(guī)則。
- 如果規(guī)則來自同一個(gè)表,則按規(guī)則插入表的順序自上而下。
數(shù)據(jù)報(bào)文進(jìn)/出節(jié)點(diǎn)經(jīng)過哪些規(guī)則
對于客戶端來說,發(fā)送報(bào)文過程
先進(jìn)入OUTPUT鏈處理(raw、mangle、nat、filter、security表對應(yīng)的PREROUTING規(guī)則依次匹配),如果沒有被攔截則根據(jù)路由選擇出網(wǎng)口,再進(jìn)入POSTROUTING鏈處理(mangle、nat表對應(yīng)的POSTROUTING規(guī)則依次匹配),最后從網(wǎng)卡出去對于服務(wù)端來說,發(fā)送報(bào)文過程
先進(jìn)入PREROUTING鏈處理(raw、mangle、nat表對應(yīng)的PREROUTING規(guī)則依次匹配),根據(jù)路由判斷數(shù)據(jù)報(bào)文發(fā)給本機(jī),報(bào)文進(jìn)入INPUT鏈處理(mangle、nat、filter、security表對應(yīng)的INPUT規(guī)則依次匹配),如果沒有被攔截則報(bào)文被應(yīng)用程序處理對于轉(zhuǎn)發(fā)場景,發(fā)送報(bào)文過程
先進(jìn)入PREROUTING鏈處理(raw、mangle、nat表對應(yīng)的PREROUTING規(guī)則依次匹配),根據(jù)路由判斷數(shù)據(jù)報(bào)文不是發(fā)給本機(jī),報(bào)文進(jìn)入FORWARD鏈處理(mangle、filter、security表對應(yīng)的FORWARD規(guī)則依次匹配),如果沒有被攔截則進(jìn)入POSTROUTING鏈處理(mangle、nat表對應(yīng)的POSTROUTING規(guī)則依次匹配),最后從網(wǎng)卡出去*補(bǔ)充:轉(zhuǎn)發(fā)場景需要Linux開啟轉(zhuǎn)發(fā)功能,否則數(shù)據(jù)報(bào)文進(jìn)入FORWARD鏈直接丟棄;臨時(shí)開啟執(zhí)行命令
sysctl net.ipv4.ip_forward=1
或者echo "1" >/proc/sys/net/ipv4/ip_forward
;永久生效需要修改/etc/sysctl.conf,增加內(nèi)容net.ipv4.ip_forward = 1保存,再執(zhí)行命令:sysctl -p
NAT(網(wǎng)絡(luò)地址轉(zhuǎn)換)介紹
NAT應(yīng)用最廣的場景就是解決局域網(wǎng)內(nèi)設(shè)備訪問互聯(lián)網(wǎng)的問題。
SNAT(源地址轉(zhuǎn)換) 主要用于修改數(shù)據(jù)包的源IP和源端口,一般在nat表的PREROUTING鏈中增加規(guī)則:局域網(wǎng)內(nèi)所有設(shè)備要上外網(wǎng),如果每個(gè)設(shè)備都分配一個(gè)公網(wǎng)ip成本太大,可以在路由器出口分配一個(gè)公網(wǎng)ip,局域網(wǎng)內(nèi)的設(shè)備訪問外網(wǎng)時(shí)統(tǒng)一走路由器出口,路由器此時(shí)需要做兩件事:
- 數(shù)據(jù)包從出口出去之前,將數(shù)據(jù)包的源地址和源端口改成公網(wǎng)ip和隨機(jī)端口
- 同時(shí)將轉(zhuǎn)換關(guān)系記錄保存,響應(yīng)數(shù)據(jù)包返回時(shí)根據(jù)記錄轉(zhuǎn)發(fā)給局域網(wǎng)內(nèi)的設(shè)備
SNAT示例:
iptables -t nat -A POSTROUTING -d 192.168.1.11 -p tcp --dport 88 -j SNAT --to-source 122.9.3.47:88 # -j:值為SNAT需要靜態(tài)指定修改后的值,值為MASQUERADE表示動(dòng)態(tài)修改源地址為出口網(wǎng)卡地址 # --to-source:將數(shù)據(jù)包的源地址轉(zhuǎn)換成指定值 # 整條命令解釋:將發(fā)給192.168.1.11:88的數(shù)據(jù)包,其源地址改為122.9.3.47
DNAT(目的地址轉(zhuǎn)換) 主要用于修改數(shù)據(jù)包目的地址和端口路由器,一般在nat表中的PREROUTING鏈中增加規(guī)則:接收到數(shù)據(jù)包后,將目的地址和目的端口根據(jù)轉(zhuǎn)換規(guī)則修改為實(shí)際的內(nèi)網(wǎng)地址,規(guī)則需要提前在路由器上手動(dòng)添加,如下圖:將訪問公網(wǎng)ip 100...155:10022的數(shù)據(jù)包轉(zhuǎn)發(fā)給內(nèi)網(wǎng)設(shè)備172.30.100.136:22
DNAT示例:
iptables -t nat -A PREROUTING -d 202.12.10.100 -p tcp --dport 20022 -j DNAT --to-destination 192.168.10.11:22 # --to-destination:修改數(shù)據(jù)包的目的地址 # 整條命令解釋:將發(fā)給202.12.10.100:20022的數(shù)據(jù)包,其目的地址改為192.168.10.11:22
注意:linux內(nèi)核使用CONNTRACK表(連接跟蹤)記錄NAT轉(zhuǎn)換關(guān)系,一個(gè)連接僅在首次經(jīng)過iptables鏈條時(shí)會計(jì)算nat表,一旦conntrack記錄下這次的改寫關(guān)系,后續(xù)無論是去程包還是回程包都是依據(jù)conntrack表進(jìn)行改寫關(guān)系的處理,不會再重復(fù)執(zhí)行nat表中的DNAT/SNAT規(guī)則
以上就是linux網(wǎng)絡(luò)知識詳解:iptables 規(guī)則介紹的詳細(xì)內(nèi)容,更多關(guān)于linux網(wǎng)絡(luò)知識詳解:iptables 規(guī)則介紹的資料請關(guān)注腳本之家其它相關(guān)文章!
- Linux下iptables 禁止端口和開放端口示例
- 詳解Linux防火墻iptables禁IP與解封IP常用命令
- linux防火墻iptables規(guī)則的查看、添加、刪除和修改方法總結(jié)
- 詳解Linux iptables 命令
- Linux使用iptables限制多個(gè)IP訪問你的服務(wù)器
- Linux服務(wù)器利用防火墻iptables策略進(jìn)行端口跳轉(zhuǎn)的方法
- linux防墻iptables詳細(xì)介紹、配置方法與案例
- Linux防火墻iptables添加白名單方式
- 在Linux中如何列出和刪除Iptables防火墻規(guī)則
- Linux如何利用iptables屏蔽某些域名
相關(guān)文章
Centos 6.5環(huán)境實(shí)現(xiàn)本地局域網(wǎng)搭建YUM的方法【基于HTTP】
這篇文章主要介紹了Centos 6.5環(huán)境實(shí)現(xiàn)本地局域網(wǎng)搭建YUM的方法,較為詳細(xì)的分析了CentOS6.5基于HTTP實(shí)現(xiàn)本地局域網(wǎng)搭建YUM的具體步驟、相關(guān)命令與操作注意事項(xiàng),需要的朋友可以參考下2018-04-04Linux 新的API signalfd、timerfd、eventfd使用說明
這篇文章主要介紹了Linux 新的API signalfd、timerfd、eventfd使用說明的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下2016-10-10linux expect 自動(dòng)登錄交換機(jī)保存配置的方法
今天小編就為大家分享一篇linux expect 自動(dòng)登錄交換機(jī)保存配置的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07Linux性能監(jiān)控工具nmon安裝及使用教程解析
這篇文章主要介紹了Linux性能監(jiān)控工具nmon安裝及使用教程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07Linux下tar解壓錯(cuò)誤:文件損壞與不完整問題的解決方案
在日常的 Linux 系統(tǒng)管理中,我們經(jīng)常需要使用 tar 命令來壓縮和解壓文件,然而,有時(shí)在解壓過程中會遇到諸如“文件損壞”或“意外結(jié)束”等錯(cuò)誤提示,本文將詳細(xì)分析這些問題的原因,并提供一套完整的解決方案,需要的朋友可以參考下2025-02-02一道題理解Linux中sort命令的多個(gè)參數(shù)
今天小編就為大家分享一篇關(guān)于一道題理解Linux中sort命令的多個(gè)參數(shù),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-03-03