我家里有一台 Raspberry Pi,我已将其连接到家庭网络。我使用它来运行 VPN 服务器、SSH 隧道,有时我还会通过 SSH 进入它进行维护。
在路由器上打开端口(TCP)以便我在外出时可以远程连接到我的 Pi 是不是一个坏主意?我不使用通常的端口 22;这是我选择的随机端口。但是,当我使用 扫描我的 IP 地址时nmap
,pentest-tools.com
我会看到我选择用于 SSH 的开放端口。我的 Pi 受密码保护,据我所知,上面没有敏感数据或信用卡号。但考虑到我将它用于 VPN 或 SSH 隧道,敏感数据可能会通过它传输。那么在我的路由器上打开这个 SSH 端口是不是不好?考虑到我的 Pi 始终处于打开状态并监听该端口,有人可以通过打开此端口对我的家庭网络进行恶意操作吗?
答案1
在安全性方面,我想到另外三种方法。
A:使用公钥认证
为了增加安全性,您可以将 SSH 服务器设置为使用公钥身份验证。也就是说,除了强密码之外,或者代替强密码,只有当 SSH 客户端提供与服务器上的公钥匹配的私钥时,才会打开连接。即使攻击者可以以某种方式获得公钥,他也无法从中恢复私钥。但是,这不会将您的端口隐藏在端口扫描器之外。
B:使用不同的端口
此外,我通过配置 SSH 服务器监听 22 以外的其他端口,在减少端口扫描方面取得了良好的效果。相应的默认配置选项/etc/ssh/sshd_config
是
Port 22
您可以将其更改为 54322:
Port 54322
请记住随后重新启动 SSH 服务器;根据你的 Raspberry 上的 Linux,它可能是
# service sshd restart
# systemctl restart sshd
(#
如果该符号不在文件中,则在我的示例中应表示根提示。)
别担心,您当前的 SSH 会话将保持活动状态。也许值得尝试打开第二个 SSH 会话到端口 54322,看看登录是否仍然有效。请记住
- 将 SSH 客户端设置为新端口
- 如果适用,将互联网路由器中的新端口转发到 Raspberry Pi
C:关闭端口并仅根据您的请求打开
如果您真的不想向“互联网”显示您已打开此端口,请查看端口敲击守护程序,例如knockd
。这些程序会监听您定义的(已关闭的)端口,并根据您定义的敲击序列打开另一个端口,例如您的 SSH 端口。从手机或笔记本电脑,您可以启动敲击序列,然后 Raspberry Pi 上的敲击守护程序会打开您的 SSH 端口,而这根本不可见。
更详细地说,端口敲击将在您的配置中添加一行iptables
。此行将打开 Raspberry 上的端口。这也意味着,SSH 端口必须先关闭iptables
。这意味着您无法通过 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%
另外,请记住将要敲击的端口从您的互联网路由器转发到您的 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
和
#!/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
请记住使用 使两个脚本都可执行chmod +x /usr/local/bin/knockd*
。此外,你应该使用以下任一方式启动并启用 knockd 服务:
# service knockd start && update-rc.d knockd enable
# systemctl start knockd && systemctl enable knockd
特别是当您使用敲击操作来访问您没有控制台访问权限的远程计算机时,您可能希望atd
在出现配置错误时使用它来自动撤销任何更改和/或重新启动 Raspberry。
由于 iptables 不会在重启后自动保存,因此,举个例子,你可以以 root 身份(通过su
)并
# at now + 5 minutes
> reboot
> (hit ctrl-d)
# ./script-which-closes-iptables.sh
一个例子./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
如果您的 SSH 会话现在即将结束,Raspberry 将在 5 分钟后重新启动。如果您的 SSH 会话仍处于活动状态,请使用以下命令撤销待处理的重新启动
# atq
15 reboot
# atrm 15
如果您的 SSH 会话仍处于活动状态,请尝试通过第二个 SSH 会话登录。这应该行不通。然后使用您的手机并敲入您在 中配置的端口/etc/knockd.conf
。之后,再次尝试通过第二个 SSH 会话登录。这一次,它应该可以工作。
然后,您可以让 iptables 在重启后继续存在。在您的系统上,您可能需要通过以下方式安装软件包
# apt-get install iptables-persistent
使用以下方法保存你的 iptables
# iptables-save > /etc/iptables/iptables-rules
并启用 iptables 服务
# systemctl enable iptables