如何在非22端口上运行SSH服务器

我在同一台路由器后面有两台电脑。我们称它们为A和B。
A可以通过以下方式SSH到B:ssh usr@<计算机的内部IP> B可以通过相同的方式SSH到A,但必须使用外部IP。我已经将路由器的端口22转发到了计算机A的IP上,所以这对我来说都是有意义的。
然而,我还想将端口26转发到计算机B,并且通过使用外部IP同时指定端口22或26来从网络外部进行SSH,以有效选择要使用的计算机。
我尝试允许A的OUTPUT和B的INPUT通过iptables开放端口26,但似乎没有起作用。我还像对A的22端口那样,将端口26转发到了B的内部IP(通过路由器)。
当我尝试使用外部IP和端口26从A到B进行SSH时,我得到了以下结果:
ssh: connect to host xx.xx.xxx.xx port 26: Connection refused.

版本:
  • A = OpenSSH_5.9p1 Debian-5ubuntu1, OpenSSL 1.0.1 14 Mar 2012
  • B = OpenSSH_6.0p1 Debian-4, OpenSSL 1.0.1c 10 May 2012
A上安装的是12.04 Ubuntu,B是一台搭载Raspbian系统的树莓派。
编辑:有一件事我忘了提:我尝试过更改SSH配置文件(我找到了它的位置在/etc/ssh/ssh_config),我取消了对Port这行的注释(删除了#),并将22改为26。但仍然显示连接被拒绝的消息(我尝试过重新启动,但没有成功)。

你的第二台机器上是在22号或26号端口运行SSH吗? - Nerdfest
4请注意,_/etc/ssh/ssh_config_ 是SSH客户端配置文件。而 /etc/ssh/sshd_config 则是SSH守护进程的配置文件。 - steakunderscore
7个回答

如果你正在使用Linux系统,并且想要连接到一个在26端口上的SSH服务器,你可以使用以下命令。
ssh user@192.168.1.1 -p 26

注意:

  1. 将服务器IP替换为您的服务器的IP地址或DNS名称。
  2. 根据您设置的端口号进行更改。
  3. 如果您使用自定义端口SSH,则防火墙上必须允许出站和入站连接的相同端口,否则连接将无法建立。

17不,这不是正确的答案。OP遇到了守护进程未在所需端口上监听的问题。他明确要求帮助SSH服务器和/或NAT配置,但当前的答案忽略了原始帖子,并描述了OP已经知道的客户端命令选项。我想知道为什么这个答案获得了这么多赞同票。 - nnovich-OK
8这对大多数人来说是正确的,但对于楼主的问题来说并不正确。 - Ultrasonic54321
1但是手册上说: .... [user@]host[:port]] ....我有什么遗漏吗? - Daddy32
1我不会说OP "清楚地询问了..."他的问题,对我来说,他似乎遇到了连接26号端口的问题。看起来他想通过为每个端口指定不同的端口来区分这两个端口。不清楚是客户端还是服务器出了问题。 - Marty Fried
1谢谢你的帖子 - 这正是我在寻找的。给 @Daddy32 的提示:你所缺少的是尝试那种格式。它在我的系统上不起作用,但 -p 选项可以。 - Marty Fried
在我的Azure虚拟机后面,有一个公共负载均衡器,并且设置了自定义NAT规则以及不同的端口。这个方法完美地运行了。 - Rajesh Swarnkar

看起来您在第二台机器上没有使用端口26运行SSH。您可以将该机器上的端口号更改为26。

要么编辑/etc/ssh/sshd_config并且不要忘记重启SSH(service sshd restart),要么将其保留在22,并将路由器上的端口26转发到第二台机器上的端口22。还要记得更改第二台机器上的任何防火墙设置,以允许连接通过。


2啊...所以需要更改的是sshd_config,而不是ssh_config? - Gary
5正确。sshd是服务(d代表守护进程)。使用sudo gedit编辑配置文件,然后使用"sudo service ssh restart"重新启动服务。 - Nerdfest
2问题已解决。也不需要更改任何防火墙设置。 - Gary
1如何在路由器上将端口26转发到22? - Shadi Alnamrouti

我只在内部网络使用端口22进行SSH访问。

对于通过互联网的访问,我使用自定义(不寻常的)端口。 这样做的好处是减少了那些扫描“众所周知用户名”的脚本小子对端口22造成的负载。

外部的sshd进程由xinetd控制,并与内部sshd进程并行运行。 在下面的示例中,我使用端口12345:

您可以自由更改为系统上任何可用的空闲端口号。 也许一个更高的值会使这个端口被“快速端口扫描”扫描到的可能性更小一些。

xinetd的配置如下:

service ssh-external
{
    socket_type = stream
    wait = no
    protocol = tcp
    type = UNLISTED
    user = root
    server = /usr/sbin/sshd
    server_args = -i -f  /etc/ssh/external-sshd.config
    port = 12345
    log_on_failure += USERID
}

文件/etc/ssh/external-sshd.config可以是您通常的sshd配置的副本。 请确保以下陈述已配置好:
Port 12345
AddressFamily inet

我还建议在互联网访问中强制使用公钥身份验证,并禁用密码身份验证。
PasswordAuthentication no
PermitEmptyPasswords no
ChallengeResponseAuthentication no

如我在相关答案中所解释的那样,ssh客户端允许以ssh://user@host:1234的URI格式进行指定。例如:
ssh  ssh://myuser@mydomain.com:2222

在这里,2222是端口号。请替换为您打算使用的端口号。当然,要记住,为了连接到指定的端口,ssh服务器(在您试图连接的主机上)必须首先监听指定的端口。

你用什么SSH客户端?在Linux Mint的bash shell上无法工作。你需要使用"ssh host -p port"。 - Marty Fried
1@MartyFried 嗨,抱歉回复晚了。我使用的是 OpenSSH_7.7p1 Debian-2, OpenSSL 1.0.2o 27 Mar 2018。我不知道Linux Mint使用的是什么,但是这个页面https://community.linuxmint.com/software/view/openssh-client说它是一个“可移植实现”,所以可能会有所不同。 - Sergiy Kolodyazhnyy
没问题。Mint使用OpenSSH 7.6 Ubuntu,但我看到有来自Debian的补丁,所以我不清楚是否有差异。我按照你提供的链接访问了OpenSSH BSD man页面(https://man.openbsd.org/ssh),它看起来和我拥有的差不多。很遗憾,如果它能使用与ftp端口规范相同的格式就好了。 - Marty Fried
我很好奇,于是我搜索了更多信息,并找到了这个网页(https://linux.die.net/man/1/ssh),它来自一个更早的版本,看起来与您使用的相同,但它显示了您使用的格式。有趣,但我不知道它的意思。 :-) - Marty Fried
这个解决方案的好处在于你可以将所有信息(用户名、服务器名、端口甚至密码)编码成一个字符串。 - Manu CJ

监听端口也可以与IP地址进行硬链接

/etc/ssh/sshd_config:

ListenAddress 10.10.10.10:22
ListenAddress 20.20.20.20:4444

这应该是一个评论,而不是一个答案。 - Pablo Pazos

在默认端口(TCP/22)上运行ssh并将WAN IP 22转发到LAN IP上使用的ssh服务器所使用的任何端口都不是一个好主意。

要使ssh服务器监听任何给定的端口,您需要:

  1. 编辑 /etc/ssh/sshd_config(注意d)中的内容,将 #Port 22 修改为 Port 26。即取消注释并更改端口号。比 26 更好 的端口号可以是一个随机选择的数值(小于 65535),例如 42895。
    同时考虑将 PermitRootLogin no

  2. 使用 ssh 测试模式 来测试您的配置

    sudo sshd -t
    
  3. 重新启动 SSH 服务器服务

    sudo systemctl restart sshd.service
    
然后你将能够从ssh客户端进行连接。
ssh user@serverNameOrIP -p 42895

奖励: mosh

Mosh(移动终端)是一款远程终端应用程序,它允许漫游、支持间歇性连接,并提供智能本地回显和用户按键的行编辑。Mosh是交互式SSH终端的替代品。它更加稳健和响应,尤其在Wi-Fi、蜂窝网络和长距离链接上。

如果服务器上安装了mosh软件包,则可以使用以下命令:

mosh --ssh="ssh -p 42895" serverNameOrIP

两种方法。
你不需要在任何一台机器上更改SSH配置。如果你在路由器上设置了端口转发,你可以将路由器上的任何公共端口的流量转发到计算机上的22号端口。使用另一个端口转发到另一台机器的22号端口。除非你有充分的理由这样做,否则应该避免在外部IP地址上打开22号端口。这会使你成为攻击目标。
另一种选择是直接通过SSH登录其中一台机器,然后从那里再SSH到另一台机器。