OpenSSH
OpenSSH 是 SSH (Secure SHell) 協(xié)議的免費開源實現(xiàn)简识。SSH協(xié)議族可以用來進行遠(yuǎn)程控制薪者, 或在計算機之間傳送文件斯棒。而實現(xiàn)此功能的傳統(tǒng)方式许帐,如telnet(終端仿真協(xié)議)劳坑、 rcp ftp、 rlogin成畦、rsh都是極為不安全的距芬,并且會使用明文傳送密碼。OpenSSH提供了服務(wù)端后臺程序和客戶端工具循帐,用來加密遠(yuǎn)程控件和文件傳輸過程中的數(shù)據(jù)框仔,并由此來代替原來的類似服務(wù)。
服務(wù)端配置文件:/etc/ssh/sshd_config拄养,客戶端配置文件/etc/ssh/sshd_config
Centos下的openssh軟件包
openssh
openssh-clients
openssh-server
一些命令
ssh 連接遠(yuǎn)程服務(wù)器离斩,選項在下面介紹
ssh-keygen 用于為ssh生成、管理和轉(zhuǎn)換認(rèn)證密鑰,它支持RSA和DSA兩種認(rèn)證密鑰
-b:指定密鑰長度跛梗;
-B:先生密鑰文件的信息
-e:讀取openssh的私鑰或者公鑰文件寻馏,將OpenSSH轉(zhuǎn)換為RFC 4716密鑰文件
-C:添加注釋;
-c:更改注釋
-f:指定用來保存密鑰的文件名茄袖;
-i:讀取未加密的ssh-v2兼容的私鑰/公鑰文件操软,然后在標(biāo)準(zhǔn)輸出設(shè)備上顯示openssh兼容的私鑰/公鑰
-l:顯示公鑰文件的指紋數(shù)據(jù);
-N:提供一個新密語宪祥;
-P:提供舊密碼聂薪,來重新設(shè)置密碼
-p:重新設(shè)置私鑰文件的密碼
-q:靜默模式;
-t:指定要創(chuàng)建的密鑰類型蝗羊。
ssh-copy-id 命令可以把本地主機的公鑰復(fù)制到遠(yuǎn)程主機的authorized_keys文件上
-i 指定公鑰文件
ssh-agent 私鑰代理程序運行ssh-agent以后藏澳,使用ssh-add將私鑰交給ssh-agent保管
-a:將代理綁定到UNIX域的套接字綁定地址
-c:生成C-shell風(fēng)格的命令輸出。
-d:調(diào)試模式耀找。
-k:把ssh-agent進程殺掉翔悠。
-s:生成Bourne shell 風(fēng)格的命令輸出。
-t life:設(shè)置默認(rèn)值添加到代理人的身份最大壽命
ssh-add 把私鑰的密碼添加給agent
-D:刪除ssh-agent中的所有密鑰
-d:從ssh-agent中的刪除密鑰
-e pkcs11:刪除PKCS#11共享庫pkcs1提供的鑰匙
-s pkcs11:添加PKCS#11共享庫pkcs1提供的鑰匙
-L:顯示ssh-agent中的公鑰
-l:顯示ssh-agent中的密鑰
-t life:對加載的密鑰設(shè)置超時時間野芒,超時ssh-agent將自動卸載密鑰
-X:對ssh-agent進行解鎖
-x:對ssh-agent進行加鎖
ssh-keyscan 是一個收集大量主機公鑰的使用工具
-f:從指定文件中讀取“地址列表/名字列表”
-p:指定連接遠(yuǎn)程主機的端口
-T:指定連接嘗試的超時時間
-t:指定要創(chuàng)建的密鑰類型
-v:信息模式蓄愁,打印調(diào)試信息
服務(wù)器守護進程sshd
sshd
-4:強制使用IPv4地址;
-6:強制使用IPv6地址狞悲;
-D:以后臺守護進程方式運行服務(wù)器撮抓;
-d:調(diào)試模式;
-e:將錯誤發(fā)送到標(biāo)準(zhǔn)錯誤設(shè)備摇锋,而不是將其發(fā)送到系統(tǒng)日志丹拯;
-f:指定服務(wù)器的配置文件;
-g:指定客戶端登錄時的過期時間荸恕,如果在此期限內(nèi)乖酬,用戶沒有正確認(rèn)證,則服務(wù)器斷開次客戶端的連接融求;
-h:指定讀取主機key文件咬像;
-i:ssh以inetd方式運行;
-o:指定ssh的配置選項生宛;
-p:靜默模式施掏,沒有任何信息寫入日志;
-t:測試模式茅糜。
選項ssh,
-p port 遠(yuǎn)程服務(wù)器監(jiān)聽的端口
-b 指定連接的源IP
-v 調(diào)試模式
-C 壓縮方式
-X 支持x11轉(zhuǎn)發(fā)
-Y 支持信任x11轉(zhuǎn)發(fā),但是要在配置文件中設(shè)置ForwardX11Trusted yes
-t 強制偽tty分配,ssh - t remoteserver1 ssh remoteserver21作為2的跳板主機
-1 強制使用ssh協(xié)議版本1
-2 強制使用ssh協(xié)議版本2
-4 強制使用IPv4地址
-6 強制使用IPv6地址
-A 開啟認(rèn)證代理連接轉(zhuǎn)發(fā)功能
-a 關(guān)閉認(rèn)證代理連接轉(zhuǎn)發(fā)功能
-F 指定ssh指令的配置文件
-f 后臺執(zhí)行ssh指令
-g 允許遠(yuǎn)程主機連接主機的轉(zhuǎn)發(fā)端口
-i 指定身份文件
-l 指定連接遠(yuǎn)程服務(wù)器登錄用戶名
-N 不執(zhí)行遠(yuǎn)程指令
-o 指定配置選項
-x 關(guān)閉X11轉(zhuǎn)發(fā)功能
基于口令的連接方式
ssh -l root 192.168.1.1
當(dāng)用戶第一次連接遠(yuǎn)程主機是會提示遠(yuǎn)程主機不安全要不要連接素挽,在配置文件中設(shè)置StrictHostKeyChecking no第一次連接服務(wù)器是不提示 蔑赘。第一次連接時客戶端會復(fù)制ssh服務(wù)器/etc/ssh/ssh_host*key.pub( CentOS7默認(rèn)是ssh_host_ecdsa_key.pub)文件中的公鑰到客戶機的~./ssh/know_hosts中。下一次時連接遠(yuǎn)程主機會使用自己的私鑰加密連接信息,客戶機使用遠(yuǎn)程主機的公鑰解密缩赛,以此來驗證遠(yuǎn)程主機的身份耙箍。
使用-X 選型可以通過X11協(xié)議轉(zhuǎn)發(fā),來連接到遠(yuǎn)程主機的圖形界面酥馍,但是需要遠(yuǎn)程主機安裝圖形軟件辩昆,客戶機也在圖形界面下。在Windows下使用Xmanager軟件也可以給連接Linux桌面旨袒,就像Windows的遠(yuǎn)程桌面一樣汁针。這里就不演示了。
當(dāng)你的主機地址無法通過防火墻砚尽,而不能訪問遠(yuǎn)程主機施无,可以使用跳板機,通過你和遠(yuǎn)程主機都可以連接的主機
[root@CentOS6.9 ~]#ssh 192.168.166.130 ssh 192.168.166.131 #先連接到跳板機必孤,再從跳板機連接到遠(yuǎn)程主機猾骡,但是直接連接遠(yuǎn)程主機會報錯誤提示不是通過終端連接的
[root@CentOS6.9 ~]#ssh -t 192.168.166.130 ssh 192.168.166.131 #我們可以通過-t 選項強制跳板機分配終端
基于密鑰
- 生成公鑰和私鑰文件
[root@CentOS6.9 ~]#ssh-keygen #生成密鑰文件
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): #設(shè)置密鑰文件的名字,默認(rèn)為/root/.ssh/id_rsa
Enter passphrase (empty for no passphrase): #設(shè)置私鑰文件的密碼
Enter same passphrase again: #確認(rèn)密碼
Your identification has been saved in /root/.ssh/id_rsa. #私鑰文件的路徑
Your public key has been saved in /root/.ssh/id_rsa.pub. #公鑰文件的路徑
[root@CentOS6.9 ~]#ls .ssh/ #查看公鑰和私鑰文件敷搪,known_hosts文件中保存的是遠(yuǎn)程主機的公鑰
id_rsa id_rsa.pub known_hosts
- 把公鑰上傳到遠(yuǎn)程主機用戶的家目錄下的authorized_keys文件中
[root@CentOS6.9 ~]#ssh-copy-id root@192.168.1.1 #指定遠(yuǎn)程主機的用戶和IP地址兴想,root是客戶機連接遠(yuǎn)程主機的用戶
root@192.168.166.130's password: #遠(yuǎn)程主機用戶的密碼
- 測試
[root@CentOS6.9 ~]#ssh -l root 192.168.166.130 #連接遠(yuǎn)程主機
Enter passphrase for key '/root/.ssh/id_rsa': #輸入私鑰文件的密碼
-
其實不光客戶機連接遠(yuǎn)程主機時可以使用密鑰連接,Windows中的軟件如“xshell”赡勘、“SRT”也可以使用密鑰方式來連接嫂便。我這里就使用xshell來演示一下。
image.png
新建一個主機密鑰
把密鑰保存到文件狮含,然后把密鑰文件上傳到遠(yuǎn)程主機顽悼,再把里面的內(nèi)容寫入authorized_keys文件中
配置文件
#Port 22 #SSH端口,可以修改
#AddressFamily any #指定sshd應(yīng)當(dāng)使用暗中地址族{any(默認(rèn))几迄、inet(僅ipv4)蔚龙、inet6(僅ipv6)}
#ListenAddress 0.0.0.0 #指定監(jiān)聽的IP網(wǎng)絡(luò)地址,默認(rèn)監(jiān)聽所有地址
#ListenAddress ::
···省略
# HostKey for protocol version 1 #設(shè)定包含主機私人密鑰的文件
#HostKey /etc/ssh/ssh_host_key
# HostKeys for protocol version 2
#HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_dsa_key
······
# Lifetime and size of ephemeral version 1 server key
#KeyRegenerationInterval 1h #設(shè)置服務(wù)器密鑰的自動更新時間映胁,
#ServerKeyBits 1024 #定義服務(wù)器密鑰的位數(shù)
······
# Logging
# obsoletes QuietMode and FascistLogging
#SyslogFacility AUTH
SyslogFacility AUTHPRIV #指定日志消息通過那個日志子系統(tǒng)發(fā)送
#LogLevel INFO #設(shè)定sshd的日志等級
······
# Authentication:
#LoginGraceTime 2m #限定用戶必須在指定的時間內(nèi)認(rèn)證登陸木羹,0表示無限制,默認(rèn)是120秒
#PermitRootLogin yes #是否允許管理員直接登陸
#StrictModes yes #指定是否要求在接受連接請求前對用戶主目錄和相關(guān)的配置文件進行宿主和權(quán)限檢查 #MaxAuthTries 6 #指定每個連接最大允許的認(rèn)證次數(shù)解孙。默認(rèn)值是6
#MaxSessions 10 #指定最多的會話連接坑填,默認(rèn)值是10
······
#RSAAuthentication yes #設(shè)置是否允許只有RSA安全驗證
#PubkeyAuthentication yes #是否允許公鑰認(rèn)證。默認(rèn)值為”yes”
#AuthorizedKeysFile .ssh/authorized_keys #存放用戶連接該主機的公鑰存儲文件
······
#PasswordAuthentication yes #基于口令的認(rèn)證
#PermitEmptyPasswords no #是否允許空密碼
PasswordAuthentication yes
······
#Kerberos認(rèn)證相關(guān)
# Kerberos options
#KerberosAuthentication no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes
#KerberosGetAFSToken no
······
#GSSAPIAuthentication no #是否允許使用基于 GSSAPI 的用戶認(rèn)證弛姜。默認(rèn)值為no
GSSAPIAuthentication yes
#GSSAPICleanupCredentials yes #是否在用戶退出登錄后自動銷毀用戶憑證緩存脐瑰。默認(rèn)值是yes
GSSAPICleanupCredentials yes
·······
#PAM認(rèn)證模塊
# Set this to 'yes' to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
# be allowed through the ChallengeResponseAuthentication and
# PasswordAuthentication. Depending on your PAM configuration,
# PAM authentication via ChallengeResponseAuthentication may bypass
# the setting of "PermitRootLogin without-password".
# If you just want the PAM account and session checks to run without
# PAM authentication, then enable this but set PasswordAuthentication
# and ChallengeResponseAuthentication to 'no'.
#UsePAM no
UsePAM yes
UsePAM yes
······
#AllowTcpForwarding yes #是否允許TCP轉(zhuǎn)發(fā),默認(rèn)值為”yes”
#GatewayPorts no
·······
#X11Forwarding no #設(shè)置是否允許X11轉(zhuǎn)發(fā)
X11Forwarding yes
#X11DisplayOffset 10 #指定X11 轉(zhuǎn)發(fā)的第一個可用的顯示區(qū)(display)數(shù)字廷臼。默認(rèn)值是 10
#X11UseLocalhost yes #sshd是否應(yīng)當(dāng)將X11轉(zhuǎn)發(fā)服務(wù)器綁定到本地loopback地址苍在。默認(rèn)值是”yes”
#PrintMotd yes #設(shè)置sshd是否在用戶登錄的時候顯示“/etc/motd”中的信息
#PrintLastLog yes #指定sshd是否在每一次交互式登錄時打印最后一位用戶的登錄時間 默認(rèn)值是”yes”
#TCPKeepAlive yes #指定系統(tǒng)是否向客戶端發(fā)送 TCP keepalive 消息绝页。默認(rèn)值是”yes”
#UseLogin no #是否在交互式會話的登錄過程中使用 login默認(rèn)值是”no”
#UsePrivilegeSeparation yes #是否讓sshd通過創(chuàng)建非特權(quán)子進程處理接入請求的方法來進行權(quán)限分離 默認(rèn)值是”yes
#PermitUserEnvironment no
#Compression delayed #是否對通信數(shù)據(jù)進行加密,還是延遲到認(rèn)證成功之后再對通信數(shù)據(jù)加密 可用值:yes寂恬、no续誉、delayed
#ClientAliveInterval 0 #設(shè)置一個以秒記的時長,如果超過這么長時間沒有收到客戶端的任何數(shù)據(jù)初肉,sshd 將通過安全通道向客戶端發(fā)送一個”alive”消息酷鸦,并等候應(yīng)答。默認(rèn)值 0 表示不發(fā)送”alive”消息
#ClientAliveCountMax 3 #Sshd在未收到任何客戶端回應(yīng)前最多允許發(fā)送多少個”alive”消息 默認(rèn)值是 3
#ShowPatchLevel no
#UseDNS yes #指定在登陸是要不要將IP地址解析牙咏,建議設(shè)置未no臼隔,可以提高連接速度
#PidFile /var/run/sshd.pid #指定在哪個文件中存放SSH守護進程的進程號,默認(rèn)為 /var/run/sshd.pid文件
#MaxStartups 10 #最大允許保持多少個未認(rèn)證的連接 默認(rèn)值是 10
#PermitTunnel no #是否允許 tun 設(shè)備轉(zhuǎn)發(fā)
·······
# override default of no subsystems #是否允許啟動sftp-server
Subsystem sftp /usr/libexec/openssh/sftp-server
sshd限制主機登陸
ALLOWUSERS root@192.168.166.1 #只允許192.168.1.1這一臺主機以root設(shè)置登陸
SSH端口轉(zhuǎn)發(fā)
SSH 會自動加密和解密所有 SSH 客戶端與服務(wù)端之間的網(wǎng)絡(luò)數(shù)據(jù)眠寿。但是躬翁, SSH 還能夠?qū)⑵渌?TCP 端口的網(wǎng)絡(luò)數(shù)據(jù)通過 SSH 鏈接來轉(zhuǎn)發(fā),并且自動提供了相應(yīng)的加密及解密服務(wù)盯拱。這一過程也被叫做“隧道”( tunneling)盒发,這是因為 SSH 為其他 TCP 鏈接提供了一個安全的通道來進行傳輸而得名。例如狡逢, Telnet宁舰, SMTP, LDAP 這些 TCP應(yīng)用均能夠從中得益奢浑,避免了用戶名瘦穆,密碼以及隱私信息的明文傳輸脑溢。而與此同時停撞,如果工作環(huán)境中的防火墻限制了一些網(wǎng)絡(luò)端口的使用瘸彤,但是允許SSH 的連接,也能夠通過將 TCP 端口轉(zhuǎn)發(fā)來使用 SSH 進行通訊
SSH 端口轉(zhuǎn)發(fā)能夠提供兩大功能:
- 加密 SSH Client 端至 SSH Server 端之間的通訊數(shù)據(jù)
- 突破防火墻的限制完成一些之前無法建立的TCP連接
SSH端口轉(zhuǎn)有三種
- 本地端口轉(zhuǎn)發(fā)
- 遠(yuǎn)程轉(zhuǎn)發(fā)
- 動態(tài)轉(zhuǎn)發(fā)
注:如果不是以root身份設(shè)置端口轉(zhuǎn)發(fā)的話徊哑,轉(zhuǎn)發(fā)端口只能使用大于1024的端口號
本地轉(zhuǎn)發(fā)袜刷,在訪問本地設(shè)置好的監(jiān)聽端口時,主機會自動和跳轉(zhuǎn)機建立ssh連接莺丑,然后把數(shù)據(jù)封裝在ssh協(xié)議建立的隧道中著蟹,傳輸給跳轉(zhuǎn)的主機,在跳轉(zhuǎn)主機哪里把數(shù)據(jù)解封梢莽,再由跳轉(zhuǎn)機和目標(biāo)主機建立服務(wù)連接萧豆,把主機的數(shù)據(jù)轉(zhuǎn)發(fā)給遠(yuǎn)程主機。
選項
-N:不執(zhí)行命令
-f:后臺執(zhí)行
-L:local本地端口轉(zhuǎn)發(fā)
-g:啟用網(wǎng)關(guān)功能,允許網(wǎng)絡(luò)上其他機器連接監(jiān)聽端口昏名,否則只有本機可用涮雷。
示例
環(huán)境
- 主機A IP地址192.168.166.129 主機名CentOS 6.9
- 主機B IP地址192.168.166.130 主機名CentOS 7.3
- 主機C IP地址192.168.166.131 主機名CentOS 6.9-1
- 服務(wù)telnet
[root@CentOS6.9 ~]#ssh -NF -L 9527:192.168.166.131:23 root@192.168.166.130
- -Nf指定不執(zhí)行命令,后臺執(zhí)行轻局,
- 9527指定本地的轉(zhuǎn)發(fā)端口洪鸭,
- 192.168.166.131:23 最終訪問的遠(yuǎn)程主機的IP的和端口
- root@192.168.166.130 跳轉(zhuǎn)機的ip地址和用戶名
[root@CentOS6.9 ~]#telnet 127.0.0.1 9527 #設(shè)置好后膜钓,使用telnet訪問本機127.0.0.1 9725端口
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
CentOS release 6.9 (Final)
Kernel 2.6.32-696.el6.x86_64 on an x86_64
CentOS6.9-1 login: #跳轉(zhuǎn)到了目標(biāo)主機
注:可以一次設(shè)置多個轉(zhuǎn)發(fā):ssh -L 8888:目標(biāo)主機地址:80 -L 110:目標(biāo)主機地址:110 -L 跳轉(zhuǎn)機地址
遠(yuǎn)程轉(zhuǎn)發(fā),一般的公司里的主機是不直接連接網(wǎng)絡(luò)的卿嘲,那本地轉(zhuǎn)發(fā)就無法實現(xiàn),這里就可以使用遠(yuǎn)程轉(zhuǎn)發(fā)用夫壁,用公司內(nèi)部建立SSH連接拾枣。
在內(nèi)網(wǎng)的跳轉(zhuǎn)機設(shè)置,內(nèi)網(wǎng)的主機作為客戶端盒让,外網(wǎng)的主機作為服務(wù)端梅肤,跳轉(zhuǎn)機通過ssh協(xié)議連接到外網(wǎng)的主機,然后監(jiān)聽設(shè)置好外網(wǎng)主機端口邑茄,發(fā)現(xiàn)監(jiān)聽端口有人訪問姨蝴,就在和外網(wǎng)的主機建立一個ssh連接,把數(shù)據(jù)通過這個ssh連接隧道封裝肺缕,傳輸?shù)絻?nèi)網(wǎng)的跳轉(zhuǎn)機解封左医,然后在轉(zhuǎn)發(fā)給目標(biāo)主機。
[root@CentOS7.3 ~]#ssh -Nf -R 9528:192.168.166.131:23 192.168.166.129
# 這次在CentOS 7 設(shè)置遠(yuǎn)程轉(zhuǎn)發(fā)同木,監(jiān)聽外網(wǎng)主機centos 6.9的9528端口
- -R 遠(yuǎn)程轉(zhuǎn)發(fā)
- 9528 要監(jiān)聽的端口號
- 192.168.166.131:23 轉(zhuǎn)發(fā)目標(biāo)主機的IP地址和服務(wù)端口
- 192.168.166.129 要監(jiān)聽的端口
[root@CentOS6.9 ~]#telnet 127.0.0.1 9528 #訪問本機的9528端口
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
CentOS release 6.9 (Final)
Kernel 2.6.32-696.el6.x86_64 on an x86_64
CentOS6.9-1 login: #連接到了目標(biāo)主機
動態(tài)轉(zhuǎn)發(fā)
工作原理是這樣的, 本地機器上分配了一個socket偵聽端口, 一旦這個端口上有了連接, 該連接就經(jīng)過安全通道轉(zhuǎn)發(fā)出去, 根據(jù)應(yīng)用程序的協(xié)議可以判斷出遠(yuǎn)程主機將和哪里連接浮梢。
選項
-D port 指定一個本地 “動態(tài)的’’ 應(yīng)用程序端口轉(zhuǎn)發(fā)
[root@CentOS7.3 ~]#ssh -Nfg -D 1080 192.168.166.129 #所用到1080端口的數(shù)據(jù)都轉(zhuǎn)發(fā)到192.168.166.129
注:有些路由器會把長時間沒有通信的連接斷開。SSH客戶端的TCPKeepAlive選項可以避免這個問題的發(fā)生彤路,默認(rèn)情況下它是被開啟的秕硝。如果它被關(guān)閉了,可以在ssh的命令上加上-o TCPKeepAlive=yes來開啟洲尊。
檢查隧道狀態(tài)
有些時候隧道會因為一些原因通信不暢而卡死远豺,這種時候,往往SSH客戶端并不退出坞嘀,而是卡死在那里躯护。一種應(yīng)對方法是,使用SSH客戶端的ServerAliveInterval和ServerAliveCountMax選項姆吭。S
erverAliveInterval會在隧道無通信后的一段設(shè)置好的時間后發(fā)送一個請求給服務(wù)器要求服務(wù)器響應(yīng)榛做。如果服務(wù)器在 ServerAliveCountMax次請求后都沒能響應(yīng),那么SSH客戶端就自動斷開連接并退出内狸,將控制權(quán)交給你的監(jiān)控程序检眯。這兩個選項的設(shè)置方法分別是在ssh時加入-o ServerAliveInterval=n和-o ServerAliveCountMax=m。其中n, m可以自行定義