茫茫網海中的冷日
         
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已!
 恭喜您是本站第 1669301 位訪客!  登入  | 註冊
主選單

Google 自訂搜尋

Goole 廣告

隨機相片
IMG_G9_00012.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

小企鵝開談 : [轉貼]firewalld - CentOS 7 的動態防火牆

發表者 討論內容
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]firewalld - CentOS 7 的動態防火牆

firewalld - CentOS 7 的動態防火牆

如同先前在 [完全用 GNU/Linux 工作] 07. 簡易的防火牆一文提到,Ubuntu 從 8.04 LTS 開始多了 ufw 這個簡單的防火牆,CentOS 也在 7.0 導入可以動態管理防火牆的 firewalld。Weithenn 前輩的 CentOS 7.3 基礎設定 (10) - 調整 Firewalld 防火牆規則一文很好的解說了 firewalld 與 iptables 的差異,想深入了解的伙伴不妨參考一下。

firewalld 還有個跟 Windows 7 類似的網路共用設定機制,在官方文件中是使用界域 1 (zone) 來敘述這項依據不同環境所設計的網路區域功能。我們可以藉由在各種不同的 zone 進行設置,來達到公開網域 (public network zone) 不開 ssh 埠口,而內部網域 (internal network zone) 則允許等較複雜的信任等級配置。這部份凍仁還未深入研究,在此就不多加說明。


1. 安裝與初始化

1.1. 若系統未預載,請手動安裝 firewalld
[ jonny @CentOS ~ ]
$ sudo yum install firewalld [Enter]

1.2. 檢查 firewalld 服務運行狀態。
[ jonny @CentOS ~ ]
$ systemctl status firewalld [Enter]

● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: active (running) since Sun 2017-09-24 09:03:55 UTC; 14min ago
Docs: man:firewalld(1)
Main PID: 4376 (firewalld)
CGroup: /system.slice/firewalld.service
└─4376 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid


1.3. 若狀態不為 active,則啟動 (start) 它。firewalld 預設會開 ssh 服務,不用再擔心啟動防火牆時,會被 iptables 擋在牆外了!
[ jonny @CentOS ~ ]
$ sudo systemctl start firewalld [Enter]

1.4. 若需開機自動啟動,則還需啟用 (enable) 它。
[ jonny @CentOS ~ ]
$ sudo systemctl enable firewalld [Enter]

Created symlink from /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service to /usr/lib/systemd/system/firewalld.service.
Created symlink from /etc/systemd/system/basic.target.wants/firewalld.service to /usr/lib/systemd/system/firewalld.service.


2. 基礎操作

2.1. 狀態 (state) 查詢,running 表示正常運行中。
[ jonny @CentOS ~ ]
$ sudo firewall-cmd --state [Enter]
running

2.2. 新增允許 HTTP 服務連線規則。
[ jonny @CentOS ~ ]
$ sudo firewall-cmd --add-service= http --permanent [Enter]
success

2.3. 新增允許 10050 埠口 TCP 連線規則。
[ jonny @CentOS ~ ]
$ sudo firewall-cmd --add-port= 10050/tcp --permanent [Enter]
success

2.4. 刪除允許 dhcpv6-client 服務連線規則。
[
jonny @CentOS ~ ]
$ sudo firewall-cmd --remove-service= dhcpv6-client \
    --permanent [Enter]
success

2.5. 刪除允許 10050 埠口的 TCP 連線規則。
[ jonny @CentOS ~ ]
$ sudo firewall-cmd --remove-port= 10050/tcp --permanent [Enter]
success

2.6. 重新讀取防火牆規則。
[ jonny @CentOS ~ ]
$ sudo firewall-cmd --reload [Enter]
success

2.7. 列出當前的防火牆規則:眼尖的客官可以發現,以下範例為 public 這個 network zone 的配置。
[ jonny
@CentOS ~ ]
$ sudo firewall-cmd --list-all [Enter]
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3
  sources:
  services: http ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  sourceports:
  icmp-blocks:
  rich rules:

3. 進階使用

3.1. 允許 (accept) 特定 IP 連線

3.1.1. 允許來自 192.168.1.2 的所有連線。
[ jonny @CentOS ~ ]
$ sudo firewall-cmd --add-rich-rule 'rule family="ipv4" \
    source address=" 192.168.1.2/32" accept' --permanent [Enter]

3.1.2. 允許來自 192.168.2.1 ~ 192.168.2.254 的所有 ssh 連線。
[ jonny @CentOS ~ ]
$ sudo firewall-cmd --add-rich-rule 'rule family="ipv4" \
    source address=" 192.168.2.0/24" service name=" ssh" accept' \
   --permanent [Enter]

3.2. 拒絕 (reject) 或阻擋 (drop) 特定 IP 連線

3.2.1. 拒絕來自 110.88.4.5 的連線。
[ jonny @CentOS ~ ]
$ sudo firewall-cmd --add-rich-rule 'rule \
    family="ipv4" source address=" 110.88.4.5/32" reject' \
    --permanent [Enter]

3.2.2. 阻擋來自 27.16.3.1 ~ 27.16.3.254 的 22 埠口連線。
[ jonny @CentOS ~ ]
$ sudo firewall-cmd --add-rich-rule 'rule \
    family="ipv4" source address=" 27.16.3.0/24" port port=" 22" \
    drop' --permanent [Enter]

3.3. 允許特定埠口連線

3.3.1. 允許 32700 到 33000 埠口的 TCP 連線規則。
[ jonny @CentOS ~ ]
$ sudo firewall-cmd --add-port= 32700-33000/tcp --permanent [Enter]

3.4. 圖形化介面

大家可另外安裝 firewall-config 套件進行操作。
[ jonny @CentOS
~ ]
$ sudo yum install firewall-config [Enter]

近來凍仁總覺得 CentOS 7 的 firewalld 有些用不慣,索性參照之前 ufw 的筆記,把常用的 firewalld 防火牆指令整理了一下,將來有遇上比較特殊的用法再補上了。

1 經友人 Cheng-Chia Tseng 回饋,GNU/Linux 官方是使用「界域」一詞來形容此項功能。然而很棒的一點是在 20.1.4 防火牆簡易設定 | 鳥哥的 Linux 私房菜一文也有很完整的解說呢!


原文出處:firewalld - CentOS 7 的動態防火牆 | 凍仁的筆記
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]CentOS 防火牆設定 : firewalld 指令範例教學

CentOS 防火牆設定 : firewalld 指令範例教學

CentOS 7 版本之後的版本會使用 firewalld 這個服務來管理防火牆,而防火牆設定在Linux的世界裡也算是常會遇到的課題,因此,本文將以CentOS 7做為測試平台,來示範如何管理或者查詢防火牆的相關資訊,適合一般新手閱讀。

CetnOS - 防火牆 firewalld 指令範例教學

防火牆區域簡介

firewalld是用區域(zone)的概念來管理防火牆,我們可以針對每個區域進行不同的設定或規則,各區域的預設作用在此不多做介紹,但一般我們比較常接觸到的區域是「public」,完整的區域介紹可以參考 此文章的說明。
註:在使用firewalld指令進行操作時,若想要針對某個區域做查詢,可加上–zone=區域名稱來限定範圍,如設定有變更,建議要養成重新載入設定的習慣:sudo firewall-cmd –reload

firewalld 指令教學

以下就列出幾個比較常見的firewalld的相關指令以及範例供大家參考:

查看防火牆的運作狀況

查看防火牆是否有開啟,或者它的運作情況,如果「Active」的值是inactive就是沒有在運作,active即是正常運作中


指令:systemctl status firewalld 或 firewall-cmd --state

● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running) since 三 2018-08-01 13:34:09 CST; 10s ago
Docs: man:firewalld(1)
Main PID: 861 (firewalld)
CGroup: /system.slice/firewalld.service
└─861 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

PS1:如果是用「firewall-cmd –state」來查詢的話,防火牆有運行時會顯示「running」,沒有運行時則顯示「not running」,利用此方法查詢需要足夠權限

啟動、停止、重啟firewalld服務

firewalld會以service的方式運行,所以要啟動、停止、動啟防火牆的服務,一樣直接用「systemctl」來管理即可:


啟動:sudo systemctl start firewalld
停止:sudo systemctl stop firewalld
重啟:sudo systemctl restart firewalld

查詢以及設定預設的區域

查詢預設區域:firewall-cmd --get-default-zone
設定預設區域:sudo firewall-cmd --set-default-zone=work

查看已知(支援)的服務
firewall-cmd --get-services
查看有開Port的服務

和「–get-service」不太相同,這是列出目前區域中有開Port的服務

sudo firewall-cmd --list-services
列出運行中的區域

這個指令個人覺得還蠻實用的,可以同時查網路介面的代號,或者用–list-all指令也可以

firewall-cmd --get-active-zones

public
interfaces: ens33 (網路介面)
sources: 11.22.33.44/24

開啟連接埠

如果我們有特別的Port想要開啟,那麼可以利用以下指令來達成
–zone:指定區域
–add-port:加入欲開啟的連接埠,並指定通訊協定
–remove-port:移除開啟的連接埠,並指定通訊協定

sudo firewall-cmd --zone=public --add-port=6666/tcp

上面的指令是暫時性開啟,重開系統就會失效,如果想要永久生效,那麼需要再指令後面多加–permanent

sudo firewall-cmd --zone=public --add-port=6666/tcp --permanent

而開Port時,也可以一次開啟多個,例如以下的例子就會同時開啟6666 ~ 6670等5個Port

sudo firewall-cmd --zone=public --add-port=6666-6670/tcp
查詢已開啟的連接埠

承上,如果在開啟連接埠之後,可以利用–list-ports來查詢連接埠的開啟狀況,以確保有開啟成功

sudo firewall-cmd --list-ports

想移除已開啟的Port,則利用–remove-port來達成:


sudo firewall-cmd --zone=public --remove-port=6666/tcp --permanent
新增、移除服務

在前面有提到「–get-service」是列出已知的服務,因此,我們可以藉由這些服務名稱,直接透過–add-service的方式來開放此服務,例如:

sudo firewall-cmd --zone=public --add-service=mysql --permanent

要將加入的服務移除的話,則使用–remove-service

sudo firewall-cmd --zone=public --remove-service=mysql --permanent
列出區域的詳細設定

可以指定區域來查詢,該指令會列出此區域中設定的相關細節

sudo firewall-cmd --zone=public --list-all
重新載入防火牆設定
sudo firewall-cmd --reload
Port Forwarding 連接埠轉發

利用–add-forward-port參數,可以將來自連接埠A的資料轉發至連接埠B,如以下的例子就是將來自Port=22的訊息轉發至Port=2233


sudo firewall-cmd --zone=public --add-forward-port=port=22:proto=tcp:toport=2233

承上,以下的例子沒有用到toport,而是用了toaddr,這樣表示要把資訊轉發到位址192.168.10.1的相同連接埠,也就是22

sudo firewall-cmd --zone=public --add-forward-port=port=22:proto=tcp:toaddr=192.168.10.1

那如果同時指定toporttoaddr呢?也是可以的,例如以下範例是把來自本機22連接埠的資料轉發至192.168.10.1主機上是2233連接埠

sudo firewall-cmd --zone=public --add-forward-port=port=22:proto=tcp:toport=2233:toaddr=192.168.10.1

註:連接埠轉發如果是不同主機的話,那麼要先利用–add-masquerade來開啟防火牆偽裝,移除的話則使用–remove-masquerade

sudo firewall-cmd --zone=public --add-masquerade
白名單

利用–add-source將IP加入白名單內,移除則用–remove-source


firewall-cmd --zone=public --add-source=192.168.100.0/24 --permanent

Rich rules

Rich rules在 官方文件中有詳細的用法說明,主要會用–add-rich-rule–remove-rich-rule來管理操作一些比較複雜的狀況,以下就舉幾個平常比較有機會遇到的實務案例供大家參考:

IP白名單:允IP存取

允許來自指定IP的存取請求,即加入該IP進白名單,範例如下:

sudo firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address=192.168.10.10 accept'

在還沒使用「–add-rich-rule」之前,如果利用–list-rich-rules來查詢已加入的rich rules,加到的結果會是空的(預設值),而當我們執行過上述的指令,再一次進行rich rules的查詢,就可以看到剛剛已加入的條件了:

sudo firewall-cmd --list-rich-rules
執行結果:rule family="ipv4" source address="192.168.10.1" accept
IP黑名單:拒絕IP存取

承上,有允許IP進入當然就有拒絕的設定,要拒絕某個IP的請求,只要把上述指令中的
accept改成reject就行了,在這邊我們做一點小變化,加入一些其他的條件,例如下面的例子是拒絕來自192.168.1.10且Port=22的存取請求

sudo firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.10.10" port port=22 protocol=tcp reject'
Port Forwarding 連接埠轉發

我們也可以利用rich rules來設定連接埠轉發,例如下面範例就是將主機192.168.19.1、連接埠80上的流量導到8080連接埠上

sudo firewall-cmd --zone=public --add-rich-rule 'rule family=ipv4 source address=192.168.10.1 forward-port port=80 protocol=tcp to-port=8080'

而下面的範例則是將連接埠80的資料導到主機192.168.10.2的8080連接埠上(如果轉發至不同主機的話,masquerade要開啟)

sudo firewall-cmd --zone=public --add-rich-rule 'rule family=ipv4 forward-port port=80 protocol=tcp to-port=8080 to-addr=192.168.10.2'

原文出處:CentOS 防火牆設定 : firewalld 指令範例教學 - 靖.技場
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]CentOS 7 Firewalld 防火牆說明介紹

CentOS 7 Firewalld 防火牆說明介紹

在 CentOS 6 防火牆 iptables 是以 Rules 寫在 Chain 建立規則然後給 kernel 去執行,每次重建規則必須先清除原有規則,這會導致既有連線中斷。到 CentOS 7 之後改用 firewalld 以 zone 的區域分割觀念來建立,並以動態設定方式執行避免中斷的問題。請注意:不能同時執行 iptables 跟 firewalld 這會造成衝突錯誤。

Firewalld 相關路徑
/etc/firewalld:設定檔路徑
/usr/bin/:firewall-cmd 指令所在的位置

--------------------------------------------------------------------------------

所謂的 zone 就表示主機位於何種環境,需要設定哪些規則,在 firewalld 裡共有 7 個zones
> 先決定主機要設定在那個區域 zone >> 再往該 zone 設定規則 >>> 重新讀取設定檔 sudo firewall-cmd --reload

public: 公開的場所,不信任網域內所有連線,只有被允許的連線才能進入,一般只要設定這裡就可以了
For use in public areas. You do not trust the other computers on the network to not harm your computer. Only selected incoming connections are accepted.

external: 公開的場所,應用在IP是NAT的網路

For use on external networks with masquerading enabled especially for routers. You do not trust the other computers on the network to not harm your computer. Only selected incoming connections are accepted.
dmz: (Demilitarized Zone) 非軍事區,允許對外連線,內部網路只有允許的才可以連線進來 
For computers in your demilitarized zone that are publicly-accessible with limited access to your internal network. Only selected incoming connections are accepted.
work: 公司、工作的環境
For use in work areas. You mostly trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.
home: 家庭環境

For use in home areas. You mostly trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.
internal: 內部網路,應用在NAT設定時的對內網路
For use on internal networks. You mostly trust the other computers on the networks to not harm your computer. Only selected incoming connections are accepted.
trusted: 接受所有的連線
All network connections are accepted.
drop: 任何進入的封包全部丟棄,只有往外的連線是允許的 
Any incoming network packets are dropped, there is no reply. Only outgoing network connections are possible.
block: 任何進入的封包全部拒絕,並以 icmp 回覆對方 ,只有往外的連線是允許的

Any incoming network connections are rejected with an icmp-host-prohibited message for IPv4 and icmp6-adm-prohibited for IPv6. Only network connections initiated from within the system are possible.

-------------------------------------------------------------------------------

預設主機是被放在 public zone 區域,並有開啟兩個服務 dhcpv6-client ssh
> 在這樣的設定下,任何來源都可以透過 ssh 服務來連接到本主機,但其他的服務 service-port 都是關閉的。
★★★ 顯示目前的設定 ★★★
# firewall-cmd --list-all
public (default, active)
interfaces: ens160
sources:
services: dhcpv6-client ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:

若你的環境沒在用 DHCP ,則可以將他關掉 DHCP 服務 port

★★★ 關掉 DHCP 服務 port ★★★
# sudo firewall-cmd --zone=public --remove-service dhcpv6-client

暫時允許外部連接本機 DNS 服務
★★★ 暫時開啟 DNS port 53 ★★★
# sudo systemctl start named
# sudo systemctl enable named
# sudo firewall-cmd --add-service=dns
# sudo firewall-cmd --reload
# firewall-cmd --list-all
public (default, active)
interfaces: ens160
sources:
services: dhcpv6-client dns ssh
ports: (略)

★★★ 永久開啟 DNS port 53 ★★★
# sudo firewall-cmd --add-service=dns --permanent
#
sudo firewall-cmd --reload

 

QQ:為何可以直接指定加入的服務名稱為 dns 呢?那他怎麼知道要開啟哪些連接埠?
Ans:他會參考 /usr/lib/firewalld/services/ 下的服務,例如 dns.xml ,啟用本服務就會連帶的開啟 TCP 跟 UDP 的 port 53

<service>
<short>DNS</short>
<description>The Domain Name System (DNS) is used to provide and request host and domain names. Enable this option, if you plan
to provide a domain name service (e.g. with bind).</description>


</service>

總共有這些服務,可以直接叫用
amanda-client.xml high-availability.xml kpasswd.xml mysql.xml pop3s.xml smtp.xml
bacula-client.xml https.xml ldaps.xml nfs.xml postgresql.xml ssh.xml

bacula.xml http.xml ldap.xml ntp.xml proxy-dhcp.xml telnet.xml
dhcpv6-client.xml imaps.xml libvirt-tls.xml openvpn.xml radius.xml tftp-client.xml
dhcpv6.xml ipp-client.xml libvirt.xml pmcd.xml RH-Satellite-6.xml tftp.xml
dhcp.xml ipp.xml mdns.xml pmproxy.xml rpc-bind.xml transmission-client.xml
dns.xml ipsec.xml mountd.xml pmwebapis.xml samba-client.xml vnc-server.xml
ftp.xml kerberos.xml ms-wbt.xml pmwebapi.xml samba.xml wbem-https.xml

 

★★★ 如何修改主機的預設 zone ★★★
前面說過預設為 public zone ,但有些主機服務是要建立在 DMZ 下,我們可以透過修改 /etc/firewalld/firewalld.conf 來將預設的區域改為 dmz
# sudo vi /etc/firewalld/firewalld.conf
> 修改 DefaultZone=public
> 變成  DefaultZone=dmz
然後重新載入
#
sudo firewall-cmd --reload

 

★★★ 加入自行指定的連接埠 ★★★
# sudo firewall-cmd --add-port=8080/tcp --permanent
success
# sudo firewall-cmd --reload
success
# sudo firewall-cmd --list-all
public (default, active)
interfaces: ens160
sources:
services: dhcpv6-client dns ssh
ports: 8080/tcp
masquerade: no

 

QQ:為何我設定暫時的 rules 都無效呢?
ANS:假設你臨時要開放 port 8888,於是你執行了
# sudo firewall-cmd --add-port=8888/tcp 
# sudo firewall-cmd --reload
# sudo firewall-cmd --list-all


卻發現 --list-all 的結果都沒將 port:8888 這 rule 給加入,這是因為你在第二步驟時做了 reload ,不是設定沒用而是被你的 reload 給清除了,所以臨時性的只要
# sudo firewall-cmd --add-port=8888/tcp 
# sudo firewall-cmd --list-all

查看永久的設定
# firewall-cmd  --list-all --permanent 

 

★★★ 修改服務的預設連接埠 ★★★
假設你的主機為 web /www ,預設是走 port 80 但有時候某些網站就不是使用 80 port ,這時候該怎麼修改呢?
Step 1:先複製對應的 xml 檔到 /etc/firewalld/services
# sudo cp /usr/lib/firewalld/services/http.xml  /etc/firewalld/services
Step 2:修改 http.xml
# sudo vi /etc/firewalld/services/http.xml
Step 3:修改對應連接埠

改為

Step 4:重新載入 

sudo firewall-cmd --reload

 

★★★ 限制某服務只能從哪IP連入 ★★★
通常我們會限制 ssh 只能從某些IP來進來,我們可以使用 rich-rule 來加入
#
或 ip subnet
#

 

★★★ 限制某 port 只能從哪IP連入 ★★★
#

 

★★★ 直接指定 rule 到 INPUT  chain★★★

這樣的寫法使用 # firewall-cmd --list-all 是看不到的,要用 iptables -L -n

 

★★★ 查看預設載入的 rule ★★★
所有的 zone 設定檔會放在 /etc/firewalld/zones 跟 /usr/lib/firewalld/zones/ ,你所執行的 --permanent 參數會寫在 /etc/firewalld/zones 對應的 zone 檔案裡(例:public.xml),所以當你下了
#
sudo firewall-cmd --add-service=dns --permanent



  <zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>




</zone>

 

★★★ 從 /etc/sysconfig/iptables 轉為 firewalld 的 direct  ★★★

假設你原有的 /etc/sysconfig/iptables 有規則
-A INPUT -s 140.113.12.9 -j ACCEPT
-A INPUT -m state --state NEW -m udp -p udp -s 140.113.0.0/16 --dport 123 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp -s 140.114.88.0/24 --dport 161 -j ACCEPT

要轉換到 firewalld 的 direct 規則
新增 /etc/firewalld/direct.xml  ,如果你之前有執行過 #sudo firewall-cmd --permanent --direct .... 則這個檔案會自動的產生

新增/修改 direct.xml 增加對應上面的 rules
# sudo vi /etc/firewalld/direct.xml

<direct>




</direct>

★★★ 從 zone 移除某項服務 ★★★
# sudo firewall-cmd --zone=public --add-service=http --permanent
# sudo firewall-cmd --zone=public --remove-service=http --permanent

#
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
# sudo firewall-cmd --zone=public --remove-port=8080/tcp --permanent

 

★★★ port forward 將從某 port number 的封包轉送另外的 port 或其他主機 ★★★
# 將 80 port 收到的訊息轉往 port 8080
# toport=8080

# 將 80 port 收到的訊息轉往其他台主機的 port 8080
toport=8080:toaddr=140.113.1.1

 

Reference:
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Security_Guide/sec-Using_Firewalls.html 

https://www.youtube.com/watch?v=7_XwTdZlqes 
https://www.linode.com/docs/security/firewalls/introduction-to-firewalld-on-centos 


原文出處:CentOS 7 Firewalld 防火牆說明介紹 @ 黃昏的甘蔗 :: 隨意窩 Xuite日誌
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]CentOS Linux 7 以 firewalld 指令設定防火牆規則教學

CentOS Linux 7 以 firewalld 指令設定防火牆規則教學

這裡介紹如何在 CentOS Linux 7 中使用 firewalld 的指令設定防火牆規則。

在舊版的 CentOS Linux 中,防火牆都是以傳統的 iptables 來設定,而從 CentOS 7 開始,則改用 firewalld 來管理防火牆。

傳統的 iptables 在每次修改防火牆時都要清除舊規則,重新套用一次新規則,使用上不是很方便,而新的 firewalld 以區域(zone)的方式管理規則,並使用動態的方式執行,修改規則後可立即生效,也不需要重新啟動系統的服務(service 或 daemon),所以後來的 RHEL、CentOS 與 Fedora 都改用 firewalld 了。

iptables 與 firewalld 兩個防火牆管理系統只能選用其中一種,不可以同時開啟,否則會有問題。

以下是我在 CentOS Linux 7 的測試環境中所整理出來的 firewalld 使用教學。

安裝 firewalld

安裝 firewalld 之前,請先確認 iptables 是否有被啟用,若系統上原本就有運行 iptables 的防火牆,一定要先將其關閉後,才能啟用 firewalld,否則會有問題:


# 檢查 iptables 服務是否正在運行
systemctl status iptables
# 停止正在執行的 iptables 服務
systemctl stop iptables
# 將 iptables 服務永久關閉
systemctl mask iptables

firewalld 在 RHEL/CentOS 7 與 Fedora 21 之中應該是預設就會安裝好的,若您的系統上沒有安裝,可用 yum 安裝:

sudo yum install firewalld

當 firewalld 安裝好之後,檢查 firewalld 服務是否有啟動:


# 檢查 firewalld 服務狀態
systemctl status firewalld

若 firewalld 沒有啟動,則手動啟動它:


# 啟動 firewalld 服務
systemctl start firewalld
# 停止 firewalld 服務
systemctl stop firewalld
# 重新啟動 firewalld 服務
service firewalld restart

若要設定讓 firewalld 在開機時自動啟動,可執行:


# 設定開機自動啟動 firewalld 服務
systemctl enable firewalld

區域簡介


firewalld 的區域(zone)可用來設定網路連線、介面等所處的運作環境,對內使用的區域其防火牆規則會較為寬鬆,反之若是對外的區域其規則會較為嚴謹。

一條網路連線或介面只能隸屬於一個區域,我們可以自訂區域的設定,也可以直接從 firewalld 預設的幾個區域中選擇:

區域描述
drop任何往內的封包都會被丟棄,只允許往外傳送的封包。
block任何來自於外部的連線都會被阻擋,只允許自己系統主動建立的連線。
public 公開區域,預設不信任其他電腦與網路,只有被允許的連線才能進入。通常大部分的連線設定都會放在這裡。
external 公開區域,適用於 NAT 網路環境。
dmz 非軍事區域(demilitarized zone,有點像是放在外頭的危險區域),允許外部的連線進入,但其對內的連線則有限制,只有被允許的連線才能連進內部網路。
work公司內部等工作區域,在此區域中不應該會有惡意的攻擊者。只有被允許的連線可以進入。
home家裡頭的網路區域,在此區域中不應該會有惡意的攻擊者。只有被允許的連線可以進入。
internal內部網路區域,在此區域中不應該會有惡意的攻擊者。只有被允許的連線可以進入。
trusted完全信任的區域,接受所有連線。

查詢區域設定

firewalld 都是透過 firewall-cmd
指令來操作的,若要列出 firewalld 中已經定義好的區域,可執行:


# 列出所有的區域
firewall-cmd --get-zones

block dmz drop external home internal public trusted work

列出所有的區域與其詳細的設定內容:


# 列出所有的區域與內容
sudo firewall-cmd --list-all-zones

block
target: %%REJECT%%
icmp-block-inversion: no
interfaces:
sources:
services:
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
[略]

若要查詢特定區域的內部設定,可執行:


# 列出指定的區域與內容
sudo firewall-cmd --list-all

public (active)
target: default
icmp-block-inversion: no
interfaces: enp7s0d1 ib0
sources:
services: ssh dhcpv6-client rpc-bind https http tftp dhcp
ports: 944/tcp 944/udp 945/tcp 945/udp 946/udp 8649/udp 8649/tcp 8651/tcp 8652/tcp 15001/tcp 15002/tcp 15003/tcp 15004/tcp 15007/tcp 17001/tcp 8080/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

上面這個查詢方式所得到的結果是目前系統上執行的設定(runtime),若要查詢寫在硬碟中的永久設定,可以使用:


# 查詢永久設定值
sudo firewall-cmd --permanent

預設區域


當網路介面或是連線沒有指定區域時,就會直接納入預設區域中。若要查詢目前預設的區域,可執行:


# 列出預設區域
firewall-cmd --get-default-zone

public

若要更改 firewalld 預設的區域,可以執行:


# 設定預設區域
firewall-cmd --set-default-zone=home

更改後,可再確認一次預設區域:


# 列出預設區域
firewall-cmd --get-default-zone

home

介面所屬區域

列出目前所有運作中的區域,以及各個網路介面所屬的區域:


# 查詢運作中的區域
firewall-cmd --get-active-zones

public
interfaces: enp7s0d1 ib0
trusted
interfaces: eno2

若要查詢指定網路介面所屬區域,可執行:


# 查詢網路介面所屬區域
firewall-cmd --get-zone-of-interface=enp7s0d1

public

若要更改指定網路介面的所屬區域,可以使用:


# 將 enp7s0d1 網路介面設定至 home 區域
sudo firewall-cmd --change-interface=enp7s0d1

上面這種修改網路介面所屬區域的方式只是暫時的,若要讓系統重新開機後還可以維持這樣的設定,就要直接更改 /etc/sysconfig/network-scripts/ 底下的設定檔,以 enp7s0d1 這個網路介面來說,就修改 ifcfg-enp7s0d1 這個檔案中的 ZONE 設定值:

區域的服務

若要在防火牆上開啟一些連接埠,讓對外的服務使用,可以再區域設定中新增一些服務設定。firewalld 中有預先定義一些常用的服務名稱,這用這個指令查詢:


# 列出預先定義的服務名稱
firewall-cmd --get-services

RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bitcoin
bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector
ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry dropbox-lansync elasticsearch
freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client
ganglia-master high-availability http https imap imaps ipp ipp-client ipsec iscsi-target
kadmin kerberos kibana klogin kpasswd kshell ldap ldaps libvirt libvirt-tls managesieve
mdns mosh mountd ms-wbt mssql mysql nfs nrpe ntp openvpn ovirt-imageio ovirt-storageconsole
ovirt-vmconsole pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp
ptp pulseaudio puppetmaster quassel radius rpc-bind rsh rsyncd samba samba-client
sane sip sips smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh
synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client
vdsm vnc-server wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server

大部分常見的網路服務都有在這個列表中,若要將指定的服務新增至指定的區域中,可執行:


# 將 http 服務新增至 public 區域中
sudo firewall-cmd --add-service=http

上面這行指令只是暫時將 http 服務新增至 public 區域中,重新開機後這個設定就不見了,通常在比較重要的伺服器上,我們都會先使用暫時的設定先進行測試,若測試沒問題,再將設定寫入設定檔,永久保存:


# 永久將 http 服務新增至 public 區域中
sudo firewall-cmd --add-service=http

執行永久的設定之後,可再重新查詢一次永久設定值,確認設定值是否正確:


# 列出 public 區域永久的服務設定值
sudo firewall-cmd --list-services

這樣設定之後,在 public 這個區域就會開啟網頁的 80 連接埠,讓外面可以連進來我們的網站,而現在的網站都會提供安全加密的網頁,所以最好連 HTTPS 的 443 連接埠也一並開啟,開啟的方式大同小異:


# 將 https 服務新增至 public 區域中
sudo firewall-cmd --add-service=https
# 永久將 https 服務新增至 public 區域中
sudo firewall-cmd --add-service=https

自訂開啟連接埠


基本上 firewalld 有內定的服務都可以使用上面這種方式開啟,如果我們想要開啟的連接埠不在 firewalld 內建的服務名單中,也可以直接指定通訊協定( tcpudp)與埠號:


# 開啟 tcp 的 8080 連接埠
sudo firewall-cmd --add-port=8080/tcp
# 永久開啟 tcp 的 8080 連接埠
sudo firewall-cmd --add-port=8080/tcp

埠號的部分也可以用範圍的方式指定,一次開通多個連接埠:


# 開啟 udp 的 4990 至 4999 連接埠
sudo firewall-cmd --add-port=4990-4999/udp
# 永久開啟 udp 的 4990 至 4999 連接埠
sudo firewall-cmd --add-port=4990-4999/udp

移除服務


若要將指定的服務從某個區域中移除,可以執行:


# 將 http 服務從 public 區域中移除
sudo firewall-cmd --remove-service=http
# 永久將 http 服務從 public 區域中移除
sudo firewall-cmd --remove-service=http

如果是要移除自訂的通訊協定與埠號,則執行:


# 關閉 tcp 的 8080 連接埠
sudo firewall-cmd --remove-port=8080/tcp
# 永久關閉 tcp 的 8080 連接埠
sudo firewall-cmd --remove-port=8080/tcp

新增服務名稱


除了直接指定通訊協定與埠號之外,我們也可以自訂新的服務名稱,加入 firewalld 的服務名稱清單中,這樣就可以使用服務名稱的方式來設定開啟的服務,這樣做的好處是可以讓防火牆的設定看起來更容易理解,不會搞不清楚某些奇怪埠號的用途。

若要新增服務名稱,可以在 /etc/firewalld/services 新增服務的 XML 設定檔,XML 設定檔的語法可參考 /usr/lib/firewalld/services/ 中的範例,例如 http.xml 就是定義 http 服務的設定檔:


?>
>


/>

參考這些範例後,撰寫自己的服務設定檔(若需要開啟多個連接埠,可以自己新增,或是參考其他的範例檔),然後另外儲存成一個新的檔案,放在 /etc/firewalld/services 目錄下,檔名要設定為服務的名稱加上 XML 的附檔名,例如 my_service.xml,接著讓 firewalld 重新載入設定:


# 重新載入設定
sudo firewall-cmd --reload

重新查詢一次支援的服務名稱,應該就可以看到新加入的 my_service 服務了:


# 列出預先定義的服務名稱
firewall-cmd --get-services

常用範例

這裡蒐集一些常用的 firewalld 防火牆設定指令。

只允許特定來源 IP 位址使用服務

如果我們的服務只想讓某些特定來源 IP 位址的電腦使用,可以這樣設定:


# 允許 192.168.0.0/24 使用 http 服務
firewall-cmd \
'
# 永久允許 192.168.0.0/24 使用 http 服務
firewall-cmd \
\
--permanent

白名單 IP 位址


若要將特定的 IP 位址設定為白名單,讓它可以連接任何的連接埠,可以這樣做:


# 將 192.168.0.123 列為 public 區域的白名單
firewall-cmd \
'
# 永久將 192.168.0.123 列為 public 區域的白名單
firewall-cmd \
\
--permanent

參考資料: Red HatFedoraTecmintDigitalOcean黃昏的甘蔗


原文出處:CentOS Linux 7 以 firewalld 指令設定防火牆規則教學 - G. T. Wang
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]在 CentOS 7 中所不見的命令 – Round 1: ifconfig、route、netstat、traceroute

在 CentOS 7 中所不見的命令 – Round 1: ifconfig、route、netstat、traceroute

很好,最終還是要來體驗一下最新的 CentOS 7,雖然很早之前就使用過了,但是基於穩定性還是常用 CentOS 6,最近下定決心開始習慣 CentOS 7 的介面

 

此篇紀錄在 CentOS 6 中所常用的幾個工具將被淘汰,並且替代的工具

 

ifconfig 替換為 ip addr


#同ifconfig
$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:22:4d:80:7f:6a brd ff:ff:ff:ff:ff:ff
inet 192.168.10.10/24 brd 222.186.42.255 scope global enp1s0
valid_lft forever preferred_lft forever
inet6 fe80::222:4dff:fe80:7f6a/64 scope link
valid_lft forever preferred_lft forever
#查看介面傳輸狀態 -s 詳細
$ ip -s link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
RX: bytes packets errors dropped overrun mcast
0 0 0 0 0 0
TX: bytes packets errors dropped carrier collsns
0 0 0 0 0 0
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
link/ether 00:22:4d:80:7f:6a brd ff:ff:ff:ff:ff:ff
RX: bytes packets errors dropped overrun mcast
26232302 55435 0 0 0 0
TX: bytes packets errors dropped carrier collsns
1338484 14020 0 0 0 0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#同ifconfig
$ ip addr
 
1 : lo : < LOOPBACK , UP , LOWER_UP > mtu 65536 qdisc noqueue state UNKNOWN
     link / loopback 00 : 00 : 00 : 00 : 00 : 00 brd 00 : 00 : 00 : 00 : 00 : 00
     inet 127.0.0.1 / 8 scope host lo
       valid_lft forever preferred_lft forever
     inet6 :: 1
/ 128 scope host
       valid_lft forever preferred_lft forever
2 : enp1s0 : < BROADCAST , MULTICAST , UP , LOWER_UP > mtu 1500 qdisc pfifo_fast state UP qlen 1000
     link / ether 00 : 22 : 4d : 80 : 7f
: 6a brd ff : ff : ff : ff : ff : ff
     inet 192.168.10.10 / 24 brd 222.186.42.255 scope global enp1s0
       valid_lft forever preferred_lft forever
     inet6 fe80 :: 222 : 4dff : fe80 : 7f6a / 64 scope link
       valid_lft forever preferred_lft forever
 
#查看介面傳輸狀態 -s 詳細
$ ip - s link
 
1 : lo : < LOOPBACK , UP , LOWER_UP > mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT
     link / loopback 00 : 00
: 00 : 00 : 00 : 00 brd 00 : 00 : 00 : 00 : 00 : 00
     RX : bytes   packets   errors   dropped overrun mcast   
     0            0          0        0        0
       0       
     TX : bytes   packets   errors   dropped carrier collsns
     0            0          0        0        0        0       
2 : enp1s0 : <
BROADCAST , MULTICAST , UP , LOWER_UP > mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
     link / ether 00 : 22 : 4d : 80 : 7f : 6a brd ff : ff : ff : ff : ff : ff
     RX :
bytes   packets   errors   dropped overrun mcast   
     26232302    55435      0        0        0        0       
     TX : bytes   packets   errors   dropped carrier collsns
     1338484     
14020      0        0        0        0

netstat 替換為 ss


#同 netstat -tunpl
$ ss -tunpl
#檢視tcp連線
$ ss -t
#檢視udp
$ ss -u

1
2
3
4
5
6
7
8
#同 netstat -tunpl
$ ss - tunpl
 
#檢視tcp連線
$ ss - t
 
#檢視udp
$ ss - u

traceroute/traceroute6 替換為 tracepath


$ tracepath 8.8.8.8

1
$ tracepath 8.8.8.8

route 替換為 ip route


$ ip route
192.168.10.0/24 dev eth0 proto kernel scope link src 192.168.121.10
169.254.0.0/16 dev eth0 scope link metric 1003
default via 192.168.10.254 dev eth0

1
2
3
4
5
$ ip route
 
192.168.10.0 / 24 dev eth0   proto kernel   scope link    src 192.168.121.10
169.254.0.0 / 16 dev eth0   scope link    metric 1003
default via 192.168.10.254 dev eth0

arp 替換為 ip neighbor


$ ip neighbor
192.168.10.108 dev eth0 lladdr e0:ac:cb:66:2a:3c STALE
192.168.10.254 dev eth0 lladdr 10:7b:ef:47:ce:53 REACHABLE

1
2
3
$ ip neighbor
192.168.10.108 dev eth0 lladdr e0 : ac : cb : 66 : 2a : 3c STALE
192.168.10.254 dev eth0 lladdr 10 : 7b : ef : 47 : ce : 53 REACHABLE

 

 

 

在 CentOS 7 被淘汰的工具只是不在預設安裝所包含的,所以是可以利用 yum 把他安裝回來


Note:在 yum 中不知道套件的名稱,可以用 provides 和 list 直接搜尋 package 裡面的工具


$ yum provides */ifconfig
net-tools-1.60-110.el6_2.x86_64 : Basic networking tools
Repo : base
Matched from:
Filename : /sbin/ifconfig

1
2
3
4
5
6
$ yum provides * / ifconfig
 
net - tools - 1.60 - 110.el6_2.x86_64 : Basic networking tools
Repo          : base
Matched from :
Filename      : / sbin / ifconfig

原文出處:
在 CentOS 7 中所不見的命令 - Round 1: ifconfig、route、netstat、traceroute | Mr. 沙先生
前一個主題 | 下一個主題 | 頁首 | | |



Powered by XOOPS 2.0 © 2001-2008 The XOOPS Project|