实用技巧,示例和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 :连接的压缩。 如果您的Feed速度慢或正在查看大量文本,则可以加快连接速度。
  • neo@ :@符号前的行表示远程服务器上用于认证的用户名。 如果未指定,默认情况下将使用当前登录帐户的用户名(〜$ whoami)。 也可以使用-l选项指定用户。
  • remoteserverssh连接到的主机名,它可以是标准域名,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配置文件有两个主机条目。 第一个指示所有主机,所有端口均使用Port 2222配置参数;第二个指示对于远程服务器主机,使用不同的用户名,端口,FQDN和IdentityFile。

配置文件可以节省大量时间输入字符,从而使您可以在连接到特定主机时自动应用高级配置。

使用SCP通过SSH复制文件


SSH客户端附带了另外两个非常方便的工具,用于通过加密的ssh连接复制文件。 请参阅以下有关scp和sftp命令的标准用法的示例。 请注意,ssh的许多选项也适用于这些命令。

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

在此示例中,文件mypic.png被复制到/ media / data文件夹中的remoteserver 并重命名为mypic_2.png

不要忘记端口参数的差异。 许多人从命令行运行scp 。 这里的port参数是-P ,而不是-p ,就像ssh客户端中一样! 您会忘记,但不用担心,每个人都会忘记。

对于熟悉控制台ftp ,许多命令在sftp都是相似的。 您可以按照自己的意愿进行推拉

 sftp neo@remoteserver 

实际例子


在许多这些示例中,可以通过各种方法获得结果。 与我们所有的教科书和示例一样,偏向于简单地完成工作的实际示例。

1. SSH袜子代理


SSH代理位于1号是有充分理由的。 它比许多人想象的要强大,并且使您可以访问几乎任何应用程序都可以访问远程服务器访问的任何系统。 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上运行socks代理,第二条命令检查该端口在侦听模式下是否处于活动状态。 127.0.0.1表示该服务仅在本地主机上运行。 我们可以使用略有不同的命令来侦听所有接口,包括以太网或wifi,这将允许网络上的其他应用程序(浏览器等)通过ssh socks proxy连接到代理服务。

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

现在,我们可以配置浏览器以连接到袜子代理。 在Firefox中,选择设置| 亮点| 网络设置 指定要连接的IP地址和端口。



请注意表单底部的选项,以便浏览器DNS查询也可以通过SOCKS代理进行。 如果使用代理服务器加密本地网络上的Web流量,则可能要选择此选项,以便通过SSH连接建立DNS查询通道。

在Chrome中启动袜子代理


使用某些命令行选项运行Chrome可以激活袜子代理,并通过浏览器建立DNS查询通道。 信任,但要验证。 使用tcpdump验证DNS查询不再可见。

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

使用其他代理应用程序


请记住,许多其他应用程序也可以使用袜子代理。 Web浏览器只是其中最流行的。 某些应用程序具有用于激活代理服务器的配置选项。 其他人在帮助程序上需要一点帮助。 例如, 代理链允许通过袜子代理运行Microsoft RDP等。

 localhost:~$ proxychains rdesktop $RemoteWindowsServer 

袜子代理配置参数在proxychains配置文件中设置。

提示:如果您在Windows上使用Linux上的远程桌面? 尝试FreeRDP客户端。 与rdesktop相比,这是一种更现代的实现,交互更加顺畅。

通过袜子代理的SSH选项


您正坐在咖啡厅或旅馆中-被迫使用不太可靠的WiFi。 从笔记本电脑上,在本地启动ssh代理并将ssh隧道安装到本地Rasberry Pi上的家庭网络中。 使用浏览器或其他为袜子代理配置的应用程序,我们可以访问家庭网络上的任何网络服务,或通过家庭连接访问Internet。 便携式计算机和家庭服务器之间的所有内容(通过Wi-Fi和Internet到家庭)都在SSH隧道中加密。

2. SSH隧道(端口转发)


SSH隧道以其最简单的形式只是在本地系统上打开一个端口,该端口连接到隧道另一端的另一个端口。

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

让我们研究一下-L选项。 它可以表示为收听的本地端。 因此,在上面的示例中,端口9999在本地主机端被侦听,并通过端口80转发到remoteserver。 请注意,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 

在此示例中,我们将隧道从remoteserver重定向到运行于10.10.10.10的Web服务器。 SSH隧道中不再包含10.10.10.10之前与remoteserver进行的通信。 在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代理


在这种情况下,我们将socks代理安装在我们的ssh连接上,但是,该代理在服务器的远程端进行侦听。 现在,与该远程代理的连接从隧道显示为来自本地主机的流量。

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

对远程SSH隧道进行故障排除


如果远程SSH选项有问题,请使用netstat检查侦听端口连接到的其他接口。 尽管我们在示例中指定了0.0.0.0,但是如果sshd_config中GatewayPorts值设置为no ,则侦听器将仅绑定到localhost(127.0.0.1)。

安全警告


请注意,打开隧道和袜子代理时,内部网络资源可能可用于不受信任的网络(例如Internet!)。 这可能会带来严重的安全风险,因此请确保您了解侦听器是什么以及侦听器可以访问什么。

6.通过SSH安装VPN


攻击方法(五分之一等)的专家中的通用术语是“网络的支点”。 在一个系统中建立连接后,该系统成为进一步访问网络的网关。 允许您移动的支点。

对于这样的支点,我们可以使用SSH代理和代理 ,但是存在一些限制。 例如,您将无法直接使用套接字,因此我们将无法通过Nmap SYN扫描网络内部的端口。

使用此更高级的VPN选项,连接下降到3级 。 然后,我们可以使用标准网络路由简单地将流量路由通过隧道。

该方法使用sshiptablestun interfaces和路由。

首先,您需要在sshd_config设置这些参数。 由于我们正在更改远程系统和客户端系统的接口,因此我们都需要root特权

 PermitRootLogin yes PermitTunnel yes 

然后使用请求初始化tun设备的参数建立ssh连接。

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

现在,在显示接口( # ip a )时,我们应该有一个tun设备。 下一步将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 -nping 10.10.10.10 )。

您可以通过另一侧的主机路由任何子网。

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

在远程端,必须启用ip_forwardiptables

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

oom! 网络层3上的SSH隧道上的VPN 。 这已经是胜利。

如果遇到任何问题,请使用tcpdumpping确定原因。 由于我们在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 

在此示例中,通过ssh通道下载日志后, grep将在本地系统上运行。 如果文件很大,则在远程运行grep更为方便,只需将两个命令都用双引号引起来即可。

另一个示例执行与示例7中的ssh-copy-id相同的功能。

 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压缩文件夹(这是tar命令中的-j选项),然后在另一侧提取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 

sshd_config文件中需要X11Forwarding yes行。

12.使用rsync和SSH进行远程文件复制


如果需要定期备份目录,大量文件或非常大的文件,则rsyncscp更为方便。 具有从传输故障中恢复并仅复制修改后的文件的功能,从而节省了流量和时间。

本示例使用gzip压缩(-z)和存档模式(-a),从而启用递归复制。

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

13.通过Tor网络的SSH


匿名的Tor网络可以使用torsocks SSH流量隧道。 以下命令将通过Tor抛出ssh代理。

 localhost:~$ torsocks ssh myuntracableuser@remoteserver 

Torsocks将使用端口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挂载为本地文件夹


使用ssh文件系统客户端sshfs ,我们可以将本地目录连接到远程位置,并在加密的ssh会话中进行所有文件交互。

 localhost:~$ apt install sshfs 

我们在Ubuntu和Debian上安装sshfs软件包,然后将远程位置安装在我们的系统上。

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

17. SSH与ControlPath的复用


默认情况下,如果您具有使用ssh到远程服务器的现有连接ssh使用sshscp ssh第二个连接将建立具有附加身份验证的新会话。 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流传输视频


当您确实需要在网络上观看视频时,即使sshvlc (视频Lan客户端)的长期用户也不总是知道此便捷选项。 在设置文件| 打开Network Stream vlc程序可以将位置输入为sftp:// 。 如果需要密码,将出现提示。

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

19.两因素认证


与您的银行帐户或Google帐户相同的两因素身份验证适用于SSH服务。

当然, ssh最初具有双重身份验证功能,即密码和SSH密钥。 硬件令牌或Google Authenticator应用程序的优势在于,它通常是不同的物理设备。

请参阅有关使用Google Authenticator和SSH的 8分钟指南。

20.主机通过ssh和-J跳转


如果由于网络分段的原因,您必须跨越多个ssh主机才能到达最终的目标网络,则-J快捷方式将节省您的时间。

 localhost:~$ ssh -J host1,host2,host3 user@host4.internal 

在这里主要要了解的是,这与ssh host1 ,然后与user@host1:~$ ssh host2等类似。-J参数巧妙地使用转发,以便localhost与链中的下一个主机建立会话。 因此,在上面的示例中,我们的本地主机对host4进行身份验证。 也就是说,使用了我们的本地主机密钥,并且从本地主机到host4的会话已完全加密。

为此,请在ssh_config中指定proxyJump配置选项。 如果您必须定期通过多个主机,则通过配置进行自动化将节省大量时间。

21.使用iptables阻止SSH暴力破解尝试


任何运行SSH服务并浏览日志的人都知道每天每小时发生的暴力破解尝试次数。 减少日志中噪音的一种快速方法是将SSH迁移到非标准端口。 使用端口##配置参数更改sshd_config文件。

使用iptables ,您还可以在达到特定阈值后轻松阻止尝试连接到端口的尝试。 — OSSEC , SSH, (HIDS).

22. SSH Escape


ssh ssh . . ; , , Microsoft SMB Windows 2003 (- 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 , .

Source: https://habr.com/ru/post/zh-CN435546/


All Articles