Centos 7 Firewall

★★★ 如何修改主機的預設 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:修改對應連接埠
<port protocol="tcp" port="80"/>
改為
<port protocol="tcp" port="8080"/>
Step 4:重新載入 
# sudo firewall-cmd --reload

 

★★★ 限制某服務只能從哪IP連入 ★★★
通常我們會限制 ssh 只能從某些IP來進來,我們可以使用 rich-rule 來加入
# sudo firewall-cmd --add-rich-rule="rule family="ipv4" source address="192.168.1.88" service name="ssh" accept"
或 ip subnet
# sudo firewall-cmd --add-rich-rule="rule family="ipv4" source address="192.168.1.0/24" service name="ssh" accept"

 

★★★ 限制某 port 只能從哪IP連入 ★★★
# sudo firewall-cmd --add-rich-rule="rule family="ipv4" source address="192.168.12.9" port port="8080" protocol="tcp" accept"
注意:port port="8080" 不是寫錯唷!這是他的格式

 

★★★ 直接指定 rule 到 INPUT  chain★★★
# sudo firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -p tcp -s "192.168.12.9" --dport 22 -j ACCEPT
這樣的寫法使用 # 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
就會在 /etc/firewalld/zones/public.xml 變成 多了 <service name="dns"/>
<?xml version="1.0" encoding="utf-8"?>
  <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>
  <service name="dhcpv6-client"/>
  <service name="ssh"/>
  <service name="dns"/>
  <port protocol="tcp" port="8080"/>
</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
<?xml version="1.0" encoding="utf-8"?>
<direct>
   <rule priority="0" table="filter" ipv="ipv4" chain="INPUT">-p tcp -s 192.168.12.9 --dport 22 -j ACCEPT</rule>
   <rule priority="0" table="filter" ipv="ipv4" chain="INPUT">-s 140.113.12.9 -j ACCEPT</rule>
   <rule priority="0" table="filter" ipv="ipv4" chain="INPUT">-p udp -s 140.113.0.0/16 --dport 123 -j ACCEPT</rule>
   <rule priority="0" table="filter" ipv="ipv4" chain="INPUT">-p tcp -s 140.114.88.0/24 --dport 161 -j ACCEPT</rule>
</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
# sudo firewall-cmd --zone="public" --add-forward-port=port=80:proto=tcp:toport=8080

# 將 80 port 收到的訊息轉往其他台主機的 port 8080
# sudo firewall-cmd --zone="public" --add-forward-port=port=80:proto=tcp: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 

Tags