- 先來看幾個問題
ssh是什么?ssh的作用是啥桐猬?是如何實現(xiàn)的麦撵?如何實現(xiàn)不輸入密碼進行登陸?ssh用戶這邊保存的是公鑰還是私鑰?ssh的端口轉(zhuǎn)發(fā)是什么免胃?
1音五、ssh是什么?
ssh是一種網(wǎng)絡(luò)協(xié)議羔沙,用于計算機之間的加密登陸躺涝。如果一個用戶從本地計算機,使用ssh協(xié)議登陸另一臺遠程計算機扼雏,我們就可以認為坚嗜,這種登陸是安全的,即使中途被截獲诗充,密碼也不會泄露苍蔬。(因為最早的時候計算機都是明文通信的,一旦被截獲蝴蜓,內(nèi)容就暴露無疑碟绑。
*需要注意的是:
ssh會把你每個你訪問過計算機的公鑰(public key)都記錄在~/.ssh/known_hosts。當下次訪問相同計算機時励翼,OpenSSH會核對公鑰蜈敢。如果公鑰不同,OpenSSH會發(fā)出警告汽抚。
2抓狭、兩種方式實現(xiàn)不輸入密碼登陸:
一般的方法是基于口令的,需要在認證過程中傳輸公鑰造烁,輸入口令否过。
而基于密鑰的方法,不需要輸入密碼進行登陸
- 直接在本地(服務(wù)器)把公鑰認證到本地惭蟋,然后把私鑰發(fā)送到遠程苗桂,此時遠程就可以直接登陸服務(wù)器.本地生成認證文件(auth)。
- 在本地直接使用ssh-copy-id 遠程ip 就是將本地的公鑰匙發(fā)送到遠程告组,就是遠程的認證文件煤伟。此時本地可以直接登陸到遠程。
1木缝、最常用的使用密碼登陸遠程
[root@server1 ~]# cd /root/.ssh/
[root@server1 .ssh]# ls
authorized_keys
[root@server1 .ssh]# rm -rf authorized_keys
[root@server1 .ssh]# ls
[root@server1 .ssh]#
[root@server1 .ssh]# /etc/init.d/sshd status
openssh-daemon (pid 963) 正在運行...
[root@ivans ~]# cd /root/.ssh/
[root@ivans .ssh]# ls
known_hosts
[root@ivans .ssh]# rm -rf known_hosts
[root@ivans .ssh]# ls
[root@ivans .ssh]#
[root@ivans .ssh]# systemctl status sshd
● sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
Active: active (running) since 二 2018-12-18 12:00:01 CST; 3h 28min ago
Process: 1524 ExecStartPre=/usr/sbin/sshd-keygen (code=exited, status=0/SUCCESS)
Main PID: 2001 (sshd)
CGroup: /system.slice/sshd.service
└─2001 /usr/sbin/sshd -D
12月 18 12:00:00 ivans systemd[1]: Starting OpenSSH server daemon...
12月 18 12:00:01 ivans systemd[1]: Started OpenSSH server daemon.
12月 18 12:00:02 ivans sshd[2001]: Server listening on 0.0.0.0 port 22.
12月 18 12:00:02 ivans sshd[2001]: Server listening on :: port 22.
本來已經(jīng)清空了.ssh這個目錄的的東西便锨,但是從虛擬機連接一次主機完畢后,發(fā)現(xiàn)多了一個knownhosts文件我碟。
此時我們對比真機上的公鑰文件放案,發(fā)現(xiàn)客戶端這邊knownhosts記錄的是服務(wù)器的公鑰。
我們刪除服務(wù)器上的公鑰矫俺,重新生成吱殉,發(fā)現(xiàn)公鑰是不變的振乏。
2鹦牛、配置sshd免密登陸
第一種方法:在客戶端將本地的公鑰發(fā)送到遠程
[root@server1 .ssh]# ssh-copy-id 172.25.4.250
此時發(fā)現(xiàn)客戶端可以直接登陸服務(wù)器近范,但是服務(wù)器端多了一個認證文件澎现,這個文件里記錄的是客戶端的公鑰
第二種方法,在服務(wù)器端將公鑰認證在本地然后將私鑰匙發(fā)送到客戶端押赊。
[root@ivans .ssh]# ssh-keygen
[root@ivans .ssh]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.25.4.250
[root@ivans .ssh]# scp id_rsa 172.25.4.1:/root/.ssh/
這么說吧缎罢!
實現(xiàn)免密登陸的第一種方法,是通過將本地的公鑰直接發(fā)送到遠程考杉,這種方法首先需要通過ssh-keygen命令在/root/.ssh/目錄下生成公鑰和私鑰匙,再通過ssh-copy-id 遠程主機的ip地址舰始,需要輸入一次yes這個時候就已經(jīng)將遠程主機的公鑰添加到knownhosts文件里崇棠,以后登陸不需要輸入yes也不需要輸入密碼了。
實現(xiàn)免密碼登陸的第二種方法丸卷,是通過先在服務(wù)器端將服務(wù)端的公鑰認證到服務(wù)端枕稀,此時服務(wù)端的/root/.ssh/目錄下會生成authorized_keys這個文件,這個文件里面記錄的是服務(wù)端的公鑰匙谜嫉,然后我們需要將服務(wù)端的私鑰發(fā)送到遠程客戶端萎坷。此時客戶端可以免密登陸,但是需要輸入yes確認將服務(wù)器端的公鑰寫入到本地的knownhosts文件中沐兰。
- ssh服務(wù)安全配置
ssh服務(wù)的配置文件為: /etc/ssh/sshd_config 更改配置文件后一定要重新啟動systemctl restart sshd一定記住
PasswordAuthencation yes|no
是否開啟用戶密碼認證 yes為支持 no為關(guān)閉
PermitRootLogin yes|no
是否允許超級用戶登錄 yes為允許 no為不允許*不允許別的主機登陸你的root帳號
AllowUsers 哆档、DenyUsers用戶白名單和黑名單
ssh的端口轉(zhuǎn)發(fā)
端口轉(zhuǎn)發(fā)簡介:
ssh的基本特性是會自動加密ssh服務(wù)端和客戶端的所有數(shù)據(jù)。那么住闯,我們可以通過ssh為其他的一些tcp連接提供一個安全的通道瓜浸,ssh將其他的一些tcp端口的網(wǎng)絡(luò)數(shù)據(jù)轉(zhuǎn)發(fā)達到安全傳輸?shù)哪康摹H绫仍瑃elent插佛,smtp
等tcp應(yīng)用,從而避免了用戶名密碼等的明文傳輸量窘。還有一種情況雇寇,如果工作環(huán)境中的防火墻限制了一些網(wǎng)絡(luò)端口的使用,但是允許ssh連接蚌铜,也能夠通過將tcp端口轉(zhuǎn)發(fā)锨侯,使用ssh進行通信。
兩大功能:
- 加密ssh服務(wù)端和客戶端之間的通信數(shù)據(jù)
- 突破防火墻的間隔完成一些之前無法建立的tcp連接厘线。
實驗一
1识腿、本地轉(zhuǎn)發(fā)
實驗背景:
說明:
22端口為sshd服務(wù)監(jiān)聽的端口
23端口為telnet服務(wù)監(jiān)聽的端口
企業(yè)內(nèi)部c服務(wù)器僅僅允許telnet連接就是23端口訪問,而不允許外部直接訪問造壮,而b服務(wù)器是一個ssh服務(wù)器渡讼,一個用戶需要從企業(yè)外部訪問企業(yè)內(nèi)部的c服務(wù)器骂束。前提是企業(yè)的防火墻允許22端口進來。
命令:ssh -L localport:remotehost:remotehostport sshserver
localport 代表a機器開啟的端口號成箫,用來與b機器進行連接
remotehost 代表最終連接機器的ip地址
remotehostport 代表最終連接機器的端口號
sshserver代表轉(zhuǎn)發(fā)機器也就是機器b的ip地址
-f代表后臺啟用展箱。當你的隧道建立完畢后,隧道進程會默認后臺啟動
-N代表不打開遠程shell蹬昌,處于等待狀態(tài)
實驗環(huán)境:rhel7
server1:172.25.4.1 作為實驗背景中的a機器
server2:172.25.4.2 b機器
server3:172.25.4.3 c機器
首先混驰,我們得在c機器上設(shè)置防火墻策略,還原實驗場景
1皂贩、設(shè)置拒絕a機器連接
[root@server3 ~]# iptables -A INPUT -s 172.25.4.1 -j REJECT
[root@server3 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
REJECT all -- 172.25.4.1 0.0.0.0/0 reject-with icmp-port-unreachable
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@server1 ~]# ssh root@172.25.4.3
ssh: connect to host 172.25.4.3 port 22: Connection refused
2栖榨、開啟c機器的23端口,telnet服務(wù)監(jiān)聽的端口
3明刷、開啟端口轉(zhuǎn)發(fā)
查看a機器都使用了哪些端口
[root@server1 ~]# ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
設(shè)置端口轉(zhuǎn)發(fā)策略婴栽,由于發(fā)現(xiàn)9527端口沒有被使用,然后我們就建立本地轉(zhuǎn)發(fā)的隧道
[root@server1 ~]# ssh -L 9527:172.25.4.3:23 -fN 172.25.4.2
[root@server1 ~]# ss -nt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 172.25.4.1:35828 172.25.4.2:22
ESTAB 0 0 172.25.4.1:22 172.25.4.250:55842
使用ss -nt查看端口連接情況
我們發(fā)現(xiàn)9527端口和server2的22端口已經(jīng)建立連接成功辈末,然后使用telnet訪問本地的9527端口愚争,然后會通過ssh到server2再從server2到server3的23端口。這個結(jié)果代表已經(jīng)建立連接挤聘,由于telnet默認超戶無法登陸轰枝,所以我們得新建用戶再測試。