Задать вопрос
@BaldUser
Инженеришка

Как перенаправлять трафик через iptables?

Ситуация следующая. Арендовал у хостера VDS на ubuntu 22.04 с белым ip, настроил на нём vpn-server (10.15.0.1), а дома на ПК за натом настроил vpn-client (10.15.0.2). На сервере запустил реверс-прокси (nginx в контейнере), и обращение к ip сервера летает через vpn к клиенту, отдавая страницу с последнего. Теперь к проблеме: Отправляю netflow трафик на сервер (порт 2055). На нём-же смотрю утилитой iptraf-ng, что приходит на интерфейс ens0 - почти каждую секунду есть netflow-трафик от микротика:
UDP (1492 bytes) from <ip микротика>:2055 to <ip сервера>:2055 on ens3

Вроде всё ок. Нужно перенаправить этот-же трафик клиенту. В файле /etc/sysctl.conf раскомментировал строчку net.ipv4.ip_forward=1, перезагрузил, и давай писать в iptables. Пробовал так:
iptables -t nat -A PREROUTING -p udp -i ens0 --dport 2055 -j DNAT --to-destination 10.15.0.2:2055

и так:
iptables -t nat -A PREROUTING -p udp -d <ip сервера> --dport 2055 -j DNAT --to-destination 10.15.0.2:2055
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

даже пробовал делать так, по мануалу для tcp-трафика, только протокол поменял на udp:
iptables -t nat -A PREROUTING -i ens3 -p udp --dport 2055 -m state --state NEW -j DNAT --to 10.15.0.2:2055
iptables -t nat -A PREROUTING -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -p udp -m udp --dport 2055 -j SNAT --to-source 10.15.0.1

Но результата нет - я не только не вижу приходящих udp-пакетов через iptraf-ng на клиенте, но и не вижу исходящих на сервере на интерфейсе tun0.

iptables до изменений имел вид:

iptables -L -nv -t nat
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
 2879  132K DOCKER     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DOCKER     all  --  *      *       0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 MASQUERADE  all  --  *      !docker0  172.17.0.0/16        0.0.0.0/0           

Chain DOCKER (2 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 RETURN     all  --  docker0 *       0.0.0.0/0            0.0.0.0/0


Таблицы filter:

iptables -L -nv -t filter
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DOCKER-USER  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
    0     0 DOCKER-ISOLATION-STAGE-1  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
    0     0 ACCEPT     all  --  *      docker0  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
    0     0 DOCKER     all  --  *      docker0  0.0.0.0/0            0.0.0.0/0           
    0     0 ACCEPT     all  --  docker0 !docker0  0.0.0.0/0            0.0.0.0/0           
    0     0 ACCEPT     all  --  docker0 docker0  0.0.0.0/0            0.0.0.0/0           

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain DOCKER (1 references)
 pkts bytes target     prot opt in     out     source               destination         

Chain DOCKER-ISOLATION-STAGE-1 (1 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DOCKER-ISOLATION-STAGE-2  all  --  docker0 !docker0  0.0.0.0/0            0.0.0.0/0           
    0     0 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0           

Chain DOCKER-ISOLATION-STAGE-2 (1 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DROP       all  --  *      docker0  0.0.0.0/0            0.0.0.0/0           
    0     0 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0           

Chain DOCKER-USER (1 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0


В какую сторону копать? Как узнать, почему пакеты не улетают? В качестве транспорта для vpn выбран udp - может ли это оказывать влияние?

P.S. когда запускаю на сервере реверс-прокси nginx и получаю в браузере страничку с клиента, что характерно, пакетов на интерфейсе tun0 клиента тоже не наблюдается, но трафик бежит через порт 1194 (vpn) интерфейса eno4 (сетевуха на клиенте) теми-же udp пакетами. Но на всякий случай уточню, nfcapd на клиенте всё равно не видит трафика (все файлы пустые), и tcpdump тоже не видит трафика на порту 2055.
  • Вопрос задан
  • 637 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
@BaldUser Автор вопроса
Инженеришка
В общем, не осилив крутой и современный nftables для умных, я переустановил ubuntu на версию 20.04. Там в рабоче-крестьянском iptables мне понадобилась всего одна строчка, чтобы перенаправить трафик в нужное русло:
iptables -t nat -I PREROUTING -i ens3 -p udp --dport 2055 -j DNAT --to-destination 10.15.0.2
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
hint000
@hint000
у админа три руки
Пробовал так:
Ошибка в имени интерфейса - в правиле ens0, а выше показан ens0.
и так:
А так должно работать, по идее.
iptables до изменений имеет вид:
Проверьте после изменений, появляются ли новые правила. А то я столкнулся с тем, что именно в Ubuntu 22.04 поломали iptables (отработанный годами набор правил, работавший на Ubuntu 20.04, просто выдавал ошибки при попытке их добавления на Ubuntu 22.04). Я не знаю, может быть, уже починили это, а может быть и нет.

Они настойчиво подталкивают к миграции на nftables (типа того, что iptables внезапно признали за дерьмо мамонта, и приняли решение, что оно вам не нужно). И действительно, при конвертации в nftables "поломатый" набор правил снова стал работать как надо.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы