我是一个初学者,对开发板和整个 Linux 很陌生,并且一直在 Debian 中使用精彩的 SSH 软件包(我相信这是 OpenSSH)来修补和学习更多信息,而无需通过物理连接到我的 Pi。串行电缆。
我关注了该论坛上的各个网站和主题,以强化和调整我的 SSH,使其更加安全。然而,我想对我的sshd_config
文件进行的一项重要更改却让我烦恼 - ListenAddress
。据我了解,ListenAddress
中的值sshd_config
定义了服务器应侦听请求的 IP 地址的严格参数。
ListenAddress
in 的默认值为,sshd_config
已0.0.0.0
被注释掉。我知道工作“注释掉默认值”策略,应用程序将默认为该值。我读过手册页这表明默认是
监听当前路由域上的所有本地地址
虽然我不能自称对网络了解很多,但我在其他地方读到0.0.0.0
表明服务器将侦听来自任何来自互联网的 IPv4 地址?我担心这可能会使我的(面向互联网的)Pi 成为攻击目标,并且限制ListenAddress
为仅侦听来自内部网络的请求似乎是谨慎的做法。除了家之外,我不需要访问任何地方。
我的路由器(Apple Airport)的 DHCP 范围是10.0.1.2
,10.0.1.200
路由器位于10.0.1.1
。 (这似乎是默认值,如果我知道更多,也许我应该将其更改为192.168.1.1
)。我尝试设置以下ListenAddress
值,所有这些值都将我锁定在 SSH 之外,需要使用 USB 串行电缆连接才能恢复ListenAddress
为默认值:
10.0.1.0
- 我认为将最后一个八位字节设置为可能表示该范围0
内的所有IP10.0.1.
10.0.1.*
- 我认为用作*
通配符可能会按照上面的第一个示例工作
10.0.1.**
-如果单个*
通配符仅表示.1
范围.9
10.0.1.1
- 现在看起来很傻,但我认为设置路由器的 IP 可能会起作用,因为这是分发 IP 地址的神奇“盒子”
10.0.1.1/24
- 用于/24
定义前三个八位字节,将最后一个八位字节保留为开放“范围”。但好像sshd_config
不认识这个/
角色
127.0.0.1
- 我学到了 关于或环回地址选项localhost
,但这也不起作用
10.0.1.24
- 我的电脑的IP。最后一次掷骰子不起作用,运行时systemctl status ssh.service
返回error: Bind to port 22 on 10.0.1.24 failed: Cannot assign requested address
,fatal: Cannot bind any address
和Failed to start OpenBSD Secure Shell server
消息。
我希望这能在某种程度上解释我的想法,以及我迄今为止所尝试的——我觉得我已经用尽了所有逻辑选项,也许0.0.0.0
这是我想要实现的目标的唯一允许的选项。请告诉我我的问题是否更适合网络论坛。
令人担忧的是,systemctl status ssh.service
还建议Deprecated option
使用以下sshd_config
值:
Deprecated option KeyRegenerationInterval
Deprecated option RhostsRSAAuthentication
Deprecated option RSAAuthentication
Deprecated option KeyRegenerationInterval
Deprecated option RhostsRSAAuthentication
Deprecated option RSAAuthentication
然而,我不知道该程序对这些的青睐值应该是什么。
到目前为止,我正在突破我(非常有限)知识的极限,但从我之前对这个委员会的询问中我了解到,鼓励您充分和冗长地回答您的友好答复。
我的sshd_config
默认为 v1.103 我所做的改变是:
AddressFamily inet
AllowUsers keith
Protocol 2
LoginGraceTime 30
KeyRegenerationInterval 3600
PermitRootLogin no
StrictModes yes
MaxAuthTries 3
MaxSessions 1
PubkeyAuthentication yes
IgnoreUserKnownHosts yes
IgnoreRhosts yes
RhostsRSAAuthentication no
RSAAuthentication yes
PasswordAuthentication no
PermitEmptyPasswords no
ChallengeResponseAuthentication no
AuthenticationMethods publickey keyboard-interactive
UsePAM yes
X11Forwarding no
PrintMotd no
TCPKeepAlive no
ClientAliveInterval 360
ClientAliveCountMax 0
我一直在使用各种网站和资源来获取指导,因此其中一些价值观现在可能已经过时了。我知道 SSH 安全性在不断发展,并且是一场流动的盛宴。
我希望这能解释我的思维过程和方法,并对不够简洁表示歉意。感谢大家迄今为止的热情帮助,非常感谢。从未停止学习!
答案1
实际上是ListenAddress
告诉 SSH 服务器应该侦听哪个系统接口(0:0:0:0 使其侦听所有接口)。例如,如果您的系统有一个 Wifi(在 10.0.1.4 上)和一个以太网(10.0.1.12),ListenAddress 10.0.1.12
则将使其仅在以太网接口上侦听,而其他计算机将必须通过 SSH 才能10.0.1.12
获得连接。
要将外部用户限制在给定的地址范围内,您可以iptables
直接使用防火墙(但它不适合人类)或使用更容易接受的前端,例如ufw
。
然而,由于您位于路由器后面,路由器可能已经阻止外部访问,路由器另一侧的系统看不到您的10.0.1.*
地址,对他们来说,一切都来自一个地址:您的路由器,并启动从外部到您的本地计算机之一必须将路由器设置为执行端口转发(到路由器上某些指定端口的连接将转发到本地网络上的特定本地地址:端口)。
答案2
iptables
方式 (手册页)
我建议通过 允许仅本地网络连接到您的计算机iptables
,因为我这样做:
此类规则的示例取自我的rules.v4
长版
--append INPUT --protocol tcp --match tcp --destination-port 22 --match iprange --src-range 192.168.0.2-192.168.0.254 --match comment --comment "ssh + sshfs" --jump ACCEPT
简洁版本
-A INPUT -p tcp -m tcp --dport 22 -m iprange --src-range 192.168.0.2-192.168.0.254 -m comment --comment "ssh + sshfs" -j ACCEPT
conntrack
使用+ 指定的修改示例subnet
长版
--append INPUT --match conntrack --ctstate NEW,ESTABLISHED --protocol tcp --match tcp --destination-port 22 --source 192.168.0.0/24 --match comment --comment ssh --jump ACCEPT
简洁版本
-A INPUT -s 192.168.0.0/24 -p tcp -m conntrack --ctstate NEW,ESTABLISHED -m tcp --dport 22 -m comment --comment ssh -j ACCEPT
答案3
ssh
您可以使用“Match”指令来保留所有内容sshd_config
# This will disallow everyone
AuthorizedKeysFile /dev/null
# Put the netmask you want to allow here
Match Address 10.0.1.1/24
# Connections from above IP can use normal authorized keys to authenticate
AuthorizedKeysFile %h/.ssh/authorized_keys
最好从控制台进行测试,以防止意外锁定自己。