linux防火墙简介
防火墻
隔離功能,工作在網絡或主機邊緣,對進出網絡或主機的數據包基于一定的規則檢查,并在匹配某規則時由規則定義的行為進行處理的一組功能的組件,基本上的實現都是默認情況下關閉所有的通過型訪問,只開放允許訪問的策略;
國內有很多防火墻廠家如:華為、深信服、天融信、網康、啟明星辰等等;
市場主流的防火墻叫做下一代防火墻,即能夠識別應用層信息并設置安全策略,當然,很多廠家的防火墻設備其軟件核心都是linux內核,如天融信、深信服;
iptables
linux中的防火墻功能是由集成在內核中的netfilter組件提供,即內核空間,而iptables只是用戶空間的一個工具,用它來調用內核空間的netfilter組件。在centos7上,
firewalld是類似于iptables的一個用戶工具;
iptables由四表五鏈組成:
四表:
filter: ? ?? ? 過濾規則表,根據預定義的規則過濾符合條件的數據包
nat: ? ? ? ?? network address translation 地址轉換規則表
mangle: ? 修改數據標記位規則表
Raw:????????關閉NAT表上啟用的連接跟蹤機制,加快封包穿越防火墻速度
五鏈:
INPUT
OUTPUT
FORWARD
PREROUTING
POSTROUTING
結合‘四表五鏈’,數據流經過防火墻時一般有三種流向:
1、流入本機:PREROUTING流入本機:PREROUTING --> INPUT-->用戶空間進程
2、流出本機:用戶空間進程-->OUTPUT--> POSTROUTING
3、轉發:PREROUTING --> FORWARD --> POSTROUTING
數據流經過防火墻的具體過程如下:
a、當流量進入防火墻時先檢查PREROUTING鏈,如果此鏈未設置拒絕策略,則進入下一步;
b、檢查路由表,判斷此流量是否是發給自己的,如果是發給本防火墻自身的則執行‘c’步驟,如果不是發給本機則執行步驟‘e’;
c、先匹配INPUT鏈,如果此鏈允許通過,則交由本機進程處理流量數據;
d、本機進程處理結束,封裝數據包,并檢查OUTPUT鏈,執行相應策略并轉發出去,進入步驟‘f’;
e、本機只是轉發此數據,交由FORWARD鏈處理;
f、再次查看路由表,找到去往目標的路徑;
g、匹配POSTROUTING鏈,并執行策略
配置iptablles時需要明確是對哪個表哪個鏈做什么匹配并執行何種操作
下面我們舉個例子說明
| iptables -A INPUT -s 192.168.1.101 -j DROP #未指定具體表,默認是filter表,本例中是對filter表中的INPUT鏈做操作 #-A是添加鏈,-s指定源地址,-j是對匹配的數據包執行的操作 #即在filter表INPUT鏈中,匹配來自192.168.1.101訪問本機的所有流量,操作是統統丟棄 |
下面結合例子說明iptables常用的參數:
例子1、
| iptables -t nat -vnL #-t指明使用的表的類型,此處使用的是nat表 #-v詳細信息,-n以數字顯示ip地址和端口而不是域名和服務名稱,-L列出表上所有鏈的信息 |
例子2、
| iptables -A INPUT ! -s 192.168.1.101 -p icmp --icmp-type 8 -j REJECT #嘆號!表示非,即源地址為非192.168.1.101的所有地址 #-p協議,此處是icmp協議 #--icmp-type 8是ping的請求包,一次完整的ping操作由本端的request請求和對端replay回應組成,數字8表示request報文,數字0表示回應replay報文 #-j執行的動作是拒絕,REJECT與DROP都是拒絕的意思,但前者會明確回應不可到達,后者則一直不返回任何消息 #此命令含義是源地址非192.168.1.101的ping請求報文全部拒絕,也就是說只允許192.168.1.101能ping |
例子3、
| iptables -A INPUT -m iprange --src-range 192.168.1.101-192.168.1.102 -p tcp -m multiport --dports 80,22 -j REJECT #-m顯式擴展,iptables必須使用指定模塊即iprange和multiport,實現特定功能,從字面意思就能理解模塊的意思 #--src-range源地址范圍 #--dports多個目標端口,以逗號隔開,如果是連續的端口可以以冒號‘ : ’表示 |
例子4、
| iptables -A INPUT -m time --timestart 00:00 --timestop 12:00 -p tcp --dport 80 -j REJECT? #在每天凌晨到中午十二點訪問http的服務全部拒絕,此命令中用到了time的擴展模塊 iptables -A OUTPUT -m time --timestart 00:00 --timestop 12:00 -m string --algo bm --string 'google' -j REJECT? #在每天凌晨到中午十二點訪問包含‘google’字符串的流量全部拒絕 #此命令用到了time和strin的擴展模塊,--algo?bm是字符串匹配算法 |
例子5、
| iptables -A INPUT -m connlimit --connlimit-above 1 -p tcp --dport 22 -j REJECT #每ip的ssh連接超過1個就會拒絕,即每ip只允許一個ssh連接 #ssh使用tcp的22端口 #用到了擴展模塊connlimit,--connlimit-above連接超過多少,--connlimit-upto連接達到多少 iptables -I INPUT -m limit --limit 6/minute --limit-burst 10 -p icmp --icmp-type 8 -j ACCEPT #擴展模塊limit,--limit-burst 10表示前10個icmp的請求包不做限制 #--limit 6/minute?超過10個icmp請求包后,就限制每分鐘允許6個icmp請求包通過 #此命令實現了對流量的限制 |
例子6、
ftp是文件傳輸協議,使用tcp連接,但是其控制連接和數據連接使用的tcp端口不同,那么針對這種情況iptables怎么限制呢?
比如,我們只想要192.168.1.101主機能夠訪問ftp服務器,其他全部拒絕,應該怎么做?
首先我們要明白,ftp的工作原理:
1)、客戶端開啟隨機端口與服務器的21端口建立tcp連接;
2)、雙方協商使用何種模式傳輸數據,在linux上是被動模式,在windows上是主動模式;
3)、所謂被動、主動都是針對服務器端而言的,即服務器是被動接收客戶端請求還是主動向客戶端發出請求;
4)、此處我們只討論linux上的被動模式,被動模式服務器與客戶端之間建立數據連接使用的都是任意端口
所以在iptables上才不好根據端口限制,不過linux提供狀態模塊state,可以跟蹤多端口的狀態,具體請看下面例子
| iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #擴展模塊state,ESTABLISHED已經建立的連接,RELATED關聯的連接 #NEW新建立的連接 #上述兩條命令意思就是與tcp21端口建立的連接及其關聯的連接(數據連接),和已經建立的連接都執行ACCEPT允許操作 #state模塊能夠識別ftp的后續數據連接并放行,還是比較智能的 #本例中ftp服務器與防火墻是同一臺設備 #默認策略是拒絕所有ip和協議連接到本機 #本例就是只允許ftp連接(控制連接和數據連接),其他任何協議、ip、端口全部拒絕 #注意要達到state記錄狀態的效果還得安裝一個模塊,命令為'modprobe nf_conntrack_ftp' |
注意:
上述例子全部未指定表類型,所以默認都是在filter表中操作
NAT和端口轉發
防火墻還有一個常用的表:nat表
NAT就是網絡地址轉換的意思,根據應用場景分為源NAT(source)、目的NAT(destination),下面我們來分析二者的用途:
SNAT:
將數據包的源ip地址轉換為特定ip。一般企業內部都會使用私網地址如10.0.0.0/8或者172.16.0.0/16-172.31.0.0/16或者192.168.0.0/24,
但是私網地址在公網上是無法得到回應包的,即源地址是私網地址的數據包雖然能夠到達目的地,但是目標沒有回去的路由信息,即私網地址無法在公網傳輸。SNAT就是將數據包ip頭中的源地址轉換為能在公網路由的公網地址,一般用于內網用戶訪問外網資源,其優點就是節省了公網地址;
SNAT用到nat表中的鏈有:POSTROUTING
DNAT:
SNAT是轉換請求方的源ip地址,而DNAT則是轉換請求方的目標地址。即防火墻收到請求,讀取數據包中的目的ip,并將目的ip轉換為內網某臺服務器的私網地址然后將數據包轉發給那臺服務器,一般用于外網用戶訪問企業內部服務器,其優點是可以隱藏內網服務器ip,避免收到攻擊。
DNAT用到nat表的鏈有:PREROUTING
PNAT:
端口和ip都可以進行轉換,更加靈活
下面三個例子分別說明NAT的三種應用場景:
SNAT?
| iptables -t nat -A POSTROUTING -s 192.168.1.0/24 ! -d 192.168.1.0/24 -j SNAT --to-source 172.32.253.237 #不能再使用默認表,此處使用的是nat表,-j的動作是進行SNAT的轉換 #源地址是192.168.1.0/24網段的,訪問外網資源時都會轉換為172.32.253.237,對于目的而言,其認為數據包是由172.32.253.237發來的, #而不是192.168.1.0/24中的某一主機發來的 #目標主機回包時的目的地址就是172.32.253.237,由于防火墻本身會有一份表,專門記錄私網地址、端口轉換為公網地址、端口的對應關系 #所以防火墻會根據這張表找到私網主機,完成整個通信 |
DNAT
| iptables -t nat -A PREROUTING -s 172.18.0.0/16? -d 172.32.253.237 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.101:8080 #將172.32.253.237:80轉換為192.168.1.101:8080 #完成公網到私網的轉換 |
PAT
| iptables -t nat -A PREROUTING -d 192.168.1.101 -p tcp --dport 80 -j REDIRECT --to-ports 8080 #通過改變目標IP和端口,將接收的包轉發至不同地址、端口 |
本文轉自 ?a_pan ?51CTO博客,原文鏈接:http://blog.51cto.com/panpangao/1974660
總結
以上是生活随笔為你收集整理的linux防火墙简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql启动多端口
- 下一篇: linux 其他常用命令