【Redhat系列linux防火牆工具】firewalld與iptables防火牆工具的激烈碰撞

前言

iptables與firewalld防火牆管理工具在linux發行版Redhat7系列使用較為廣泛。
UFW則是在linux發行版Ubuntu下進行管理防火牆的一款管理工具。

在選用防火牆工具的時候,運維或者是開發人員往往會糾結使用哪個。這裡給出建議,使用iptables工具管理就禁用firewalld,使用firewalld工具管理就禁用iptables,二者選其一即可,避免產生混亂。

此篇文章不會在原理上做深究,主要以實用性為主,原理可以閱讀相關書籍慢慢品味。

正文

一、Netfilter內核模組

無論是使用iptables還是firewalld,不妨先了解一下Netfilter內核模組
什麼是Netfilter:linux作業系統核心層內部的一個數據包處理模組。
Hook point:數據包在Netfilter中的掛載點。(PRE_ROUTING INPUT OUTPUT FORWORD POST_ROUTING)

1、netfilter的體系結構

網路數據包的的統信主要通過以下相關步驟,對應netfilter定義的鉤子函數,具體可以參考源碼介紹。

  • NF_IP_PRE_ROUTING

    網路數據包進入系統,經過簡單檢測後,數據包轉交給改函數進行處理,然後根據系統設置的規則對數據包進行處理,如果數據包不被丟棄則交給路由函數進行處理。在該函數中可以替換IP包的目的地址,及DNAT

  • NF_IP_LOCAL_IN:

    所有發送給本機的數據包都要通過該函數進行處理,該函數根據系統設置的系統規則對數據包進行處理,如果數據包不被丟棄則交給本地的應用程式。

  • NF_IP_FORWARD:

    所有不是發送給本機的數據包都要通過該函數進行處理,該函數會根據系統設置的規則對數據包進行處理,如數據包不被丟棄則轉給

    NF_IP_POST_ROUTING處理。

  • NF_IP_LOCAL_OUT:

    所有從本地應用程式出來的數據包必須通過該函數進行處理,該函數會根據系統設置的規則對數據包進行處理,如數據包不被丟棄則交給路由函數進行處理。

  • NF_IP_POST_ROUTING

    所有數據包在發送給其它主機之前需要通過該函數進行處理,該函數會根據系統設置的規則對數據包進行處理,如數據包不被丟棄,將數據包發給數據鏈路層。在該函數中可以替換IP包的源地址,即SNAT

數據包通過linux防火牆的處理過程如下圖

2、包過濾

每個函數都可以對數據包進行處理,最基本的操作是對數據包進行過濾。系統管理員可以通過iptables工具來向內核模組註冊多個過濾規則,並且指明過濾規則的優先權。設置完以後每個鉤子按照規則進行匹配。如果規則匹配,函數就會進行一些過濾操作,這些操作主要如下:

  • NF_ACCEPT:繼續正常的傳遞包。
  • NF_DROP:丟棄包,阻止傳送。
  • SF_STOLEN:已經接管了包,不需要繼續傳送。
  • NF_QUEUE:排列包。
  • NF_REPEAT:再次使用鉤子。

篇幅受限,介紹過多反而不好。關於包過濾就介紹這麼多,後續會進一步完善。

二、firewalld防火牆工具

以Redhat系列為例子做簡單的介紹,熟悉centos的基本上可以套用。

firewalld簡介

​ 在RHEL7之前的版本中,iptables和ip6tables作為防火牆配置管理工具。在RHEL7中防火牆管理工具變成了firewalld,它是一個支援自定義網路區域(zone)及介面安全等級的動態防火牆管理工具。利用firewalld,用戶可以實現許多強大的網路功能,例如防火牆、代理伺服器以及網路地址轉換。

​ 之前版本的system-config-firewall和lokkit防火牆模型是靜態的,每次修改防火牆規則都需要完全重啟。在此過程中包括提供防火牆的內核模組netfilter需要卸載和重新載入。而卸載會破壞已建立的連接和狀態防火牆。與之前的靜態模型有區別,firewalld將動態地管理防火牆,不需要重新啟動防火牆,也不需重新載入內核模組。但firewalld服務要求所有關於防火牆的變更都要通過守護進程來完成,從而確保守護進程中的狀態與內核防火牆之間的一致性。

​ 許多不了解的人,認為RHEL7中的防火牆從iptables變成了firewalld。其實不然,無論是iptables還是firewalld都無法提供防火牆功能。他們都只是linux系統中的一個防火牆管理工具,負責生成防火牆規則與內核模組netfilter進行「交流」,真正實現防火牆功能的是內核模組netfilter。

​ firewalld提供了兩種管理模式:其一是firewall-cmd命令管理工具,其二是firewall-config圖形化管理工具。在之前版本中的
iptables將規則保存在文件/etc/sysconfig/iptables中,現在firewalld將配置文件保存在/usr/lib/firewalld和/etc/firewalld
目錄的xml文件中。

​ 雖然RHEL7中將默認的防火牆管理工具從iptables換成了firewalld,但在RHEL7中仍然可以使用iptables的,只需要通過yum命令進行安裝啟用iptables服務即可。換句話說,紅帽將這個選擇權交給了用戶。

下面給出RHEL7的防火牆堆棧

1、firewalld命令行模式

1.1、區域選擇

當前作業系統安裝完成後,防火牆會設置一個默認區域,將介面加入到默認區域中。用戶配置防火牆的第一步是獲取默認區域並修改,關於操作如下:

查看當前系統中所有區域

firewall-cmd --get-zones

查看當前默認的區域

firewall-cmd --get-default-zone

查看當前已激活的區域

firewall-cmd --get-active-zones

獲取介面ens33所屬區域

firewall-cmd --get-zone-of-interface=ens33

修改介面所屬區域

firewall-cmd --permanent --zone=internal --change-interface=ens33

1.2、firewalld服務重載、重啟、停止

重新載入防火牆配置

firewall-cmd --reload

重啟防火牆(redhat系列)

systemctl restart firewalld.service

臨時關閉防火牆

systemctl stop firewalld.service

開機啟用防火牆

systemctl enable firewalld.service

開機禁止防火牆

systemctl disable firewalld.service

查看firewalld的運行狀態

firewall-cmd --state

1.3、firewalld開放埠(public)

公共區域設置開放21埠永久生效並寫入配置文件(參數:–permanent)

#參數:--permanent,設置即立刻生效並且寫入配置文件
firewall-cmd --zone=public --add-port=21/tcp --permanent

查詢防火牆埠21是否開放

firewall-cmd --zone=public --query-port=21/tcp

移除開放的埠21

firewall-cmd --zone=public --remove-port=21/tcp --permanent

1.4、區域規則修改

查詢防火牆規則列表

firewall-cmd --zone=public --list-all

新增一條區域規則httpd服務

firewall-cmd --permanent --zone=internal --add-service=http

驗證規則

firewall-cmd  --zone=internal --list-all

2、firewalld圖形化介面

上面的簡介也介紹到了firewalld提供了兩種管理模式:其一是firewall-cmd命令管理工具,其二是firewall-config圖形化管理工具。在之前版本中的iptables將規則保存在文件/etc/sysconfig/iptables中,現在firewalld將配置文件保存在/usr/lib/firewalld/etc/firewalld目錄的xml文件中。

圖形化介面中修改介面區域可以使用NetworkManager,也可以使用firewall-config工具。NetworkManager使用方法:打開終端執行命令nm-connection-editor,如下圖彈出對話框:

2.1、圖形化介面NetworkManager

終端執行:nm-connection-editor

2.2、圖形化介面firewall-config

終端執行:firewall-config

三、iptables防火牆工具

1、安裝iptables

假如是centos6,默認是安裝了iptables。
如果是centos7或者Redhat7系列,默認沒有安裝iptables。你需要關閉默認啟動的firewalld,二選一即可。

臨時關閉firewalld

systemctl stop firewalld

開機禁用firewalld

systemctl disable firewalld

開機啟用firewalld

systemctl enable firewalld

通過yum在線安裝iptables,檢查是否安裝了iptables

systemctl status iptables.service
service iptables status

安裝iptables

yum -y install iptables

升級iptables

yum update iptables

安裝iptables-services

yum -y install iptables-services.x86_64

設置iptables為開機自啟

systemctl enable iptables.service

iptables規則組成

  • ACCEPT(接收,允許通過)
  • DROP(丟棄數據包不做任何回饋)
  • REJECT(丟棄數據包,客戶端有對應消息返回)

查詢已經設置的規則:-L命令

#一般配合-n命令使用
iptables -L
#不顯示主機地址
iptables -nL 

清除原來設置的規則:-F命令

iptables -F

刪除某一條已經設置的規則:-D命令

iptables -D INPUT -p tcp --dport 80 -j ACCEPT

2、場景一放通埠

插入一些規則:-I命令,放通80、22、10~21(一段)這些埠

iptables -I INPUT -p tcp --dport 80 -j ACCEPT

設置某一個固定的IP訪問80埠:-s 192.168.xxx.xxx

iptables -I INPUT -p tcp -s (你的IP地址) --dport 80 -j ACCEPT

ssh遠程連接本地伺服器或者雲伺服器需要默認啟用的埠

iptables -I INPUT -p tcp --dport 22 -j ACCEPT

設置10~21埠開放訪問

iptables -I INPUT -p tcp --dport 10:21 -j ACCEPT

設置icmp規則允許訪問

iptables -I INPUT -p icmp -j ACCEPT

注意:允許本機可以訪問本機,本機訪問外網
解決本機可以訪問本機(telnet 127.0.0.1 22),添加-i lo(網卡)規則。

設置規則

iptables -I INPUT -i lo -p tcp  -j ACCEPT

本機測試訪問外網

curl //www.baidu.com

設置規則

iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

在設置的最後追加一條規則:-A命令
拒絕xx規則

iptables -A INPUT -j REJECT

3、場景二

ftp主動模式下iptables的規則配置(不建議)
ftp被動模式下iptables的規則配置(實際應用,推薦)

4、場景三

工作中的一些常用配置,設置好規則後保存到配置文件。chkconfig iptables on 設置開機啟動規則。
snat(對原地址,發起地址)規則設置,dnat(目標地址,發往的地址)規則設置。

5、iptables防攻擊企業應用

iptables防攻擊企業應用(根據實際業務設置)
利用iptables防CC攻擊
connlimit模組
作用: 用於限制每一個客戶端IP的並發連接數。
參數: --connlimit-above n(次數),限制並發數

例如,限制次數為100

iptables -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 100 -j REJECT

測試,限制某一固定IP並發次數

iptables -I INPUT -p tcp --dport 80 -s [ip地址] -m connlimit --connlimit-above 10 -j REJECT

6、limit模組

作用: 限速,控制流量
例如

iptable -A INPUT -m limit --limit 3/hour

--limit-burst 5,默認值為5

在設置最後追加一條過濾規則

iptables -A INPUT -p icmp -m limit --limit 1/m --limit-burst 10 -j ACCEPT 

拒絕其它規則訪問

iptables -A INPUT -p icmp -j DROP

設置完,測試接限制的IP地址:

#測試受限IP地址
ping 192.168.245.139

2、配置文件新增規則

文中介紹過iptables安裝後的配置文件所在目錄。

/etc/sysconfig/iptables

修改配置文件

vim  /etc/sysconfig/iptables

四、UFW防火牆工具

Uncomplicated Firewall

簡稱UFW,是Ubuntu系統上默認的防火牆組件。UFW是為輕量化配置iptables而開發的一款工具。
UFW 提供一個非常友好的介面用於創建基於IPV4,IPV6的防火牆規則。UFW 在 Ubuntu 8.04 LTS 後的所有發行版中默認可用。
UFW 的圖形用戶介面叫Gufw。

1、開啟與關閉防火牆

開啟防火牆

ufw enable

關閉防火牆

ufw disable

2、顯示防火牆狀態

2.1、顯示防火牆狀態

ufw status

2.2、查看防火牆詳細狀態

ufw status verbose

3、允許與阻止

3.1、增加一條表示允許的規則

ufw allow

3.2、允許通過 21 連接埠使用 tcp 和 udp 協議連線本機

ufw allow 21

3.3、增加一條表示阻止的規則

ufw deny

阻止通過 21 連接埠使用 tcp 協議連線本機

ufw deny 21/tcp

3.4、增加一條表示拒絕的規則

ufw reject

4、以服務名稱代表連接埠

可以採用

less /etc/services
by 龍騰萬里sky 原創不易,白嫖有癮