一 方案與思路
- 0 xshell客戶端監測是否能夠ping通目標服務器。
- 前提:知曉目標服務器IP地址
- Linux: ifconfig -a
- Windows: ipconfig -a
- 前提:知曉目標服務器IP地址
- 1 利用firewall工具,檢查是否已開啟ssh的22端口。若無,則:開啟22端口
- 2 利用sshd工具,檢查是否已開啟sshd服務。若無,則:開啟sshd服務
- 開(重)啟ssh服務: system (re)start sshd
- 3 利用systemctl工具,檢查是否已開啟sshd、firewalld的開機自啟服務。若無,則:開啟sshd、firewalld服務的開機自啟
- systemctl enable sshd
- systemctl list-unit-files | grep sshd
- systemctl enable firewalld[.service]
- systemctl list-unit-files | grep firewall
二 相關知識及操作命令
關鍵工具
ssh:客戶端,主要進行服務器端的連接
sshd:服務端,作用於服務器端(開閉ssh服務等操作)
ssh————————————>sshd
client serve
firewalld(防火牆)
firwall-cmd(Linux提供的操作firewall的一個工具)
systemctl(服務控制命令)
1 sshd
- 查看服務狀態
inactive(不可用),active(可用,活動狀態)
systemctl status sshd
- 列出已開啟服務當前狀態
systemctl list-units | grep <目標服務,例如:ssh>
或
netstat -antulp | grep ssh

- 開啟ssh服務
systemctl start sshd
- 設定服務開機啟動
systemctl enable sshd
- 查看sshd開機自啟服務是否已開啟
systemctl list-unit-files | grep sshd
- 關閉ssh服務
systemctl stop sshd
- 設定服務開機不啟動
systemctl disable sshd
- 重啟ssh服務
systemctl restart sshd
- 重新加載服務配置
systemctl reload sshd
2 防火牆(firewalld/firewall-cmd)
2.1 查看
- 查看firewall服務狀態
(centos7)
[centos 7]
systemctl status firewalld
[centos 6/7]
service firewalld status

- 查看防火牆狀態
firewall-cmd --state

- 查看防火牆規則
firewall-cmd --list-all


- 查詢端口是否開放
firewall-cmd --query-port=8080/tcp
2.2 操縱
1.2.1 firewall端口
- 開放端口
例如,80端口
--permanent:表示設置為持久;
--add-port:標識添加的端口;
firewall-cmd --permanent --add-port=80/tcp
--permanent:表示設置為持久
--add-port:標識添加的端口
- 移除端口
firewall-cmd --permanent --remove-port=8080/tcp
1.2.2 firewall服務
- 開啟
(centos7)
service firewalld start
- 重啟
(centos7)
service firewalld restart
# 或者↓
firewall-cmd --reload 【重啟防火牆(修改配置后,要重啟防火牆)】
- 啟用/禁用 開機自啟
systemctl enable/disable firewalld.service
- 關閉
service firewalld stop
2.3 補充: CentOS6的防火牆iptables操作
# 安裝防火牆(iptables)
yum install iptables //CentOS
apt-get install iptables //Debian/Ubuntu
# 查看防火牆狀態
service iptables status
# 停止防火牆
service iptables stop
# 啟動防火牆
service iptables start
# 重啟防火牆
service iptables restart
# 永久關閉防火牆 (停用開機自啟)
chkconfig iptables off
# 永久關閉后重啟 (啟用 開機自啟)
chkconfig iptables on
2.4 防火牆進階篇
- iptables的結構
參見
CentOS iptables防火牆的理解和使用 - 博客園
iptables工具__過濾包—命令... - CSDN
【四張表】:Raw追蹤表——mangle修改表——nat地址轉換——filter過濾表(默認表,常用)(四張表按優先級從高到低) 使用參數-t 表選擇表


【五條鏈】:prerouting、input(常用)、forward、output、postrouting
在鏈前使用參數:
-P/--policy:新建鏈。定義過濾政策。 也就是未符合過濾條件之封包,預設的處理方式。
-L/--list:列出規則
-A/--append:追加規則
-D/--delete:刪除規則
-I/--insert:插入規則。插入一條規則,原本該位置(這里是位置1)上的規則將會往后移動一個順位。
-R/--replace:替換規則 (取代現行規則,規則被取代后並不會改變順序)
-N/--new-chain: 新增鏈。定義新的規則鏈
-F/--flush:刪除規則。刪除某規則鏈(這里是INPUT規則鏈)中的所有規則(Eg: iptables -F INPUT)
-Z/--zero:清零 計數。將封包計數器歸零。封包計數器是用來計算同一封包出現次數,是過濾阻斷式攻擊不可或缺的工具。
-X/--delete-chain:刪除鏈
【過濾規則】:源IP -s
、源PORT --sport
/ 目標IP -d
、目標PORT --dport
/ 協議(tcp、udp、icmp)-p
、狀態--state
/ 數據流入接口,進網卡 -i
、數據流出接口,出網卡-o
【執行動作】:-j :ACCEPT接受報、DROP丟棄報、REJECT丟棄報並通知對方、REDIRECT重定向包、MASQUERADE (改寫源IP為防火牆ip)等
ACCEPT 將封包放行,進行完此處理動作后,將不再比對其它規則,直接跳往下一個規則鏈(natostrouting)。
REJECT 攔阻該封包,並傳送封包通知對方,可以傳送的封包有幾個選擇:ICMP port-unreachable、ICMP echo-reply 或是 tcp-reset(這個封包會要求對方關閉聯機),進行完此處理動作后,將不再比對其它規則,直接中斷過濾程序。 例如:iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with tcp-reset
DROP 丟棄封包不予處理,進行完此處理動作后,將不再比對其它規則,直接中斷過濾程序。
REDIRECT 將封包重新導向到另一個端口(PNAT),進行完此處理動作后,將會繼續比對其它規則。 這個功能可以用來實作通透式porxy 或用來保護 web 服務器。 例如:iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
MASQUERADE 改寫封包來源 IP 為防火牆 NIC IP,可以指定 port 對應的范圍,進行完此處理動作后,直接跳往下一個規則(mangleostrouting)。這個功能與 SNAT 略有不同,當進行 IP 偽裝時,不需指定要偽裝成哪個 IP,IP 會從網卡直接讀,當使用撥接連線時,IP 通常是由 ISP 公司的 DHCP 服務器指派的,這個時候 MASQUERADE 特別有用。例如:iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-31000
LOG 將封包相關訊息紀錄在 /var/log 中,詳細位置請查閱 /etc/syslog.conf 組態檔,進行完此處理動作后,將會繼續比對其規則。例如:iptables -A INPUT -p tcp -j LOG --log-prefix "INPUT packets"
SNAT 改寫封包來源 IP 為某特定 IP 或 IP 范圍,可以指定 port 對應的范圍,進行完此處理動作后,將直接跳往下一個規則(mangleostrouting)。例如:iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT --to-source 194.236.50.155-194.236.50.160:1024-32000
DNAT 改寫封包目的地 IP 為某特定 IP 或 IP 范圍,可以指定 port 對應的范圍,進行完此處理動作后,將會直接跳往下一個規煉(filter:input 或 filter:forward)。例如:iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.1.1-192.168.1.10:80-100
MIRROR 鏡射封包,也就是將來源 IP 與目的地 IP 對調后,將封包送回,進行完此處理動作后,將會中斷過濾程序。
QUEUE 中斷過濾程序,將封包放入隊列,交給其它程序處理。透過自行開發的處理程序,可以進行其它應用,例如:計算聯機費......等。
RETURN 結束在目前規則煉中的過濾程序,返回主規則煉繼續過濾,如果把自訂規則煉看成是一個子程序,那么這個動作,就相當提早結束子程序並返回到主程序中。
MARK 將封包標上某個代號,以便提供作為后續過濾的條件判斷依據,進行完此處理動作后,將會繼續比對其它規則。例如:iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2
【加載其他過濾模塊】 -m (state 狀態(NEW、ESTABLISHED、RELATED、INVALID)、multiport 多端口、limit 包流量、mac 網卡地址)
參數 -m multiport --source-port
例如: iptables -A INPUT -p tcp -m multiport --source-port 22,53,80,110
說明 用來比對不連續的多個來源埠號,一次最多可以比對 15 個埠,可以使用 ! 運算子進行反向比對。
參數 -m multiport --destination-port
例如: iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80,110
說明 用來比對不連續的多個目的地埠號,設定方式同上。
參數 -m multiport --port
例如: iptables -A INPUT -p tcp -m multiport --port 22,53,80,110
說明 這個參數比較特殊,用來比對來源埠號和目的埠號相同的封包,設定方式同上。
注意:在本范例中,如果來源端口號為 80目的地埠號為 110,這種封包並不算符合條件。
參數 --icmp-type
例如: iptables -A INPUT -p icmp --icmp-type 8
說明 用來比對 ICMP 的類型編號,可以使用代碼或數字編號來進行比對。
請打 iptables -p icmp --help 來查看有哪些代碼可用。
參數 -m limit --limit
例如: iptables -A INPUT -m limit --limit 3/hour
說明 用來比對某段時間內封包的平均流量,上面的例子是用來比對:每小時平均流量是否超過一次 3 個封包。 除了每小時平均次外,也可以每秒鍾、每分鍾或每天平均一次,
默認值為每小時平均一次,參數如后: /second、 /minute、/day。 除了進行封數量的比對外,設定這個參數也會在條件達成時,暫停封包的比對動作,以避免因駭客使用洪水攻擊法,導致服務被阻斷。
參數 --limit-burst
范例 iptables -A INPUT -m limit --limit-burst 5
說明 用來比對瞬間大量封包的數量,上面的例子是用來比對一次同時涌入的封包是否超過 5 個(這是默認值),超過此上限的封將被直接丟棄。使用效果同上。
參數 -m mac --mac-source
范例 iptables -A INPUT -m mac --mac-source 00:00:00:00:00:01
說明 用來比對封包來源網絡接口的硬件地址,這個參數不能用在 OUTPUT 和 Postrouting規則煉上,這是因為封包要送出到網后,才能由網卡驅動程序透過 ARP 通訊協議查出目的地的 MAC 地址,所以 iptables 在進行封包比對時,並不知道封包會送到個網絡接口去。
參數 --mark
范例 iptables -t mangle -A INPUT -m mark --mark 1
說明 用來比對封包是否被表示某個號碼,當封包被比對成功時,我們可以透過 MARK 處理動作,將該封包標示一個號碼,號碼最不可以超過 4294967296。
參數 -m owner --uid-owner
范例 iptables -A OUTPUT -m owner --uid-owner 500
說明 用來比對來自本機的封包,是否為某特定使用者所產生的,這樣可以避免服務器使用 root 或其它身分將敏感數據傳送出,可以降低系統被駭的損失。可惜這個功能無法比對出來自其它主機的封包。
參數 -m owner --gid-owner
范例 iptables -A OUTPUT -m owner --gid-owner 0
說明 用來比對來自本機的封包,是否為某特定使用者群組所產生的,使用時機同上。
參數 -m owner --pid-owner
范例 iptables -A OUTPUT -m owner --pid-owner 78
說明 用來比對來自本機的封包,是否為某特定行程所產生的,使用時機同上。
參數 -m owner --sid-owner
范例 iptables -A OUTPUT -m owner --sid-owner 100
說明 用來比對來自本機的封包,是否為某特定聯機(Session ID)的響應封包,使用時機同上。
參數 -m state --state
范例 iptables -A INPUT -m state --state RELATED,ESTABLISHED
說明 用來比對聯機狀態,聯機狀態共有四種:INVALID、ESTABLISHED、NEW 和 RELATED。
INVALID 表示該封包的聯機編號(Session ID)無法辨識或編號不正確。
ESTABLISHED 表示該封包屬於某個已經建立的聯機。
NEW 表示該封包想要起始一個聯機(重設聯機或將聯機重導向)。
RELATED 表示該封包是屬於某個已經建立的聯機,所建立的新聯機。例如:FTP-DATA 聯機必定是源自某個 FTP 聯機。
- 查看 已添加的iptables規則
iptables -L -n
v:顯示詳細信息,包括每條規則的匹配包數量和匹配字節數
x:在 v 的基礎上,禁止自動單位換算(K、M)
n:只顯示IP地址和端口號,不將ip解析為域名
- 屏蔽 MAC
按來源MAC地址匹配,拒絕轉發來自該MAC地址的數據包.
iptables -t filter -A FORWARD -m --mac-source 00:02:b2:03:a5:f6 -j DROP
- 屏蔽 IP(網段)
iptables -I INPUT -s 124.115.0.199 -j DROP //屏蔽124.115.0.199這個IP
iptables -I INPUT -s 124.115.0.0/16 -j DROP //屏蔽124.115.*.*這一網段段(124.115開頭)的所有IP
iptables -I INPUT -s 61.37.80.0/24 -j DROP //屏蔽61.37.80.*這一網段段(61.37.80開頭)的所有IP
iptables -I INPUT -s 124.0.0.0/8 -j DROP //屏蔽124.*.*.*這一網段段(124開頭)的所有IP
- 將1分鍾內連續超過3次的SSH連接請求拒絕掉
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSH_RECENT --rcheck --seconds 60 --hitcount 3 -j DROP
- 保存 規則
service iptables save //也可指定存儲文件: iptables-save > /etc/sysconfig/iptables
- 開啟/取消屏蔽 IP(網段)
(只要把參數-I
改為-D
就好了)
iptables -D INPUT -s 124.0.0.0/8 -j DROP //取消屏蔽 124.*.*.*這一網段段(124開頭)的所有IP 【取消 指定對滿足條件包的執行DROP的規則】
iptables -D INPUT -s 124.0.0.0/8 -j REJECT //取消屏蔽 124.*.*.*這一網段段(124開頭)的所有IP 【取消 指定對滿足條件包的執行REJECT的規則】
- 清除 已有iptables規則
iptables -F //全清掉了
iptables -X
iptables -Z
三 開機自啟
3.1 Linux的運行級別
Linux的運行級別有6個,而這6個運行級都有各自的功能,某個程序在一個運行級別里面運行,在另一個級別就不運行。
- 0 - halt (Do NOT set initdefault to this) 系統停止 / 關機模式
- 1 - Single user mode 單用戶運行模式
- 2 - Multiuser, without NFS (The same as 3, if you do not have networking) 無網絡多用戶模式
- 3 - Full multiuser mode 有網絡多用戶(完整多用戶模式)
- 4 - unused 未使用
- 5 - X11 有網絡支持,且有X-Window支持的多用戶模式 (圖形模式)
- 6 - reboot (Do NOT set initdefault to this) 重新引導系統 (即 重啟)
一般情況下,我們處於的運行級在3或者5。
這6種模式還有許多功能,比如說:
如果忘記了root密碼就可以進入單用戶模式,
在啟動后的提示符界面下輸入init = /bin/sh rw就進入了模式1,
把root文件掛為讀寫就可以跳過系統認證,
直接用passwd程序來更改root用戶口令了,
然后,再啟動到正常的運行級去即可。
查看6大運行級別信息 、 修改運行級別(啟動模式)
CentOS6/RHEL6 及之前的版本,查看、修改啟動模式,都是在 /etc/inittab
文件里直接修改,修改id后面的數字即可。
shell# cat /etc/inittab
# inittab is only used by upstart for the default runlevel.
#
# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# System initialization is started by /etc/init/rcS.conf
#
# Individual runlevels are started by /etc/init/rc.conf
#
# Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf
#
# Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,
# with configuration in /etc/sysconfig/init.
#
# For information on how to write upstart event handlers, or how
# upstart works, see init(5), init(8), and initctl(8).
#
# Default runlevel. The runlevels used are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
#
id:3:initdefault:
CentOS7/RHEL7 之后版本,查看、修改啟動模式,也在 /etc/inittab
里有介紹
# inittab is no longer used when using systemd.
#
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
#
# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
#
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5
#
# To view current default target, run:
# systemctl get-default
#
# To set a default target, run:
# systemctl set-default TARGET.target
查看當前的啟動模式/運行級別
[CentOS6/RHEL6 及之前的版本]
查看模式,在 /etc/inittab
文件里直接查看末行的id
后面的數字即可。
[centos7]
- runlevel0.target -> poweroff.target
- runlevel1.target -> rescue.target
- runlevel2.target -> multi-user.target
- runlevel3.target -> multi-user.target
multi-user.target
: analogous to runlevel 3
-
runlevel4.target -> multi-user.target
-
runlevel5.target -> graphical.target
graphical.target
: analogous to runlevel 5
- runlevel6.target -> reboot.targe
systemctl get-default
查看指定運行模式下可使用的功能服務
怎么查看在當前模式下可以使用什么功能呢?查看/etc/rc.d/init.d這個文件夾下
ll /etc/rc.d/init.d

怎么查看在不同運行模式下,可以使用什么功能呢?
查看/etc/rc.d/init.d
這個文件夾下,就是可以運行的腳本.如下圖:
ll /etc/rc.d

或者:
ll /etc/rc[0-6].d
通過下圖,可以發現: 在/etc下也有同樣的7個文件夾即 /etc/rc[0-6].d
,通過查看發現/etc/rc[0-6].d
其實就是/etc/rc.d/rc[0-6].d
的軟連接,只是為了保持和Unix的兼容性

ll /etc/rcN.d
或者 ll /etc/rc.d/rc[0-6].d

↓↓↓
這些文件是按照如下格式命名的 [KS][1-100]servicename ,它表示當系統的運行級別為5時,它會關掉以K開頭的所有服務,並啟動所有以S開頭的服務。
其實,這些服務都是/etc/init.d/中某個服務的軟連接,所以真正啟動的服務是/etc/init.d目錄中的某一個服務,而以K/S開頭建立軟連接是為了表明在對應級別下應該采取的行為,K/S后面緊跟的數字表示開/關服務的優先級。

因此,如果我們自己寫了一個腳本代碼 如cleanupd
,需要在開機級別為3的時候自啟動的話,那么我們只需要把可執行的cleanupd
腳本文件放到 /etc/init.d目錄下,並在對應的運行級別目錄下 如/etc/rc.d/rc3.d/ 建立一個以S開頭后加數字的軟連接到/etc/init.d/cleanupd即可,如
ln -s /etc/init.d/cleanupd /etc/rc.d/rc3.d/S95cleanup
設置、切換啟動模式/運行級別
那么如何切換啟動模式呢?
[通用方法]
使用"init + 運行級別"回車即可直接進入,比如:輸入init 0
電腦就會關機,輸入init 6
電腦就會重啟


[centos7]
systemctl set-default <TARGET.target>
修改完成,重啟服務器,即生效。
3.2 查看 開機自啟
- 查看 開機自啟的所有服務
[centos6/7/8/...]
chkconfig --list
[centos7/8/...]
systemctl list-unit-files
或者 systemctl list-unit-files | grep -i xxx

- 查看是否有定時執行任務
參考文獻
[查看 定時服務是否已開啟]
systemctl status crond
[查看 定時 執行任務列表]
crontab -e
3.3 設置 開機自啟
方式1: chkconfig 【推薦】
Linux chkconfig命令用於檢查,設置系統的各種服務。用來設置服務的運行級信息,該設置並非立即啟動,或者禁用制定服務。
這是Red Hat公司遵循GPL規則所開發的程序,它可查詢操作系統在每一個執行等級中會執行哪些系統服務,其中包括各類常駐服務。
這個命令是centos7之前版本使用的,但是目前是過渡期,在centos7上依然可以使用,這個命令只列出SysV服務機制的服務,並不包含centos7上systemd服務
注: Linux默認允許任何人按下Ctrl+Alt+Del來重啟系統。但是在生產環境中,應該停用按下Ctrl-Alt-Del 重啟系統的功能。
- 停用/啟用 指定服務的開機自啟
chkconfig network off/on | 關閉network
chkconfig iptables off/on | 關閉防火牆
linux有7個運行級別: 0-6
0級別表示:關機狀態
1級別表示:單用戶模式
2級別表示:沒有nfs服務
3級別表示:多用戶模式,不帶圖形界面
4級別表示:保留的級別
5級別表示:多用戶模式,帶圖形界面
6級別表示:重啟

- 自定義設置 開機自啟服務
/etc/inittab
在centos7之前版本中,可修改此配置文件來定義系統運行級別,只不過在centos7系統中,已經不使用了。
#chkconfig --level 3 network off //關閉3級別的network服務
#chkconfig --level 35 network off //關閉3級別和5級別的network服務
#chkconfig --level 345 network on //開啟3、4、5級別的network服務
在/etc/init.d/下創建一個自己的腳本,然后使用命令:
chkconfig --add +腳本名稱 //就可以把自己的腳本添加到開機服務列表中
自己添加的腳本中必須要有:chkconfig: 2345 10 90
和 description: Activates/Deactivates all network interfaces configured to \ start at boot time.
這兩部分才能被識別,其中必須是shell腳本,2345表示啟動級別是2、3、4、5級別,10表示啟動順序是第10位,90是第90位關閉

#chkconfig --del +腳本名稱 //刪除開機自啟動服務
方式2: 修改 /etc/rc.d/rc.local 文件
- step1 賦予腳本可執行權限(/opt/script/autostart.sh是你的腳本路徑)
chmod +x /opt/script/autostart.sh
- step2 打開
/etc/rc.d/rc/local
文件,配置、指定具體功能模塊的開機自啟的shell啟動操作
例如: 例如將 apache、MySQL、samba、autostart.sh(自定義的用戶啟動腳本)等這些服務的開機自啟動問題一起搞定:
vi/etc/rc.d/rc.local
/usr/sbin/apachectl start
/etc/rc.d/init.d/mysqld start
/etc/rc.d/init.d/smb start
/opt/script/autostart.sh
- 在centos7中,/etc/rc.d/rc.local的權限被降低了,所以需要執行如下命令賦予其可執行權限
chmod +x /etc/rc.d/rc.local
方式3: 修改 /etc/rc.d/init.d 文件 + chkconfig
- step1 將腳本移動到
/etc/rc.d/init.d
目錄下
mv /opt/script/autostart.sh /etc/rc.d/init.d
- step2 增加腳本的可執行權限
chmod +x /etc/rc.d/init.d/autostart.sh
- step3 添加腳本到開機自動啟動項目中
cd /etc/rc.d/init.d
chkconfig --add autostart.shchkconfig autostart.sh on
方式4: ln -s 建立軟連接
如果我們自己寫了一個腳本代碼 如 cleanupd,需要在開機級別為3的時候自啟動的話.
那么,我們只需要把可執行的cleanupd腳本文件放到 /etc/init.d目錄下,並在對應的運行級別目錄下 如/etc/rc.d/rc3.d/ 建立一個以S開頭后加數字的軟連接到/etc/init.d/cleanupd即可,如:
ln -s /etc/init.d/cleanupd /etc/rc.d/rc3.d/S95cleanup