我开始了sudo systemctl start sshd
,但无法从外部连接到 CentOS 7 机器。但是,在 CentOS 7 机器上我可以通过ssh
.
我错过了什么?
更新#1
我根据slm的回答确认了以下内容:
sshd
服务已启动并绑定到 IP 131.181.10.150 上的端口 22- 我可以执行
curl -v telenet://131.181.10.150:22
并看到“已连接”消息。
我的问题是当我尝试ssh
连接服务器时:
$ ssh [email protected]
ssh: connect to host 131.181.10.150 port 22: Operation timed out
更新#2
我记得当我使用docker-compose
它时,它开始下载容器,突然我失去了启动连接的能力ssh
。
ip link show
查看使用打开的NIC的接口数量docker0
以及许多其他接口。
然后我尝试禁用 Docker 服务和防火墙,但仍然无法连接。
$ sudo systemctl stop docker
$ sudo systemctl stop firewalld
还是没有运气。
答案1
有了sshd
服务,设置和开始就非常简单。
1. 启动服务
确保服务已启动并在端口 22 上运行/侦听。
启动服务$ sudo systemctl start sshd
检查状态
$ sudo systemctl status sshd
● sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2018-07-24 22:24:00 EDT; 1h 40min left
Docs: man:sshd(8)
man:sshd_config(5)
Main PID: 1270 (sshd)
Tasks: 1
CGroup: /system.slice/sshd.service
└─1270 /usr/sbin/sshd -D
Jul 24 22:24:00 centos7 systemd[1]: Starting OpenSSH server daemon...
Jul 24 22:24:00 centos7 systemd[1270]: Executing: /usr/sbin/sshd -D
Jul 24 22:24:00 centos7 sshd[1270]: Server listening on 0.0.0.0 port 22.
Jul 24 22:24:00 centos7 sshd[1270]: Server listening on :: port 22.
Jul 24 22:24:00 centos7 systemd[1]: Started OpenSSH server daemon.
Jul 24 20:31:37 centos7 sshd[1582]: Accepted publickey for vagrant from 10.0.2.2 port 64437 ssh2: RSA SHA256:1vJymfZsu2KZ49lDftGMzz2VEb2Z2Y8PNi9cs55eHGE
Jul 24 20:43:29 centos7 systemd[1]: Trying to enqueue job sshd.service/start/replace
Jul 24 20:43:29 centos7 systemd[1]: Installed new job sshd.service/start as 560
Jul 24 20:43:29 centos7 systemd[1]: Enqueued job sshd.service/start as 560
Jul 24 20:43:29 centos7 systemd[1]: Job sshd.service/start finished, result=done
2. 验证服务正在监听
检查是否监听22端口$ sudo netstat -tlpn | grep sshd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1270/sshd
tcp6 0 0 :::22 :::* LISTEN 1270/sshd
您还需要验证是否sshd
正在侦听所有接口 (0.0.0.0) 或至少侦听系统的 IP 地址:
$ ip a l eth0 | awk '/inet / {print $2}'
192.168.56.101/24
因此,您会在输出中看到netstat
192.168.56.101:22,例如。
3. 防火墙
接下来检查防火墙是否允许网络流量到达端口 22。
$ sudo firewall-cmd --list-all
FirewallD is not running
如果是这样,那么流量可以到达端口 22。如果是这样:
$ firewall-cmd --list-all
public (active)
target: DROP
icmp-block-inversion: no
interfaces: eth0 eth1
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
它允许ssh
&dhcpv6-client
服务的流量,并丢弃其他所有服务的流量。同样,这没问题,应该允许 SSH 流量进入。
4. 检查/etc/ssh/sshd_config
验证您/etc/ssh/sshd_config
没有阻止外部连接。以下选项的设置应类似于我在下面显示的内容。
$ grep -vE '^#|^$|AcceptEnv|HostKey|Syslog|MAC|Banner|LogLevel|Authorized' /etc/ssh/sshd_config
PermitRootLogin yes
MaxAuthTries 4
HostbasedAuthentication no
IgnoreRhosts yes
PermitEmptyPasswords no
PasswordAuthentication yes
ChallengeResponseAuthentication no
GSSAPIAuthentication yes
GSSAPICleanupCredentials no
UsePAM yes
X11Forwarding no
Subsystem sftp /usr/libexec/openssh/sftp-server
Protocol 2
5. 验证
您可以从外部客户端之一使用如下命令进行确认:
$ timeout 2 curl -v telnet://192.168.56.101:22
* Rebuilt URL to: telnet://192.168.56.101:22/
* Trying 192.168.56.101...
* Connected to 192.168.56.101 (192.168.56.101) port 22 (#0)
SSH-2.0-OpenSSH_7.4
$
笔记:如果您在此处看到“已连接到 XXXX”IP 地址消息,则没有任何东西会阻止从运行的客户端计算机curl
到sshd
服务器的网络流量。
6. 码头工人
在某些情况下,例如安装了 Docker 的情况下,您将遇到桥接器在桥接器docker0
内添加多个虚拟网络的情况docker0
。你可以像这样看到它们:
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
bd7594c1dce3 bridge bridge local
db24b1e2be58 host host local
edf606d533a5 none null local
在这些情况下,您需要删除任何额外的网络来恢复物理网络,以便它能够正确路由 SSH 数据包。只需使用该命令docker network rm <net id>
即可删除超出标准bridge
、host
和 的任何内容none
。