【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