实用技巧、示例和 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"

通过代理使用其他应用程序

请记住,许多其他应用程序也可能使用袜子代理。 网络浏览器是其中最受欢迎的。 某些应用程序具有启用代理服务器的配置选项。 其他人需要一些帮助程序的帮助。 例如, proxychains 允许您通过socks代理运行Microsoft RDP等。

localhost:~$ proxychains rdesktop $RemoteWindowsServer

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

提示:如果您在 Windows 上使用 Linux 的远程桌面? 尝试一下客户端 FreeRDP。 这是比以下更现代的实现 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 代理并 proxychains,但是也有一些限制。 例如,不可能直接使用套接字,因此我们将无法通过以下方式扫描网络内的端口 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 第二个连接使用 ssh или scp 建立带有附加身份验证的新会话。 选项 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 你在玩任何游戏时都会变得更有效率。

来源: habr.com

添加评论