Networking

SSH 到 EC2 實例超時

  • December 5, 2020

我創建了一個 AWS EC2 實例以在其上設置 prometheus,我創建了一個新的 ssh 密鑰對並使用 terraform 配置了該實例,我使用實例類型為“t3.large”和一個 120GB 的 SSD 磁碟,作業系統是 Ubuntu 18.04,並且我可以正常 ssh 到實例。到現在為止一切都還好。

使用 docker 安裝 Prometheus 和 Grafana 一段時間後,我回到實例,發現無法登錄!我收到以下問題:

ssh: connect to host [ip] port 22: Connection timed out

我確定這不是網際網路連接問題,因為我可以通過 ssh 連接到其他實例。使用ip地址或DNS時問題相同,埠22也是開放的。

這是我使用的 terraform 腳本,但我認為它與此無關:

provider "aws" {
 profile = "default"
 region  = "eu-west-1"
}

resource "aws_key_pair" "ubuntu" {
 key_name   = "ubuntu"
 public_key = file("ubuntu.pem.pub")
}

resource "aws_security_group" "ubuntu" {
 name        = "ubuntu-security-group"
 description = "Allow HTTP, HTTPS and SSH traffic"

 ingress {
   description = "SSH"
   from_port   = 22
   to_port     = 22
   protocol    = "tcp"
   cidr_blocks = ["0.0.0.0/0"]
 }

 ingress {
   description = "HTTPS"
   from_port   = 443
   to_port     = 443
   protocol    = "tcp"
   cidr_blocks = ["0.0.0.0/0"]
 }

 ingress {
   description = "HTTP"
   from_port   = 80
   to_port     = 80
   protocol    = "tcp"
   cidr_blocks = ["0.0.0.0/0"]
 }

 ingress {
   description = "HTTP"
   from_port   = 3000
   to_port     = 3000
   protocol    = "tcp"
   cidr_blocks = ["0.0.0.0/0"]
 }

 ingress {
   description = "HTTP"
   from_port   = 9090
   to_port     = 9090
   protocol    = "tcp"
   cidr_blocks = ["0.0.0.0/0"]
 }

 ingress {
   description = "HTTP"
   from_port   = 9100
   to_port     = 9100
   protocol    = "tcp"
   cidr_blocks = ["0.0.0.0/0"]
 }



 egress {
   from_port   = 0
   to_port     = 0
   protocol    = "-1"
   cidr_blocks = ["0.0.0.0/0"]
 }

 tags = {
   Name = "terraform"
 }
}


resource "aws_instance" "ubuntu" {
 key_name      = aws_key_pair.ubuntu.key_name
 ami           = "ami-0dc8d444ee2a42d8a"
 instance_type = "t3.large"

 tags = {
   Name = "ubuntu-prometheus"
 }

 vpc_security_group_ids = [
   aws_security_group.ubuntu.id
 ]

 connection {
   type        = "ssh"
   user        = "ubuntu"
   private_key = file("key")
   host        = self.public_ip
 }

 ebs_block_device {
   device_name = "/dev/sda1"
   volume_type = "gp2"
   volume_size = 120
 }
}

resource "aws_eip" "ubuntu" {
 vpc      = true
 instance = aws_instance.ubuntu.id
}

我終於找到了問題所在,我再次使用我留下的所有數據訪問了我的 EC2 實例。

這個問題背後的原因是,為了允許 http 流量進入我使用ufw的啟用防火牆的新埠,並且不包含允許 ssh 的規則,ufw這會導致訪問失去。我本可以使用 aws 安全組並添加正確的規則來避免所有這些。

解決方案是創建一個新的 EC2 實例並將舊 EC2 實例的捲安裝到這個新創建的實例上。

列出可用磁碟如下:

buntu@ip-172-31-27-78:~$ lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
loop0         7:0    0 97.8M  1 loop /snap/core/10185
loop1         7:1    0 28.1M  1 loop /snap/amazon-ssm-agent/2012
nvme0n1     259:0    0  120G  0 disk 
└─nvme0n1p1 259:1    0  120G  0 part /
nvme1n1     259:2    0  120G  0 disk 
└─nvme1n1p1 259:3    0  120G  0 part 

在此之後將您的分區掛載到任何目錄:

$ sudo mkdir /data
$ sudo mount /dev/nvme1n1p1 /data/

現在您將能夠訪問您的捲文件,以允許 ssh 訪問編輯文件user.rulesuser6.rules位於目錄中/data/etc/ufw並添加以下行:

#user.rules
-A ufw-user-input -p tcp --dport 22 -j ACCEPT
-A ufw-user-input -p udp --dport 22 -j ACCEPT
user6.rules
-A ufw6-user-input -p tcp --dport 22 -j ACCEPT
-A ufw6-user-input -p udp --dport 22 -j ACCEPT

感謝這篇對我幫助很大的文章,我在這裡收集了所有步驟。

引用自:https://serverfault.com/questions/1045082