早期的Linux系統中,默認使用的是iptables防火牆管理服務來配置防火牆 linux
大量的企業在生產環境中依然出於各類緣由而繼續使用iptables web
在進行路由選擇前處理數據包(PREROUTING);shell
處理流入的數據包(INPUT);安全
處理流出的數據包(OUTPUT);服務器
處理轉發的數據包(FORWARD);markdown
在進行路由選擇後處理數據包(POSTROUTING)app
參數 | 做用 |
---|---|
-P | 設置默認策略 |
-F | 清空規則鏈 |
-L | 查看規則鏈 |
-A | 在規則鏈的末尾加入新規則 |
-I num | 在規則鏈的頭部加入新規則 |
-D num | 刪除某一條規則 |
-s | 匹配來源地址IP/MASK,加歎號「!」表示除這個IP外 |
-d | 匹配目標地址 |
-i 網卡名稱 | 匹配從這塊網卡流入的數據 |
-o 網卡名稱 | 匹配從這塊網卡流出的數據 |
-p | 匹配協議,如TCP、UDP、ICMP |
--dport num | 匹配目標端口號 |
--sport num | 匹配來源端口號 |
本機:192.168.0.9dom
Linux服務器:192.168.0.15ssh
C:\Users\Administrator>ping 192.168.0.15 正在 Ping 192.168.0.15 具備 32 字節的數據: 來自 192.168.0.15 的回覆: 字節=32 時間<1ms TTL=64 來自 192.168.0.15 的回覆: 字節=32 時間=1ms TTL=64 來自 192.168.0.15 的回覆: 字節=32 時間=1ms TTL=64 來自 192.168.0.15 的回覆: 字節=32 時間=1ms TTL=64 192.168.0.15 的 Ping 統計信息: 數據包: 已發送 = 4,已接收 = 4,丟失 = 0 (0% 丟失), 往返行程的估計時間(以毫秒爲單位): 最短 = 0ms,最長 = 1ms,平均 = 0ms
[root@localhost ~]# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT udp -- anywhere anywhere udp dpt:domain ACCEPT tcp -- anywhere anywhere tcp dpt:domain ACCEPT udp -- anywhere anywhere udp dpt:bootps ACCEPT tcp -- anywhere anywhere tcp dpt:bootps Chain FORWARD (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere 192.168.122.0/24 ctstate RELATED,ESTABLISHED ACCEPT all -- 192.168.122.0/24 anywhere ACCEPT all -- anywhere anywhere REJECT all -- anywhere anywhere reject-with icmp-port-unreachable REJECT all -- anywhere anywhere reject-with icmp-port-unreachable Chain OUTPUT (policy ACCEPT) target prot opt source destination ACCEPT udp -- anywhere anywhere udp dpt:bootpc [root@localhost ~]# iptables -F [root@localhost ~]# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
root@localhost ~]# iptables -I INPUT -p icmp -j REJECT # 查看是否配置上去 [root@localhost ~]# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination REJECT icmp -- anywhere anywhere reject-with icmp-port-unreachable Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
C:\Users\Administrator>ping 192.168.0.15 正在 Ping 192.168.0.15 具備 32 字節的數據: 來自 192.168.0.15 的回覆: 沒法連到端口。 來自 192.168.0.15 的回覆: 沒法連到端口。 來自 192.168.0.15 的回覆: 沒法連到端口。 來自 192.168.0.15 的回覆: 沒法連到端口。 192.168.0.15 的 Ping 統計信息: 數據包: 已發送 = 4,已接收 = 4,丟失 = 0 (0% 丟失)
# 清空防火牆 [root@localhost ~]# iptables -F [root@localhost ~]# [root@localhost ~]# iptables -P INPUT DROP # 讓全部icmp協議進來 [root@localhost ~]# iptables -I INPUT -p icmp -j DROP [root@localhost ~]# iptables -L Chain INPUT (policy DROP) target prot opt source destination ACCEPT icmp -- anywhere anywhere Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
C:\Users\Administrator>ping 192.168.0.15 正在 Ping 192.168.0.15 具備 32 字節的數據: 請求超時。 請求超時。 請求超時。 請求超時。 192.168.0.15 的 Ping 統計信息: 數據包: 已發送 = 4,已接收 = 0,丟失 = 4 (100% 丟失),
[root@localhost ~]# iptables -I INPUT -p icmp -j ACCEPT [root@localhost ~]# iptables -L Chain INPUT (policy DROP) target prot opt source destination ACCEPT icmp -- anywhere anywhere DROP icmp -- anywhere anywhere
注意:iptables防火牆是從前以後開始判斷的,前面生效了,後面就無心義了!socket
先容許再拒絕全部 > 先拒絕在容許全部 更加安全
[C:\~]$ Connecting to 192.168.0.15:22... Connection established. To escape to local shell, press 'Ctrl+Alt+]'. Activate the web console with: systemctl enable --now cockpit.socket Last login: Tue Jul 20 07:27:50 2021
[root@localhost ~]# iptables -I INPUT -p tcp --dport 22 -j REJECT [root@localhost ~]# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination REJECT tcp -- anywhere anywhere tcp dpt:ssh reject-with icmp-port-unreachable ACCEPT udp -- anywhere anywhere udp dpt:domain ACCEPT tcp -- anywhere anywhere tcp dpt:domain ACCEPT udp -- anywhere anywhere udp dpt:bootps ACCEPT tcp -- anywhere anywhere tcp dpt:bootps
[C:\~]$ Connecting to 192.168.0.15:22... Could not connect to '192.168.0.15' (port 22): Connection failed Type `help' to learn how to use Xshell prompt.
[root@localhost ~]# iptables -I INPUT -p tcp --dport 22 -j REJECT [root@localhost ~]# iptables -I INPUT -p tcp --dport 1000:1500 -j REJECT [root@localhost ~]# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination REJECT tcp -- anywhere anywhere tcp dpts:cadlock2:vlsi-lm reject-with icmp-port-unreachable REJECT tcp -- anywhere anywhere tcp dpt:ssh reject-with icmp-port-unreachable Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
[C:\~]$ Connecting to 192.168.0.15:22... Could not connect to '192.168.0.15' (port 22): Connection failed Type `help' to learn how to use Xshell prompt. # 測試成功!
[root@localhost ~]# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination REJECT tcp -- anywhere anywhere tcp dpts:cadlock2:vlsi-lm reject-with icmp-port-unreachable REJECT tcp -- anywhere anywhere tcp dpt:ssh reject-with icmp-port-unreachable Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination [root@localhost ~]# iptables-save # Generated by xtables-save v1.8.2 on Tue Jul 20 07:50:36 2021 *filter :INPUT ACCEPT [1207:1625091] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [906:68760] -A INPUT -p tcp -m tcp --dport 1000:1500 -j REJECT --reject-with icmp-port-unreachable -A INPUT -p tcp -m tcp --dport 22 -j REJECT --reject-with icmp-port-unreachable COMMIT # Completed on Tue Jul 20 07:50:36 2021 # Generated by xtables-save v1.8.2 on Tue Jul 20 07:50:36 2021 *security :INPUT ACCEPT [954:1589536] :FORWARD ACCEPT [0:0] ………… root@localhost ~]# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination REJECT tcp -- anywhere anywhere tcp dpts:cadlock2:vlsi-lm reject-with icmp-port-unreachable REJECT tcp -- anywhere anywhere tcp dpt:ssh reject-with icmp-port-unreachable Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
RHEL 8系統中集成了多款防火牆管理工具,其中firewalld(Dynamic Firewall Manager of Linux systems)服務是默認的防火牆配置管理工具,也叫Linux系統的動態防火牆管理器,它擁有基於CLI(命令行界面)和基於GUI(圖形用戶界面)的兩種管理方式。
區域 | 默認規則策略 |
---|---|
trusted | 容許全部的數據包 |
home | 拒絕流入的流量,除非與流出的流量相關;而若是流量與ssh、mdns、ipp-client、amba-client與dhcpv6-client服務相關,則容許流量 |
internal | 等同於home區域 |
work | 拒絕流入的流量,除非與流出的流量相關;而若是流量與ssh、ipp-client與dhcpv6-client服務相關,則容許流量 |
public | 拒絕流入的流量,除非與流出的流量相關;而若是流量與ssh、dhcpv6-client服務相關,則容許流量 |
external | 拒絕流入的流量,除非與流出的流量相關;而若是流量與ssh服務相關,則容許流量 |
dmz | 拒絕流入的流量,除非與流出的流量相關;而若是流量與ssh服務相關,則容許流量 |
block | 拒絕流入的流量,除非與流出的流量相關 |
drop | 拒絕流入的流量,除非與流出的流量相關 |
命令行終端是一種極富效率的工做方式,firewall-cmd是firewalld防火牆配置管理工具的CLI命令行界面版本
參數 | 做用 |
---|---|
--get-default-zone | 查詢默認的區域名稱 |
--set-default-zone=<區域名稱> | 設置默認的區域,使其永久生效 |
--get-zones | 顯示可用的區域 |
--get-services | 顯示預先定義的服務 |
--get-active-zones | 顯示當前正在使用的區域與網卡名稱 |
--add-source= | 將源自此IP或子網的流量導向指定的區域 |
--remove-source= | 再也不將源自此IP或子網的流量導向某個指定區域 |
--add-interface=<網卡名稱> | 將源自該網卡的全部流量都導向某個指定區域 |
--change-interface=<網卡名稱> | 將某個網卡與區域進行關聯 |
--list-all | 顯示當前區域的網卡配置參數、資源、端口以及服務等信息 |
--list-all-zones | 顯示全部區域的網卡配置參數、資源、端口以及服務等信息 |
--add-service=<服務名> | 設置默認區域容許該服務的流量 |
--add-port=<端口號/協議> | 設置默認區域容許該端口的流量 |
--remove-service=<服務名> | 設置默認區域再也不容許該服務的流量 |
--remove-port=<端口號/協議> | 設置默認區域再也不容許該端口的流量 |
--reload | 讓「永久生效」的配置規則當即生效,並覆蓋當前的配置規則 |
--panic-on | 開啓應急情況模式 |
--panic-off | 關閉應急情況模式 |
# 默認區域public [root@localhost ~]# firewall-cmd --get-default-zone public
[root@localhost ~]# firewall-cmd --get-zone-of-interface=ens160 public
預計21~22日寫完,看工做期間加不加班吧!
[root@mmx ~]# firewall-cmd --permanent --zone=external --change-interface=ens160 The interface is under control of NetworkManager, setting zone to 'external'. success [root@mmx ~]# firewall-cmd --reload success [root@mmx ~]# firewall-cmd --get-zone-of-interface=ens160 external
[root@mmx ~]# firewall-cmd --set-default-zone=public Warning: ZONE_ALREADY_SET: public success [root@mmx ~]# firewall-cmd --get-default-zone public
發現服務器不正常,爲防止數據進一步丟失,咱們能夠先把網線拔掉,或者服務器斷電,有沒有更好的方法呢?
救援模式也能作到一樣的效果,還能夠容許一些用戶進入
命令 | 介紹 |
---|---|
panic-on | 開啓救援模式 |
panic-off | 關閉救援模式 |
[root@mmx ~]# firewall-cmd --panic-on success
[C:\~]$ ping 192.168.130.100 # 設備訪問,icmp包直接被丟棄 正在 Ping 192.168.130.100 具備 32 字節的數據: 請求超時。 請求超時。 請求超時。 請求超時。 192.168.130.100 的 Ping 統計信息: 數據包: 已發送 = 4,已接收 = 0,丟失 = 4 (100% 丟失),
[root@mmx ~]# firewall-cmd --panic-off success
[C:\~]$ ping 192.168.130.100 正在 Ping 192.168.130.100 具備 32 字節的數據: 來自 192.168.130.100 的回覆: 字節=32 時間<1ms TTL=64 來自 192.168.130.100 的回覆: 字節=32 時間<1ms TTL=64 來自 192.168.130.100 的回覆: 字節=32 時間=1ms TTL=64 來自 192.168.130.100 的回覆: 字節=32 時間<1ms TTL=64 192.168.130.100 的 Ping 統計信息: 數據包: 已發送 = 4,已接收 = 4,丟失 = 0 (0% 丟失), 往返行程的估計時間(以毫秒爲單位): 最短 = 0ms,最長 = 1ms,平均 = 0ms
不加 --permanent命令,當前狀態
加 -permanent命令,重啓以後狀態
[root@mmx ~]# firewall-cmd --zone=public --query-service=ssh yes [root@mmx ~]# firewall-cmd --zone=public --query-service=https no [root@mmx ~]# firewall-cmd --permanent --zone=public --query-service=https no [root@mmx ~]# firewall-cmd --permanent --zone=public --query-service=http no
--add-service=[服務名稱]
# 查看發現並無放行https服務 [root@mmx ~]# firewall-cmd --permanent --zone=public --query-service=https no [root@mmx ~]# firewall-cmd --permanent --zone=public --add-service=https success # 重啓firewalld防火牆 [root@mmx ~]# firewall-cmd --reload success # 發現已經容許http服務 [root@mmx ~]# firewall-cmd --permanent --zone=public --query-service=https yes
--remove-service=[服務名稱]
[root@mmx ~]# firewall-cmd --permanent --zone=public --remove-service=https Warning: NOT_ENABLED: https success [root@mmx ~]# firewall-cmd --reload success [root@mmx ~]# firewall-cmd --zone=public --query-service=https no
--add-port=[端口-端口]/協議
[root@mmx ~]# firewall-cmd --zone=public --add-port=8080-8081/tcp success [root@mmx ~]# firewall-cmd --zone=public --list-ports 8080-8081/tcp
ssh服務是22號端口,我把22號端口屏蔽了,ssh須要經過1500端口才能訪問,端口轉發功能正好解決這一痛點
記得剛剛修改了網卡的默認區域,致使禁用ssh以後竟然還能訪問設備,首先修改網卡區域爲public
[root@mmx ~]# firewall-cmd --permanent --zone=public --change- --change-interface= --change-source= --change-zone= [root@mmx ~]# firewall-cmd --permanent --zone=public --change-interface=ens160 The interface is under control of NetworkManager, setting zone to 'public'. success [root@mmx ~]# firewall-cmd --reload success
該步驟確保ssh只能由一個端口訪問
[root@mmx ~]# firewall-cmd --permanent --zone=public --add-forward-port=port=22:proto=tcp:toport=1500:toaddr=192.168.130.100 success [root@mmx ~]# firewall-cmd --reload success
[root@mmx ~]# firewall-cmd --permanent --zone=public --add-forward-port=port=1500:proto=tcp:toport=22:toaddr=192.168.130.100 Warning: ALREADY_ENABLED: 1500:tcp:22:192.168.130.100 success [root@mmx ~]# firewall-cmd --reload success
# 直接使用ssh命令 [C:\~]$ ssh 192.168.130.100 Connecting to 192.168.130.100:22... Could not connect to '192.168.130.100' (port 22): Connection failed. Type `help' to learn how to use Xshell prompt. #使用ssh命令+指定端口,配置完成 [C:\~]$ ssh 192.168.130.100 1500 Connecting to 192.168.130.100:1500... Connection established. To escape to local shell, press 'Ctrl+Alt+]'. Activate the web console with: systemctl enable --now cockpit.socket Last login: Mon Jul 19 23:02:41 2021 from 192.168.130.1
表示更細緻、更詳細的防火牆策略配置,它能夠針對系統服務、端口號、源地址和目標地址等諸多信息進行更有針對性的策略配置。
需求:不讓一個組訪問ssh和http協議
一、創建家庭規則組
二、拒絕ssh
三、拒絕http……
[root@mmx ~]# firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.130.0/24" service name="ssh" reject" success [root@mmx ~]# firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.130.0/24" service name="http" reject" success [root@mmx ~]# firewall-cmd --reload success
firewalld防火牆配置管理工具的GUI圖形用戶界面版本,幾乎能夠實現全部以命令行來執行的操做。絕不誇張的說,即便讀者沒有紮實的Linux命令基礎,也徹底能夠經過它來妥善配置RHEL 8中的防火牆策略
實驗以前,讓我把系統恢復成初始快照!
[root@mmx ~]# mkdir /media/cdrom [root@mmx ~]# mount /dev/cdrom /media/cdrom/ mount: /media/cdrom: WARNING: device write-protected, mounted read-only. # 寫入/etc/fstab文件 [root@mmx ~]# echo /dev/cdrom /media/cdrom/ iso9660 defauts 0 0 /dev/cdrom /media/cdrom/ iso9660 defauts 0 0 [root@mmx ~]# echo /dev/cdrom /media/cdrom/ iso9660 defauts 0 0 >> /etc/fstab [root@mmx ~]# cat /etc/fstab # # /etc/fstab # Created by anaconda on Sat Feb 13 18:57:33 2021 # # Accessible filesystems, by reference, are maintained under '/dev/disk/'. # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info. # # After editing this file, run 'systemctl daemon-reload' to update systemd # units generated from this file. # UUID=4d4c29d8-ed99-4dc5-9d18-1c07f42c205e / xfs defaults 0 0 UUID=47ad9072-96e0-4ba5-8644-d281a35ac6a2 /boot xfs defaults 0 0 UUID=4ae13371-a715-4fe3-aca6-64fe31bb459f swap swap defaults 0 0 /dev/cdrom /media/cdrom/ iso9660 defaults 0 0 # 該命令無報錯就行! [root@mmx ~]# mount -a
[root@mmx yum.repos.d]# cat xiaoming.repo [BaseOS] name=BaseOS baseurl=file:///media/cdrom/Base enbled=1 gpgcheck=0 [AppStream] name=AppStream baseurl=file:///media/cdrom/AppStream enabled=1 gpgcheck=0
[root@mmx ~]# dnf install firewall-config Updating Subscription Management repositories. Unable to read consumer identity This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register. AppStream 12 MB/s | 5.3 MB 00:00 BaseOS 0.0 B/s | 0 B 00:00 Cannot find a valid baseurl for repo: rhel, ignoring this repo. Failed to synchronize cache for repo 'BaseOS', ignoring this repo. Last metadata expiration check: 0:00:02 ago on Tue 20 Jul 2021 12:57:54 AM PDT. Dependencies resolved. ======================================================================= Package Arch Version Repository Size ======================================================================= Installing: firewall-config noarch 0.6.3-7.el8 AppStream 157 k Transaction Summary ======================================================================= Install 1 Package Total size: 157 k Installed size: 1.1 M Is this ok [y/N]: y Downloading Packages: Running transaction check Transaction check succeeded. Running transaction test Transaction test succeeded. Running transaction Preparing : 1/1 Installing : firewall-config-0.6.3-7.el8.noarch 1/1 Running scriptlet: firewall-config-0.6.3-7.el8.noarch 1/1 Verifying : firewall-config-0.6.3-7.el8.noarch 1/1 Installed products updated. Installed: firewall-config-0.6.3-7.el8.noarch Complete!
[root@mmx ~]# firewall-config
實驗成功
實驗環境RHEL7
/etc/hosts.allow
/etc/hosts.deny
規則:先容許後拒絕
客戶端類型 | 示例 | 知足示例的客戶端列表 |
---|---|---|
單一主機 | 192.168.10.10 | IP地址爲192.168.10.10的主機 |
指定網段 | 192.168.10. | IP段爲192.168.10.0/24的主機 |
指定網段 | 192.168.10.0/255.255.255.0 | IP段爲192.168.10.0/24的主機 |
指定DNS後綴 | .linuxprobe.com | 全部DNS後綴爲.linuxprobe.com的主機 |
指定主機名稱 | www.baidu.com | 主機名稱爲www.baidu.com的主機 |
指定全部客戶端 | ALL | 全部主機所有包括在內 |
本機 IP地址 192.168.125.1
RHEL7 IP地址192.168.125.132
[root@localhost ~]# echo sshd:192.168.125.* >> /etc/hosts.allow [root@localhost ~]# echo sshd:* >> /etc/hosts.deny [root@localhost ~]# tail -n 3 /etc/hosts.allow # See 'man tcpd' for information on tcp_wrappers # sshd:192.168.125. [root@localhost ~]# tail -n 3 /etc/hosts.deny # See 'man tcpd' for information on tcp_wrappers # sshd:*
[C:\~]$ Connecting to 192.168.125.132:22... Connection established. To escape to local shell, press 'Ctrl+Alt+]'. WARNING! The remote SSH server rejected X11 forwarding request. Last login: Wed Jul 21 00:50:26 2021 from 192.168.125.1 [root@localhost ~]#
[root@localhost ~]# tail -n 5 /etc/hosts.allow # # See 'man 5 hosts_options' and 'man 5 hosts_access' # for information on rule syntax. # See 'man tcpd' for information on tcp_wrappers #
[C:\~]$ Connecting to 192.168.125.132:22... Connection established. To escape to local shell, press 'Ctrl+Alt+]'. Connection closing...Socket close. Connection closed by foreign host. Disconnected from remote host(紅帽7) at 17:04:55. Type `help' to learn how to use Xshell prompt.
Cockpit是一個基於網頁的圖形化工具,自然具有很好的跨平臺性,被 普遍使用於服務器、容器、虛擬機等等多種管理場景,即使是新手均可以直接上手操做。最後要說的是紅帽公司對Cockpit十分的看重,從最開始就默認安裝到了RHEL 8系統中,衍生的CentOS和Fedora也都是標配它。
[root@linuxprobe ~]# dnf install cockpit Updating Subscription Management repositories. Unable to read consumer identity This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register. AppStream 3.1 MB/s | 3.2 kB 00:00 BaseOS 2.7 MB/s | 2.7 kB 00:00 Package cockpit-185-2.el8.x86_64 is already installed. Dependencies resolved. Nothing to do. Complete!
[root@linuxprobe ~]# systemctl start cockpit [root@linuxprobe ~]# systemctl enable cockpit.socket Created symlink /etc/systemd/system/sockets.target.wants/cockpit.socket → /usr/lib/systemd/system/cockpit.socket.
例如:https://XXX.XXX.XXX.XXX:9090