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


8

如果我将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文件中添加一行“端口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

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

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(作为根)的输出

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

对于任何看不到第三iptables -L(ssh有效)和第二iptables -L(ssh被阻止)之间差异的人。看一下INPUT链中规则的顺序(第一个“目标”下面的6行),它们是从上到下读取的,因此在第二组规则中,在“ ACCEPT tcp”之前命中了“ REJECT all” dpt:23453”。第三组规则的ACCEPT条目位于REJECT条目的上方,因此位于REJECT条目的前面。
安德鲁·马丁

Answers:


12

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

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

这工作了。如果有人能告诉我@melsayed的iptables规则与Frank的iptables规则之间的重要区别,我将非常感谢。另外,我想这意味着我的最终问题的答案是:“是的,在AWS上,您必须在ec2实例防火墙及其安全组中打开端口”。谢谢大家。
安德鲁·马丁

我试图对弗兰克的答案发表评论,但我没有足够的代表:)
2012年

2
基本上,Frank的iptables命令添加(-A)新规则,该规则将允许连接到该端口。问题是,它将规则添加到iptables规则列表的末尾。iptables列表中的最后一条规则拒绝所有在此之前未明确允许的内容。由于iptables规则是按顺序应用的,因此即使到达新规则,连接也会被匹配和拒绝。
2012年

2
我在列表的第3个位置(-I INPUT 3)插入了一个新规则。最后在拒绝规则之前匹配,因此允许连接。如Frank所述,您可以使用iptables -nvL查看每个规则匹配的数据包数量,这有助于调试此类配置。
2012年

/sbin/service iptables save即使使用sudo也不适合我。
huertanix

2

添加一个iptables规则

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

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

如果您没有看到任何数据包,则表示AWS Security组没有允许您的端口的规则。

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

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


1

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

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


之前我对“应用更改”陷阱犯规。再也不。:)
安德鲁·马丁

-1

如果有人因为更改了ssh的默认端口而迷失了这个主题,那么可以使用以下解决方案:

  1. 要绕过公司防火墙,我将端口更改为80 on /etc/ssh/sshd_conf
  2. 不幸的是,Apache已经安装在该实例上,所以我不能再使用ssh了。
  3. 我从实例中分离了该卷。
  4. 将其附加到另一个实例
  5. 安装它,更改配置文件中的端口
  6. 拆下它,重新将它附加到旧实例上
  7. 重新启动:一切都好:D
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.