从家里的 ssh 到防火墙后面的机器

从家里的 ssh 到防火墙后面的机器

半新手,所以请使用火焰喷射器“仅烧焦”。;-)

我在公司有一台机器 A,我想从家里的一台机器(称为机器 B)通过 SSH 连接到这台机器——机器 A 位于我们公司的防火墙后面,防火墙只开放了端口 22 和端口 80。在机器 A 方面,我想将机器 A 上的 SSH 端口从 22 更改为(比如说)2200,以尽量减少在端口 22 上乱敲脚本小子的数量(我已制定了其他 SSH 强化策略,但我想将默认 SSH 端口从 22 移到(比如说)2200。这在 SSHD 配置中很容易,但这样做会终止所有入站流量,因为端口 2200 在边缘被阻止。

因此,某种转发/隧道选项。我在机器 A 和机器 B 端都尝试了一些排列,但还没有找到神奇的组合。我希望这个论坛上比较有学问的人能给我一些建议:

1\ 我需要为机器 A 上的转发/端口配置设置什么?

2\ 就从机器 B 建立隧道而言,我需要尝试的基本 SSH 命令结构是什么?

对于问题极其“基础”的水平,我提前表示歉意(并且,如果这些问题之前已经得到回答,我再次表示歉意,因为我能找到的答案对于我这个水平的人来说并不完全容易理解)。

提前谢谢了。

答案1

您的公司防火墙仅允许端口 22 和 80...因此您只能在端口 22 和 80 上运行服务。如果您想通过 ssh 建立端口转发以访问原本无法访问的端口,您首先需要连接到远程主机,除非您能够穿越公司防火墙,否则您无法做到这一点。

换句话说,您必须让 ssh 在端口 22 上运行。如果您担心那些勤奋的脚本小子,最好的办法就是禁用密码验证并始终使用 ssh 密钥。这将使系统在很大程度上免受基于密码的暴力攻击。如果有人发现某种可以在身份验证前利用的 ssh 漏洞,这显然没有帮助,但这可能是您在这种情况下能得到的最好的办法。

答案2

如果防火墙的漏洞位于 TCP/22 上,那么某物必须在 TCP/22 上监听连接。这可以是您的 sshd 进程,也可以是其他进程。不过,如果您想通过 ssh 进入它而不必先敲门,那么您几乎只能让 ssd 在 TCP/22 上监听。

另一种选择是使用某种形式的敲门脚本。我以前没用过这些,我只是知道它们在那里。让服务在 TCP/22 上监听。当它收到正确的魔法字符串时,它会自行卸载并在 TCP/22 上启动 SSHD X 分钟。当 SSH 进程关闭时,门监听器会在 TCP/22 上重生并等待下一次敲门。

但最终,保护 SSH 应该足够好了。依靠公钥并禁用密码验证,scriptkiddiez 所能做的就是填充您的日志文件。虽然很吵,但无害。

答案3

从工作到家建立隧道,并建立一条允许您从家里连接的隧道。

A 在工作,B 在家。您想从 B 连接到 A,但防火墙阻止了它。相反,从 A 连接到 B,创建一个隧道回到服务器。这假设您在家中运行 ssh 服务器,并在路由器上打开了端口 22。如果您的家用机器是 Mac 或 Linux,您可能正在运行它;如果是 Windows,请安装 cygwin 和设置 sshd(链接)

在工作时,将其放入您的 .ssh/config 文件中:

host home
 hostname B      # replace with your FQDN or IP
 user homeuser   # user at home
 LocalForward 2222 localhost:22

现在,当您运行“ssh home”时,端口 2222 将成为通向本地计算机 ssh 服务器的隧道。我发现,如果您只是将其放在某个窗口的提示符下,连接可能会偶尔挂起,或者文件墙可能会在一段时间后关闭它。我更喜欢使用类似

while true; do ssh -n home sleep 600; sleep 3000; done &

这将启动一个持续十分钟的隧道,然后关闭,然后在下一个小时启动另一个隧道。如果有隧道连接,则当 sleep 完成时,ssh 命令将等待它们完成。
(sleep 3000 不是必需的;您可以一直保持打开状态,只是有些企业不喜欢看到与外部机器的频繁或长时间的持续连接)

现在,在主端,将其放入您的 .ssh/config 文件中:

host worktunnel
 hostname localhost
 user     workuser
 port     2222
 UserKnownHostsFile ~/.ssh/known_hosts.worktunnel

保存它,然后当隧道在你的家用机器上启动时,你只需输入

ssh worktunnel

你就进来了。

UserKnownHostsFile 行不是必需的,但是当您对不同的主机使用具有不同端口的多个隧道时,它可以防止出现警告,因此默认 known_hosts 文件中的 localhost 条目不会与所有这些主机匹配。

您可以在 A 上的配置文件中添加多个 LocalForward 行;例如 LocalForward 2223 server2:22 # 另一台带有 ssh 的服务器 LocalForward 5900 qa:5900 # vnc LocalForward 3389 exchange:3389 # 远程桌面 LocalForward 3128 internalProxy:3128 # 用于浏览内部主机 # 等等。

(对于隧道 X 连接,请使用“ssh -X”,而不是 LocalForward。)

这里不需要更改 ssh 服务器端口号。

请注意,这种远程访问可能违反贵公司的政策。有些地方会扫描或审核此类连接,并可能就此向您发出警告。您可以运行隧道命令五分钟,休眠 55 分钟;或者在家用机器上安装一个脚本,当您不需要隧道时立即退出。Logmein 是另一种免费解决方案,可以很好地允许远程访问防火墙后面的(Windows、Mac)桌面

答案4

其他答案很好地涵盖了这一点,但我想提一下,你可以使用拒绝主机在机器 A 上减少机器人暴露。denyhosts 记录尝试的 ssh 请求,如果外部机器失败次数过多,它会阻止该 ip 地址 vi /etc/hosts.deny。因此​​,例如,尝试以用户 bob 身份 ssh 100 次的机器人将在第五次尝试失败后被永久阻止(所有这些参数都是可调的)。

您还应该遵循良好的 ssh 服务器安全实践,我相信其他 serverfault 答案中已经详细介绍了这些实践。禁用 root 登录。禁用除极少数其他授权用户之外的所有用户的登录。禁用密码登录并仅允许公钥 ssh 连接。

相关内容