我正在使用 Ubuntu Server(Amazon EC2)并使用 putty 通过 ssh 连接,我正在设置 iptables 来阻止除我的 ip 地址之外的所有传入和传出连接,我尝试从 putty 执行以下命令:
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
现在,我无法从任何地方连接。请帮我恢复连接。
答案1
从评论中,我们确定这是在 Amazon AWS EC2 实例上,并且您已将自己锁定在远程 SSH 访问之外。通过使用 Amazon EC2,您将在这里遇到一些麻烦。没有真正的串行/控制台模式可供访问,也没有人可以“修复”它,并且通过像您那样禁用所有连接,您已将自己完全锁定在外。
除了销毁 EC2 实例并重新开始之外,您实际上没有太多的解决方案。
一旦重新开始,您有两种选择来设置系统的防火墙:
改用 EC2 安全组防火墙。这更容易配置,而且它已经存在,无需任何额外配置 - 它是 EC2 基础设施的一部分,您必须允许端口实际得到到 EC2 实例。您也不会轻易把自己锁定(尽管您可能会被锁定,但修复它很简单,因为您只需在 Amazon EC2 设置面板的规则集中再次允许端口 22,前提是您不要乱搞
iptables
)。用一个体面的
iptables
规则集,并且不要从你的 EC2 上的 PuTTY 注销,直到你绝对肯定您制定的规则并不会完全破坏您对系统的访问。
现在,我在 #2 中提到了一个“不错的规则集”。下面是我对 EC2 的指南iptables
,前提是您在执行命令之前确实阅读了注释(例如,除非真的需要,否则不要乱用 OUTPUT 或 FORWARD)。
根据您的要求设置的工作规则iptables
:
您不需要输入#
以 开头的行,这些只是我的注释,用于解释每个命令的作用。另外,将其替换YOUR.IP.ADDRESS.HERE
为您的实际 IP 地址,如下所示。
入站过滤:
# Permit localhost to communicate with itself.
iptables -A INPUT -i lo -j ACCEPT
# Permit already established connection traffic and related traffic
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# Permit new SSH connections into the system from trusted IP address
iptables -A INPUT -p tcp --dport 22 -s YOUR.IP.ADDRESS.HERE -m conntrack --ctstate NEW -j ACCEPT
# Permit all other traffic from trusted IP Address
iptables -A INPUT -s YOUR.IP.ADDRESS.HERE -j ACCEPT
# Drop all other traffic
iptables -A INPUT -j DROP
出站过滤:
警告:这将阻止对更新服务器、时间同步服务器等的访问。因此,如果绝对需要,请仅在出站上进行过滤,否则根本不要执行此部分
# Allow Localhost to itself
iptables -A OUTPUT -i lo -j ACCEPT
# Allow RELATED,ESTABLISHED state traffic (related to Inbound for example)
iptables -A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# Allow all other traffic to trusted IP address
iptables -A OUTPUT -d YOUR.IP.ADDRESS.HERE -j ACCEPT
# Drop all other unpermitted outbound traffic.
iptables -A OUTPUT -j DROP
转发过滤:
注意:除非你真的需要限制诸如通过隧道或 VPN 将流量转发到互联网到你的服务器作为网络的“代理”之类的事情,否则你真的不需要弄乱 FORWARD 规则集,所以我建议不要这样做,因为没有其他东西真正会使用这个函数或进入这个规则集表
# Drop FORWARD target traffic, we don't need it
iptables -A FORWARD -j DROP
请注意,我坚信不是弄乱服务器上的默认策略,因为如果做得不正确,它有一些...弊端......而且我通常只过滤入口流量和FORWARD
流量,并允许传出流量,因为时间同步服务器,Ubuntu 更新服务器并不总是有一定数量的 IP,我需要的其他相关进程(例如,作为“相关”流量的一部分的 SSH 输入/输出)等。
我也坚信应该使用REJECT
而不是DROP
,但这只是为了让您更容易知道您的服务器已启动并拒绝连接。为此,我会将 替换为-j DROP
或-j REJECT --reject-with icmp-host-unreachable
类似的。
请注意,如果您的系统已启用 IPv6,则也需要对 IPv6 执行此操作,但要使用ip6tables
,并将 ICMP 相关消息指示符替换为 ICMP6 等效指示符。
答案2
等一下 - 您不必销毁您的 EC2 - AWS 云文档中提到了解决方案:
排除故障/修复无法访问的 EC2/云实例:
基本上这里的基础是 - 使用管理控制台/云界面,(你已经搞乱了 iptabes/ssh-keys 等,以至于你无法登录它)。
- 将 / (可启动)卷从坏的(无法访问的) EC2 中分离出来
- 创建一个新的 EC2(这里不要更改默认值),将旧的(无法访问的)EC2 的 / 卷附加到此机器上
- 将其安装在新机器上 - 编辑/修复更改
- 从新实例分离,重新连接到旧 EC2(我们关闭它以修复 / 卷)
- 重新启动旧的 EC2 机器/虚拟机。
请参阅 AMAZON CLOUD DOCS 的完整详细信息,网址为: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/TroubleshootingInstancesConnecting.html -向下滚动到以“验证实例的权限”开头的部分
答案3
我刚刚遇到了这个问题。在阅读了这里的讨论后,我已经快要删除我的实例了。然后我想起 iptables 有一个默认的 iptables-config 文件,其中包含两个重要参数:
# Save current firewall rules on stop.
# Value: yes|no, default: no
# Saves all firewall rules to /etc/sysconfig/iptables if firewall gets stopped
# (e.g. on system shutdown).
IPTABLES_SAVE_ON_STOP="no"
# Save current firewall rules on restart.
# Value: yes|no, default: no
# Saves all firewall rules to /etc/sysconfig/iptables if firewall gets
# restarted.
IPTABLES_SAVE_ON_RESTART="no"
这两个参数的意思是,如果将这两个参数设置为“否”,则当机器停止或重新启动时,规则将不会保留。这意味着当您重新启动 EC2 机器时,规则将被清除。
我就是这么做的。没想到“重启”又能拯救我!哈哈。
注意:如果将两个参数都设置为“是”,那么最好的选择就是重新开始。