以下文章轉自 http://note.tc.edu.tw/932.html
什麼?我在新裝的Centos7中竟然沒有找到iptables以及ip6tables,我直覺的想:應該是要自己安裝吧。不過事實上,我發現開的通訊埠都連不上,以為是selinux的問題,結果才知道,Centos7的防火牆是我好像聽過事實上是沒聽過的firewalld (呃,取這個名字?會不會太貼切了~~)
系統 CentOS Linux release 7.0.1406 (Core)
firewalld 執行指令
firewalld 執行指令
啟動
# service firewalld start
# service firewalld start
停止
# service firewalld stop
# service firewalld stop
重新啟動
# service firewalld restart
# service firewalld restart
重讀設定
# firewall-cmd --reload
查看狀態
# service firewalld status
或
# firewall-cmd --state
# firewall-cmd --reload
查看狀態
# service firewalld status
或
# firewall-cmd --state
程式設定
目錄 /etc/firewalld
設定檔 /etc/firewalld/firewalld.conf
設定檔 /etc/firewalld/firewalld.conf
防火牆基礎操作
畢竟他是一個防火牆,所以他引入了防火牆的zone的觀念,一看到就能瞭,一個zone可以有規則,zone到zone也可以有規則。
預設是一個叫 public的 zone,就是外面進到伺服器的zone,如果伺服器很單純對外服務不當路由器的話,這個zone就夠了。
操作這個防火牆如果有圖形介面直接在選單中點選防火牆就好了,圖形化易學易懂較沒問題,指令的話主要是用firewall-cmd 這個指令。
查看zone
# firewall-cmd --get-default-zone
public
# firewall-cmd --get-default-zone
public
查看運作中的zone和zone裡的介面
# firewall-cmd --get-active-zones
public
interfaces: ens192
# firewall-cmd --get-active-zones
public
interfaces: ens192
可以看到ens192這個介面是在public 這個zone中。
查看此zone所開的服務
# firewall-cmd --zone=public --list-all
public (default, active)
interfaces: ens192
sources:
services: dhcpv6-client ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
在public zone新增80TCP的服務
# firewall-cmd --zone=public --add-port=80/tcp
移除在public zone上80埠的所有服務 tcp/udp
# firewall-cmd --zone=public --remove-port=80
# firewall-cmd --zone=public --list-all
public (default, active)
interfaces: ens192
sources:
services: dhcpv6-client ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
在public zone新增80TCP的服務
# firewall-cmd --zone=public --add-port=80/tcp
移除在public zone上80埠的所有服務 tcp/udp
# firewall-cmd --zone=public --remove-port=80
上面移除新增port(或服務)是整個zone都生效(一個zone可以由很多interfaces組成),我們可以指定來源:
# firewall-cmd --zone=public --add-source=163.17.40.0/24
# firewall-cmd --zone=public --remove-source=163.17.40.0/24
# firewall-cmd --zone=public --remove-source=163.17.40.0/24
這樣是所有的服務都套用這個來源,如果要限定單一服務的來源,可以使用他的rich rules:
列出所有rich-rules
# firewall-cmd --zone=public --list-rich-rules
<預設是沒有>
# firewall-cmd --zone=public --list-rich-rules
<預設是沒有>
新增接受限制40.0可以讀取 28001埠
# firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="163.17.40.0/24" port port="28001" protocol="tcp" accept'
# firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="163.17.40.0/24" port port="28001" protocol="tcp" accept'
查看設定結果
# firewall-cmd --zone=public --list-all
public (default, active)
interfaces: ens192
sources:
services: dhcpv6-client ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
# firewall-cmd --zone=public --list-all
public (default, active)
interfaces: ens192
sources:
services: dhcpv6-client ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
rule family="ipv4" source address="163.17.40.0/24" port port="28001" protocol="tcp" accept
這樣子就開通了40.0/24連往這台機器的規則。
這樣子就開通了40.0/24連往這台機器的規則。
但是這樣子設定只是runtime的環境有用,一設定下去就生效,不需要重啟和重讀;
當 firewalld重啟或重讀時,剛才加的設定就不見了,所以上面的操作要全部加上--permanent,讓它變成永久的設定
防火牆永久的設定
查看永久的設定
# firewall-cmd --zone=public --list-all --permanent
# firewall-cmd --zone=public --list-all --permanent
查看runtime的設定
# firewall-cmd --zone=public --list-all
# firewall-cmd --zone=public --list-all
在firewalld重啟或重讀時,firewalld會把永久的規則寫到runtime來用。要觀察目前運作中的rule時,切記加上 --permanent