在 Raspberry Pi 上打开 SSH 端口是个坏主意?

0 networking security ssh port-forwarding ssh-tunnel

我家里有一个 Raspberry Pi,它已连接到我的家庭网络。我用它来运行 VPN 服务器、SSH 隧道,偶尔我会通过 SSH 连接到它来对其进行维护。

在我的路由器上打开端口 (TCP) 以便我可以在不在家时远程连接到我的 Pi 是不是一个坏主意?我不使用通常的端口 22;这是我选择的随机端口。但是,当我使用nmapon扫描我的 IP 地址时pentest-tools.com,我看到了我选择用于 SSH 的开放端口。我的树莓派有密码保护,我所知道的我的树莓派上没有敏感数据或信用卡号。但考虑到我将它用于 VPN 或 SSH 隧道,敏感数据可能会通过它。那么在我的路由器上打开这个 SSH 端口是不是很糟糕?考虑到我的 Pi 始终打开并监听该端口,任何人都可以通过打开此端口对我的家庭网络进行任何恶意操作吗?

stu*_*eja 5

在安全性方面,我想到了另外三种方法。

A:使用公钥认证

为了增加安全性,您可以将 SSH 服务器设置为使用公钥身份验证。也就是说,除了强密码之外,或者代替强密码,只有当 SSH 客户端提供与服务器上的公钥匹配的私钥时,才会打开连接。即使攻击者可以以某种方式获得公钥,他也无法从中恢复私钥。但是,这不会对端口扫描程序隐藏您的端口。

B:使用不同的端口

此外,我在配置 SSH 服务器以侦听不同端口而不是 22 的端口扫描方面获得了很好的经验。相应的默认配置选项/etc/ssh/sshd_config

Port 22
Run Code Online (Sandbox Code Playgroud)

您可以将其更改为 54322:

Port 54322
Run Code Online (Sandbox Code Playgroud)

之后记得重启SSH服务器;根据您的 Raspberry 上的 Linux,它可能是其中之一

# service sshd restart
# systemctl restart sshd
Run Code Online (Sandbox Code Playgroud)

#如果不在文件中,符号将在我的示例中表示根提示。)

别担心,您当前的 SSH 会话将保持活动状态。可能值得尝试打开到端口 54322 的第二个 SSH 会话以查看登录是否仍然有效。记得

  • 将您的 SSH 客户端设置为新端口
  • 如果适用,将互联网路由器中的新端口转发到 Raspberry Pi

C:关闭端口并仅在您要求时打开它

如果您真的不想向“互联网”显示您已打开此端口,请查看端口敲击守护程序,例如knockd. 这些程序侦听由您定义的(关闭的)端口,并根据同样由您定义的敲门序列打开不同的端口,例如您的 SSH 端口。在手机或笔记本电脑上,您启动敲击序列,Raspberry Pi 上的敲击守护程序打开您的 SSH 端口,该端口根本不可见。

更详细地说,端口敲门将在您的iptables配置中添加一行。此行将打开 Raspberry 上的端口。这也意味着,iptables之前必须关闭 SSH 端口。这意味着您无法通过 SSH 登录。

一个例子knockd.conf可能是这样的:

[openclosessh]
    sequence    = 1000,2020,3015,65432
    seq_timeout = 15
    tcpflags    = syn
    start_command   = /usr/local/bin/knockd-open.sh %IP%
    cmd_timeout = 30
    stop_command    = /usr/local/bin/knockd-close.sh %IP%
Run Code Online (Sandbox Code Playgroud)

另外,请记住将要被敲门的端口从您的互联网路由器转发到您的 Raspberry。

相应的打开/关闭脚本可能如下所示:

#!/bin/bash
# /usr/local/bin/knockd-open.sh
# adds two lines at the top of iptables which allow all incoming and outgoing traffic on tcp port 54322
iptables -I INPUT -s $1 -p tcp --dport 54322 -j ACCEPT
iptables -I OUTPUT -d $1 -p tcp --sport 54322 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

#!/bin/bash
# /usr/local/bin/knockd-close.sh
# deletes those two lines again
iptables -D INPUT -s $1 -p tcp --dport 54322 -j ACCEPT
iptables -D OUTPUT -d $1 -p tcp --sport 54322 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

请记住使用chmod +x /usr/local/bin/knockd*. 此外,您应该使用以下之一启动并启用knockd服务

# service knockd start && update-rc.d knockd enable
# systemctl start knockd && systemctl enable knockd
Run Code Online (Sandbox Code Playgroud)

特别是如果您使用敲击没有控制台访问权限的远程计算机,您可能希望使用atd自动撤销任何更改和/或在配置错误的情况下重新启动 Raspberry。

因为 iptables 不会在重启后自动存储,在一个例子中,你可以是 root (via su) 和

# at now + 5 minutes
> reboot
> (hit ctrl-d)
# ./script-which-closes-iptables.sh
Run Code Online (Sandbox Code Playgroud)

一个例子./script-which-closes-iptables.sh可能看起来像这样(记得用 使其可执行chmod +x

#!/bin/bash
# allow everything on the loopback interface
iptables -A INPUT -i lo -j ACCEPT
# allow only related or established incoming ssh sessions
iptables -A INPUT -p tcp -m state --state RELATED,ESTABLISHED -m tcp --dport 54322 -j ACCEPT
# allow outgoing related or established ssh sessions
iptables -A OUTPUT -p tcp -m state --state RELATED,ESTABLISHED -m tcp --sport 54322 -j ACCEPT
# allow everything on the loopback interface
iptables -A OUTPUT -o lo -j ACCEPT
# drop everything else in and out
iptables -P INPUT DROP
iptables -P OUTPUT DROP
Run Code Online (Sandbox Code Playgroud)

如果您的 SSH 会话现在正在消失,Raspberry 将在 5 分钟后重新启动。如果您的 SSH 会话仍处于活动状态,则使用以下命令撤销挂起的重启

# atq
15 reboot
# atrm 15
Run Code Online (Sandbox Code Playgroud)

如果您的 SSH 会话仍处于活动状态,请尝试通过第二个 SSH 会话登录。那应该行不通。然后用你的手机敲你配置的端口/etc/knockd.conf。之后,再次尝试通过第二个 SSH 会话登录。这一次,它应该工作。

然后你可以让你的 iptables 保持重启。在您的系统上,您可能必须通过以下方式安装软件包

# apt-get install iptables-persistent
Run Code Online (Sandbox Code Playgroud)

保存您的 iptables

# iptables-save > /etc/iptables/iptables-rules
Run Code Online (Sandbox Code Playgroud)

并启用 iptables 服务

# systemctl enable iptables
Run Code Online (Sandbox Code Playgroud)