實用技巧、範例和 SSH 隧道

實用技巧、範例和 SSH 隧道
實際例子 SSH,這會將您作為遠端系統管理員的技能提升到一個新的水平。 命令和提示不僅有助於使用 SSH,而且還能更熟練地瀏覽網路。

知道一些技巧 ssh 對任何系統管理員、網路工程師或安全專家都有用。

SSH 實用範例

  1. SSH 襪子代理
  2. SSH 隧道(連接埠轉送)
  3. 通往第三台主機的 SSH 隧道
  4. 反向 SSH 隧道
  5. SSH 反向代理
  6. 透過 SSH 安裝 VPN
  7. 複製 SSH 金鑰 (ssh-copy-id)
  8. 遠端命令執行(非互動式)
  9. Wireshark 中的遠端封包擷取和檢視
  10. 透過 SSH 將本機資料夾複製到遠端伺服器
  11. 具有 SSH X11 轉發的遠端 GUI 應用程式
  12. 使用 rsync 和 SSH 進行遠端檔案複製
  13. 透過 Tor 網路的 SSH
  14. SSH 到 EC2 執行個體
  15. 透過 ssh/scp 使用 VIM 編輯文字文件
  16. 使用 SSHFS 將遠端 SSH 掛載為本機資料夾
  17. 將 SSH 與 ControlPath 復用
  18. 使用 VLC 和 SFTP 透過 SSH 串流視訊
  19. 兩因素驗證
  20. 使用 SSH 和 -J 跳轉主機
  21. 使用 iptables 阻止 SSH 暴力嘗試
  22. SSH Escape 更改連接埠轉發

首先是基礎

解析SSH命令列

以下範例使用連接遠端伺服器時經常遇到的常用參數 SSH.

localhost:~$ ssh -v -p 22 -C neo@remoteserver

  • -v:在分析身份驗證問題時,偵錯輸出特別有用。 可以多次使用以顯示附加資訊。
  • - p 22: 連接埠 到遠端 SSH 伺服器。 22 不必指定,因為這是預設值,但如果協定位於其他端口,則我們使用參數指定它 -p。 文件中指定監聽端口 sshd_config 格式 Port 2222.
  • -C:連接時壓縮。 如果您的連線速度較慢或查看大量文本,這可以加快連線速度。
  • neo@:@符號之前的一行表示遠端伺服器上進行身份驗證的使用者名稱。 如果您不指定,它將預設為您目前登入帳戶的使用者名稱(~$whoami)。 也可以使用參數指定用戶 -l.
  • remoteserver:要連接的主機名稱 ssh,這可以是完全限定的網域名稱、IP 位址或本機主機檔案中的任何主機。 若要連線到同時支援IPv4和IPv6的主機,可以在命令列中新增此參數 -4-6 以獲得正確的解決方案。

上述所有參數都是可選的,除了 remoteserver.

使用設定檔

儘管許多人熟悉該文件 sshd_config,還有一個命令的客戶端配置文件 ssh。 預設值 ~/.ssh/config,但它可以定義為選項的參數 -F.

Host *
     Port 2222

Host remoteserver
     HostName remoteserver.thematrix.io
     User neo
     Port 2112
     IdentityFile /home/test/.ssh/remoteserver.private_key

上面的 ssh 設定檔範例中有兩個主機條目。 第一個表示所有主機,全部使用連接埠2222配置參數,第二個表示對於主機 遠端伺服器 應使用不同的使用者名稱、連接埠、FQDN 和 IdentityFile。

設定檔允許在連接到特定主機時自動套用進階配置,從而節省大量打字時間。

使用 SCP 透過 SSH 複製文件

SSH 用戶端附帶了另外兩個非常方便的工具,用於複製文件 加密的 ssh 連接。 請參閱下面的 scp 和 sftp 指令的標準用法範例。 請注意,許多 ssh 選項也適用於這些命令。

localhost:~$ scp mypic.png neo@remoteserver:/media/data/mypic_2.png

在此範例中,文件 mypic.png 複製到 遠端伺服器 到文件夾 /媒體/數據 並重命名為 mypic_2.png.

不要忘記連接埠參數的差異。 這是很多人在啟動時被抓住的地方 scp 從命令列。 這是連接埠參數 -P而且不 -p,就像在 ssh 客戶端中一樣! 你會忘記,但別擔心,每個人都會忘記。

對於熟悉控制台的人 ftp,許多命令相似 sftp。 你可以做 , и ls如心所願。

sftp neo@remoteserver

實際例子

在許多這樣的範例中,可以使用不同的方法來實現結果。 正如我們所有的 教科書 和例子,優先考慮能夠完成其工作的實際例子。

1.SSH襪子代理

SSH 代理功能排名第一是有充分理由的。 它比許多人想像的更強大,讓您可以使用幾乎任何應用程式存取遠端伺服器可以存取的任何系統。 ssh 用戶端可以使用一個簡單的命令透過 SOCKS 代理來傳輸流量。 重要的是要了解遠端系統的流量將來自遠端伺服器,這將在 Web 伺服器日誌中指示。

localhost:~$ ssh -D 8888 user@remoteserver

localhost:~$ netstat -pan | grep 8888
tcp        0      0 127.0.0.1:8888       0.0.0.0:*               LISTEN      23880/ssh

這裡我們在 TCP 連接埠 8888 上執行襪子代理,第二個指令檢查該連接埠在偵聽模式下是否處於活動狀態。 127.0.0.1 表示該服務僅在本機上執行。 我們可以使用稍微不同的命令來監聽所有接口,包括乙太網路或 wifi,這將允許我們網路上的其他應用程式(瀏覽器等)透過 sshocks 代理連接到代理服務。

localhost:~$ ssh -D 0.0.0.0:8888 user@remoteserver

現在我們可以設定瀏覽器連線到socks代理程式。 在火狐瀏覽器中,選擇 設定 | 基本 | 網路設定。 指定要連接的 IP 位址和連接埠。

實用技巧、範例和 SSH 隧道

請注意表單底部的選項,讓您的瀏覽器的 DNS 請求也透過 SOCKS 代理程式。 如果您使用代理伺服器來加密本機網路上的 Web 流量,您可能需要選擇此選項,以便 DNS 請求透過 SSH 連線進行隧道傳輸。

在Chrome中啟動socks代理

使用某些命令列參數啟動Chrome將啟用socks代理,並透過隧道傳輸來自瀏覽器的DNS請求。 信任但要檢查。 使用 轉儲 檢查 DNS 查詢是否不再可見。

localhost:~$ google-chrome --proxy-server="socks5://192.168.1.10:8888"

透過代理使用其他應用程式

請記住,許多其他應用程式也可能使用襪子代理。 網頁瀏覽器是其中最受歡迎的。 某些應用程式具有啟用代理伺服器的設定選項。 其他人需要一些幫助程序的幫助。 例如, 代理鏈 允許您透過socks代理程式運行Microsoft RDP等。

localhost:~$ proxychains rdesktop $RemoteWindowsServer

Socks 代理程式設定參數在 proxychains 設定檔中設定。

提示:如果您在 Windows 上使用 Linux 的遠端桌面? 嘗試客戶端 免費RDP。 這是比以下更現代的實現 rdesktop,體驗更加流暢。

透過socks代理使用SSH的選項

您坐在咖啡館或飯店中,被迫使用相當不可靠的 WiFi。 我們從筆記型電腦本地啟動 ssh 代理,並在本地 Rasberry Pi 上安裝進入家庭網路的 ssh 隧道。 使用為socks代理程式配置的瀏覽器或其他應用程序,我們可以存取家庭網路上的任何網路服務或透過家庭連線存取網際網路。 您的筆記型電腦和家庭伺服器(透過 Wi-Fi 和網路連接到您家)之間的所有內容都在 SSH 隧道中加密。

2.SSH隧道(連接埠轉送)

最簡單的形式是,SSH 隧道只是在本地系統上打開一個端口,該端口連接到隧道另一端的另一個端口。

localhost:~$ ssh  -L 9999:127.0.0.1:80 user@remoteserver

我們來看看參數 -L。 它可以被認為是本地監聽。 因此,在上面的範例中,連接埠 9999 正在本機主機端偵聽,並透過連接埠 80 轉送到遠端伺服器。 請注意,127.0.0.1 指的是遠端伺服器上的 localhost!

我們走上階梯吧。 以下範例與本機網路上的其他主機通訊偵聽連接埠。

localhost:~$ ssh  -L 0.0.0.0:9999:127.0.0.1:80 user@remoteserver

在這些範例中,我們連接到 Web 伺服器上的端口,但這可以是代理伺服器或任何其他 TCP 服務。

3. 到第三方主機的 SSH 隧道

我們可以使用相同的參數將隧道從遠端伺服器連接到第三個系統上運行的另一個服務。

localhost:~$ ssh  -L 0.0.0.0:9999:10.10.10.10:80 user@remoteserver

在此範例中,我們將隧道從遠端伺服器重新導向到在 10.10.10.10 上執行的 Web 伺服器。 從遠端伺服器到 10.10.10.10 的流量 不再位於 SSH 隧道中。 10.10.10.10 上的 Web 伺服器將把 Remoteserver 視為 Web 請求的來源。

4.反向SSH隧道

在這裡,我們將在遠端伺服器上配置一個偵聽端口,該端口將連接回本地主機(或其他系統)上的本地端口。

localhost:~$ ssh -v -R 0.0.0.0:1999:127.0.0.1:902 192.168.1.100 user@remoteserver

此 SSH 會話建立從遠端伺服器上的連接埠 1999 到本機用戶端上的連接埠 902 的連線。

5.SSH反向代理

在本例中,我們在 ssh 連線上設定一個ocks代理,但該代理正在伺服器的遠端偵聽。 現在,與此遠端代理程式的連線會從隧道中顯示為來自本機的流量。

localhost:~$ ssh -v -R 0.0.0.0:1999 192.168.1.100 user@remoteserver

遠端 SSH 隧道問題故障排除

如果您在遠端 SSH 選項工作時遇到問題,請檢查 netstat,監聽埠也連接了哪些其他介面。 雖然我們在範例中指定了 0.0.0.0,但如果該值 網關連接埠 в sshd_配置 調成 沒有,那麼偵聽器將僅綁定到 localhost (127.0.0.1)。

安全警告

請注意,透過開啟隧道和襪子代理,內部網路資源可能會被不受信任的網路(例如網路!)存取。 這可能會帶來嚴重的安全風險,因此請確保您了解偵聽器是什麼以及他們可以存取什麼。

6.透過SSH安裝VPN

攻擊方法專家(滲透測試人員等)中的一個常見術語是「網路中的支點」。 一旦在一個系統上建立連接,該系統就成為進一步存取網路的網關。 一個讓你大步前進的支點。

對於這樣的立足點,我們可以使用 SSH 代理並 代理鏈,但是也有一些限制。 例如,不可能直接使用套接字,因此我們將無法透過以下方式掃描網路內的端口 NMAP SYN.

使用此更進階的 VPN 選項,連線可減少至 3級。 然後,我們可以使用標準網路路由簡單地透過隧道路由流量。

該方法使用 ssh, iptables, tun interfaces 和路由。

首先你需要設定這些參數 sshd_config。 由於我們正在更改遠端和客戶端系統的介面,因此我們 雙方都需要 root 權限.

PermitRootLogin yes
PermitTunnel yes

然後我們將使用請求初始化 tun 裝置的參數建立 ssh 連線。

localhost:~# ssh -v -w any root@remoteserver

現在,在顯示介面時我們應該有一個 tun 設備(# ip a)。 下一步將向隧道介面新增 IP 位址。

SSH 客戶端:

localhost:~# ip addr add 10.10.10.2/32 peer 10.10.10.10 dev tun0
localhost:~# ip tun0 up

SSH 伺服器端:

remoteserver:~# ip addr add 10.10.10.10/32 peer 10.10.10.2 dev tun0
remoteserver:~# ip tun0 up

現在我們有到另一台主機的直接路由(route -n и ping 10.10.10.10).

您可以透過另一端的主機路由任何子網路。

localhost:~# route add -net 10.10.10.0 netmask 255.255.255.0 dev tun0

在遠端您必須啟用 ip_forward и iptables.

remoteserver:~# echo 1 > /proc/sys/net/ipv4/ip_forward
remoteserver:~# iptables -t nat -A POSTROUTING -s 10.10.10.2 -o enp7s0 -j MASQUERADE

繁榮! 網路層 3 上的 VPN over SSH 隧道。 現在這是一場勝利。

如果出現任何問題,請使用 轉儲 и ping以確定原因。 由於我們在第 3 層進行操作,因此我們的 icmp 封包將通過此隧道。

7. 複製 SSH 金鑰 (ssh-copy-id)

有多種方法可以執行此操作,但此命令無需手動複製文件,從而節省了時間。 它只是將 ~/.ssh/id_rsa.pub (或預設金鑰)從您的系統複製到 ~/.ssh/authorized_keys 在遠端伺服器上。

localhost:~$ ssh-copy-id user@remoteserver

8.遠端命令執行(非交互)

團隊 ssh 可以連結到其他命令以獲得通用、用戶友好的介面。 只需將要在遠端主機上執行的命令新增為引號中的最後一個參數即可。

localhost:~$ ssh remoteserver "cat /var/log/nginx/access.log" | grep badstuff.php

在這個例子中 grep 透過 ssh 通道下載日誌後在本機系統上執行。 如果文件較大,運行起來比較方便 grep 在遠端,只需將兩個命令括在雙引號中即可。

另一個範例執行與以下相同的功能 ssh-copy-id 來自範例 7。

localhost:~$ cat ~/.ssh/id_rsa.pub | ssh remoteserver 'cat >> .ssh/authorized_keys'

9.Wireshark中的遠端抓包和查看

我拿了我們的一張 tcpdump 範例。 使用它遠端擷取封包並直接在本機 Wireshark GUI 中顯示結果。

:~$ ssh root@remoteserver 'tcpdump -c 1000 -nn -w - not port 22' | wireshark -k -i -

10.透過SSH將本機資料夾複製到遠端伺服器

一個很好的技巧,使用壓縮資料夾 bzip2 (這是命令中的 -j 選項 tar),然後檢索流 bzip2 另一方面,在遠端伺服器上建立一個重複的資料夾。

localhost:~$ tar -cvj /datafolder | ssh remoteserver "tar -xj -C /datafolder"

11. 使用 SSH X11 轉送的遠端 GUI 應用程式

如果客戶端和遠端伺服器上都安裝了X,那麼您可以使用本機桌面上的視窗遠端執行GUI命令。 這個功能已經存在很長時間了,但仍然非常有用。 啟動遠端 Web 瀏覽器甚至 VMWawre Workstation 控制台,就像我在本範例中所做的那樣。

localhost:~$ ssh -X remoteserver vmware

必填字串 X11Forwarding yes 在文件中 sshd_config.

12.使用rsync和SSH遠端檔案複製

rsync 方便多了 scp,如果您需要定期備份目錄、大量文件或非常大的文件。 有一個從傳輸失敗中恢復並僅複製更改的檔案的功能,這可以節省流量和時間。

此範例使用壓縮 gzip (-z) 和歸檔模式 (-a),啟用遞歸複製。

:~$ rsync -az /home/testuser/data remoteserver:backup/

13. Tor 網路上的 SSH

匿名 Tor 網路可以使用以下命令透過隧道傳輸 SSH 流量 torsocks。 以下命令將透過 Tor 傳遞 ssh 代理程式。

localhost:~$ torsocks ssh myuntracableuser@remoteserver

軀幹襪 將使用本機上的連接埠 9050 進行代理程式。 與往常一樣,使用 Tor 時,您需要認真檢查正在傳輸的流量以及其他操作安全性 (opsec) 問題。 您的 DNS 查詢去了哪裡?

14. SSH 到 EC2 實例

要連接到 EC2 實例,您需要私鑰。 從 Amazon EC2 控制面板下載它(.pem 副檔名)並變更權限(chmod 400 my-ec2-ssh-key.pem)。 將密鑰保存在安全的地方或將其放在您自己的資料夾中 ~/.ssh/.

localhost:~$ ssh -i ~/.ssh/my-ec2-key.pem ubuntu@my-ec2-public

參數 -i 只是告訴 ssh 客戶端使用此密鑰。 文件 ~/.ssh/config 非常適合在連接到 ec2 主機時自動配置密鑰使用。

Host my-ec2-public
   Hostname ec2???.compute-1.amazonaws.com
   User ubuntu
   IdentityFile ~/.ssh/my-ec2-key.pem

15.透過ssh/scp使用VIM編輯文字文件

獻給所有的戀人 vim 這個技巧會節省一些時間。 透過使用 vim 檔案透過 scp 使用一個指令進行編輯。 該方法只是在本地創建文件 /tmp然後在我們保存它後將其複製回來 vim.

localhost:~$ vim scp://user@remoteserver//etc/hosts

註:格式與通常的略有不同 scp。 主持人之後我們有雙 //。 這是絕對路徑引用。 一個斜杠表示相對於您的主資料夾的路徑 users.

**warning** (netrw) cannot determine method (format: protocol://[user@]hostname[:port]/[path])

如果您看到此錯誤,請仔細檢查命令格式。 這通常意味著語法錯誤。

16. 使用 SSHFS 將遠端 SSH 掛載為本機資料夾

通過 sshfs - 檔案系統客戶端 ssh - 我們可以將本機目錄連接到遠端位置,並在加密會話中進行所有檔案交互 ssh.

localhost:~$ apt install sshfs

在 Ubuntu 和 Debian 上安裝軟體包 sshfs,然後只需將遠端位置安裝到我們的系統即可。

localhost:~$ sshfs user@remoteserver:/media/data ~/data/

17. SSH 與 ControlPath 多路復用

預設情況下,如果存在到遠端伺服器的現有連接,則使用 ssh 第二個連接使用 sshscp 建立具有附加身份驗證的新會話。 選項 ControlPath 允許現有會話用於所有後續連線。 這將顯著加快該過程:即使在本地網路上,效果也很明顯,在連接到遠端資源時更是如此。

Host remoteserver
        HostName remoteserver.example.org
        ControlMaster auto
        ControlPath ~/.ssh/control/%r@%h:%p
        ControlPersist 10m

ControlPath 指定套接字檢查新連線以查看是否有活動會話 ssh。 最後一個選項表示即使在退出控制台後,現有工作階段仍將保持開啟 10 分鐘,因此在此期間您可以在現有套接字上重新連線。 有關詳細信息,請參閱幫助。 ssh_config man.

18. 使用 VLC 和 SFTP 透過 SSH 串流視訊

即使是長期用戶 ssh и vlc 當您確實需要透過網路觀看影片時,(影片 LAN 用戶端)並不總是意識到這個方便的選項。 在設定中 文件 | 開啟網路串流 節目 vlc 您可以將位置輸入為 sftp://。 如果需要密碼,將會出現提示。

sftp://remoteserver//media/uploads/myvideo.mkv

19. 雙重身分驗證

與您的銀行帳戶或 Google 帳戶相同的雙重認證適用於 SSH 服務。

當然 ssh 最初具有雙重認證功能,即密碼和 SSH 金鑰。 硬體令牌或 Google Authenticator 應用程式的優點是它通常是不同的實體設備。

請參閱我們的 8 分鐘指南 使用 Google 身份驗證器和 SSH.

20. 使用 ssh 和 -J 跳轉主機

如果網絡分段意味著您必須跳過多個 ssh 主機才能到達最終目標網絡,那麼 -J 快捷方式將節省您的時間。

localhost:~$ ssh -J host1,host2,host3 [email protected]

這裡要理解的主要一點是,這與命令不同 ssh host1然後 user@host1:~$ ssh host2 -J 選項巧妙地使用轉送來強制 localhost 與鏈中的下一個主機建立會話。 因此,在上面的範例中,我們的 localhost 通過了 host4 的驗證。 也就是說,使用了我們的 localhost 金鑰,並且從 localhost 到 host4 的會話是完全加密的。

對於這樣的可能性 ssh_config 指定配置選項 代理跳轉。 如果您經常需要檢查多個主機,那麼透過配置實現自動化將節省大量時間。

21. 使用 iptables 阻止 SSH 暴力嘗試

任何管理過 SSH 服務並查看日誌的人都知道每天每小時發生的暴力嘗試次數。 減少日誌中噪音的一種快速方法是將 SSH 移至非標準連接埠。 更改文件 sshd_config 透過配置參數 港口##.

iptables 您還可以在達到特定閾值時輕鬆阻止連接到連接埠的嘗試。 一個簡單的方法是使用 OSSEC,因為它不僅阻止 SSH,還執行一系列其他基於主機名稱的入侵偵測 (HIDS) 措施。

22. SSH Escape 更改連接埠轉發

我們的最後一個例子 ssh 旨在在現有會話中動態變更連接埠轉發 ssh。 想像一下這個場景。 你在網路深處; 可能跨越六台主機,並且需要工作站上的本機連接埠轉送到舊 Windows 2003 系統的 Microsoft SMB(有人還記得 ms08-67 嗎?)。

點擊 enter,嘗試在控制台輸入 ~C。 這是一個會話控制序列,允許對現有連線進行變更。

localhost:~$ ~C
ssh> -h
Commands:
      -L[bind_address:]port:host:hostport    Request local forward
      -R[bind_address:]port:host:hostport    Request remote forward
      -D[bind_address:]port                  Request dynamic forward
      -KL[bind_address:]port                 Cancel local forward
      -KR[bind_address:]port                 Cancel remote forward
      -KD[bind_address:]port                 Cancel dynamic forward
ssh> -L 1445:remote-win2k3:445
Forwarding port.

在這裡您可以看到我們已將本機連接埠 1445 轉送到我們在內部網路上找到的 Windows 2003 主機。 現在只需運行 msfconsole,您可以繼續(假設您打算使用該主機)。

完成

這些範例、提示和命令 ssh 應該給出一個起點; 有關每個命令和功能的更多資訊可在手冊頁上找到(man ssh, man ssh_config, man sshd_config).

我一直對在世界任何地方存取系統和執行命令的能力著迷。 透過使用諸如 ssh 你在玩任何遊戲時都會變得更有效率。

來源: www.habr.com

添加評論