天天看點

防火牆知識總結及linux下iptables使用詳解

作者:問dao

防火牆概述

防火牆基本概念

防火牆(Firewall),也稱防護牆,是由Check Point 創立者Gil Shwed于1993 年發明并引入國際網際網路(US5606668(A)1993-12-15)。

它是一種位于内部網絡與外部網絡之間的網絡安全系統。是一項資訊安全的防護系統,依照特定的規則,允許或是限制傳輸的資料通過。

防火牆的發展曆程

防火牆從誕生開始,已經曆了四個發展階段:

  • 基于路由器的防火牆
  • 使用者化的防火牆工具套
  • 建立在通用作業系統上的防火牆
  • 具有安全作業系統的防火牆

現階段常見的防火牆屬于具有安全作業系統的防火牆,例如NETEYE、NETSCREEN、TALENTIT等。

防火牆的基本類型

網絡層防火牆

網絡層防火牆可視為一種 IP 封包過濾器,運作在底層的TCP/IP協定堆棧上。可以以枚舉的方式隻允許符合特定規則的封包通過,其餘的一概禁止穿越防火牆(病毒除外,防火牆不能防止病毒侵入)。這些規則通常可以經由管理者定義或修改,不過某些防火牆裝置可能隻能套用内置的規則。

應用層防火牆

應用層防火牆是在 TCP/IP 堆棧的“應用層”上運作,您使用浏覽器時所産生的資料流或是使用 FTP 時的資料流都是屬于這一層。應用層防火牆可以攔截進出某應用程式的所有封包,并且封鎖其他的封包(通常是直接将封包丢棄)。理論上,這一類的防火牆可以完全阻絕外部的資料流進到受保護的機器裡。

資料庫防火牆

資料庫防火牆是一款基于資料庫協定分析與控制技術的資料庫安全防護系統。基于主動防禦機制,實作資料庫的通路行為控制、危險操作阻斷、可疑行為審計。

資料庫防火牆通過SQL協定分析,根據預定義的禁止和許可政策讓合法的SQL操作通過,阻斷非法違規操作,形成資料庫的外圍防禦圈,實作SQL危險操作的主動預防、實時審計。

資料庫防火牆面對來自于外部的入侵行為,提供SQL注入禁止和資料庫虛拟更新檔包功能

防火牆有哪些技術類型

防火牆知識總結及linux下iptables使用詳解

防火牆有哪些接口模式?

防火牆有四種接口模式,分别是 L3 模式、L2 模式、L1 模式和 TAP 模式。

L1 ~ L3 模式是将防火牆進行串連,TAP 模式是防火牆進行旁挂。

防火牆知識總結及linux下iptables使用詳解

Linux 防火牆

防火牆的基本原理

節傳輸流程,可以分為以下幾層:

  • 包過濾(Packet filtering):工作在網絡層,僅根據資料標頭中的IP位址、端口号、協定類型等标志确定是否允許資料包通過。
  • 應用代理(Application Proxy):工作在應用層,通過編寫不同的應用代理程式,實作對應用層資料的檢測和分析。
  • 狀态檢測(Stateful Inspection):工作在2~4層,通路控制方式與1同,但處理的對象不是單個資料包,而是整個連接配接,通過規則表和連接配接狀态表,綜合判斷是否允許資料包通過。
  • 完全内容檢測(Compelete Content Inspection):工作在2~7層,不僅分析資料標頭資訊、狀态資訊,而且對應用層協定進行還原和内容分析,有效防範混合型安全威脅。
防火牆知識總結及linux下iptables使用詳解

Linux 防火牆在企業應用中的應用

  • 中小企業與網吧裡有iptables 作為企業的NAT路由器,可以用來代替傳統路由器,而節約成本。
  • IDC機房一般沒有硬體防火牆,IDC機房的伺服器可以用Linux 防火牆代替硬體防火牆。
  • iptables 可以結合squid 作為企業内部上網的透明代理。傳統代理需要在浏覽器裡配置代理伺服器資訊,而iptables+squid 的透明代理則可以把用戶端的請求重定向到代理伺服器的端口。用戶端不要作任何設定,而感覺不到代理的存在。
  • 将iptables 作為企業NAT 路由器時,可以使用iptables 的擴充子產品屏蔽P2P 流量,還可以禁止非法網頁。
  • iptables 可以用于外網IP 向内網IP 映射。
  • iptables 可以輕松防止輕量級DOS 攻擊,比如ping 攻擊及SYN 洪水攻擊。

linux防火牆工具iptables

netfilter/iptables(簡稱為iptables)組成Linux平台下的包過濾防火牆,與大多數的Linux軟體一樣,這個包過濾防火牆是免費的,它可以代替昂貴的商業防火牆解決方案,完成封包過濾、封包重定向和網絡位址轉換(NAT)等功能。

Iptables 是配置 Netfilter 過濾功能的使用者空間工具。 netfilter 才是防火牆真正的安全架構(framework),netfilter 位于核心空間。iptables 其實是一個指令行工具,位于使用者空間,我們用這個工具操作真正的架構。Iptable 根據規則所定義的方法來處理資料包,如放行(accept)、拒絕(reject)和丢棄(drop)等。

Netfilter/Iptables 資料包過濾系統可以當成一個整體,netfilter是核心的子產品實作,iptables是對上層操作工具。

如果不嚴格的區分則在Linux中 netfilter 和 iptables 都可以認為是指Linux防火牆。

實際 Iptables 是一個管理核心包過濾的工具,可以用來配置核心包過濾表格中的規則。運作于使用者空間。

差別在于:netfilter 是 Linux的2.4版核心引入了一種全新的包過濾引擎,稱為Netfilter。指的是Linux核心中實作包過濾防火牆的内部結構,不以程式或檔案的形式存在,屬于“核心态”的防火牆功能體系。iptables指的是用來管理Linux防火牆的指令程式,通常位于/sbin/iptables,屬于“使用者态”的防火牆管理體系。iptables是控制Netfilter的工具,是Linux 2.2版核心中比較老的指令ipchains的兄弟。

Netfilter 所設定的規則是存放在核心記憶體中的,而 iptables 是一個應用層的應用程式,它通過 Netfilter 放出的接口來對存放在核心記憶體中的 XXtables(Netfilter的配置表)進行修改。這個XXtables由表tables、鍊chains、規則rules組成,iptables在應用層負責修改這個規則檔案。類似的應用程式還有 firewalld 。

iptables 和 netfilter 的聯系?

很多人一提到防火牆立馬就想到了是iptables,其實iptables并不是防火牆,他隻是一個軟體或者說是一個工具,這個軟體可以編寫某些規則,将寫好的規則儲存到netfilter的規則資料庫中。是以,真正起到"防火"的功能是netfilter,并不是iptables。netfilter是核心中的一個架構,這個架構裡面包含了4個表和5個鍊,這些鍊又包含了很多的規則。而資料包要比對的規則就是這個鍊中所定義的規則。

iptables基礎

iptables 的四個表分别是 filter,mangle,nat,raw,預設表是filter。

  • filter 表:用來對資料包進行過濾,具體的規則要求決定如何處理一個資料包。
  • nat 表:主要用來修改資料包的 IP 位址、端口号資訊。
  • mangle 表:主要用來修改資料包的服務類型,生存周期,為資料包設定标記,實作流量整形、政策路由等。
  • raw 表:主要用來決定是否對資料包進行狀态跟蹤。

iptables 的五個鍊分别是 PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING。

  • input 鍊:當收到通路本機位址的資料包時,将應用此鍊中的規則。
  • output 鍊:當本機向外發送資料包時,将應用此鍊中的規則。
  • forward 鍊:當收到需要轉發給其他位址的資料包時,将應用此鍊中的規則,注意如果需要實作forward轉發需要開啟Linux核心中的ip_forward功能。
  • prerouting 鍊:在對資料包做路由選擇之前,将應用此鍊中的規則。
  • postrouting 鍊:在對資料包做路由選擇之後,将應用此鍊中的規則。

iptables組成

防火牆知識總結及linux下iptables使用詳解

iptables指令速查

文法 iptables(選項)(參數)

指令選項輸入順序

iptables -t 表名 <-A/I/D/R> 規則鍊名 [規則号] <-i/o 網卡名> -p 協定名 <-s 源IP/源子網> --sport 源端口 <-d 目标IP/目标子網> --dport 目标端口 -j 動作           

選項

-t, --table table 對指定的表 table 進行操作, table 必須是 raw, nat,filter,mangle 中的一個。如果不指定此選項,預設的是 filter 表。

# 通用比對:源位址目标位址的比對
-p:指定要比對的資料包協定類型;
-s, --source [!] address[/mask] :把指定的一個/一組位址作為源位址,按此規則進行過濾。當後面沒有 mask 時,address 是一個位址,比如:192.168.1.1;當 mask 指定時,可以表示一組範圍内的位址,比如:192.168.1.0/255.255.255.0。
-d, --destination [!] address[/mask] :位址格式同上,但這裡是指定位址為目的位址,按此進行過濾。
-i, --in-interface [!] <網絡接口name> :指定資料包的來自來自網絡接口,比如最常見的 eth0 。注意:它隻對 INPUT,FORWARD,PREROUTING 這三個鍊起作用。如果沒有指定此選項, 說明可以來自任何一個網絡接口。同前面類似,"!" 表示取反。
-o, --out-interface [!] <網絡接口name> :指定資料包出去的網絡接口。隻對 OUTPUT,FORWARD,POSTROUTING 三個鍊起作用。

# 檢視管理指令
-L, --list [chain] 列對外連結 chain 上面的所有規則,如果沒有指定鍊,列出表上所有鍊的所有規則。

# 規則管理指令
-A, --append chain rule-specification 在指定鍊 chain 的末尾插入指定的規則,也就是說,這條規則會被放到最後,最後才會被執行。規則是由後面的比對來指定。
-I, --insert chain [rulenum] rule-specification 在鍊 chain 中的指定位置插入一條或多條規則。如果指定的規則号是1,則在鍊的頭部插入。這也是預設的情況,如果沒有指定規則号。
-D, --delete chain rule-specification -D, --delete chain rulenum 在指定的鍊 chain 中删除一個或多個指定規則。
-R num:Replays替換/修改第幾條規則

# 鍊管理指令(這都是立即生效的)
-P, --policy chain target :為指定的鍊 chain 設定政策 target。注意,隻有内置的鍊才允許有政策,使用者自定義的是不允許的。
-F, --flush [chain] 清空指定鍊 chain 上面的所有規則。如果沒有指定鍊,清空該表上所有鍊的所有規則。
-N, --new-chain chain 用指定的名字建立一個新的鍊。
-X, --delete-chain [chain] :删除指定的鍊,這個鍊必須沒有被其它任何規則引用,而且這條上必須沒有任何規則。如果沒有指定鍊名,則會删除該表中所有非内置的鍊。
-E, --rename-chain old-chain new-chain :用指定的新名字去重命名指定的鍊。這并不會對鍊内部造成任何影響。
-Z, --zero [chain] :把指定鍊,或者表中的所有鍊上的所有計數器清零。

-j, --jump target <指定目标> :即滿足某條件時該執行什麼樣的動作。target 可以是内置的目标,比如 ACCEPT,也可以是使用者自定義的鍊。
-h:顯示幫助資訊;           

基本參數

參數  作用
-P  設定預設政策:iptables -P INPUT (DROP
-F  清空規則鍊
-L  檢視規則鍊
-A  在規則鍊的末尾加入新規則
-I  num 在規則鍊的頭部加入新規則
-D  num 删除某一條規則
-s  比對來源位址IP/MASK,加歎号"!"表示除這個IP外。
-d  比對目标位址
-i  網卡名稱 比對從這塊網卡流入的資料
-o  網卡名稱 比對從這塊網卡流出的資料
-p  比對協定,如tcp,udp,icmp
--dport num  比對目标端口号
--sport num  比對來源端口号           

操作執行個體

清空目前的所有規則和計數

iptables -F # 清空所有的防火牆規則

iptables -X # 删除使用者自定義的空鍊

iptables -Z # 清空計數

配置允許ssh端口連接配接

iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
# 22為你的ssh端口, -s 192.168.1.0/24表示允許這個網段的機器來連接配接,其它網段的ip位址是登陸不了你的機器的。 -j ACCEPT表示接受這樣的請求           

允許本地回環位址可以正常使用

iptables -A INPUT -i lo -j ACCEPT
#本地圓環位址就是那個127.0.0.1,是本機上使用的,它進與出都設定為允許
iptables -A OUTPUT -o lo -j ACCEPT           

設定預設的規則

iptables -P INPUT DROP # 配置預設的不讓進 iptables -P FORWARD DROP # 預設的不允許轉發 iptables -P OUTPUT ACCEPT # 預設的可以出去

配置白名單

iptables -A INPUT -p all -s 192.168.1.0/24 -j ACCEPT  # 允許機房内網機器可以通路
iptables -A INPUT -p all -s 192.168.140.0/24 -j ACCEPT  # 允許機房内網機器可以通路
iptables -A INPUT -p tcp -s 183.121.3.7 --dport 3380 -j ACCEPT # 允許183.121.3.7通路本機的3380端口           

開啟相應的服務端口

iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 開啟80端口,因為web對外都是這個端口
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT # 允許被ping
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 已經建立的連接配接得讓它進來           

儲存規則到配置檔案中

cp /etc/sysconfig/iptables /etc/sysconfig/iptables.bak # 任何改動之前先備份,請保持這一優秀的習慣
iptables-save > /etc/sysconfig/iptables
cat /etc/sysconfig/iptables           

列出已設定的規則

iptables -L [-t 表名] [鍊名]

四個表名 raw,nat,filter,mangle 五個規則鍊名 INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING filter表包含INPUT、OUTPUT、FORWARD三個規則鍊

iptables -L -t nat                  # 列出 nat 上面的所有規則
#            ^ -t 參數指定,必須是 raw, nat,filter,mangle 中的一個
iptables -L -t nat  --line-numbers  # 規則帶編号
iptables -L INPUT

iptables -L -nv  # 檢視,這個清單看起來更詳細           

清除已有規則

iptables -F INPUT  # 清空指定鍊 INPUT 上面的所有規則
iptables -X INPUT  # 删除指定的鍊,這個鍊必須沒有被其它任何規則引用,而且這條上必須沒有任何規則。
                   # 如果沒有指定鍊名,則會删除該表中所有非内置的鍊。
iptables -Z INPUT  # 把指定鍊,或者表中的所有鍊上的所有計數器清零。           

删除已添加的規則

添加一條規則

iptables -A INPUT -s 192.168.1.5 -j DROP

将所有iptables以序号标記顯示,執行:

iptables -L -n --line-numbers 比如要删除INPUT裡序号為8的規則,執行:

iptables -D INPUT 8

開放指定的端口

iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT               #允許本地回環接口(即運作本機通路本機)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT    #允許已建立的或相關連的通行
iptables -A OUTPUT -j ACCEPT         #允許所有本機向外的通路
iptables -A INPUT -p tcp --dport 22 -j ACCEPT    #允許通路22端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT    #允許通路80端口
iptables -A INPUT -p tcp --dport 21 -j ACCEPT    #允許ftp服務的21端口
iptables -A INPUT -p tcp --dport 20 -j ACCEPT    #允許FTP服務的20端口
iptables -A INPUT -j reject       #禁止其他未允許的規則通路
iptables -A FORWARD -j REJECT     #禁止其他未允許的規則通路           

屏蔽IP

iptables -A INPUT -p tcp -m tcp -s 192.168.0.8 -j DROP  # 屏蔽惡意主機(比如,192.168.0.8
iptables -I INPUT -s 123.45.6.7 -j DROP       #屏蔽單個IP的指令
iptables -I INPUT -s 123.0.0.0/8 -j DROP      #封整個段即從123.0.0.1到123.255.255.254的指令
iptables -I INPUT -s 124.45.0.0/16 -j DROP    #封IP段即從123.45.0.1到123.45.255.254的指令
iptables -I INPUT -s 123.45.6.0/24 -j DROP    #封IP段即從123.45.6.1到123.45.6.254的指令           

指定資料包出去的網絡接口 隻對 OUTPUT,FORWARD,POSTROUTING 三個鍊起作用。

iptables -A FORWARD -o eth0           

檢視已添加的規則

iptables -L -n -v
Chain INPUT (policy DROP 48106 packets, 2690K bytes)
 pkts bytes target     prot opt in     out     source               destination
 5075  589K ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
 191K   90M ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:22
1499K  133M ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:80
4364K 6351M ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
 6256  327K ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 3382K packets, 1819M bytes)
 pkts bytes target     prot opt in     out     source               destination
 5075  589K ACCEPT     all  --  *      lo      0.0.0.0/0            0.0.0.0/0           

啟動網絡轉發規則

公網210.14.67.7讓内網192.168.188.0/24上網

iptables -t nat -A POSTROUTING -s 192.168.188.0/24 -j SNAT --to-source 210.14.67.127           

端口映射

本機的 2222 端口映射到内網 虛拟機的22 端口

iptables -t nat -A PREROUTING -d 210.14.67.127 -p tcp --dport 2222  -j DNAT --to-dest 192.168.188.115:22           
iptables -t nat -A PREROUTING -d 210.14.67.127 -p tcp --dport 2222  -j DNAT --to-dest 192.168.188.115:22           

linux防火牆firewalld

在RHEL7/Centos7 裡有幾種防火牆共存:firewalld、iptables、ebtables,預設是使用firewalld來管理netfilter子系統,不過底層調用的指令仍然是iptables等。

RHEL7/Centos7 預設的防火牆是 firewall,替代了以前的 iptables

firewalld 使用更加友善、功能也更加強大一些

firewalld 服務引入了一個信任級别的概念來管理與之相關聯的連接配接與接口。它支援 ipv4 與 ipv6,并支援網橋,采用 firewall-cmd (command) 或 firewall-config (gui) 來動态的管理 kernel netfilter 的臨時或永久的接口規則,并實時生效而無需重新開機服務。

關閉防火牆,允許所有資料包通過

firewall-cmd--set-default-zone=trusted

開啟關閉防火牆

1、檢視防火牆狀态

sudo systemctl status firewalld或firewall-cmd --state

2、開啟防火牆

sudo systemctl start firewalld //馬上生效,重新開機會恢複原來狀态sudo systemctl enable firewalld //重新開機生效,重新開機不會恢複原來狀态

3、關閉防火牆

sudo systemctl stop firewalld //馬上生效,重新開機會恢複原來狀态sudo systemctl disable firewalld //重新開機生效,重新開機不會恢複原來狀态

4、重新加載防火牆配置

firewall-cmd --reload

防火牆端口管理

新增端口

打開tcp3838

firewall-cmd --zone=public --add-port=3838/tcp --permanent

打開udp3838

firewall-cmd --zone=public --add-port=3838/udp --permanent

重新加載防火牆

firewall-cmd --reload

【指令含義】

–zone #作用域

–add-port=3838/tcp #添加端口,格式為:端口/通訊協定

–permanent #永久生效,沒有此參數重新開機後失效

-reload #重新加載。不中斷使用者連接配接,不丢失狀态資訊。

移除端口

與新增端口關鍵字相反,把add改為remove即可。

查詢指定端口是否開啟防火牆

firewall-cmd --query-port=3939/tcp #查詢tcp端口3939

查詢哪些端口開放

firewall-cmd --list-port

防火牆知識總結及linux下iptables使用詳解

繼續閱讀