Привет линукс-кун!
Помогите разобраться с iptables.
Есть такая схемка:
Как правильно написать редирект группы портов (условно, с 15000 до 15100) на VPN клиента за Ubuntu сервером/VPN сервером при переходе на паблик IP сервера с этими портами.
Перепробывал кучу вариантов FORWARD/PREROUTING/POSTROUTING правил но что-то не получилось.
VPN клиенты видят сервер, видят друг-друга, VPN сервер видит клиентов. Тут все ок.
Еще на тему
#Разрешаем входящие подключения на 15000
iptables -A FORWARD -i eth0 -p tcp --dport 15000 -j ACCEPT
# Форвардинг 15000 eth0
iptables -t nat -A PREROUTING -p tcp -d Y.Y.Y.Y --dport 15000 -j DNAT --to-destination X.X.X.1:15000
iptables -t nat -A POSTROUTING -p tcp -d X.X.X.1 --dport 15000 -j SNAT --to-source Y.Y.Y.Y
#Разрешаем входящие подключения на 15000
iptables -A FORWARD -i ppp0 -p tcp --dport 15000 -j ACCEPT
# Форвардинг 15000 ppp0
iptables -t nat -A PREROUTING -p tcp -d X.X.X.1 --dport 15000 -j DNAT --to-destination X.X.X.5:15000
iptables -t nat -A POSTROUTING -p tcp -d X.X.X.5 --dport 15000 -j SNAT --to-source X.X.X.1
Но оно не работает.
iptables -t nat -A POSTROUTING -p tcp -d X.X.X.5 --dport 15000 -j SNAT --to-source Y.Y.Y.Y
тада поидее как то так
iptables -t nat -A POSTROUTING -o eth0 -s X.X.X.0./24 -j MASQUERADE
прописать что бы работало
iptables -t nat -A PREROUTING -p tcp -d Y.Y.Y.Y --dport 15000 -j DNAT --to-destination X.X.X.5:15000
потом SNAT-им (и прячем за локальный впн-адрес)
iptables -t nat -A POSTROUTING -p tcp -d X.X.X.5 --dport 15000 -j SNAT --to-source X.X.X.1
И последний вопрос в правиле построутинга почему указывается --to-source X.X.X.1, а не Y.Y.Y.Y. (С Y.Y.Y.Y, кстати не работает)
смотрите. от чувака в инете с адресом допустим 1.1.1.1 приходит запрос на адрес Y.Y.Y.Y (srcip 1.1.1.1, dstip Y.Y.Y.Y). убунта такая - ок, у меня есть dnat правило, и меняет dstip на X.X.X.5. далее включается маршутизация, смотрит таблицу - ага, X.X.X.5 у нас на интерфейсе ppp0 как link-local, шлём туды (итого, пакет ушёл в ppp0, с src-ip 1.1.1.1 и dstip Х.Х.Х.5). это после правила dnat.
далее, впн-клиент X.X.X.5 получает такой пакет, и формирует на него ответ (получается srcip Х.Х.Х.5 и dstip 1.1.1.1), пакет отдаётся маршрутизации.. а Х.Х.Х.1 не является шлюзом по-умолчанию! и пакет уходит в шлюз интернета, клиент валидного ответа ессно не получает.
для этого мы добавляем правило snat. оно на убунте после принятия решения о маршрутизации подменяет srcip, и пакет уходит в ppp0 с srcip X.X.X.1 и dstip Х.Х.Х.5. впн-клиент получает такой пакет, отвечает на него согласно своей таблице маршрутизации (X.X.X.1 для него линк-локал), и поэтому ответный пакет приходит на убунту обратно, и обратными правилами возвращается до клиента в инете. это всё вы можете проверить, запустив сниффер на убунте и на впн-клиенте.
из минусов - на впн-клиенте вы не увидите реальный ip клиента, увидите именно Х.Х.Х.1. поэтому логи надо будет вести на убунте.
альтернативно - вам на впн-клиенте нужно будет настраивать маркировку трафика (mangle), и таблицы маршрутизации, чтобы ответы на входящие на х.х.х.5 пакеты уходили на х.х.х.1.
или сделать на впн-клиенте х.х.х.1 шлюзом по умолчанию.
надеюсь расписал понятно.
Более чем понятно)
Ни в одной из статей, никто так подробно не объяснил...
PS про решение подобной задачи люблю спрашивать на собеседовании ;)
а) не разрешён проброс портов
б) порты закрыты фаерволом (ufw в бубунте)
ufw выключен
Спасибо за суперскую ссылку, пойду перечитаю...
iptables -t nat -A POSTROUTING -s X.X.X.0/xx -o eth0 -j SNAT --to-source Y.Y.Y.Y
а потом пробросить
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 15000 -j DNAT --to-destination X.X.X.5