Linux iptables ssh port forwarding (penolakan Mars)


12

Saya memiliki gateway Linux yang melakukan NAT untuk jaringan rumah saya. Saya memiliki jaringan lain yang ingin saya kirimkan paket secara transparan, tetapi hanya ke / dari IP / port tertentu (mis. Bukan VPN). Berikut ini beberapa contoh IP dan port untuk digunakan:

Source          Router          Remote Gateway     Remote Target
192.168.1.10 -> 192.168.1.1 ->  1.2.3.4        ->  192.168.50.50:5000

Saya ingin mesin Source untuk dapat berbicara dengan port tertentu pada Remote Target seolah-olah langsung dialihkan dari Router. Di Router, eth0 adalah jaringan pribadi dan eth1 menghadap ke internet. Remote Gateway adalah mesin Linux lain yang dapat saya gunakan ssh dan dapat merutekan langsung ke Remote Target.

Upaya saya pada solusi sederhana adalah mengatur penerusan port ssh pada Router, seperti:

ssh -L 5000:192.168.50.50:5000 1.2.3.4

Ini berfungsi dengan baik untuk Router, yang sekarang dapat terhubung secara lokal ke port 5000. Jadi "telnet localhost 5000" akan terhubung ke 192.168.50.50-05000 seperti yang diharapkan.

Sekarang saya ingin mengarahkan kembali lalu lintas dari Sumber dan corong melalui terowongan ssh yang sudah ada. Saya mencoba aturan NAT untuk ini:

iptables -t nat -D PREROUTING -i eth0 -p tcp -s 192.168.1.10 --dport 5000 -d 1.2.3.4 -j DNAT --to-destination 127.0.0.1:5000

dan karena Router sudah menjadi gateway NAT saya, ia sudah memiliki aturan postrouting yang diperlukan:

-A POSTROUTING -s 192.168.1.0/24 -o eth1 -j MASQUERADE

Kebanyakan T&J di situs ini atau di tempat lain tampaknya berurusan dengan penerusan port server atau hairpin NAT, yang keduanya telah saya gunakan dengan baik di tempat lain, yang keduanya tidak berlaku untuk situasi ini. Saya tentu saja dapat memajukan port Target Remote melalui Remote Gateway, tetapi saya tidak ingin port dapat diakses internet, saya ingin mereka dapat diakses hanya melalui terowongan SSH yang aman.

Jawaban terbaik yang bisa saya temukan terkait dengan penolakan paket Mars di kernel Linux:

iptables, bagaimana cara mengarahkan ulang port dari loopback?

Saya telah mengaktifkan logging dari orang-orang Mars dan mengkonfirmasi bahwa kernel menolak paket-paket ini sebagai orang-orang Mars. Kecuali itu bukan: Saya tahu persis untuk apa paket-paket ini, dari mana mereka berasal dan ke mana mereka pergi (terowongan ssh saya).

Solusi "bundaran" yang disajikan di sana berlaku untuk pertanyaan awal itu, tetapi tidak berlaku untuk kasus saya.

Namun, saat menulis / meneliti pertanyaan ini, saya telah mengatasi masalah saya dengan menggunakan SSH source IP binding seperti:

ssh -L 192.168.1.1:5000:192.168.50.50:5000 1.2.3.4
iptables -t nat -D PREROUTING -i eth0 -p tcp -s 192.168.1.10 --dport 5000 -d 1.2.3.4 -j DNAT --to-destination 192.168.1.1:5000

Karena saya tidak menggunakan loopback, ini membuat penolakan Mars.

Saya masih memposting pertanyaan di sini karena dua alasan:

  1. Dengan harapan bahwa seseorang yang mencoba melakukan sesuatu yang serupa di masa depan dapat menemukan ini dalam pencarian mereka dan solusi ini dapat membantu mereka.
  2. Saya masih lebih suka ide menjaga port ssh saya ke depan koneksi terikat hanya untuk loopback dan bisa rute ke mereka melalui iptables. Karena saya tahu persis apa paket-paket ini dan kemana mereka pergi, tidakkah harus ada cara bagi saya untuk menandai mereka sedemikian rupa sehingga pemfilterian Linux Linux tidak menolaknya? Semua pencarian saya pada topik ini mengarah ke rp_filter, yang sama sekali tidak membantu dalam pengujian saya. Dan bahkan jika itu berhasil, itu tidak spesifik untuk paket yang saya coba izinkan.

Saya tertarik untuk berkontribusi dalam pertanyaan saya dan mencari solusi untuk pencarian umum untuk menyelamatkan orang lain, jam-jam pencarian yang saya lakukan hanya untuk menemukan jalan buntu, dan juga semoga seseorang menjawab loopback / bagian Mars dari pertanyaan saya yang masih tetap terbuka untuk saya.


Pada bacaan lebih lanjut dari posting Meta pada UL vs SF, saya juga melihat permintaan dari Michael untuk tidak crosspost. Saya hanya crossposted ini karena secara khusus ditandai off-topic di SF, jadi jika lebih tepat dan mungkin untuk hanya memindahkan pertanyaan asli dan menutup yang ini, itu akan bagus juga.
Markus

apakah menempatkan net.ipv4.conf.default.rp_filter = 0 dan net.ipv4.conf.all.rp_filter = 0 di /etc/sysctl.conf Anda dan melakukan "sudo sysctl -p" memecahkan masalah Anda?
Rui F Ribeiro

Saya mencoba menerapkan keduanya secara langsung, yaitu. 'sysctl net.ipv4.conf.default.rp_filter = 0', juga termasuk satu untuk antarmuka pribadi spesifik saya. Saya telah mengkonfirmasi mereka diatur melalui 'sysctl -a', namun, paket Mars ke 127.0.0.1 masih ditolak. Dan bahkan jika ini berhasil, membuka semua antarmuka saya untuk orang Mars BUKAN apa yang saya inginkan. Saya juga tidak ingin membuka antarmuka tunggal (pribadi). Saya tahu persis paket Mars mana yang ingin saya izinkan dan berharap / berharap untuk iptables ekspresi NAT / mangle untuk memungkinkan saya mencapai ini.
Tandai

Anda mungkin ingin net.ipv4.conf.default.rp_filter = 2 dan beberapa aturan iptables lainnya
Rui F Ribeiro

Jawaban:


1

Masalah dengan melakukan DNAT ke 127.0.0.1-5000 adalah ketika sisi yang jauh merespons, paket-paket ini kembali ke mesin perutean seolah-olah mereka berasal secara lokal (dari 127.0.0.1) tetapi mereka memiliki alamat tujuan luar. SNAT / MASQUERADE yang cocok dengan antarmuka luar akan menangkap mereka dan menulis ulang, tetapi keputusan routing yang harus dibuat untuk paket untuk sampai pada antarmuka itu adalah yang utama, dan mereka melarang paket-paket ini yang palsu secara default. Mesin perutean tidak dapat menjamin Anda akan ingat untuk melakukan penulisan ulang nanti.

Hal yang seharusnya bisa Anda lakukan adalah menolak koneksi luar ke 192.168.1.1-5000 di iptables INPUT selain dari yang berasal dari 192.168.1.10 menggunakan !argumen sebelum -sspesifikasi alamat sumber. Jika Anda menggunakan pengaturan ulang TCP sebagai mekanisme penolakan ( -j REJECT --reject-with tcp-reset, alih-alih tujuan ICMP default tidak dapat dijangkau), sebagian besar akan identik dengan situasi di mana tidak ada yang mendengarkan pada alamat itu: kombinasi port sejauh menyangkut dunia luar.


0

Saya akan menggunakan openVPN untuk membuat terowongan dari Router ke RemoteGateway.

Maka saya akan, pada Router, menambahkan rute:

route add -host RemoteTarget gw RemoteGateway-VPNaddress

gunakan aturan iptables sederhana di mana pun Anda ingin membatasi port mana yang Anda izinkan Source untuk mengakses.

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.