Jak połączyć SSH z instancją ec2 w prywatnej podsieci VPC za pośrednictwem serwera NAT

16

Stworzyłem VPC w aws z publiczną podsiecią i prywatną podsiecią. Podsieć prywatna nie ma bezpośredniego dostępu do sieci zewnętrznej. Tak więc w podsieci publicznej znajduje się serwer NAT, który przekazuje cały ruch wychodzący z podsieci prywatnej do sieci zewnętrznej.

Obecnie mogę SSH z podsieci publicznej do podsieci prywatnej, a także SSH z NAT do podsieci prywatnej. Jednak chcę SSH z dowolnego komputera (laptopa domowego, biurowego i mobilnego) do instancji w prywatnej podsieci.

Przeprowadziłem badania, w których mogę skonfigurować skrzynkę NAT do przekazywania SSH do instancji w prywatnej podsieci. Ale nie mam szczęścia.

Czy ktoś może wymienić to, co muszę skonfigurować, aby było to możliwe.

Nazewnictwo to:

laptop (dowolne urządzenie poza VPC)

nat (serwer NAT w publicznej podsieci)

miejsce docelowe (serwer w prywatnej podsieci, z którą chcę się połączyć)

Nie jestem pewien, czy następujące ograniczenia są, czy nie:

„Miejsce docelowe” nie ma publicznego adresu IP, tylko adres IP podsieci, na przykład 10.0.0.1. „Miejsce docelowe” nie może połączyć się z „nat” przez publiczny nat. Istnieje kilka serwerów „docelowych”, czy muszę skonfigurować jeden dla każdego?

Dzięki

jasonfungsing
źródło
Ten link przedstawia kroki wymagane do połączenia się z instancjami EC2 w prywatnej podsieci za pośrednictwem SSH Agent Forwarding.
Shailender Rawat,

Odpowiedzi:

25

Możesz skonfigurować hosta bastionu, aby łączył się z dowolną instancją w twoim VPC:

http://blogs.aws.amazon.com/security/post/Tx3N8GFK85UN1G6/Securely-connect-to-Linux-instances-running-in-a-private-Amazon-VPC

Możesz wybrać uruchomienie nowej instancji, która będzie działać jako host bastionu, lub użyć istniejącej instancji NAT jako bastionu.

Jeśli utworzysz nową instancję, jako przegląd:

1) Utwórz grupę zabezpieczeń dla swojego hosta bastionu, która pozwoli na dostęp SSH z twojego laptopa (zwróć uwagę na tę grupę zabezpieczeń w kroku 4)

2) uruchom osobną instancję (bastion) w publicznej podsieci w twoim VPC

3) nadaj temu bastionowi publiczny adres IP podczas uruchamiania lub poprzez przypisanie elastycznego adresu IP

4) zaktualizuj grupy zabezpieczeń każdej z instancji, które nie mają publicznego adresu IP, aby umożliwić dostęp SSH z hosta bastionu. Można to zrobić za pomocą identyfikatora grupy zabezpieczeń hosta bastionu (sg - #####).

5) użyj przekazywania agenta SSH (ssh -A użytkownik @ publicIPofBastion), aby połączyć się najpierw z bastionem, a następnie raz w bastionie, SSH do dowolnej instancji wewnętrznej (ssh użytkownik @ private-IP-of-Internal-Instance). Przekazywanie agentów zajmuje się przekazywaniem klucza prywatnego, więc nie musi on być przechowywany w instancji bastionu ( nigdy nie przechowuj kluczy prywatnych w żadnej instancji !! )

Powyższy post na blogu AWS powinien być w stanie dostarczyć trochę drobiazgów dotyczących tego procesu. Dołączyłem również poniższe informacje na wypadek, gdybyś chciał uzyskać dodatkowe informacje na temat gospodarzy bastionu:

Koncepcja hostów bastionowych: http://en.m.wikipedia.org/wiki/Bastion_host

Jeśli potrzebujesz wyjaśnień, możesz komentować.

jca-
źródło
3
Upewnij się, że zezwalasz na SSH / 22 zarówno w ruchu przychodzącym, jak i wychodzącym bastionu.
user464180,
To jest tak krytyczny punkt, że musi być częścią odpowiedzi!
Tariq
Oprócz zaakceptowanej odpowiedzi, która bardzo pomaga, ale nie całkowicie, musiałem się upewnić, że grupy bezpieczeństwa zezwalają na ruch przychodzący i wychodzący. Na pierwszy rzut oka wyglądało to tak, jak już, ale ponieważ użyłem szablonu CloudFormation, nie zauważyłem, że źródłem przychodzącego ruchu do prywatnej podsieci był mój ELB. Pozwolił więc na cały ruch, ale tylko z ELB. Zmiana tego na moją publiczną podsieć rozwiązała problem.
Milan Markovic
1

Jedyny sposób, w jaki mogłem sprawić, by działał.

1) Upewnij się, że grupa zabezpieczeń dla tej instancji prywatnej ma w regule wejściowej grupę zabezpieczeń z publicznej podsieci

Porty Protokół Źródło
Wszystkie Wszystkie sg-0b6616e070b9ea2d (publiczna grupa bezpieczeństwa)

2) Za pomocą poleceń proxy skonfiguruj plik konfiguracyjny ssh, aby mieć coś takiego

vim ~/.ssh/config

Host publichost
   HostName 24.123.34.45
   User ubuntu
   IdentityFile ~/mypem.pem
   ProxyCommand none
Host privatehost
   HostName 10.0.2.133
   User ubuntu
   IdentityFile ~/mypem.pem
   ProxyCommand ssh publichost -W %h:%p

Uruchom ssh privatehost to powinno działać

Leonardo Ampuero
źródło
0

Wyjaśnij: po sshd do hosta bastionu musisz ssh do hosta NAT jako użytkownik ec2-user. Trochę mnie to zaskoczyło, ponieważ zwykle użytkownikiem ubuntu jest ubuntu w AWS. Więc zrobiłem:

laptop> ssh -A ubuntu@ssh_bastion
ssh_bastion> ssh ec2-user@nat_private_dns_or_private_ip

Pamiętaj również, że twój ssh_bastion powinien mieć regułę wychodzącą, która zezwala na ruch do innych hostów i SG.

Joel
źródło
Czy ta nazwa „ec2_user” jest wynikiem spreparowania Amazon AMI specjalnie skonfigurowanego dla usługi NAT? Jak więc „użytkownik ec2” założył konto na prywatnej maszynie?
Dennis