AWS VPC + IPtables + NAT: การส่งต่อพอร์ตไม่ทำงาน


10

เมื่อวานนี้ฉันโพสต์คำถามที่นี่แต่ฉันคิดว่าไม่ชัดเจนเพียงพอในคำพูดของฉัน BTW คำถามนี้ไม่ซ้ำกัน

ฉันมีการติดตั้ง AWS VPC ดังนี้

ป้อนคำอธิบายรูปภาพที่นี่

เป้าหมาย / ปัญหา : SSH ไปยังเซิร์ฟเวอร์ A จากอินเทอร์เน็ต และมันไม่ทำงาน

เซิร์ฟเวอร์ A อยู่ในซับเน็ตส่วนตัวและด้วยเหตุนี้ฉันต้องการเปิดใช้งาน iptables NATing บนอินสแตนซ์ NAT ของฉันเพื่อที่ฉันจะสามารถ ssh ไปยัง SErver A ได้โดยตรงจากอินเทอร์เน็ต

ฉันกำลังติดตามสิ่งนี้และสิ่งนี้

ฉันรันคำสั่งด้านล่างในตัวอย่าง NAT:

NAT# iptables -t nat -A PREROUTING  -p tcp --dport 2222 -j DNAT --to-destination 10.0.1.243:22

การส่งต่อ IP ถูกเปิดใช้งานบนอินสแตนซ์ NAT:

NAT# sysctl  -p
net.ipv4.ip_forward = 1

MASQUERADE กำลังทำงานบนอินสแตนซ์ NAT:

NAT# iptables -t nat -vnL POSTROUTING
Chain POSTROUTING (policy ACCEPT 6 packets, 312 bytes)
 pkts bytes target     prot opt in     out     source               destination
  199 16466 MASQUERADE  all  --  *      eth0    10.0.0.0/16          0.0.0.0/0

กลุ่มความปลอดภัย AWS ได้รับการปรับแต่งเพื่อให้สามารถใช้งานได้หลากหลายสำหรับกรณีทดสอบนี้

การแก้ไขปัญหา:

ฉันสามารถเทลเน็ตจาก NAT ไปยังเซิร์ฟเวอร์ A บนพอร์ต 22 ได้ดังนั้นการเข้าถึงก็ดี

เมื่อฉันใช้งานtelnet 54.213.116.251 2222แล็ปท็อปฉันเห็นรายการด้านล่างใน tcpdump บน NAT:

NAT# tcpdump -n -i eth0 dst 10.0.1.243 and port 22
09:59:13.738316 IP xxx.xxx.xxx.xxx.51709 > 10.0.1.243.ssh: Flags [S], seq 1868541786, win 8192, options [mss 1460,nop,wscale 2,nop,nop,sackOK], length 0
09:59:16.737009 IP xxx.xxx.xxx.xxx.51709 > 10.0.1.243.ssh: Flags [S], seq 1868541786, win 8192, options [mss 1460,nop,wscale 2,nop,nop,sackOK], length 0
09:59:22.775567 IP xxx.xxx.xxx.xxx.51709 > 10.0.1.243.ssh: Flags [S], seq 1868541786, win 8192, options [mss 1460,nop,nop,sackOK], length 0

ดังนั้นจึงหมายความว่า iptables 10.0.1.243เป็นเส้นทางที่จะแพ็คเก็ต (BTW xxx.xxx.xxx.xxxเป็นที่อยู่ IP สาธารณะของแล็ปท็อปของฉัน)

แต่เมื่อฉันรัน tcpdump บนเซิร์ฟเวอร์ A ฉันไม่เห็นสิ่งใดที่มาจาก10.0.0.54ที่อยู่ IP ภายใน / ส่วนตัวของ NAT ( และฉันคิดว่านี่เป็นปัญหา ):

Server A# tcpdump  -n src 10.0.0.54
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 

แต่ถ้าฉันเทลเน็ตจากอินสแตนซ์ NAT ไปยังเซิร์ฟเวอร์ A ฉันเห็นสิ่งดีๆใน tcpdump บนเซิร์ฟเวอร์ A ( ซึ่งหมายความว่าPREROUTINGกฎโดยรวมของฉันไม่ทำงานตามที่คาดไว้ ):

Server A# tcpdump  -n src 10.0.0.54
05:01:47.500080 IP 10.0.0.54.44627 > 10.0.1.243.ssh: Flags [S], seq 2862522431, win 14600, options [mss 1460,sackOK,TS val 3013083 ecr 0,nop,wscale 7], length 0
05:01:47.501601 IP 10.0.0.54.44627 > 10.0.1.243.ssh: Flags [.], ack 760676524, win 115, options [nop,nop,TS val 3013083 ecr 12074896], length 0
05:01:47.535720 IP 10.0.0.54.44627 > 10.0.1.243.ssh: Flags [.], ack 22, win 115, options [nop,nop,TS val 3013092 ecr 12074928], length 0

สรุป:

จากเอาต์พุต tcpdump บน NAT ดูเหมือนว่า Iptables กำลังส่งต่อแพ็กเก็ตของฉันได้ดี

จากการถ่ายโอนข้อมูล TCP บนเซิร์ฟเวอร์ A ฉันมีการเชื่อมต่อที่ดีจาก NAT ไปยังเซิร์ฟเวอร์ A

แต่ใน End-to-end ฉันไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ A จากแล็ปท็อปของฉันได้

( BTW ฉันรู้อุโมงค์ SSH และสิ่งดีๆอื่น ๆ แต่ฉันต้องการเพียงแค่ Iptables เพื่อช่วยฉันในเรื่องนี้ )


2
คุณปิดใช้งานการตรวจสอบต้นทาง / ปลายทางในอินสแตนซ์ NAT ของคุณหรือไม่
Dusan Bajic

มันหมายความว่าอะไร? จะตรวจสอบอย่างไร ฉันค้นหาหน้า man ของ Iptables ทั้งหมด แต่ไม่ได้พูดอะไรเกี่ยวกับการตรวจสอบแหล่งที่มา / ปลายทาง (เว้นแต่ฉันจะพลาดสิ่งใดก็ตามที่เห็นได้ชัด)
slayedbylucifer

คุณต้องทำเช่นนั้นใน AWS web console (หรือ CLI) docs.aws.amazon.com/AmazonVPC/latest/UserGuide/…
Dusan Bajic

ขอบคุณ ฉันพบว่ามันมีอยู่แล้วDisabledสำหรับอินสแตนซ์ NAT
slayedbylucifer

คำตอบ:


8

ในที่สุดฉันก็แคร็กมัน !!!!

ในอินสแตนซ์ NAT ฉันต้องเปลี่ยนคำสั่งด้านล่าง:

จาก:

iptables -t nat -A POSTROUTING -o eth0 -s 10.0.0.0/16 -j MASQUERADE

ถึง:

iptables -t nat -A POSTROUTING -j MASQUERADE

และมันก็ทำงานได้ !!!!

ดังนั้นฉันจะสร้างคำถามใหม่เร็ว ๆ นี้ที่ ServerFault ถามว่าข้อดีและข้อเสียในการใช้สองคำสั่งข้างต้นคืออะไร


ผู้ชายขอบคุณเป็นล้าน มีปัญหาเดียวกันเหมือนกัน .... ทุกขั้นตอนอยู่ในสถานที่ ... แต่นี่ "-o eth0" ก็อยู่ที่นั่นเช่นกัน ลบออกทำงานเหมือนมีเสน่ห์ ขอบคุณเป็นล้าน
Neven

เหตุผลที่มันใช้งานได้เพราะ "-s 10.0.0.0/16" บอกว่าจะแปลเฉพาะแพ็กเก็ตที่มีแหล่งที่มา ip 10.xxx ฉันเดาว่าแล็ปท็อปที่บ้านของคุณอยู่ในเครือข่ายในบ้านของคุณและมาจาก IP ภายนอกดังนั้น NAT ไม่สนใจคำขอแล็ปท็อปของคุณ คนอื่นอาจต้องการเรียกใช้ "ip r" บนบรรทัดคำสั่ง linux เพื่อดูว่า eth0 เป็นชื่อของอุปกรณ์อีเธอร์เน็ตจริงๆหรือไม่ ถ้าไม่ให้เปลี่ยนเป็นอุปกรณ์ eth ชื่อของคุณ (เช่น ens192 หรืออะไรก็ตาม)
Ryan Shillington

โอ้ฉันเรียนรู้จากด้านบนด้วยการอ่านหน้า iptables มันดีมากและอ่านไม่นาน ฉันขอแนะนำอย่างยิ่ง เรียกใช้ "man iptables" จากพรอมต์คำสั่งเพื่อดูมันในทุกสิ่งที่มันรุ่งโรจน์
Ryan Shillington

7
  • ตรวจสอบให้แน่ใจว่าคุณจะช่วยให้พอร์ต TCP 2222Inboud จาก0.0.0.0/0กลุ่มรักษาความปลอดภัยสำหรับกล่อง NAT ของคุณ
  • ตรวจสอบให้แน่ใจว่าคุณตั้งค่า "ตารางเส้นทาง" ของ VPC อย่างถูกต้อง
  • อย่างน้อยสองตารางที่แยกจากกัน (หนึ่งที่เกี่ยวข้องกับเครือข่ายย่อยส่วนตัวหนึ่งที่เกี่ยวข้องกับเครือข่ายสาธารณะย่อย)
  • 10.0.1.0เครือข่ายย่อย (ส่วนตัว) ของคุณควรมีกฎตารางเส้นทางเช่น: ปลายทาง: 0.0.0.0/0, เป้าหมาย: "กล่อง Nat"
  • 10.0.0.0ซับเน็ตของคุณ(สาธารณะ) ควรมีกฎตารางเส้นทางเช่น: ปลายทาง: 0.0.0.0/0, เป้าหมาย: "เกตเวย์อินเทอร์เน็ต"
  • ตรวจสอบให้แน่ใจว่าคุณได้ปิดใช้งานการตรวจสอบแหล่งที่มา / ปลายทางบน NIC สำหรับกล่อง NAT ของคุณไม่สนุกโดยไม่มี NAT (ฉันรู้ว่าคุณมีสิ่งนี้อยู่แล้ว แต่มันมีความสำคัญจริงๆ

  • ตรวจสอบให้แน่ใจว่าแพ็คเก็ตขาออกทราบว่าจะไปที่ไหน:

    iptables --table nat --append POSTROUTING --source 10.0.0.0/16 --destination 0.0.0.0/0 --jump MASQUERADE

  • ตรวจสอบให้แน่ใจว่าแพ็กเก็ต inboud ทำการ2222เปลี่ยนเส้นทางอย่างถูกต้อง:

    iptables --table nat --append PREROUTING --protocol tcp --dport 2222 --jump DNAT --to-destination 10.0.1.243:22


คำแนะนำเดียวของคุณมีอยู่แล้ว ขอบคุณ
slayedbylucifer

1
ฉันอัปเดตเพื่อแสดงขั้นตอนทั้งหมด
c4urself

ขอบคุณ +1 สำหรับความพยายามของคุณ MASQUERADEคำสั่งของคุณไม่เป็นประโยชน์ในกรณีของฉัน อาจเป็นเพราะฉันคิดถึงบางสิ่ง เฉพาะMASQUERADEคำสั่งที่ได้รับฉันบินเป็นหนึ่งที่ผมได้กล่าวไว้ในคำตอบของฉัน
slayedbylucifer

นี่คือคำแนะนำที่ดีทั้งหมดยกเว้นสิ่งนี้จะไม่ทำงานเพราะคุณเพียงกำหนดเส้นทาง 10.xxx ในคำสั่ง iptables แรกของคุณ เขาต้องการกำหนดเส้นทางสิ่งที่มาจากอินเทอร์เน็ต ดูคำตอบของ OP เองด้านล่าง
Ryan Shillington

2

โพสต์นี้ช่วยฉันได้มากในการทำความเข้าใจ AWS NAT ดังนั้นฉันจึงเริ่มตรวจสอบสิ่งที่ทำให้iptables -t nat -A POSTROUTING -j MASQUERADEมันทำงาน

คำตอบที่ฉันพบคำสั่งข้างต้นคือการอนุญาตให้กล่อง NAT ไปยังแหล่ง NAT 'LAPTOP' IP เป็น '10 .0.0.54 'ในขณะเดียวกันกับที่ทำ NAT ปลายทางเป็น 10.0.1.243 ในตอนนี้กล่อง subnet ส่วนตัวเป็นการร้องขอ ssh ที่มาจากอุปกรณ์ NAT เท่านั้น คำสั่งนี้ลดความปลอดภัยของเซิร์ฟเวอร์ซับเน็ตส่วนตัว ขอแนะนำให้ใช้คำสั่งด้านล่างเพื่อปรับการเข้าถึงซับเน็ตส่วนตัวผ่านกล่อง ssh และ NAT ตามที่ระบุไว้ด้านล่าง;

iptables --table nat --append POSTROUTING --source "INTERNET IP of the Laptop" --destination 10.0.1.243 --jump MASQUERADE

0

ปลอดภัยกว่านิดหน่อย:

iptables -t nat -I PREROUTING -d 52.213.216.251 -j DNAT --to-destination 10.0.1.243:22
iptables -t nat -I POSTROUTING -s 10.0.1.243 -j SNAT --to-source 52.213.216.251
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.