公开网络研讨会:“ SSH / NC / Socat:提示和技巧”

祝大家有美好的一天!

下周,我们将启动下一个Linux Administrator组 ,与此相关的是我们举办了许多活动。 其中之一是关于“ SSH / NC / Socat:提示和技巧”的公开课程。 在它上面,我们记得ssh是什么,它的历史和任务。 我们检查了其使用的各种选项:远程,本地端口转发,安全复制,Socks代理,反向代理。 实际上,我们在虚拟实验室中尝试了nc和socat实用程序。

该网络研讨会由经验丰富的系统管理员Vladimir Drozdetsky主持 ,该人是letundra.com,exposcan.ru,crismessenger.com的基础架构开发人员。

我们提请您注意过去事件的详细描述。


回顾SSH是什么

SSH(安全外壳)是一种“安全外壳”,一种应用程序级别的网络协议。 它允许您远程控制操作系统和隧道TCP连接(例如,传输文件)。 SSH在功能上类似于Telnet和rlogin协议,但是与它们不同,因为它会加密所有流量,包括传输的密码。 SSH-2协议规范包含在RFC 4251中。

让我们看看SSH的各种用法,包括标准和非标准。 以下立场将帮助我们:



该展台展示了位于防火墙后面的四个虚拟机。 我们将在Node-1机器上执行所有操作。

创建一个SSH密钥

为了使用SSH密钥,必须首先创建它。 为此,一个特殊的实用程序是合适的,它绝对适用于任何Linux发行版:

ssh-keygen -t RSA -N otuslinux -f ~/.ssh/otus 

  • -t-使用哪种加密算法;
  • -N-加密密钥(如果您需要创建一个没有加密和对各种ssh-keygen请求的响应的密钥,这是一个方便的参数);
  • -f-将密钥保存在哪个文件中。

SSH设置SSH服务器

为了进行进一步的工作,您将需要编辑/ etc / ssh / sshd_config文件并重新启动ssh服务器。 在这里,您应注意以下选项:

RSAAuthentication yes (是否允许RSA身份验证);
PubkeyAuthentication yes (是否允许通过密钥进行认证);
AuthorizedKeysFile %h/.ssh/authorized_keys (密钥公开部分的路径);
PasswordAuthentication yes (是否允许身份验证)。

要将密钥复制到服务器,请按照下列步骤操作:

ssh-copy-id -i /path/to/pub/key user@server (将ssh-copy-id -i /path/to/pub/key user@server的公用部分复制到远程服务器,公用密钥将沿着路径复制到文件%h / .ssh / authorized_keys)

为了在每次连接到远程服务器时都不再输入加密密钥,我们可以使用ssh-agent。 为此:

eval $(ssh-agent -s) (eval是POSIX的一部分。它的接口也可以是shell。代理中的密钥将以解密形式存储)。

ssh-add ~/.ssh/our_private_key (添加私钥)。

在这种情况下:

  • -i-指示公共密钥的位置;
  • 用户-远程服务器上的用户名;
  • 服务器-目标服务器的ip或dns。

为了便于连接到远程服务器,我们可以在ssh配置文件中描述连接参数,该文件位于〜/ .ssh / config路径中

因此,我们得到以下SSH配置文件:

 Host myserver HostName ip/hostname Port 22/??? User username IdentityFile ~/.ssh/id_rsa 

这里的一切都很简单:

  • 主机-我们的连接名称;
  • HostName-服务器名称;
  • 端口-SSH端口
  • 用户-用户名;
  • IdentityFile-ssh密钥。

SSH SCP

让我们继续前进。 使用SSH的最简单方法是将文件从一台计算机复制到远程计算机。 为此,请使用实用程序SCP(安全复制协议)。 使用它,您可以将目录或文件从本地服务器复制到远程服务器,反之亦然:

scp test.txt username@server:/some/directory (将文件从本地服务器复制到远程服务器)。
scp username@server:test.txt /some/directory (将文件从远程服务器复制到本地服务器)。
scp -r dir_name username@server:/some/directory (将文件夹从本地服务器复制到远程服务器)。

在这里:

  • 用户名-用户名;
  • 服务器-服务器地址;
  • / some / server-我们复制的目录;
  • dir_name-文件夹名称;
  • -r-递归使用。

SSH隧道,代理

现在让我们看一下将带有远程端口的端口转发到本地计算机的选项。 以经典案例为例,就是说,当我们拥有一个“邪恶的安全卫士”和一台带有Web应用程序的服务器时,ssh和https端口正在进入世界,而我们确实希望连接到MySQL服务器。

因此:

ssh -f -N -L 9906:127.0.0.1:3306 user@server (仅以MySQL为例)

结果,我们可以使用mysql客户端连接到本地端口9906并进入我们的“安全”服务器。

ssh -D 8080 -q -C -N -f servername (通过端口8080通过SOCKS代理通信)

使用此命令,我们使用ssh创建一个socks5代理服务器。 要检查其性能,我们可以使用以下命令:

 curl -x socks5h://server-with-proxy:8080 https://test.domain 

使用ssh进行端口转发的经典示例是当您要连接的服务器位于nat后面时。 以下命令将帮助我们连接到这样的服务器:

ssh -f -N -R 2255:localhost:22 username@servername (从远程服务器转发到本地服务器)。

在远程服务器上,端口2255将打开,它将重定向到我们服务器的nat端口22。 要连接到这样的服务器,我们可以使用以下命令:

 ssh -p 2255 username@localhost 

请注意:

  • -f-将ssh发送到后台;
  • -N-不要在远程主机上执行命令;
  • -L-转发本地端口(本地端口:本地计算机:远程端口);
  • -R-远程机器上的端口;
  • -q-静音模式;
  • -D-定义应用程序级别端口的本地动态路由;
  • -C-请求数据压缩。

网猫(nc)

我们的下一站是Netcat,这是一个Unix实用程序,可让您建立TCP和UDP连接,从那里接收数据并进行传输。 尽管它有用且简单,但是该实用程序不包含在任何标准中,也不随任何分发工具包一起提供。 因此,必须手动安装。

Netcat(nc)有趣的功能之一是能够扫描端口:

nc -vn ipaddress 22 (单端口扫描);
nc -v ipaddress 10-55 (端口范围扫描);
nc -l 4444 (打开并监听端口4444);
nc servername 4444 (我们在所需端口上连接到服务器)。

打开端口并连接到端口后,我们得到了一个小型网络聊天室=)。

接下来,我们考虑使用nc实用程序传输文件的可能性。 为此,以下命令将为我们提供帮助:

cat test_file | pv -b | nc -l 4444 cat test_file | pv -b | nc -l 4444 (打开端口并通过管道将文件传输到该端口,带有-b开关的pv实用程序用于以字节为单位显示文件传输的进度)。

nc servername 4444 | pv -b > filename nc servername 4444 | pv -b > filename (我们连接到服务器以接收文件,pv -b的使用方式相同)。

我们可以通过动态添加文件归档来使管道复杂化:

tar -czf - /path/to/ | pv -b | nc -l 4444 tar -czf - /path/to/ | pv -b | nc -l 4444 (即时归档文件夹并发送);
n c servername 4444 | pv -b > file.tar.gz c servername 4444 | pv -b > file.tar.gz (发送存档)。

nc的一个不太明显的功能是仅创建一个http服务器。

 while true; do nc -lp 80 < index.html; done 

请注意,要使用端口80,您必须具有root特权。

另请注意:

  • -l-指示监听的操作模式;
  • -n-不使用DNS查询;
  • -v-详细输出。

索卡特

它也是一个有用的实用程序,允许您在机器,转发端口等之间建立TCP连接。它基于Netcat的原理工作:它打开两个双向连接,可以传输数据,流等。但是,它具有一个有趣的功能。 例如,使用Socat,我们可以将COM端口映射到TCP端口,等等。

Socat工作示例:

socat -u FILE:file_name TCP-LISTEN:5778,reuseaddr #发送文件;
socat -u TCP:192.168.1.48:5778 STDOUT | pv -r > file_name socat -u TCP:192.168.1.48:5778 STDOUT | pv -r > file_name #获取文件;
socat TCP-LISTEN:80,fork TCP:ubuntunode-4:80 #将远程服务器的端口重定向到本地端口;
socat TCP-LISTEN:1234,reuseaddr EXEC:/bin/bash #打开远程shell =);
socat - TCP:server_with_remote_shell:1234 #连接到远程服务器的远程Shell。

小解密:

  • -u-使用单向模式;
  • FILE-表示我们正在使用文件;
  • TCP-LISTEN-监听tcp端口;
  • repeataddr-允许其他套接字使用相同的地址进行通信,即使使用该地址也是如此;
  • fork-建立连接后,在子进程中处理通道;
  • TCP是连接的类型。

我现在应该看视频版本吗?

当然可以,因为在描述中所有内容都是抽象表示的。 此外,将详细介绍网络研讨会中的主题,其中一些主题还提供了其他示例和实现选项。 因此,如果您对此主题感兴趣,请完整阅读公开课,并重复Vladimir Drozdetsky的所有步骤以最大程度地吸收材料。 并且不要忘记发表您的评论。

反过来,我们也不会说再见,而是邀请您参加Linux Administrator课程!

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


All Articles