柚子快報邀請碼778899分享:linux 運維 ssh 轉發(fā)
柚子快報邀請碼778899分享:linux 運維 ssh 轉發(fā)
目錄
關于ssh的一些參數(shù)
關于ssh config?一些參數(shù)
關于主機驗證?
關于限制轉發(fā)和登錄的一些參數(shù)
ssh-agent --身份驗證代理連接的轉發(fā)
使用場景
ssh?代理
正向代理 -?本地端口代理轉發(fā)??LocalForward(-L)?
使用場景? (外部訪問內部服務)
關于VPN --多個LocalForward?轉發(fā)的集合
反向代理 -遠端啟動端口代理轉發(fā)??RemoteForward(-R)
使用場景? (外部訪問內部服務)
本地 socks5 代理-動態(tài)端口轉發(fā) DynamicForward(-D)
使用場景? (使用網絡代理請求)
autossh
自動跳轉多個中間機器???-?ProxyJump (-J) 與 ProxyCommand? ?用于通過中間機器 來跳 轉目的主機
使用場景(目的主機需要多次登錄調整,或者本機到目的主機網絡限制,不能直接連接)
在配置文件中配置
關于ssh的一些其他安全配置?
參閱:
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips ?26 Jan 2017 CentOS Linux release 7.4.1708 (Core)?
關于ssh的一些參數(shù)
#https://man7.org/linux/man-pages/man1/ssh.1.html ssh [-D [bind_address:]port] ?[-L address] ?[-R address] ?······
-A?? ??? ?啟用代理驗證轉發(fā),可以在配置文件中配置,登錄會生成保留登錄信息的文件 類似于ssh-agent -a ? ? ?禁用代理驗證轉發(fā) -D ?? ??? ?用于在 SSH 連接上創(chuàng)建動態(tài)端口轉發(fā)(Dynamic Port Forwarding) -F?? ??? ?系統(tǒng)默認配置文件/etc/ssh/ssh_config,用戶默認配置文件~/.ssh/config. -f?? ??? ?轉到后臺,轉發(fā)后可以放后臺執(zhí)行 -G?? ??? ?命令用于顯示Host和Match配置信息,但不會連接到遠程主機 -g?? ??? ?允許遠程主機連接到本地轉發(fā)端口。 -J ?? ??? ?命令用于指定跳板主機(jump host) -t?? ??? ?檢查配置文件的語法是否正確 等同于ProxyJump配置指令 -L?? ??? ?本地監(jiān)聽一個端口,轉發(fā)數(shù)據(jù)到遠程主機 ,默認使用GatewayPorts 啟用遠程訪問 -M?? ??? ?ControlMaster通路復用共享會話 no(默認值),其他的參數(shù)還有(-S ControlPath) ControlPersist -N?? ??? ?不執(zhí)行遠程命令。這僅適用于轉發(fā)端口。不加-N則直接登錄進去 -n?? ??? ?阻止從stdin讀取,拒絕交互操作批量執(zhí)行遠程命令時非常有用,ssh -n ?hosta "telnet hostb 80" -O?? ??? ?控制-M 命令,有check、forward、cancel、exit 等 -o?? ??? ?配置文件參數(shù)以命令行格式體現(xiàn),臨時使用非常有用 -q?? ??? ?安靜模式 -R?? ??? ?與-L 相反,遠程主機上給定TCP端口或Unix socket轉發(fā)到本地,可以是本地動態(tài)端口,與-O forward 連用會打印到標準輸出 -T?? ??? ?禁用偽終端分配。 -v?? ??? ?調試消息詳細模式 -vv -vvv, -W ?? ??? ?本地和遠程主機之間的網絡流量轉發(fā)到另一個地址和端口。ssh -W
關于ssh config?一些參數(shù)
(存在可能因版本問題造成的參數(shù)不可用)
#https://man7.org/linux/man-pages/man5/ssh_config.5.html 讀取文件順序 ? ? 1. ? command-line options ? ? 2. ? user''s configuration file (~/.ssh/config) ? ? 3. ? system-wide configuration file (/etc/ssh/ssh_config) ? ?? Host?? ??? ??? ??? ?#配置主機之后添加特定的配置 Match?? ??? ??? ??? ?#匹配自定義條件后(如canonical, exec, host, originalhost, user, and localuser)?? ?添加特定的配置 AddKeysToAgent ??? ?#密鑰自動添加ssh-agent中,no (the default)? AddressFamily?? ??? ?#允許是使用的ip地址, ?IPv4 or IPv6 or any BatchMode?? ??? ??? ?#yes:不會打印密碼短語/密碼查詢,方便無交互模式下,no (the default). CanonicalDomains?? ?#類似別名功能 CanonicalizeHostname ?? ??? ??? ?#別名開關 CanonicalizePermittedCNAMEs?? ??? ?#類似域名的泛解析 CertificateFile ?? ?#密鑰路徑 CheckHostIP?? ??? ??? ?#yes(the default).一般會檢查~/.ssh/known_hosts 并添加,不受StrictHostKeyChecking影響 ClearAllForwardings #no (the default).是否清除所有已存在的端口轉發(fā)設置 Compression?? ??? ??? ?#是否壓縮 no (the default) ConnectionAttempts?? ?#連接重試 ConnectTimeout?? ??? ?#連接超時 ControlMaster?? ??? ?#ssh復用 no (the default) ControlPath?? ??? ??? ?#會話信息存儲路徑 ControlPersist?? ??? ?#ssh復用時間,no不會放后臺,yes永久,時間:復用有效期時間 DynamicForward?? ??? ?#-D 用于在 SSH 連接上創(chuàng)建動態(tài)端口轉發(fā)[bind_address:]port,默認可以GatewayPorts 啟用遠程訪問? ExitOnForwardFailure?? ??? ??? ?#遇到錯誤或無法成功建立端口轉發(fā),則會立即退出 SSH 連接 ForwardAgent?? ??? ?#啟用 SSH 代理的轉發(fā)功能,無需將密鑰直接傳輸?shù)竭h程服務器 GatewayPorts?? ??? ?#no (the default). 默認不允許遠程訪問 GSSAPIAuthentication?? ??? ??? ?#可以理解為基于api驗證 HostbasedAuthentication?? ??? ??? ?#no (the default). ? 基于主機的驗證,通常情況公鑰驗證或其他更安全的身份驗證方法會更可取。 HostKeyAlias?? ??? ?#除了hosts中定義別名,也可以使用他來定義別名 HostName?? ??? ??? ?#-h 真實主機名 IdentityAgent ?? ??? ?#緩存登錄信息,類似ControlPath Include?? ??? ??? ??? ?#nclude the specified configuration file(s) KbdInteractiveAuthentication ?? ?#鍵盤交互式身份驗證進行用戶身份驗證:yes (the default) LocalCommand?? ??? ?#~/.ssh/config 執(zhí)行本地命令(非交互) 還支持ssh轉義命令 LocalForward?? ??? ?# -L 本地監(jiān)聽一個端口,轉發(fā)數(shù)據(jù)到遠程主機 NoHostAuthenticationForLocalhost# no(the default). 是否對本地回環(huán)地址(localhost)進行主機身份驗證 PasswordAuthentication ?? ??? ??? ?#yes (the default) 是否允許使用密碼進行 SSH 認證 PermitLocalCommand?? ?#no (the default) ?控制LocalCommand 生效 PreferredAuthentications?? ??? ?#驗證順序 ?默認順序:gssapi-with-mic,hostbased,publickey,keyboard-interactive,password ProxyCommand?? ??? ?# ProxyJump是ProxyCommand升級版 ?ssh -o ProxyCommand="ssh -W %h:%p
關于主機驗證?
ssh驗證過程包含:主機驗證和用戶身份驗證(這里不討論針對主機和用戶的登錄限制策略) [root@tserver121 ~]# ssh 10.3.246.110 The authenticity of host '10.3.246.110 (10.3.246.110)' cant be established. ECDSA key fingerprint is SHA256:OU+wRDPwaCOrKSEKKrwvlA/sQbjZWCttViD9VEjCtBI. ECDSA key fingerprint is MD5:6c:94:2b:6f:70:fc:3d:5c:19:9b:8e:f8:0a:ac:d4:a6.
StrictHostKeyChecking?? ??? ?#ask (the default),在第一次連接遠程主機時詢問用戶是否信任該主機的公鑰。 CheckHostIP?? ??? ??? ??? ??? ?#yes(the default).一般會檢查~/.ssh/known_hosts 并添加,不受StrictHostKeyChecking影響 HostbasedAuthentication?? ??? ?#no (the default). ? 基于主機的驗證
上述一般情況下主機驗證 是沒有開啟的,所以一般不用太關注~/.ssh/known_hosts的內容,可以看出來上面是采用ECDSA簽名算法。在 CentOS 7 上,默認情況下并不支持 Ed25519 密鑰算法, ECDSA 優(yōu)先級大于RSA。
系統(tǒng)默認有密鑰對/etc/ssh/ssh_host_*可以直接使用,/etc/ssh/sshd_config 也有對應的配置 [root@tserver121 ~]# ?cat /etc/ssh/sshd_config |grep HostKey HostKey /etc/ssh/ssh_host_rsa_key #HostKey /etc/ssh/ssh_host_dsa_key HostKey /etc/ssh/ssh_host_ecdsa_key HostKey /etc/ssh/ssh_host_ed25519_key 所以fingerprint就使用是/etc/ssh/ssh_host_ecdsa_key文件
使用場景 1.除了網絡上arping之外, 某種情況下,ssh也能驗證是否是同一臺機器 [root@tserver120 ~]# hostname -I 10.3.246.110? [root@tserver120 ~]# ssh-keygen -l -E md5 -f /etc/ssh/ssh_host_ecdsa_key ?#和上登錄時的指紋是一致的 256 MD5:6c:94:2b:6f:70:fc:3d:5c:19:9b:8e:f8:0a:ac:d4:a6 /etc/ssh/ssh_host_ecdsa_key.pub (ECDSA)
2.驗證密鑰對是否一致或者 遠端機是否添加正確 [root@tserver121 ~]# ?ssh-keygen -l -E md5 -f ?/root/.ssh/id_rsa 2048 MD5:70:67:73:5a:33:e4:51:c6:fd:0e:b1:72:73:fb:57:bf root@tserver121 (RSA) [root@tserver121 ~]# ?ssh-keygen -l -E md5 -f ?/root/.ssh/id_rsa.pub? 2048 MD5:70:67:73:5a:33:e4:51:c6:fd:0e:b1:72:73:fb:57:bf root@tserver121 (RSA) [root@tserver121 ~]# ssh 10.3.246.110 Last login: Mon Dec 18 19:53:22 2023 from 10.3.246.108 [root@tserver120 ~]# ssh-keygen -l -E md5 -f /root/.ssh/authorized_keys? 2048 MD5:70:67:73:5a:33:e4:51:c6:fd:0e:b1:72:73:fb:57:bf root@tserver121 (RSA) ?
關于限制轉發(fā)和登錄的一些參數(shù)
AllowTcpForwarding、AllowAgentForwarding與ForwardAgent、PermitOpen、Match、ForceCommand
#AllowTcpForwarding ?#禁用TCP轉發(fā)并不能提高安全性 #/etc/ssh/sshd_config ? ? 在OpenSSH服務器的配置文件中,可以設置為以下幾種值之一: ? ? ? ? yes:允許TCP連接轉發(fā)。(默認) ? ? ? ? no:禁止TCP連接轉發(fā)。 ? ? ? ? local:僅允許本地TCP連接轉發(fā)。 ? ? ? ? remote:僅允許遠程TCP連接轉發(fā)。
#AllowAgentForwarding ? #/etc/ssh/sshd_config ?? ??? ?yes:允許ssh-agent轉發(fā)。(默認) ? ? ? ? no:禁止TCP連接轉發(fā)。 ? ? ? ?? #ForwardAgent ? ? ? ? ? ?#一般在客戶端配置中/etc/ssh/ssh_confi ? ?? ??? ?yes:啟用ssh-agent轉發(fā)。 ?? ??? ?no: 關閉ssh-agent轉發(fā)。(默認)
#DenyUsers, AllowUsers, DenyGroups, AllowGroup 控制用戶、用戶組登錄 ? ? DenyGroups ?hellogroup testgroup ?# 表示即拒絕這些組用戶連接 ? ? DenyUsers ? hello test ? ? ? ? ? ?# 表示即拒絕這些用戶連接 ? ? ?~/.rhosts or ~/.shosts 不是必需,最好不要使用這兩個文件來控制遠程主機訪問本地主機
#PermitOpen host:port ? ?#默認情況下,允許所有端口轉發(fā)請求 #PermitRootLogin?? ??? ? #控制是否允許 root 用戶通過 SSH 登錄到服務器 ?? ??? ?yes:允許root登錄。(默認) ? ? ? ? prohibit-password:拒絕密碼行驗證。 ? ? ? ? without-password:拒絕密碼行驗證。 ? ? ? ? forced-commands-only:不允許交互式登錄 ? ? ? ? no:禁止root登錄。 ? ? ? ? ? GatewayPorts no?? ??? ?#禁止遠程訪問
#Match ??? ??? ??? ??? ? #添加自定義的匹配配置 偏向系統(tǒng)配置 ?#/etc/ssh/sshd_config Match Address 192.168.1.0/24 ?? ?#ip匹配 ? ?PermitRootLogin yes?? ??? ? ?? ?#特殊條件
#Host?? ??? ??? ??? ??? ?#添加自定義主機配置?? ?偏向用戶級別 #~/.ssh/config ? ? ?? ??? ?Host t109 ? ? ? ? ? User root ? ? ? ? ? Port 22 ? ? ? ? ? HostName 10.3.246.109 ? ? ? ? ?? ForceCommand 屬于登錄后的限制 ForceCommand /bin/bash ?或在~/.ssh/authorized_keys對應的rsa public key 前面加上command="/bin/bash"(參考gitlab的/var/opt/gitlab/.ssh/authorized_keys) 效果是等效的。這樣就可以實現(xiàn)允許用戶遠程登錄系統(tǒng),但是scp和rsync命令失效,同時由于限定死了command參數(shù),導致你的非交互式ssh命令也無法使用了,比如ssh user@ip ls /這一類非交互式ssh不起作用了。 ForceCommand internal-sftp ?則表示只允許使用sftp,不允許shell登錄。如果配置中去掉Subsystem sftp /usr/lib/openssh/sftp-server這一行就可以關閉sftp服務
[root@tserver121 ~]# cat /var/opt/gitlab/.ssh/authorized_keys command="/opt/gitlab/embedded/service/gitlab-shell/bin/gitlab-shell key-4",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa ····· ?
ssh-agent --身份驗證代理連接的轉發(fā)
?-A?? ??? ?啟用代理驗證轉發(fā),也可以在ssh_config 或者 ~/.ssh/config 中配置ForwardAgent開啟? ??? ??? ?登錄其他機器后 /tmp/ssh-QJPzmXUEhK ?會生成隨機文件一般包含一些加密算法、密鑰信息、會話ID等。 可以用于使用同樣的信息再次登錄其他機器不需要再次輸入登錄信息 類似于ssh代理工具ssh-agent ? ? ? ? ssh-agent 保存用于公鑰身份驗證的私鑰的程序 https://www.man7.org/linux/man-pages/man1/ssh-agent.1.html
使用場景
跳板機 --登錄--> 管理多個管理機 --登錄--> 管理多個應用服務器
使用密鑰登錄服務器,但不想把自己的私鑰放到管理機(也可以稱之為中轉機器),提高安全性。
這就可以使用ssh-agent功能了,與-A一樣都是啟用身份驗證代理連接的轉發(fā)。在遠端機器的時候,將本機的登錄驗證信息抓發(fā)給遠端機器。
#前提是轉發(fā)機器都需要開啟用SSH代理的轉發(fā)功能,所有機器都添加了登錄用戶的公鑰
ForwardAgent yes #此配置不必要寫入到全局配置 可以使用Host或者Match參數(shù)去匹配指定服務器
AddKeysToAgent no #自動添加到ssh-agent,no (the default) 此參數(shù)不用開啟
[user@DevOps4JP ~]$ ssh-agent bash 啟動
[user@DevOps4JP ~]$ ssh-add ~/.ssh/id_rsa 添加私鑰,輸入密鑰密碼
[user@DevOps4JP ~]$ ssh-add ~/.ssh/id_rsa2 添加私鑰2,輸入密鑰密碼
[user@DevOps4JP ~]$ ssh-add -l 查看
[user@DevOps4JP ~]$ ll /tmp/ 會看到生成個帶ssh的緩存目錄
[user@DevOps4JP ~]$ ssh 10.3.246.112 -A 連接(管理機)
[root@tserver-mgmt ~]# ssh 10.3.246.108 -A 再連接(管理機1)
[root@tserver121 ~]# ssh 10.3.246.109 -A 再連接(管理機2)
[root@tserver118 ~]# ssh 10.3.246.110 再連接(應用服務器)
當使用 ssh -vvv 參數(shù)是 可以看到如下agent中讀取登錄信息
key: /home/user/.ssh/id_rsa (0x557675912180), agent
優(yōu)化
針對ssh-agent 登錄登出,多用戶 多終端等匹配不對造成無法登錄問題
使用:
可以將認證程序放置至后臺程序,重新登錄后自動重新讀取會話信息。
[user@DevOps4JP ~]$ ps -ef |grep agen
user1 731 1 0 Dec14 ? 00:00:00 ssh-agent -s -a /home/user1/.ssh/agent.sock
user2 8862 1 0 May26 ? 00:00:14 ssh-agent -s -a /home/user2/.ssh/agent.sock
優(yōu)點:可以ssh-agent和密鑰自動加載到工作中的每個終端會話中的shell腳本
缺點:用戶再次重新登錄可以復用,安全性有問題,如果可以接受,也不用添加下面配置(退出關閉ssh-agent,再次登錄只需要輸一次密碼)
# cat ~/.bash_logout
NUM=$(who -u | grep -c "$USER")
if [[ "$SSH_AGENT_PID" != "" ]]; then
[[ "$NUM" == "1" ]] && eval `/usr/bin/ssh-agent -k`
fi
ssh?代理
10.3.246.108 ?hostA ?(tserver121) 10.3.246.109 ?hostB ?(tserver118) 10.3.246.110 ?hostC ?(tserver120)
正向代理 -?本地端口代理轉發(fā)??LocalForward(-L)?
命令:-L localport:remotehost:remotehostport sshserver #相當于 iptable 的 port forwarding
說明:localport 本機開啟的端口號
remotehost 最終連接機器的IP地址
remotehostport 最終連接機器的端口號
sshserver 轉發(fā)機器的IP地址
remotehost 和 sshserver 可以是同一個
選項:-f 后臺啟用
-N 不打開遠程shell,處于等待狀態(tài)(不加-N則直接登錄進去)
-g 啟用網關功能,允許遠程主機連接到本地轉發(fā)端口。
-C 為壓縮數(shù)據(jù)
-q 安靜模式
-T 禁止遠程分配終端
-n 關閉標準輸入
使用場景? (外部訪問內部服務)
外部hostA想訪問內部服務器hostC,但網絡不通,但能訪問到內部服務器hostB,這時在hostB?上做一個轉發(fā)(本地啟動端口,把本地端口數(shù)據(jù)轉發(fā)到遠端)?到hostC,這樣hostA可以訪問到 hostC了
hostB上做轉發(fā)
[root@hostB ~]# ssh -L 0.0.0.0:22022:hostC:22 -fN root@hostC #hostB:22022-->hostC:22
[root@hostB ~]# netstat -nlpt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22022 0.0.0.0:* LISTEN 1450/ssh
[root@hostA ~]# ssh hostB -p 22022 "hostname" #請求hostB:22022實際被轉發(fā)到了hostC:22
hostC
hostA上做轉發(fā)
[root@hostA ~]# ssh -L 0.0.0.0:22080:hostC:80 -fN root@hostB #hostA:22080-->hostB:22-->hostC:80
[root@hostA ~]# sudo -u nobody curl http://hostA:22080 -v
[root@hostC nginx]# cat nginx.log #在hostC可以看出來 請求是從10.3.246.109(hostB)上發(fā)起的
{"host":"10.3.246.110","clientip":"10.3.246.109","size":162,"responsetime":0.000,"upstreamtime":"-","upstreamhost":"-","http_host":"hosta","url":"GET / HTTP/1.1","xff":"-","referer":"-","agent":"curl/7.29.0","status":"403"}
兩種用法的區(qū)別是
第一種用法hostA 到hostB的數(shù)據(jù)可以明文的,但不需要ssh到hostB權限,客戶端不需要額外配置。
第二種用法hostA ssh加密傳輸給 hostB 又轉發(fā)給 hostC:PortC。 但需要ssh到hostB權限
關于VPN --多個LocalForward?轉發(fā)的集合
sshuttle -r user@remote_ip 10.0.0.0/8 代表將10.0.0.0/8這個網段的請求走SSH代理,是不是很容易使用? ?? ?此外,還支持--dns,--auto-hosts, --auto-nets等十分有用的參數(shù),根據(jù)實際情況去選用即可。
sshuttle實際體驗上非常類似于VPN,但是比VPN更輕量,而且無需管理。值得注意的是,本質上這個工具是利用了端口轉發(fā)的原理,并不是真正的VPN,所以對于ICMP這類的協(xié)議是沒用的,也就是說,對于ping命令是無效的。
反向代理 -遠端啟動端口代理轉發(fā)??RemoteForward(-R)
命令:-R [bind_address:]sshserverport:remotehost:remotehostport sshserver #相當于 frp 或者 ngrok
說明:sshserverport 被轉發(fā)機器開啟的端口號
remotehost 最終連接機器的IP地址
remotehostport 最終連接機器的端口號
sshserver 被轉發(fā)機器的IP地址
remotehost 和 sshserver 可以是同一個
選項:-f 后臺啟用
-N 不打開遠程shell,處于等待狀態(tài)(不加-N則直接登錄進去)
-g 啟用網關功能,允許遠程主機連接到本地轉發(fā)端口。
-C 為壓縮數(shù)據(jù)
-q 安靜模式
-T 禁止遠程分配終端
-n 關閉標準輸入
使用場景? (外部訪問內部服務)
外部hostA?也訪問不了內部的hostB?和hostC,但hostB能訪問到外部hostA,,這時在hostB 上做一個轉發(fā)(遠端hostA啟動端口,把遠端端口數(shù)據(jù)轉發(fā)到本地。在轉發(fā)到hostC)?,這樣hostC可以訪問到 hostA了
[root@hostB ~] ssh -R hostA:11080:hostC:80 -fN hostA #hostA:11080-->hostB:22-->hostC:80
[root@hostA ~]# netstat -nlpta|grep ssh #hostB <-->hostA有一個長連接,并且hostA 有監(jiān)11080
#GatewayPorts 設置成為yes ,bind_address 就配置成了0.0.0.0:11080
tcp 0 0 127.0.0.1:11080 0.0.0.0:* LISTEN 44647/sshd: root
tcp 0 0 10.3.246.108:22 10.3.246.109:57315 ESTABLISHED 44647/sshd: root
[root@hostA ~]# sudo -u nobody curl http://127.0.0.1:11080 -v
[root@hostC nginx]# cat nginx.log #在hostC可以看出來 請求是從10.3.246.109(hostB)上發(fā)起的
{"host":"10.3.246.110","clientip":"10.3.246.109","size":162,"responsetime":0.000,"upstreamtime":"-","upstreamhost":"-","http_host":"127.0.0.1","url":"GET / HTTP/1.1","xff":"-","referer":"-","agent":"curl/7.29.0","status":"403"}
本地 socks5 代理-動態(tài)端口轉發(fā) DynamicForward(-D)
命令:-D [bind_address:]port sshserver #相當于 ss/ssr
說明:sshserver 被轉發(fā)機器的IP地址
選項:-f 后臺啟用
-N 不打開遠程shell,處于等待狀態(tài)(不加-N則直接登錄進去)
-g 啟用網關功能,允許遠程主機連接到本地轉發(fā)端口。
-C 為壓縮數(shù)據(jù)
-q 安靜模式
-T 禁止遠程分配終端
-n 關閉標準輸入
使用場景? (使用網絡代理請求)
外部hostA想訪問內部服務器hostC,但網絡不通,但能訪問到內部服務器hostB,這時在hostB?上做一個轉發(fā)(創(chuàng)建一個 SOCKS 代理將所有流量通過代理hostB)?到hostC,這樣hostA可以通過網絡代理的方式訪問到 hostC了
[root@hostB ~] ssh -D 0.0.0.0:31080 -fN hostC #hostB:31080-->hostC:80
[root@hostB ~]# netstat -nlpta|grep 20860
tcp 0 0 0.0.0.0:31080 0.0.0.0:* LISTEN 20860/ssh
tcp 0 0 10.3.246.109:8416 10.3.246.110:22 ESTABLISHED 20860/ssh
[root@hostA ~]# curl --socks5 hostB:31080 http://hostC:80 -v #可以多個端口
[root@hostA ~]# curl --socks5 hostB:31080 http://hostC:8888 -v
[root@hostC nginx]# cat nginx.log #在hostC可以看出來 請求是從10.3.246.110(hostC)上發(fā)起的
{"host":"10.3.246.110","clientip":"10.3.246.110","size":162,"responsetime":0.000,"upstreamtime":"-","upstreamhost":"-","http_host":"hostc","url":"GET / HTTP/1.1","xff":"-","referer":"-","agent":"curl/7.29.0","status":"403"}
autossh
ssh直接做可能會因為網絡閃斷導致代理失效,如果希望ssh自動重連,可以使用autossh這個小工具,幫我們在ssh斷掉之后自動重連,維持代理隧道的穩(wěn)定。 autossh的使用也十分簡單,基本兼容絕大多數(shù)ssh參數(shù),像ssh一樣用就行,比如:
?? ?autossh -M 0 -R 9999:192.168.1.10:9999 -C -N
自動跳轉多個中間機器???-?ProxyJump (-J) 與 ProxyCommand? ?用于通過中間機器 來跳 轉目的主機
OpenSSH 版本 7.3?開始支持中間機器可以為多個
10.3.246.108 ?thostA ? 10.3.246.109 ?thostB ?thostE 10.3.246.110 ?thostC? 10.3.246.112 ?thostD
ProxyCommand?? ??? ?# ProxyJump是ProxyCommand升級版? ?? ??? ??? ??? ??? ?# ssh -o ProxyCommand="ssh -W %h:%p
ProxyJump?? ??? ??? ?#-J 命令用于指定一個或者多個跳板主機(jump host) ?? ??? ??? ??? ??? ?#ssh -J
使用場景(目的主機需要多次登錄調整,或者本機到目的主機網絡限制,不能直接連接)
雖然ssh-agent能解決ssh復用問題,但不能解決多次跳轉登錄
在配置文件中配置
#~/.ssh/config
# # sample for ProxyJump
# ProxyJump user@
# # sample for ProxyCommand
# ProxyCommand ssh -W %h:%p
Host 10.3.246.108
Hostname 10.3.246.108
User root
ForwardAgent yes
Host thostB
Hostname 10.3.246.109
User root
ProxyCommand ssh -W %h:%p 10.3.246.108
ForwardAgent yes
Host thostC
Hostname 10.3.246.110
User root
ProxyJump 10.3.246.108
ForwardAgent yes
Host thostE
Hostname 10.3.246.109
User root
ProxyJump 10.3.246.110,10.3.246.108
ForwardAgent yes
# 登錄測試
[root@thostD ~]# ssh thostC -v #ProxyJump 在thostD 登錄thostC
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017
debug1: Reading configuration data /root/.ssh/config
debug1: Setting implicit ProxyCommand from ProxyJump: ssh -v -W %h:%p 10.3.246.108
debug1: Executing proxy command: exec ssh -v -W 10.3.246.110:22 10.3.246.108
[root@thostD ~]# ssh thostB -v #ProxyCommand 在thostD 登錄thostB
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017
debug1: Reading configuration data /root/.ssh/config
debug1: Executing proxy command: exec ssh -W 10.3.246.109:22 10.3.246.108
[root@thostD ~]# ssh thostE -v #在thostD 登錄thostE(10.3.246.109) 中間多個跳轉
debug1: Setting implicit ProxyCommand from ProxyJump: ssh -J 10.3.246.110 -v -W %h:%p 10.3.246.108
debug1: Executing proxy command: exec ssh -J 10.3.246.110 -v -W 10.3.246.109:22 10.3.246.108
debug1: Setting implicit ProxyCommand from ProxyJump: ssh -v -W %h:%p 10.3.246.110
debug1: Executing proxy command: exec ssh -v -W 10.3.246.108:22 10.3.246.110
Authenticated to 10.3.246.110 ([10.3.246.110]:22).
debug1: channel_connect_stdio_fwd 10.3.246.108:22
Authenticated to 10.3.246.108 (via proxy).
debug1: channel_connect_stdio_fwd 10.3.246.109:22
[root@thostE ~]# w
19:53:18 up 218 days, 1:39, 1 user, load average: 0.02, 0.02, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/2 10.3.246.108 19:51 6.00s 0.00s 0.00s w
ssh命令行
#10.3.246.110 和 10.3.246.108 為中轉機。
ssh -J 10.3.246.110,10.3.246.108 10.3.246.109
ssh -o ProxyCommand="ssh -W %h:%p 10.3.246.110 'ssh -W %h:%p 10.3.246.108'" 10.3.246.109
關于ssh的一些其他安全配置?
https://www.junmajinlong.com/linux/ssh/ ssh 登錄一般采用密鑰對驗證是比較安全的一種驗證方式 ? ? 默認監(jiān)聽在22端口,不過可以修改或者增加不常見的端口監(jiān)聽 ? ? ssh服務端配置文件為/etc/ssh/sshd_config ? ? ssh客戶端的全局配置文件/etc/ssh/ssh_config
一些安全配置 ? ? #PermitRootLogin no 或者 ?without-password ? ? ? ? ? ?# 是否允許root用戶登錄 ? ? 重要的ssh-key生成最好在創(chuàng)建的時候設置一個復雜密碼
登錄直接執(zhí)行某個命令 ? ? 命令放在~/.ssh/rc或/etc/ssh/rc .bash_profile ?甚至可以寫入在/etc/passwd ? ?? 登錄顯示信息/etc/motd、/run/motd.dynamic,登錯機器是經常碰到的,顯示機器的備注信息可以一定程度避免次情況發(fā)生
部分控制登錄配置 ? ? #DenyUsers, AllowUsers, DenyGroups, AllowGroup ? ? DenyGroups ?hellogroup testgroup ?# 表示即拒絕這些組用戶連接 ? ? DenyUsers ? hello test ? ? ? ? ? ?# 表示即拒絕這些用戶連接 ? ? 禁用用戶登錄: /etc/passwd ? ? 禁用用戶組登錄:/etc/group ? ? ?~/.rhosts or ~/.shosts 不是必需,最好不要使用這兩個文件來控制遠程主機訪問本地主機 ? ? ? 提高登錄速度? ? ? 可以通過PreferredAuthentications調整驗證順序,或者關閉不必要的驗證方式 ? ? UseDNS no
ssh傳文件,從標準輸入中讀取數(shù)據(jù)然后傳輸?shù)竭h程 ? ? cat 86_64.rpm | ssh 172.16.10.6 ?"cat - > /tmp/86_64.rpm" ? ? [root@xuexi ~]# cat ~/.ssh/id_rsa.pub | ssh 172.16.10.6 "umask 077; test -d ~/.ssh || mkdir ~/.ssh ; cat >> ~/.ssh/authorized_keys" ?
參閱:
SSH權限詳解:?SSH權限詳解 - DTeam 技術日志
如何通過 PyCharm 連接服務器?JumpServer 如何通過 PyCharm 連接 - FIT2CLOUD 知識庫
ssh系列文章:https://www.junmajinlong.com/linux/ssh_port_forward/
SSH 命令的三種代理功能(-L/-R/-D):https://zhuanlan.zhihu.com/p/57630633
SSH ProxyCommand example: https://www.cyberciti.biz/faq/linux-unix-ssh-proxycommand-passing-through-one-host-gateway-server/
柚子快報邀請碼778899分享:linux 運維 ssh 轉發(fā)
推薦閱讀
本文內容根據(jù)網絡資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉載請注明,如有侵權,聯(lián)系刪除。