วิธี SSH ไปยังอินสแตนซ์ ec2 ใน VPC ส่วนตัว subnet ผ่านเซิร์ฟเวอร์ NAT


16

ฉันสร้าง VPC ใน aws ด้วยซับเน็ตสาธารณะและซับเน็ตส่วนตัว ซับเน็ตส่วนตัวไม่สามารถเข้าถึงเครือข่ายภายนอกได้โดยตรง ดังนั้นจึงมีเซิร์ฟเวอร์ NAT ในซับเน็ตสาธารณะที่ส่งต่อการรับส่งข้อมูลขาออกทั้งหมดจากซับเน็ตส่วนตัวไปยังเครือข่ายภายนอก

ขณะนี้ฉันสามารถ SSH จากซับเน็ตสาธารณะไปยังซับเน็ตส่วนตัวและ SSH จาก NAT ไปยังซับเน็ตส่วนตัว อย่างไรก็ตามสิ่งที่ฉันต้องการคือ SSH จากเครื่องใด ๆ (แล็ปท็อปที่บ้านเครื่องที่ทำงานและมือถือ) ไปยังอินสแตนซ์ในเครือข่ายย่อยส่วนตัว

ฉันได้ทำการวิจัยบางอย่างที่ฉันสามารถตั้งค่ากล่อง NAT เพื่อส่งต่อ SSH ไปยังอินสแตนซ์ในซับเน็ตส่วนตัว แต่ฉันไม่โชคดี

ทุกคนสามารถแสดงรายการสิ่งที่ฉันต้องตั้งค่าเพื่อให้เป็นไปได้

การตั้งชื่อคือ:

แล็ปท็อป (อุปกรณ์ใด ๆ นอก VPC)

nat (เซิร์ฟเวอร์ NAT ในซับเน็ตสาธารณะ)

ปลายทาง (เซิร์ฟเวอร์ในซับเน็ตส่วนตัวที่ฉันต้องการเชื่อมต่อ)

ไม่แน่ใจว่าต่อไปนี้เป็นข้อ จำกัด หรือไม่:

"ปลายทาง" ไม่มี IP สาธารณะเฉพาะ subnet ip ตัวอย่างเช่น 10.0.0.1 "ปลายทาง" ไม่สามารถเชื่อมต่อกับ "nat" ผ่านสาธารณะของ nat ได้ มีเซิร์ฟเวอร์ "ปลายทาง" หลายตัวฉันต้องตั้งค่าสำหรับแต่ละเซิร์ฟเวอร์หรือไม่

ขอบคุณ


ลิงก์นี้แสดงขั้นตอนที่จำเป็นในการเชื่อมต่อกับอินสแตนซ์ EC2 ใน Private Subnet ผ่านการส่งต่อตัวแทน SSH
Shailender Rawat

คำตอบ:


25

คุณสามารถตั้งค่าโฮสต์ป้อมปราการเพื่อเชื่อมต่อกับอินสแตนซ์ใด ๆ ภายใน VPC ของคุณ:

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

คุณสามารถเลือกที่จะเปิดใช้งานอินสแตนซ์ใหม่ที่จะทำหน้าที่เป็นโฮสต์ของป้อมปราการหรือใช้อินสแตนซ์ NAT ที่มีอยู่ของคุณเป็นป้อมปราการ

หากคุณสร้างอินสแตนซ์ใหม่ตามภาพรวมคุณจะ:

1) สร้างกลุ่มความปลอดภัยสำหรับโฮสต์ป้อมปราการของคุณที่จะอนุญาตให้เข้าถึง SSH จากแล็ปท็อปของคุณ (โปรดสังเกตกลุ่มความปลอดภัยนี้สำหรับขั้นตอนที่ 4)

2) เปิดใช้อินสแตนซ์แยก (ป้อมปราการ) ในซับเน็ตสาธารณะใน VPC ของคุณ

3) ให้โฮสต์ไอพีสาธารณะว่าเป็นไอพีสาธารณะไม่ว่าจะเปิดตัวหรือโดยการกำหนด Elastic IP

4) อัปเดตกลุ่มความปลอดภัยของแต่ละอินสแตนซ์ของคุณที่ไม่มี IP สาธารณะเพื่ออนุญาตการเข้าถึง SSH จากโฮสต์ป้อมปราการ ซึ่งสามารถทำได้โดยใช้ ID กลุ่มความปลอดภัยของโฮสต์ป้อมปราการ (sg - #####)

5) ใช้การส่งต่อเอเจนต์ SSH (ssh -A user @ publicIPofBastion) เพื่อเชื่อมต่อแรกกับป้อมปราการจากนั้นหนึ่งครั้งในป้อมปราการ SSH เป็นอินสแตนซ์ภายในใด ๆ (ssh user @ private-IP-of-Internal-Instance) การส่งต่อตัวแทนจะดูแลการส่งต่อคีย์ส่วนตัวของคุณดังนั้นจึงไม่จำเป็นต้องเก็บไว้ในอินสแตนซ์ป้อมปราการ ( อย่าเก็บคีย์ส่วนตัวในอินสแตนซ์ใด ๆ !! )

การโพสต์บล็อกของ AWS ข้างต้นควรจะสามารถให้ข้อมูลที่เป็นประโยชน์เกี่ยวกับกระบวนการได้ ฉันได้รวมไว้ด้านล่างในกรณีที่คุณต้องการรายละเอียดเพิ่มเติมเกี่ยวกับโฮสต์ของป้อมปราการ:

แนวคิดของ Bastion Hosts: http://en.m.wikipedia.org/wiki/Bastion_host

หากคุณต้องการคำชี้แจงอย่าลังเลที่จะแสดงความคิดเห็น


3
ตรวจสอบให้แน่ใจว่าอนุญาต SSH / 22 ทั้งขาเข้าและขาออกบนป้อมปราการ
user464180

นี่เป็นจุดสำคัญที่ต้องเป็นส่วนหนึ่งของคำตอบ!
ทาเร็ค

นอกจากคำตอบที่ยอมรับซึ่งช่วยได้มาก แต่ไม่ทั้งหมดฉันต้องตรวจสอบให้แน่ใจว่ากลุ่มความปลอดภัยอนุญาตการรับส่งข้อมูลขาเข้าและขาออก เมื่อดูอย่างรวดเร็วครั้งแรกดูเหมือนว่าพวกเขาได้ทำไปแล้ว แต่เนื่องจากฉันใช้เทมเพลต CloudFormation ฉันไม่ได้สังเกตว่าแหล่งที่มาของทราฟฟิกขาเข้าไปยังซับเน็ตส่วนตัวคือ ELB ของฉัน มันอนุญาตการรับส่งข้อมูลทั้งหมด แต่มาจาก ELB เท่านั้น การเปลี่ยนเป็นซับเน็ตสาธารณะของฉันแก้ไขปัญหาได้
Milan Markovic

1

วิธีเดียวที่ฉันสามารถทำให้มันทำงาน

1) ตรวจสอบให้แน่ใจว่ากลุ่มความปลอดภัยสำหรับอินสแตนซ์ส่วนตัวนี้มีอยู่ในกฎขาเข้ากลุ่มความปลอดภัยจากซับเน็ตสาธารณะ

พอร์ตโปรโตคอลแหล่งที่มา
ทั้งหมดทั้งหมด sg-0b6616e070b9ea2d (กลุ่มความปลอดภัยสาธารณะ)

2) การใช้คำสั่งพร็อกซีกำหนดค่าไฟล์ ssh ของคุณเพื่อให้มีสิ่งนี้

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

เรียกใช้ssh privatehost มันควรจะทำงาน


0

เพียงชี้แจง: เมื่อคุณได้เข้าสู่โฮสต์ ssh'd ป้อมปราการของคุณคุณต้อง SSH เข้าสู่โฮสต์ NAT ec2-userเป็นผู้ใช้ สิ่งนี้ทำให้ฉันทรุดโทรมเล็กน้อยเนื่องจากโดยปกติผู้ใช้ Ubuntu เป็น ubuntu ใน AWS ดังนั้นฉันจึง:

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

นอกจากนี้โปรดจำไว้ว่า ssh_bastion ของคุณควรมีกฎขาออกที่อนุญาตการรับส่งข้อมูลไปยังโฮสต์และ sg อื่น ๆ


นั่นคือชื่อ 'ec2_user' อันเป็นผลมาจากการปั่น Amazon AMI โดยเฉพาะซึ่งกำหนดค่าไว้สำหรับบริการ NAT แล้วหรือยัง ดังนั้น 'ผู้ใช้ ec2' ได้รับบัญชีบนเครื่องส่วนตัวอย่างไร
Dennis
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.