防火牆(Firewall),也稱防禦牆,是由Check Point創立者Gil Shwed於1993年發明並引入國際互連網(US5606668(A)1993-12-15)。它是一項信息安全的防禦系統,依照特定的規則,容許或是限制傳輸的數據經過。python
分類:shell
基本上,依據防火牆管理的範圍,我們能夠將防火牆區分為網域型與單一主機型的控管。數據庫
在單一主機型的控管方面, 主要的防火牆有封包過濾型的 Netfilter 與依據服務軟體程式做為分析的 TCP Wrappers 兩種。vim
若以區域型的防火牆而言, 由於此類防火牆都是當做路由器角色,所以防火牆類型主要則有封包過濾的 Netfilter 與利用代理伺服器 (proxy server) 進行存取代理的方式了。安全
說明:服務器
netfilter (封包過濾機制)cookie
所謂的封包過濾,亦便是分析進入主機的網路封包,將封包的表頭資料捉出來進行分析,以決定該連線為放行或抵擋的機制。 由於這種方式能夠直接分析封包表頭資料,因此包括硬體位址(MAC), 軟體位址 (IP), TCP, UDP, ICMP 等封包的資訊均可以進行過濾分析的功能,所以用途很是的廣泛。(其實主要分析的是 OSI 七層協定的 2, 3, 4 層)在 Linux 上面我們使用核心內建的 Netfilter 這個機制,而 Netfilter 提供了 iptables 這個軟體來做為防火牆封包過濾的指令。由於 Netfilter 是核心內建的功能,所以他的效率很是的高! 很是適合於通常小型環境的設定呢!Netfilter 利用一些封包過濾的規則設定,來定義出什麼資料能夠接收, 什麼資料須要剔除,以達到保護主機的目的.網絡
TCP Wrappers (程式控管)app
另外一種抵擋封包進入的方法,為透過伺服器程式的外掛 (tcpd) 來處置的!與封包過濾不一樣的是, 這種機制主要是分析誰對某程式進行存取,然後透過規則去分析該伺服器程式誰能夠連線、誰不能連線。 由於主要是透過分析伺服器程式來控管,所以與啟動的埠口無關,只與程式的名稱有關。 舉例來說,我們知道 FTP 能夠啟動在非正規的 port 21 進行監聽,當你透過 Linux 內建的 TCP wrappers 限制 FTP 時, 那麼你只要知道 FTP 的軟體名稱 (vsftpd) ,然後對他做限制,則無論 FTP 啟動在哪個埠口,都會被該規則管理的。tcp
Proxy (代理伺服器)
其實代理伺服器是一種網路服務,它能夠『代理』使用者的需求,而代為前往伺服器取得相關的資料。就有點像底下這個圖示吧:
在客服機與網絡之間增長代理來對傳輸的數據作出管理。
Version 2.0:使用 ipfwadm
Version 2.2:使用 ipchains ;
Version 2.4 ~ 2.6 :主要是使用 iptables
基本原理
以下圖所示,當報文來到時先進行拆包而後逐一匹配設置的規則,匹配上時執行規則對應的動做,須要注意的是規則的處理順序:若是在某個規則匹配後將包丟棄是不會進行後面的處理的。
但實際上netfilter的處理流程更爲複雜。
實際流程
以下圖所示, 根據防火牆規則的特性分類,將規則使用Filter, Mangle, nat 和自定義等三個不一樣的表分別管理起來。
filter:主要跟進入 Linux 本機的封包有關,這個是預設的 table
INPUT:主要與想要進入我們 Linux 本機的封包有關;
OUTPUT:主要與我們 Linux 本機所要送出的封包有關;
FORWARD:和本機處理無關,與nat有較多關聯,用於轉包
nat : 是 Network Address Translation 的縮寫, 這個表格主要在進行來源與目的之 IP 或 port 的轉換,與 Linux 本機較無關,主要與 Linux 主機後的區域網路內電腦較有相關。
PREROUTING:在進行路由判斷以前所要進行的規則(DNAT/REDIRECT)
POSTROUTING:在進行路由判斷之後所要進行的規則(SNAT/MASQUERADE)
OUTPUT:與發送出去的封包有關
mangle :這個表格主要是與特殊的封包的路由旗標有關, 早期僅有 PREROUTING 及 OUTPUT 鏈,不過從 kernel 2.4.18 之後加入了 INPUT 及 FORWARD 鏈。 由於這個表格與特殊旗標相關性較高,因此像咱們這種單純的環境當中,較少使用 mangle 這個表格。
當包來到時的處理流程以下
封包進入 Linux 主機使用資源 (路徑 A): 在路由判斷後確定是向 Linux 主機要求資料的封包,主要就會透過 filter 的 INPUT 鏈來進行控管;
封包經由 Linux 主機的轉遞,沒有使用主機資源,而是向後端主機流動 (路徑 B): 在路由判斷以前進行封包表頭的修訂做業後,發現到封包主要是要透過防火牆而去後端,此時封包就會透過路徑 B 來跑動。 也就是說,該封包的目標並非我們的 Linux 本機。主要經過的鏈是 filter 的 FORWARD 以及 nat 的 POSTROUTING, PREROUTING。 這路徑 B 的封包流向使用情況。
封包由 Linux 本機發送出去 (路徑 C): 例如回應用戶端的要求,或者是 Linux 本機主動送出的封包,都是透過路徑 C 來跑的。先是透過路由判斷, 決定了輸出的路徑後,再透過 filter 的 OUTPUT 鏈來傳送的!當然,最終還是會經過 nat 的 POSTROUTING 鏈。
iptables [-t tables] [-L] [-nv]選項與參數:
-t :後面接 table ,例如 nat 或 filter ,若省略此項目,則使用預設的 filter
-L :列出目前的 table 的規則
-n :不進行 IP 與 HOSTNAME 的反查,顯示訊息的速度會快不少!
-v :列出更多的資訊,包括通過該規則的封包總位元數、相關的網路介面等
範例: 列出 filter table 三條鏈的規則 [root@www ~]# iptables -L -nChain INPUT (policy ACCEPT) <==針對 INPUT 鏈,且預設政策為可接受 target prot opt source destination <==說明欄 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED <==第 1 條規則 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 <==第 2 條規則 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 <==第 3 條規則 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 <==如下類推 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT) <==針對 FORWARD 鏈,且預設政策為可接受target prot opt source destinationREJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibitedChain OUTPUT (policy ACCEPT) <==針對 OUTPUT 鏈,且預設政策為可接受target prot opt source destination範例:列出 nat table 三條鏈的規則[root@www ~]# iptables -t nat -L -nChain PREROUTING (policy ACCEPT) target prot opt source destination Chain POSTROUTING (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
iptables [-t tables] [-FXZ]選項與參數: -F :清除全部的已訂定的規則; -X :殺掉全部使用者 "自定義" 的 chain (應該說的是 tables ); -Z :將全部的 chain 的計數與流量統計都歸零範例:清除本機防火牆 (filter) 的全部規則
iptables [-t nat] -P [INPUT,OUTPUT,FORWARD] [ACCEPT,DROP]選項與參數: 當你的封包不在你設定的規則以內時,則該封包的經過與否,是以 Policy 的設定爲準.-P :定義政策( Policy )。注意,這個 P 爲大寫啊! ACCEPT :該封包可接受 DROP :該封包直接丟棄,不會讓 client 端知道爲什麼被丟棄。
iptables [-AI 鏈名] [-io 網絡接口] [-p 協議] \> [-s 來源IP/網域] [-d 目標IP/網域] -j [ACCEPT|DROP|REJECT|LOG]選項與參數: -AI 鏈名:針對某的鏈進行規則的 "插入" 或 "累加" -A :新增長一條規則,該規則增長在本來規則的最後面。例如本來已經有四條規則, 使用 -A 就能夠加上第五條規則! -I :插入一條規則。若是沒有指定此規則的順序,默認是插入變成第一條規則。 例如本來有四條規則,使用 -I 則該規則變成第一條,而本來四條變成 2~5 號 鏈 :有 INPUT, OUTPUT, FORWARD 等,此鏈名稱又與 -io 有關,請看底下。 -io 網絡接口:設定封包進出的接口規範 -i :封包所進入的那個網絡接口,例如 eth0, lo 等接口。需與 INPUT 鏈配合; -o :封包所傳出的那個網絡接口,需與 OUTPUT 鏈配合; -p 協定:設定此規則適用於哪一種封包格式 主要的封包格式有: tcp, udp, icmp 及 all 。 -s 來源 IP/網域:設定此規則之封包的來源項目,可指定單純的 IP 或包括網域,例如: IP :192.168.0.100 網域:192.168.0.0/24, 192.168.0.0/255.255.255.0 都可。 若規範爲『不準』時,則加上 ! 便可,例如: -s ! 192.168.100.0/24 表示不準 192.168.100.0/24 之封包來源; -d 目標 IP/網域:同 -s ,只不過這裏指的是目標的 IP 或網域。 -j :後面接動做,主要的動做有接受(ACCEPT)、丟棄(DROP)、拒絕(REJECT)及記錄(LOG)
iptables [-AI 鏈] [-io 網絡接口] [-p tcp,udp] [-s 來源IP/網域] [--sport 埠口範圍] [-d 目標IP/網域] [--dport 埠口範圍] -j [ACCEPT|DROP|REJECT]選項與參數: --sport 埠口範圍:限制來源的端口號碼,端口號碼能夠是連續的,例如 1024:65535 --dport 埠口範圍:限制目標的端口號碼。
iptables -A INPUT [-m state] [--state 狀態]選項與參數: -m :一些 iptables 的外掛模塊,主要常見的有: state :狀態模塊 mac :網絡卡硬件地址 (hardware address) --state :一些封包的狀態,主要有: INVALID :無效的封包,例如數據破損的封包狀態 ESTABLISHED:已經聯機成功的聯機狀態; NEW :想要新創建聯機的封包狀態; RELATED :這個最經常使用!表示這個封包是與咱們主機發送出去的封包有關 最典型的就是ftp鏈接,當ftp的數據通道(20端口)的第一個包來時,就會被認爲是RELATED,由於它和處於ETABLISHED狀態的命令通道(21端口)的鏈接有關係。
示例:
只要已創建或相關封包就予以經過,只要是不合法封包就丟棄 iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A INPUT -m state --state INVALID -j DROP
針對局域網絡內的 aa:bb:cc:dd:ee:ff 主機開放其聯機 iptables -A INPUT -m mac --mac-source aa:bb:cc:dd:ee:ff -j ACCEP T選項與參數: --mac-source :就是來源主機的 MAC
iptables -A INPUT [-p icmp] [--icmp-type 類型] -j ACCEPT 選項與參數: --icmp-type :後面必需要接 ICMP 的封包類型,也可使用代號, 例如 8 表明 echo request 的意思。
/usr/share/doc/kernel-doc-2.6.32/Documentation/networking/ip-sysctl.txt
咱們在前一章談到所謂的阻斷式服務 (DoS) 攻擊法當中的一種方式,就是利用 TCP 封包的 SYN 三向交握原理所達成的, 這種方式稱爲 SYN Flooding 。那如何預防這種方式的攻擊呢?咱們能夠啓用核心的 SYN Cookie 模塊啊! 這個 SYN Cookie 模塊能夠在系統用來啓動隨機聯機的埠口 (1024:65535) 即將用完時自動啓動。
當啓動 SYN Cookie 時,主機在發送 SYN/ACK 確認封包前,會要求 Client 端在短期內回覆一個序號,這個序號包含許多本來 SYN 封包內的信息,包括 IP、port 等。若 Client 端能夠回覆正確的序號,那麼主機就肯定該封包爲可信的,所以會發送 SYN/ACK 封包,不然就不理會此一封包。
透過此一機制能夠大大的下降無效的 SYN 等待端口,而避免 SYN Flooding 的 DoS 攻擊說! 那麼如何啓動這個模塊呢?很簡單,這樣作便可:
echo "1" > /proc/sys/net/ipv4/tcp_syncookies
可是這個設定值因爲違反 TCP 的三向交握 (由於主機在發送 SYN/ACK 以前須要先等待 client 的序號響應), 因此可能會形成某些服務的延遲現象,例如 SMTP (mail server)。 不過總的來講,這個設定值仍是不錯用的! 只是不適合用在負載已經很高的服務器內喔! 由於負載過高的主機有時會讓核心誤判遭受 SYN Flooding 的攻擊呢。
若是是爲了系統的 TCP 封包聯機優化,則能夠參考 tcp_max_syn_backlog, tcp_synack_retries, tcp_abort_on_overflow 這幾個設定值的意義。
阻斷式服務常見的是 SYN Flooding ,不過,咱們知道系統其實能夠接受使用 ping 的響應, 而 ping 的封包數據量是能夠給很大的!想象一個情況, 若是有個搞破壞的人使用 1000 臺主機傳送 ping 給你的主機,並且每一個 ping 都高達數百 K bytes時, 你的網絡帶寬會怎樣?要嘛就是帶寬被吃光,要嘛可能系統會當機! 這種方式分別被稱爲 ping flooding (不斷髮 ping) 及 ping of death (發送大的 ping 封包)。
那如何避免呢?取消 ICMP 類型 8 的 ICMP 封包迴應就是了。咱們能夠透過防火牆來抵擋, 這也是比較建議的方式。固然也可讓核心自動取消 ping 的響應。不過你必需要了解, 某些局域網絡內常見的服務 (例如動態 IP 分配 DHCP 協議) 會使用 ping 的方式來偵測是否有重複的 IP ,因此你最好不要取消全部的 ping 響應比較好。
核心取消 ping 迴應的設定值有兩個,分別是:/proc/sys/net/ipv4 內的 icmp_echo_ignore_broadcasts (僅有 ping broadcast 地址時才取消 ping 的迴應) 及 icmp_echo_ignore_all (所有的 ping 都不迴應)。鳥哥建議設定 icmp_echo_ignore_broadcasts 就行了。 你能夠這麼作:
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
我們的核心還能夠針對不一樣的網絡接口進行不同的參數設定喔!網絡接口的相關設定放置在 /proc/sys/net/ipv4/conf/ 當中,每一個接口都以接口代號作爲其表明,例如 eth0 接口的相關設定數據在 /proc/sys/net/ipv4/conf/eth0/ 內。那麼網絡接口的設定數據有哪些比較須要注意的呢? 大概有底下這幾個:
rp_filter:稱爲逆向路徑過濾 (Reverse Path Filtering), 能夠藉由分析網絡接口的路由信息配合封包的來源地址,來分析該封包是否爲合理。舉例來講,你有兩張網卡,eth0 爲 192.168.1.10/24 ,eth1 爲 public IP 。那麼當有一個封包自稱來自 eth1 ,可是其 IP 來源爲 192.168.1.200 , 那這個封包就不合理,應予以丟棄。這個設定值建議能夠啓動的。
log_martians:這個設定數據能夠用來啓動記錄不合法的 IP 來源, 舉例來講,包括來源爲 0.0.0.0、127.x.x.x、及 Class E 的 IP 來源,由於這些來源的 IP 不該該應用於 Internet 啊。 記錄的數據默認放置到核心放置的登陸檔 /var/log/messages
accept_source_route:或許某些路由器會啓動這個設定值, 不過目前的設備不多使用到這種來源路由,你能夠取消這個設定值。
accept_redirects:當你在同一個實體網域內架設一部路由器, 但這個實體網域有兩個 IP 網域,例如 192.168.0.0/24, 192.168.1.0/24。此時你的 192.168.0.100 想要向 192.168.1.100 傳送訊息時,路由器可能會傳送一個 ICMP redirect 封包告知 192.168.0.100 直接傳送數據給 192.168.1.100 便可,而不需透過路由器。由於 192.168.0.100 與 192.168.1.100確實是在同一個實體線路上 (二者能夠直接互通),因此路由器會告知來源 IP 使用最短路徑去傳遞數據。但那兩部主機在不一樣的 IP 段,倒是沒法實際傳遞訊息的!這個設定也可能會產生一些輕微的安全風險,因此建議關閉他。
send_redirects:與上一個相似,只是此值爲發送一個 ICMP redirect 封包。 一樣建議關閉。(事實上,鳥哥就曾經爲了這個 ICMP redirect 的問題傷腦筋!其實關閉 redirect 的這兩個項目便可啊!)
開啓路由功能
echo "1" > /proc/sys/net/ipv4/ip_forward
當咱們使用-m state模塊功能的時候,iptables除了裝載xt_state.ko模塊外,還裝載ip_conntrack.ko,接着它會創建
/proc/net/ip_conntrack數據庫
保存各類超時的文件在 /proc/sys/net/ipv4/netfilter/*
如
ip_conntrack_tcp_timeout_syn_sent 120s ip_conntrack_tcp_timeout_syn_recv 60s ip_conntrack_tcp_timeout_syn_established 432000s ip_conntrack_udp_timeout 30s ip_conntrack_udp_timeout_stream 180s ip_conntrack_ICMP_timeout 30s
追蹤的最大鏈接數 /proc/sys/net/ipv4/ip_conntrack_max
系統默認爲 最大內存(K)/16K/(系統位數/32),若 512M內存,則默認的最大鏈接數爲 32768
要修改這個限制,必須以手動方式加載 ip_contrack模塊,命令爲:
modprobe ip_conntrack hashsize=16384
每一個hashsize可容納8條鏈接,那麼修改後鏈接數爲16384*8=131072
每條鏈接消耗內存爲228B,能夠查看/var/log/message ip_conntrack加載日誌
131072*228/(1024*1024)=28.5M
可使用raw table功能來取消某些鏈接的追蹤功能,以下
iptables -t raw -A PREROUTING -i eth0 -o eth1 -p tcp --dport 25 -j NOTRACK iptables -t raw -A PREROUTING -i eth1 -o eth0 -p tcp --sport 25 -j NOTRACK
這樣將使包跳過NAT和ip_contrack模塊,形成不能NAT功能;
對於複雜的通信協議,必須加載擴展模塊,如ftp,必須加載
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
雖然你可使用『 echo "1" > /proc/sys/net/ipv4/conf/???/rp_filter 』之類的方法來啓動這個項目,不過, 鳥哥比較建議修改系統設定值,那就是 /etc/sysctl.conf 這個檔案!假設咱們僅有 eth0 這個以太接口,並且上述的功能要統統啓動, 那你能夠這樣作:
vim /etc/sysctl.conf# Adding by VBird 2011/01/28 net.ipv4.tcp_syncookies = 1 net.ipv4.icmp_echo_ignore_broadcasts = 1 net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 net.ipv4.conf.eth0.rp_filter = 1 net.ipv4.conf.lo.rp_filter = 1