AWS VPC + IPtables + NAT: Port Forwarding tidak berfungsi


10

Kemarin, saya mengirim pertanyaan di sini tapi saya pikir tidak cukup jelas dalam kata-kata saya. BTW, Pertanyaan ini bukan duplikat.

Saya memiliki AWS VPC Setup seperti di bawah ini.

masukkan deskripsi gambar di sini

TUJUAN / MASALAH : SSH ke Server A dari internet. Dan itu tidak berfungsi.

Server A adalah dalam subnet pribadi dan karenanya saya ingin mengaktifkan iptables NATing pada instance NAT saya sehingga saya dapat ssh ke SErver A langsung dari internet

Saya mengikuti ini dan ini

Saya menjalankan perintah di bawah ini pada contoh NAT:

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

Penerusan IP diaktifkan pada instance NAT:

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

MASQUERADE dijalankan dengan instance 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

Grup Keamanan AWS dikonfigurasikan dengan baik untuk memungkinkan berbagai akses yang diperlukan untuk test case ini.

Penyelesaian masalah:

Saya bisa telnet dari NAT ke Server A di port 22. Jadi aksesnya bagus.

Ketika saya menjalankan telnet 54.213.116.251 2222laptop saya, saya melihat entri di bawah di tcpdump di 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

Jadi itu berarti iptables mengarahkan paket ke 10.0.1.243. (BTW, xxx.xxx.xxx.xxxadalah alamat ip publik laptop saya)

Tetapi ketika saya menjalankan tcpdump di Server A, saya tidak melihat apa pun yang berasal dari 10.0.0.54alamat IP Internal / Privat NAT ( Dan saya pikir ini masalahnya ):

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 

Tetapi jika saya telnet dari NAT instance ke Server A, saya melihat hal-hal bagus di tcpdump di Server A ( Ini artinya, PREROUTINGAturan saya secara keseluruhan tidak berfungsi seperti yang diharapkan ):

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

Kesimpulan:

Dari output tcpdump di NAT, Tampaknya Iptables meneruskan paket saya dengan baik.

dari TCP dump di Server A, saya memiliki konektivitas yang baik dari NAT ke Server A.

Tetapi dalam End-to-end, saya tidak dapat terhubung ke server A dari laptop saya.

( BTW, saya tahu terowongan SSH dan hal-hal bagus lainnya. Tapi saya hanya ingin Iptables membantu saya dengan ini. )


2
Apakah Anda menonaktifkan pemeriksaan sumber / tujuan pada instance NAT Anda?
Dusan Bajic

Apa artinya? Bagaimana cara memeriksanya? Saya mencari seluruh halaman manual Iptables tetapi tidak mengatakan apa-apa tentang pemeriksaan sumber / tujuan (kecuali saya melewatkan sesuatu yang jelas.)
slayedbylucifer

Anda harus melakukannya di konsol web AWS (atau CLI). docs.aws.amazon.com/AmazonVPC/latest/UserGuide/…
Dusan Bajic

Terima kasih. Saya menemukan bahwa itu sudah Disableduntuk contoh NAT.
slayedbylucifer

Jawaban:


8

Akhirnya, aku memecahkannya !!!!

Pada contoh NAT, saya harus mengubah perintah di bawah ini:

Dari:

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

Untuk:

iptables -t nat -A POSTROUTING -j MASQUERADE

Dan itu BEKERJA !!!!

Jadi, saya akan segera membuat pertanyaan baru pada ServerFault menanyakan apa kelebihan dan kekurangan dalam menggunakan dua perintah di atas.


Man terima kasih dalam sejuta. Punya masalah yang sama, sama .... Setiap langkah ada di tempat ... tapi "-o eth0" ini ada di sana juga. Dihapus, bekerja seperti pesona. Terima kasih dalam jutaan.
Neven

Alasan mengapa ia bekerja adalah karena "-s 10.0.0.0/16" mengatakan untuk hanya menerjemahkan paket-paket dengan sumber ip 10.xxx Saya menduga laptop rumah Anda ada di jaringan rumah Anda dan datang dari beberapa IP eksternal sehingga NAT mengabaikan permintaan laptop Anda. Orang lain mungkin ingin menjalankan "ip r" pada baris perintah linux untuk melihat apakah eth0 benar-benar nama perangkat ethernet mereka. Jika tidak, ubah ke perangkat apa pun yang bernama et Anda (mis. Ens192 atau apa pun).
Ryan Shillington

Oh, juga, saya belajar hal di atas dengan membaca halaman manual iptables. Sangat bagus dan tidak lama dibaca. Saya sangat merekomendasikannya. Jalankan "man iptables" dari command prompt untuk melihatnya dalam semua kemuliaan itu.
Ryan Shillington

7
  • Pastikan Anda mengizinkan port tcp 2222inboud dari 0.0.0.0/0pada grup keamanan untuk kotak nat Anda
  • Pastikan Anda memiliki pengaturan "Rute Tabel" VPC dengan benar.
  • Setidaknya dua tabel terpisah (satu terkait dengan subnet pribadi, satu terkait dengan subnet publik)
  • Anda 10.0.1.0(swasta) subnet harus memiliki aturan tabel rute seperti: Tujuan: 0.0.0.0/0Target: "kotak Nat"
  • Anda 10.0.0.0(publik) subnet harus memiliki aturan tabel rute seperti: Tujuan: 0.0.0.0/0Target: "gateway Internet"
  • Pastikan Anda menonaktifkan Pemeriksaan Sumber / tujuan pada NIC untuk kotak NAT Anda, jangan bersenang-senang tanpa NATting. (Saya tahu Anda sudah memiliki ini tetapi ini sangat penting, jadi sertakan juga untuk beberapa penampil di masa mendatang)

  • Pastikan paket keluar tahu ke mana harus pergi:

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

  • Pastikan paket inboud untuk 2222dialihkan dengan benar:

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


Setiap saran Anda sudah tersedia. Terima kasih.
slayedbylucifer

1
Saya memperbaruinya untuk menunjukkan semua langkah
c4urself

Terima kasih. +1 untuk upaya Anda. MASQUERADEPerintah Anda tidak membantu dalam kasus saya. Mungkin saya kehilangan sesuatu. Satu-satunya MASQUERADEperintah yang membuat saya terbang adalah yang saya sebutkan dalam jawaban saya .
slayedbylucifer

Ini semua saran yang bagus kecuali ini tidak akan berhasil karena Anda hanya merutekan 10.xxx pada perintah iptables pertama Anda. Dia ingin merutekan apa pun yang datang dari internet. Lihat jawaban OP sendiri di bawah ini.
Ryan Shillington

2

Posting ini banyak membantu saya dalam memahami AWS NAT. Jadi saya mulai menyelidiki apa yang membuatnya iptables -t nat -A POSTROUTING -j MASQUERADEbekerja.

Yah jawaban saya menemukan pernyataan di atas adalah memungkinkan kotak NAT untuk sumber NAT IP 'LAPTOP' ke '10 .0.0.54 'sementara saat yang sama melakukan NAT tujuan ke 10.0.1.243. Saat ini kotak subnet pribadi adalah permintaan ssh yang berasal dari perangkat NAT saja. Perintah ini sebenarnya mengurangi keamanan server subnet pribadi. Disarankan untuk menggunakan perintah di bawah ini untuk menyempurnakan akses subnet pribadi melalui ssh dan kotak NAT seperti yang disebutkan di bawah ini;

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

0

Sedikit lebih aman:

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.