Перенаправлення порту iptables ssh (марсіанське відхилення)


12

У мене є шлюз Linux, який виконує NAT для моєї домашньої мережі. У мене є ще одна мережа, до якої я б хотів прозоро пересилати пакети, але тільки до / з конкретних IP / портів (тобто не VPN). Ось декілька прикладів IP та портів для роботи:

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

Мені б хотілося, щоб джерельна машина могла спілкуватися з певними портами на віддаленій цілі, як ніби вона безпосередньо переводиться з маршрутизатора. На маршрутизаторі eth0 - це приватна мережа, а eth1 - Інтернет. Віддалений шлюз - це ще одна машина Linux, на яку я можу вступити, і вона може направлятись безпосередньо до віддаленої цілі.

Моя спроба простого рішення - налаштувати пересилання перекладу ssh на маршрутизаторі, наприклад:

ssh -L 5000:192.168.50.50:5000 1.2.3.4

Це чудово працює для маршрутизатора, який тепер може локально підключитися до порту 5000. Отже, "telnet localhost 5000" буде підключений до 192.168.50.50 BENZ000, як очікувалося.

Тепер я хочу переспрямувати трафік з Source та послідовності через створений тунель ssh. Для цього я спробував правило NAT:

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

і оскільки маршрутизатор вже є моїм шлюзом NAT, він вже має необхідне правило для побудови:

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

Більшість запитань на цьому веб-сайті чи в інших місцях, здається, мають справу з портами переадресації серверів або шпильками NAT, обидва з яких я працюю в іншому місці, і жодне з них не стосується цієї ситуації. Я, звичайно, міг DMZ переслати порти віддалених цілей через віддалений шлюз, але я не хочу, щоб порти були доступними через Інтернет, я хочу, щоб вони були доступними лише через захищений тунель SSH.

Найкраща відповідь, яку я можу знайти, стосується відмови від марсіанських пакетів у ядрі Linux:

iptables, як перенаправити порт з петлі?

Я включив реєстрацію марсіанів і підтвердив, що ядро ​​відкидає ці пакети як марсіани. За винятком того, що вони не є: я точно знаю, для чого ці пакети, звідки вони і куди їдуть (мій ssh ​​тунель).

Представлене там рішення «навколо кола» застосовно до цього оригінального питання, але не стосується мого випадку.

Однак, пишучи / досліджуючи це питання, я вирішив свою проблему, використовуючи прив'язку IP джерела SSH так:

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

Оскільки я не використовую петлю, це сприймає марсіанську відмову.

Я все ще публікую тут питання з двох причин:

  1. Сподіваючись, що хтось, хто намагається зробити щось подібне в майбутньому, може виявити це у своїх пошуках, і цей спосіб вирішення може допомогти їм.
  2. Я все ще віддаю перевагу ідеї зберігати свій ssh-порт для переадресації з'єднання, прив'язаного лише до циклічного зворотного зв'язку, і мати можливість маршруту до них через iptables. Оскільки я точно знаю, що це за пакети і куди вони йдуть, чи не повинен мені якийсь спосіб позначити їх як такі, щоб марсіанська фільтрація Linux не відкидала їх? Усі мої пошуки в цій темі призводять до rp_filter, який зовсім не допоміг у моєму тестуванні. І навіть якщо це все працювало, це не конкретно для точних пакетів, які я намагаюся дозволити.

Мені цікаво сприяти моєму питанню та вирішенню загального пошуку, щоб врятувати когось іншого, години пошуку я зробив лише для того, щоб придумати тупики, а також сподіваюсь, що хтось відповість на циклічну / марсіанську частину мого питання, яка все ще залишається відкритою до мене.


Після подальшого читання повідомлення Meta на UL проти SF, я також помічаю прохання Майкла не перехрещуватися. Я лише перекреслив це, тому що це було спеціально позначено поза темою в SF, тож якщо це більш доречно і можливо просто перенести оригінальне запитання і закрити це, це теж було б чудово.
Марк

чи введення net.ipv4.conf.default.rp_filter = 0 і net.ipv4.conf.all.rp_filter = 0 у вашому /etc/sysctl.conf вирішує вашу проблему?
Rui F Ribeiro

Я спробував застосувати ці обидва безпосередньо, тобто. 'sysctl net.ipv4.conf.default.rp_filter = 0', також включаючи один для мого конкретного приватного інтерфейсу. Я підтвердив, що вони встановлені через 'sysctl -a', однак марсіанські пакети до 127.0.0.1 все ще відкидаються. І навіть якщо це спрацювало, відкриття всіх моїх інтерфейсів для марсіанів НЕ є тим, чого я хочу. Я навіть не хочу відкривати єдиний (альбієтний приватний) інтерфейс. Я точно знаю, які марсіанські пакети я хочу дозволити, і бажаю / сподіваюся, що NAT / mangle вираз iptables дозволить мені досягти цього.
Марк

Можливо, ви хочете net.ipv4.conf.default.rp_filter = 2 та деякі інші правила iptables
Rui F Ribeiro

Відповіді:


1

Проблема з використанням DNAT до 127.0.0.1.1000000 полягає в тому, що коли віддалена сторона реагує, ці пакети повертаються в двигун маршрутизації так, ніби вони локально походять (з 127.0.0.1), але вони мають зовнішню адресу призначення. SNAT / MASQUERADE, що відповідає зовнішньому інтерфейсу, схопив би їх і переписав, але рішення про маршрутизацію, які повинні бути прийняті, щоб пакети надходили на цей інтерфейс, приходять першими, і вони забороняють ці пакети, які за замовчуванням є помилковими. Двигун маршрутизації не може гарантувати, що ви пам’ятаєте, що будете робити це перезапис пізніше.

Замість цього ви повинні відхилити будь-які зовнішні з'єднання до 192.168.1.1.1000000 на iptables INPUT, крім тих, що надходять з 192.168.1.10, використовуючи !аргумент перед -sспецифікацією адреси джерела. Якщо ви використовуєте скидання TCP як механізм відхилення ( -j REJECT --reject-with tcp-resetзамість недоступного пункту призначення ICMP за замовчуванням), він буде значною мірою ідентичний ситуації, коли за цією адресою нічого не було навіть прослуховування: поєднання портів, що стосується зовнішнього світу.


0

Я б використовував openVPN для створення тунелю від маршрутизатора до RemoteGateway.

Тоді я б на маршрутизаторі додав маршрут:

route add -host RemoteTarget gw RemoteGateway-VPNaddress

використовуйте прості правила iptables, куди ви хочете, щоб обмежити, до яких портів ви можете дозволити Source.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.