在 AWS 上,我是否必须在 EC2 实例的防火墙和安全组中打开端口?

在 AWS 上,我是否必须在 EC2 实例的防火墙和安全组中打开端口?

如果我将 SSH 端口从 22 更改为 23453,我就无法再 ssh 接入。

更详细地说,我在 Amazon Web Services 上使用 Red Hat EC2 实例。这是我在全新安装时进行的第二次更改(第一次更改是添加非 root 用户)。

我可以使用 Git Bash 和本地 .ssh/config 文件进行 ssh 连接,我编辑了 /etc/ssh/sshd_config 中的行,该行当前显示

#Port 23453

Port 23453

然后重启 sshd

sudo service sshd restart

然后我在 .ssh/config 文件中添加一行“Port 23453”

Host foo 
Hostname my-ec2-public-DNS
Port 23453
IdentityFile my ssl key

如果我打开另一个 Git Bash shell(不关闭现有连接)并尝试通过 ssh 进入我的实例(使用 ssh foo),我会看到以下错误:

ssh: connect to host my-ec2-public-DNS port 23453: Bad file number

附加到此实例的安全组有两个条目,均为 TCP

22 (SSH) 0.0.0.0/0

23453 0.0.0.0/0

我最好的猜测是该端口仍然被我的防火墙阻止。

输出sudo iptables -L如下

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

在我看来,这非常开放。

更新

添加 iptables 规则后

iptables -A INPUT -p tcp --dport 23453 -j ACCEPT

并再次尝试,仍然没有运气。

输出iptables -L

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:23453

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

这看起来足够开放。我不太清楚如何查找传入的数据包或端口上的活动。但netstat -ntlp(以 root 身份)的输出

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State PID/Program name
tcp        0      0 0.0.0.0:56137               0.0.0.0:*                   LISTEN      948/rpc.statd
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      930/rpcbind
tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      1012/cupsd
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      1224/master
tcp        0      0 0.0.0.0:23453               0.0.0.0:*                   LISTEN      32638/sshd
tcp        0      0 :::36139                    :::*                        LISTEN      948/rpc.statd
tcp        0      0 :::111                      :::*                        LISTEN      930/rpcbind
tcp        0      0 ::1:631                     :::*                        LISTEN      1012/cupsd
tcp        0      0 :::23453                    :::*                        LISTEN      32638/sshd

在我看来,这显示 23453 上的 sshd。

我再次检查该实例是否在安全组中打开了端口(端口:23453,协议:tcp,来源:0.0.0.0/0)

还有什么原因导致无法通过 SSH 连接?

干杯

事后分析

我现在可以连接了。这是因为 iptables 中缺少一条规则。现在的输出iptables -L如下所示:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:23453 state NEW
ACCEPT     all  --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

答案1

您的实例防火墙未打开此端口。请尝试以下命令:

iptables -I INPUT 3 -s 0.0.0.0/0 -d 0.0.0.0/0 -p tcp --dport 23453 -m state --state New -j ACCEPT

请注意,iptables 规则需要保存,以便在重启后继续存在。在 RHEL 上,保存方式如下:

/sbin/service iptables save

答案2

添加 iptables 规则

iptables -I INPUT 1 -p tcp --dport 23435 -j ACCEPT

它通过端口 23435 接受来自任何主机的流量,并尝试 ssh,如果您看到任何数据包或活动,则表示数据包正在到达您的服务器。

如果您看不到数据包,则意味着 AWS 安全组没有允许您的端口的规则。

但是如果您看到此规则上的流量(通过iptables -nvL),那么您必须运行“netstat -ntlp”并验证 SSH 守护程序是否在端口 2435 上运行。以及0.0.0.0/0

希望这些步骤能够解决问题。如果仍然没有,请告诉我。

答案3

您确定安全组设置正确吗?您是否单击了“应用更改”?许多人忘记实际应用他们的更改 :)

“错误的文件编号”通常表示连接超时,并且您的 iptables 设置看起来是正确的。

答案4

如果有人因为更改了 ssh 的默认端口而偶然发现这个问题,这里有一个对我有用的解决方案:

  1. 为了绕过公司防火墙,我将端口更改为 80 /etc/ssh/sshd_conf
  2. 不幸的是,Apache 已经安装在该实例上,所以我无法再 ssh。
  3. 我已将卷从实例中分离。
  4. 将其附加到另一个实例
  5. 挂载它,在配置文件中更改端口
  6. 将其分离,重新连接到旧实例上
  7. 重新启动:一切正常:D

相关内容