防火牆是系統的第一道防線,其作用是防止非法用戶的進入,是內部網和外部網(Internet)之間的保護屏障。在我們構建服務器應用的時候首先應該想到的是安全,不能讓用戶隨意的獲取服務器的資源甚至系統的用戶數據。這種安全事件頻頻發生我們更應該注重安全,安全也是未來互聯網行業必須重視的重中之重。
防火牆應用的現狀
如果大家直接購買阿里雲的ECS或者騰訊雲的雲服務器可能很少關注防火牆,DDoS攻擊等問題。因爲服務器提供商同時爲我們提供了這項業務,對於服務器允許的網絡請求類型,接口等我們都可以通過服務器提供商提供的可視化的界面進行配置。這種嚴格的配置在生產環境中比較多見,對於部分用戶爲了方便會設置路由規則爲0.0.0.0/0這樣就會存在潛在的風險,表示你的任何端口都可以被外部的任何設備訪問,這其實是很危險的一件事。可能大家會說自己在服務器上搭建的mysql服務器是有密碼的,其實mysql的密碼校驗真的不安全。還有大部分人爲了操作方便給數據庫授權了所有ip的訪問權限,這就更危險了。就等於你暴漏了一個保險櫃在大街上人人都可以去試一下。
安全案例(自己搭建redis)
有這樣一個案例。自己在雲服務器上搭建redis服務的情況。默認情況下redis的配置中有
bind 127.0.0.1
這樣的內部迴環,所以外部服務器是訪問不了的。但是如果爲了外部網絡可以訪問註釋bind後redis就完全是個暴露的在任何地方都可以隨便存取的服務。關於redis安全會在下一篇文章中專門來說。
開啓firewall
開啓firewall的命令是
systemctl start firewalld.service
如果提醒服務被mask則需要執行下邊的命令
systemctl unmask firewalld.service
然後start就沒有問題了
配置防火牆
如果你之前沒有使用firewall在上邊步驟中剛開啓你會發現你的80端口等都不可訪問了,這時候就需要配置防火牆來開放相應的端口。
有firewall情況下的網絡請求
如果服務器有網絡接口 eth0和lo那麼網絡請求的基本流向是
數據包從eth0或者lo進入其中的一個zone然後進入內核處理。
什麼是zone
zone其實最簡單的理解是定製的過濾規則的劃分。根據我們對請求的不同信任度來使用不同的zone(規則集合)。例如上圖中eth0網卡的請求需要進過第二個zone。而且每一個網卡interface所對應的zone只能有一個,這需要我們設置。我們來看看firewall默認有哪些zone:
firewall-cmd --get-zones
work drop internal external trusted home dmz public block
默認情況是有這些zone
查看zone的特徵
如果要查看zone的特徵,主要是一些過濾規則,可以使用以下的命令
firewall-cmd --list-all-zones
這樣會返回所有的zone的特徵,我們拿一個來看
public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: dhcpv6-client ssh
ports: 3306/tcp 80/tcp 6626/tcp
protocols:
masquerade: no
forward-ports:
sourceports:
icmp-blocks:
rich rules:
target
可用於接受(accept)、拒絕(reject)或丟棄(drop)與任何規則(rule)(端口(port)、服務(etc)等)不匹配的每個包。在可信區域中使用ACCEPT target接收不匹配任何規則的每個包。在block zone中使用%%REJECT%%目標來拒絕(使用默認的firewalld拒絕類型)不匹配任何規則的每個包。DROP target用於drop zone中刪除不匹配任何規則的每個包。如果沒有指定目標,則將拒絕不匹配任何規則的每個包。
icmp-block-inversion
是一個可選標記,在區域配置中只能使用一次。此標誌反轉icmp塊處理。區域中只接受啓用的ICMP類型,而拒絕所有其他類型。
interfaces
是一個可選的標記,可以多次使用。它可用於將接口綁定到zone。對於NetworkManager管理的接口,您不需要這樣做,因爲NetworkManager自動將接口綁定到區域。
sources
是一個可選的標記,可以多次使用。它可用於將源地址、地址範圍、MAC地址或ipset綁定到一個區域。源條目具有以下格式之一:
address="address[/mask]"
mac="MAC"
ipset="ipset"
services
是一個可選的標記,可以多次使用,以啓用多個服務條目。服務條目格式如下:
name="string"
如果不知道有哪些services可用可以使用以下命令
firewall-cmd --get-services
RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client ceph ceph-mon dhcp dhcpv6 dhcpv6-client dns docker-registry dropbox-lansync freeipa-ldap freeipa-ldaps freeipa-replication ftp high-availability http https imap imaps ipp ipp-client ipsec iscsi-target kadmin kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mosh mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster radius rpc-bind rsyncd samba samba-client sane smtp smtps snmp snmptrap 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
ports
是一個可選標記,可多次用於具有多個端口條目。端口條目的所有屬性都是強制性的:
port="portid[-portid]" #定義端口或者端口範圍
protocol="tcp|udp|sctp|dccp" #定義協議類型
配置端口可訪問
firewall-cmd --zone==public --add-port=80/tcp --permanent
這裏是在public zone下配置添加port特性爲運行80端口的tcp請求。參數–permanent是爲了在重啓的情況下該規則任然生效,也就是持久化配置
爲什麼配置到public zone下呢?因爲默認的zone就是public,可以使用以下命令查看
firewall-cmd --get-default-zone
在設置完路由規則後需要重新加載
firewall-cmd --reload
更多的選項和使用方法大家可以查看firewall-cmd的help
firewall-cmd --h