SSH服务器

RouterOS内置的SSH服务器默认是启用的,并且在TCP/22端口监听传入的连接。可以在 服务 菜单下改变端口并禁用该服务器。

属性

Sub-menu: /ip ssh

属性 说明
allow-none-crypto (yes| no; Default: no) 如果加密被设置为无,是否允许连接。
always-allow-password-login (yes | no; Default: no) 配置公钥授权时,是否同时允许密码登录。
forwarding-enabled (both| local| no| remote; Default: no) 允许哪种SSH转发方式:
- no - 禁用SSH转发;
- local - 允许SSH客户端从服务器(路由器)发起连接,这个设置也控制动态转发;
- remote - 允许SSH客户端在服务器(路由器)上监听并转发进入的连接;
- both - 允许本地和远程的转发方式。
host-key-size (1024 | 1536 | 2048 | 4096 | 8192; Default: 2048) 当主机钥匙被重新生成时,要使用的RSA钥匙的大小。
strong-crypto (yes | no; Default: no) 使用更强的加密、HMAC算法,使用更大的DH素数,不允许使用更弱的算法:
- 倾向于使用256和192位加密,而不是128位;
- 禁用空加密;
- 倾向于使用sha256而不是sha1进行散列;
- 禁用md5;
- 在Diffie Hellman交换中使用2048位素数而不是1024位。

命令

属性 说明
export-host-key (key-file-prefix) 将公共和私人RSA/DSA密钥导出到文件。命令需要一个参数:
- key-file-prefix - 用于生成文件的前缀,例如,前缀'my'将生成文件'my_rsa','my_rsa.pub'等。
import-host-key (private-key-file) 从指定文件中导入和替换私人DSA/RSA密钥。命令需要一个参数:
- private-key-file - 私人RSA/DSA密钥文件的名称
regenerate-host-key () 在路由器上生成新的替换当前的一套私钥(DSA,RSA)。请注意,以前导入的密钥可能会停止工作。

启用PKI认证

为用户 admin 导入公钥的例子

在客户端设备上生成SSH密钥,将SSH公钥上传到路由器并导入。

/user ssh-keys import public-key-file=id_rsa.pub user=admin

SSH客户

Sub-menu: /system ssh

简单登录到远程主机

它能连接到远程主机并启动ssh会话。IP地址支持IPv4和IPv6。

/system ssh 192.168.88.1
/system ssh 2001:db8:add:1337::beef

在这种情况下,提供给远程主机的用户名是已经登录到路由器的用户名。如果需要其他值,则必须使用 user=<username>。

/system ssh 192.168.88.1 user=lala
/system ssh 2001:db8:add:1337::beef user=lala

从路由器的特定IP地址登录

出于测试或安全原因,可能需要使用某些连接的源地址登录到其他主机。在这种情况下,要使用 src-address=<ip address> 参数。请注意,这种情况下的IP地址同时支持IPv4和IPv6。

/system ssh 192.168.88.1 src-address=192.168.89.2
/system ssh 2001:db8:add:1337::beef src-address=2001:db8:bad:1000::2

in this case, ssh client will try to bind to address specified and then initiate ssh connection to remote host.

使用RSA公钥/私钥登录

为用户 admin 导入私钥的例子

首先,将当前生成的SSH密钥导出到一个文件:

/ip ssh export-host-key key-file-prefix=admin

生成两个文件 admin_rsaadmin_rsa.pub 。pub文件需要在SSH服务器端被信任(如何在RouterOS上启用SSH PKI) 私钥必须为特定用户添加。

/user ssh-keys private import user=admin private-key-file=admin_rsa

只有在路由器上有完全权限的用户才能在 /user ssh-keys private 下改变 "user "属性值。

在SSH服务器上安装了公钥并被信任后,可以创建一个PKI SSH会话。

/system ssh 192.168.1.1

执行远程命令

要执行远程命令,必须在登录行的最后提供。

/system ssh 192.168.88.1 "/ip address print"
/system ssh 192.168.88.1 command="/ip address print"
/system ssh 2001:db8:add:1337::beef "/ip address print"
/system ssh 2001:db8:add:1337::beef command="/ip address print"

如果服务器不支持pseudo-tty(ssh -T或ssh host命令),如mikrotik ssh服务器,那么就不能通过SSH发送多行命令。

例如,向MikroTik路由器发送命令 /ip address\n add address=1.1.1.1/24 将会失败。

如果你想通过 脚本调度器 执行远程命令,请使用 ssh-exec 命令。

SSH exec

Sub-menu: /system ssh-exec

ssh-exec 是一个非交互式的ssh命令,因此可以通过脚本和调度器在设备上远程执行命令。

检索信息

该命令将返回两个值:

  • exit-code:如果命令执行成功则返回0。

  • output:返回远程执行命令的输出。

例子: 下面的代码从设备10.10.10.1检索ether1的接口状态,并将结果输出到"日志"中。

:local Status ([/system ssh-exec address=10.10.10.1 user=remote command=":put ([/interface ethernet monitor [find where name=ether1] once as-value]->\"status\")" as-value]->"output")
:log info $Status

出于安全考虑,不允许输入纯文本密码。为了确保安全地远程执行命令,对双方的用户使用SSH PKI认证。

执行该命令的用户组和脚本策略需要 测试 权限