У мене є шлюз 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
Оскільки я не використовую петлю, це сприймає марсіанську відмову.
Я все ще публікую тут питання з двох причин:
- Сподіваючись, що хтось, хто намагається зробити щось подібне в майбутньому, може виявити це у своїх пошуках, і цей спосіб вирішення може допомогти їм.
- Я все ще віддаю перевагу ідеї зберігати свій ssh-порт для переадресації з'єднання, прив'язаного лише до циклічного зворотного зв'язку, і мати можливість маршруту до них через iptables. Оскільки я точно знаю, що це за пакети і куди вони йдуть, чи не повинен мені якийсь спосіб позначити їх як такі, щоб марсіанська фільтрація Linux не відкидала їх? Усі мої пошуки в цій темі призводять до rp_filter, який зовсім не допоміг у моєму тестуванні. І навіть якщо це все працювало, це не конкретно для точних пакетів, які я намагаюся дозволити.
Мені цікаво сприяти моєму питанню та вирішенню загального пошуку, щоб врятувати когось іншого, години пошуку я зробив лише для того, щоб придумати тупики, а також сподіваюсь, що хтось відповість на циклічну / марсіанську частину мого питання, яка все ще залишається відкритою до мене.