我在另一个大陆的远程位置有一台 Ubuntu 11.04 服务器,因此我无法对其进行物理访问。我仅通过ssh
(和)与它交互scp
,并且打算仅以这种方式与它交互。
出于安全目的,我想确保服务器上除 之外的所有端口都已关闭ssh
。
尽管我尝试在网上查找说明,但我的理解仍然模糊。到目前为止我收集到的是,我需要“刷新”“iptables”,而且我需要编辑一些文件(/etc/hosts
也许?),然后重新启动机器。
但显然,我对此要非常小心,因为如果我做错了,我最终可能会意外关闭 ssh 端口,从而使我无法访问服务器。
在执行此操作之前,我希望建立一套万无一失的步骤。
那么,如何关闭所有端口,同时仍保留我的访问权限?
奖金问题:在执行此操作时,我应该并且可以将ssh
端口从 22 更改为非标准端口吗?它真的有区别吗?
答案1
首先编写一个小脚本来刷新 iptables 规则:
#!/bin/bash
echo "Stopping firewall and allowing everyone..."
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
(您可能不需要“nat”和“mangle”命令。)将其命名为“flush.sh”并将脚本放在“/root”目录中。请记住“chmod +xlush.sh”。
通过添加无害的 iptables 规则来测试脚本,例如
iptables -A INPUT -p tcp -j ACCEPT
然后从命令行运行脚本。验证您添加的规则是否已消失。
将脚本添加到 root 的 crontab 以每十分钟运行一次:
*/10 * * * * /root/flush.sh
添加回用于测试脚本的无害 iptables 规则。等待十分钟并验证您的 cron 作业是否成功执行并删除了规则。
此时,您应该能够使用每十分钟运行一次的flush.sh 安全网来调试您的iptables 规则集。完成规则调试后,注释掉 crontab 中运行lush.sh 脚本的行。
您放置规则的位置在某种程度上取决于发行版。对于 Ubuntu,请查看这个链接。最后,您将看到两个用于永久设置防火墙规则的选项 - /etc/network/interfaces 和使用网络管理器配置。由于您正在运行服务器,因此前一个选项可能更好。
您不需要重新启动来更改或刷新您的 iptables 规则,除非您将自己锁在门外。
最好将 sshd 配置为仅允许 root 使用公钥身份验证而不是密码登录。
如果您有一个具有固定 IP 地址的安全网关,例如您办公室的服务器,您可以从任何地方登录,那么最好在远程服务器上设置 iptables 规则以仅允许来自该网关的 SSH。
将 SSH 端口从 22 更改为其他端口的价值非常有限,因为大多数端口扫描器都会快速找到新的 SSH 端口。