如何设置SSH以使其仅限于我的本地网络?

我正在尝试通过SSH将我的运行11.10的新笔记本与运行8.04的旧笔记本连接到我的路由器。

这个问题已经在ubuntuforums上得到了提问和回答,链接如下:

http://ubuntuforums.org/showthread.php?t=1648965

我认为在这里给出一个更明确的答案会很有帮助。
注意:我需要先在我尝试连接的笔记本电脑上安装openssh-server,并使用firestarter打开防火墙中的SSH端口。

请问您能告诉我们关于那个帖子中slooow的回答有什么地方不够“明确”吗?否则,您的问题似乎有些含糊不清。 - d_inevitable
@d_inevitable 首先,这并不是唯一的答案,也没有明确指出它是正确的答案。这只是我会选择的一个答案,但这就是为什么我认为迁移这个问题会有用的原因。另外,如果能提供关于在两台本地机器之间配置SSH的一般指导或有用的链接,可能也会有所帮助。 - klenwell
3个回答

你可以通过多种方式限制对你的SSH服务器的访问。
我个人认为最重要的是使用SSH密钥并禁用密码身份验证。
有关详细信息,请参阅以下维基页面。 你可以通过多种方式限制对特定子网的访问。我假设你的SSH服务器位于子网192.168.0.0/16上,IP地址为192.168.0.10,请根据实际情况进行调整 ;)
路由器
使用路由器是一种防御手段。确保禁用UPnP并不允许端口转发。
SSH配置
你可以在/etc/ssh/sshd_config文件中设置多个选项。其中之一是监听地址。如果你在你的子网上设置了监听地址,私有IP地址无法通过互联网进行路由。
ListenAddress 192.168.0.10

您还可以使用AllowUsers

AllowUsers you@192.168.0.0/16

有点相关的是,你也可以更改端口。
Port 1234

参见:http://manpages.ubuntu.com/manpages/precise/man5/sshd_config.5.html

TCP包装器

如论坛帖子中所述,您可以使用TCP包装器。 TCP包装器使用两个文件,/etc/hosts.allow/etc/hosts.deny

编辑/etc/hosts.allow并添加您的子网

sshd : 192.168.0.

编辑/etc/hosts.deny文件,并拒绝所有连接。
ALL : ALL

另请参阅:http://ubuntu-tutorials.com/2007/09/02/network-security-with-tcpwrappers-hostsallow-and-hostsdeny/

防火墙

最后,您可以为服务器设置防火墙。您可以使用iptables、ufw或gufw。

iptables

sudo iptables -I INPUT -p tcp --dport 22 -s 192.168.0.0/16 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j REJECT

请不要在iptables中使用DROP

ufw

sudo ufw allow from 192.168.0.0/16 to any port 22

ufw有一个图形界面:gufw

GUFW


有些网络使用10.0.0.0作为IP地址,在这种情况下,可以将10.0.0.0/8替换为192.168.0.0/24,以允许范围为10.0.0.0-10.255.255.255的地址。如果只想允许一个单独的IP地址,请使用类似于192.168.1.2/32的地址。关于子网划分的详细解释可以在[http://serverfault.com/q/49765/51929](How does Subnetting Work?)找到。 - Lekensteyn
1请不要在iptables中使用DROP命令 - 请参考http://www.chiark.greenend.org.uk/~peterb/network/drop-vs-reject - Panther
该页面没有提到使用DROP而不是REJECT的可能原因之一是伪造的IP地址。然而,这个安全问题解答解释了为什么这并不真正相关(源数据包的大小大于返回的数据包)。 - Lekensteyn
@Lekensteyn - 我在那个链接中没有看到有关伪造 IP 的讨论。正如你所建议的,DDoS 和伪造 IP 超出了这次讨论的范围,我并不认为 DROP 在任何方面都优于 REJECT。DDos 是复杂的,如果没有关于 DDos 原因的信息,是无法进行防御的。例如,我曾经见过将 WP 用作 DDoS 的情况,解决问题在于正确配置 WP,与 iptables 几乎无关。 - Panther
1ListenAddress 似乎是最简单和最优雅的解决方案。 - code_monk
ufw allow在两个方向上都起作用吗?也就是说,允许本地网络连接的22号端口是否意味着非本地网络连接被阻止? - Ido_f
AllowUsers shayan@192.168.1.80 看起来完全没有作用,所有访问都被阻止了。 - Shayan

2020更新

自从这个问题提出以来,现在可以使用OpenSSH 6.5/6.5p1 (2014)中引入的Match关键字来简化处理:

在sshd配置文件中(在Debian和类似Ubuntu的派生版本中为/etc/ssh/sshd_config

# Disable all auth by default
PasswordAuthentication no
PubkeyAuthentication no

[.. then, at the end of the file ..]

# Allow auth from local network
Match Address  192.168.1.*
    PubkeyAuthentication yes
    # if you want, you can even restrict to a specified user
    AllowUsers stephan

提示:最好将自定义规则放在/etc/ssh/sshd_config.d文件夹中的文件上。通常是/etc/ssh/sshd_config.d/local_network_only.conf。这样,在升级到新版本的ssh-server软件包并更改sshd配置文件时可以避免冲突。

有关更多详细信息,请参阅man sshd_config


3对于像我这样的新手,该文件位于/etc/ssh/sshd_config。 - Steven Magana-Zook
1在Debian系统中,可以将Match部分添加到以.conf结尾的文件中,例如/etc/ssh/sshd_config.d/match.conf。这样做的好处是不需要编辑原始的ssh_config文件。 - mrossi
这样做是否比使用监听指令来限制连接到特定IP地址更好?在我的情况下,我运行着WireGuard VPN,所以我认为只让SSH服务器监听VPN IP地址就足够限制了。 - majorgear

ssh(安全外壳)用于安全访问和传输数据(使用RSA_KEYS对)。您可以通过两种方式使用ssh访问数据:1. 命令行 2. 使用文件浏览器
命令行:对于此操作,您无需安装任何东西。首先要做的是登录到其他计算机。
ssh other_computer_username@other_computer_ip

这个命令会要求输入密码,该密码是另一台计算机的密码(用于特定用户名)。您刚刚登录到了另一台计算机的shell。请将此终端视为您计算机的shell终端。您可以使用shell在其他计算机上进行与在您自己的计算机上相同的操作。

文件浏览器:您需要安装openssh-server。

sudo apt-get install openssh-server

登录请点击文件->连接到服务器

enter image description here


命令行指令是我尝试的第一件事。我能够通过LAN IP地址ping通我的另一台电脑。但是当我尝试SSH时,它卡住了。所以我推测我必须先配置我的另一台电脑允许SSH访问。 - klenwell
请确保您的路由器没有阻止22端口或SSH。 - shantanu
谢谢。我已经通过经验了解到你提到的一切,但从别人那里听到简单而有结构的解释真是一种巨大的轻松。 - Evgenia Karunus
只是提供一下信息,除了这两种方式之外,还有其他访问SSH的方法,比如通过编程和使用隧道。 - undefined