昨天晚上,我在 iptables 中执行了这个特定的命令:
sudo iptables -F
sudo iptables -X
sudo iptables -P INPUT DROP
sudo iptables -P OUTPUT ACCEPT
sudo iptables -P FORWARD DROP
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
如果我没记错的话,没有什么危害。然后我的 ssh 连接断开了。尝试重启服务器,但它一直说
ssh: connect to host X.X.X.X port 22: Connection refused
我尝试启动到救援模式,挂载 /dev/sda2 /mnt,chroot /mnt 并刷新 iptables。但仍然不起作用。看起来需要外部访问的东西都不再起作用了……
我尝试删除(--purge)openssh-client和服务器并重新安装,但结果仍然一样。
编辑:
正如 Khaled 提到的,我尝试添加
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
进入救援模式的 iptables,然后将其保存到 /etc/iptables.rules,但不起作用。我还尝试将这些指令添加到 /etc/rc.local 以在启动时刷新 iptables:
#!/bin/sh -e
sudo iptables -X
sudo iptables -t nat -F
sudo iptables -t nat -X
sudo iptables -t mangle -F
sudo iptables -t mangle -X
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT
仍然不起作用。
这也是当我(仍然处于 chrooted 救援模式)尝试使用 -d 选项启动 ssh 时的结果
/etc/init.d/ssh start -d
[....] Starting OpenBSD Secure Shell server: sshddebug1: sshd version OpenSSH_6.7, OpenSSL 1.0.1k 8 Jan 2015
debug1: private host key: #0 type 1 RSA
debug1: private host key: #1 type 2 DSA
debug1: private host key: #2 type 3 ECDSA
debug1: private host key: #3 type 4 ED25519
debug1: rexec_argv[0]='/usr/sbin/sshd'
debug1: rexec_argv[1]='-d'
debug1: Bind to port 22 on 0.0.0.0.
Bind to port 22 on 0.0.0.0 failed: Address already in use.
debug1: Bind to port 22 on ::.
Bind to port 22 on :: failed: Address already in use.
Cannot bind any address.
failed!
但这对我来说似乎很合逻辑(作为一个大新手),因为我已经在救援模式下使用 ssh......
编辑2:
根据要求,这是服务器启动且未处于救援模式时 telnet 的结果:
telnet X.X.X.X 22
Trying X.X.X.X...
telnet: connect to address X.X.X.X: Connection refused
telnet: Unable to connect to remote host
答案1
您发布的规则集不允许任何传入连接到服务器。您仅允许通过环回接口和RELATED
、ESTABLISHED
状态进行本地流量。这些不足以访问服务器。您至少需要使用如下规则允许 SSH 端口:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
另一个需要注意的重要事项是执行这些 iptables 命令的方式。您应该将它们作为脚本执行,而不是一次执行一个命令。当您输入第三个命令时,sudo iptables -P INPUT DROP
您将丢弃所有传入服务器的数据包,并且服务器将无法访问。这是因为 iptables 命令会立即生效!
通常,连接被拒绝错误是由未侦听指定端口的进程或显式 iptablesREJECTR
规则(此处并非如此)引起的。如果您可以访问服务器,则需要确保 ssh 服务器正在运行并侦听端口 22。您可以使用:
sudo netstat -lnp | grep 22