LINUX.ORG.RU
решено ФорумAdmin

не работает несколько SNAT

 , , , ,


0

1

не получается применить одно правило snat. есть вот такой кусок iptables:


-A POSTROUTING -s 192.168.2.3/32 -o vlan0111 -j SNAT --to-source 1.1.1.6

-A POSTROUTING -m set --match-set realip src -j REALIP
-A POSTROUTING -m set --match-set tel src -j TEL

-A TEL -j SNAT --to-source 2.2.2.150-2.2.2.157
-A REALIP -j SNAT --to-source 1.1.1.4

set tel вся подсеть - 192.168.2.0/24, set realip - пустой, vlan0111 - 1.1.1.0/24

хочется один ip из подсети 192.168.2.0.24 пустить по другому ip, но не работает правило -A POSTROUTING -s 192.168.2.3/32 -o vlan0111 -j SNAT --to-source 1.1.1.6 хоть в какое место его не ставь, всеравно ухоит тот ip по правилу -A TEL -j SNAT --to-source 2.2.2.150-2.2.2.157

но если добавить один ip в set realip то правило -A REALIP -j SNAT --to-source 1.1.1.4 работает. создавать оттдельный сет для каждого нужного ip не хочется. может кто-то подсказать почему не работает правило для одного ip?

кстати а в этой связке DNAT работает нормально: A PREROUTING -d 1.1.1.6/32 -i vlan0111 -j DNAT --to-destination 192.168.2.3.

похожая проблема в этой теме, но так и не решена была: Iptables -SNAT подмена ip



Последнее исправление: forella (всего исправлений: 2)

Ответ на: комментарий от anc

везде политика accept, правила filter обрезал, на маршрутизацию они не влияют.

вопрос в том почему одно и то же правило с указанием src ip через set работает, а если явно указать ip в правиле не работает?

работает:

-A POSTROUTING -m set --match-set realip src -j REALIP (в сете ip 192.168.2.3)
-A REALIP -j SNAT --to-source 1.1.1.4

не работает (если убрать ip из сета и явно указать в правиле) snat уходит на ip 2.2.2.150-2.2.2.157 (в сете tel вся подсеть 192.168.2.0/24):

-A POSTROUTING -s 192.168.2.3/32 -o vlan0111 -j SNAT --to-source 1.1.1.6

# Generated by iptables-save v1.8.7 on Thu Feb 17 17:12:03 2022
*raw
:PREROUTING ACCEPT [401850563625:522426668002774]
:OUTPUT ACCEPT [2724138006:312408975129]
COMMIT
# Completed on Thu Feb 17 17:12:03 2022
# Generated by iptables-save v1.8.7 on Thu Feb 17 17:12:03 2022
*nat
:PREROUTING ACCEPT [3375910:350567936]
:INPUT ACCEPT [1896321:119293179]
:OUTPUT ACCEPT [269024:22277779]
:POSTROUTING ACCEPT [292875:23237059]
:TEL - [0:0]
:PARKING - [0:0]
:REALIP - [0:0]
-A PREROUTING -m set --match-set client src -j PARKING
-A PREROUTING -d 1.1.1.6/32 -i vlan0111 -j DNAT --to-destination 192.168.2.3
-A POSTROUTING -s 192.168.2.3/32 -o vlan0111 -j SNAT --to-source 1.1.1.6
-A POSTROUTING -m set --match-set realip src -j REALIP
-A POSTROUTING -m set --match-set tel src -j TEL
-A TEL -j SNAT --to-source 2.2.2.150-2.2.2.157
-A PARKING -m set --match-set allow src -j RETURN
-A REALIP -j SNAT --to-source 1.1.1.4
COMMIT
# Completed on Thu Feb 17 17:12:03 2022
# Generated by iptables-save v1.8.7 on Thu Feb 17 17:12:03 2022
*mangle
:PREROUTING ACCEPT [323359893622:420532783115023]
:INPUT ACCEPT [2464072551:250588750424]
:FORWARD ACCEPT [320893777847:420282018283942]
:OUTPUT ACCEPT [2539429921:287400790681]
:POSTROUTING ACCEPT [323330692499:420562189039434]
:TEL - [0:0]
:REALIP - [0:0]
-A PREROUTING -j CONNMARK --restore-mark --nfmask 0xffffffff --ctmask 0xffffffff
-A PREROUTING -m mark ! --mark 0x0 -j RETURN
-A PREROUTING -m set --match-set realip src -j REALIP
-A PREROUTING -m set --match-set tel src -j TEL
-A OUTPUT -j CONNMARK --restore-mark --nfmask 0xffffffff --ctmask 0xffffffff
-A OUTPUT -s 1.1.1.1/32 -j MARK --set-xmark 0x3/0xffffffff
-A OUTPUT -s 2.2.2.129/32 -j MARK --set-xmark 0x4/0xffffffff
-A TEL -j MARK --set-xmark 0x4/0xffffffff
-A TEL -j CONNMARK --save-mark --nfmask 0xffffffff --ctmask 0xffffffff
-A REALIP -j MARK --set-xmark 0x3/0xffffffff
-A REALIP -j CONNMARK --save-mark --nfmask 0xffffffff --ctmask 0xffffffff
COMMIT
# Completed on Thu Feb 17 17:12:03 2022
# Generated by iptables-save v1.8.7 on Thu Feb 17 17:12:03 2022
*filter
:INPUT ACCEPT [1291875320:86045313505]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
forella
() автор топика
Ответ на: комментарий от Anoxemian

не понял вопроса. гдето в правилах перепутана логика prerouting/postrouting?

forella
() автор топика
Ответ на: комментарий от anc

а в чем тут может быть проблема?

шаблон взят отсюда https://www.opennet.ru/docs/RUS/iptables/#STARTINGSNAT

7.2.11. Запуск SNAT и цепочка POSTROUTING И заключительный раздел – настройка SNAT. По крайней мере для меня. Прежде всего мы добавляем правило в таблицу nat, в цепочку POSTROUTING, которое производит преобразование исходных адресов всех пакетов, исходящих с интерфейса, подключенного к Internet. В сценарии определен ряд переменных, с помощью которых можно использовать для автоматической настройки сценария. Кроме того, использование переменных повышает удобочитаемость скриптов. Ключом -t задается имя таблицы, в данном случае nat. Команда -A добавляет (Add) новое правило в цепочку POSTROUTING, критерий -o $INET_IFACE задает исходящий интерфейс, и в конце правила задаем действие над пакетом – SNAT. Таким образом, все пакеты, подошедшие под заданный критерий будут «замаскированы», т.е. будут выглядеть так, как будто они отправлены с нашего узла. Не забудьте указать ключ –to-source с соответствующим IP адресом для исходящих пакетов

vlan0111 - подсеть 1.1.1.0/24 куда собственно и пытаюсь SNAT’ить.

есть несколько серверов где такими же правилами сделан SNAT с десятками ip через -o $INET_IFACE, но там каждый src ip помещен в оттдельный set, может -o $INET_IFACE требует обязательно наличие set’a? но такое нигде в документации не встречалось. вот хотелось сделат ьвсе то же но без сетов, и оказалось что DNAT работает, а вот SNAT без сета не хочет.

forella
() автор топика
Ответ на: комментарий от anc

настоящий всмысле физический? -нет, это vlan на интерфейсе.

vlan0111@enp4s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 00:e0:ed:9e:d4:6d brd ff:ff:ff:ff:ff:ff
    inet 1.1.1.4/24 brd 1.1.1.255 scope global vlan0111
       valid_lft forever preferred_lft forever
    inet 1.1.1.5/24 brd 1.1.1.255 scope global secondary vlan0111
       valid_lft forever preferred_lft forever
    inet 1.1.1.6/24 scope global secondary vlan0111
       valid_lft forever preferred_lft forever

локалка на соседнем

 vlan002@enp4s0f1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 00:e0:ed:9e:d4:6e brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.1/24 brd 192.168.2.255 scope global vlan002
       valid_lft forever preferred_lft forever

forella
() автор топика
Последнее исправление: forella (всего исправлений: 2)
Ответ на: комментарий от anc

Как-бы хотелось чтоб 192.168.2.3 уходил туда куда направишь. в очень упрощеной схеме(там 4 аплинка каждый со своей таблицей маршрутизации но vlan002 есть в каждой таблице) vlan0111 - WAN, vlan002 - LAN.

вопрос не в том что оно не работает, оно то работает как нужно, только одним способом, но не очень меня устраивающим. т.е. если src ip указать явно то не работает, если src ip дабавить в set и указать этот set то работает. и такая проблема в postrouting, в prerouting dst nat правило работает.

так что проблема в vlan, маршрутах и т.п. врядли т.к. правило с сетом работает так как это задумано, но зачем создавать сет когда там всего 1 ip.

forella
() автор топика
Ответ на: комментарий от forella

По умолчанию оно куда улетает? Вот это условие -s 192.168.2.3/32 -o vlan0111 сработает если пакет полетит на выход с vlan0111.

anc ★★★★★
()
Ответ на: комментарий от anc

ага, вот кусок роута, дефолт сеть на vlan0111

default via 1.1.1.1 dev vlan0111 metric 33 
2.2.2.0/24 dev vlan1403 proto kernel scope link src 2.2.2.149 
1.1.1.0/24 dev vlan0999 proto kernel scope link src 1.1.1.4
127.0.0.0/8 via 127.0.0.1 dev lo  
192.168.2.0/24 dev vlan002 proto kernel scope link src 192.168.2.1 

поидее в любом случае должно туда уходить.

forella
() автор топика
Ответ на: комментарий от forella

Подчеркиваю если полетит. Например если вы отправите пакет на 2.2.2.0/24 или 192.168.2.0/24 или... то это правило работать не будет.

anc ★★★★★
()
Ответ на: комментарий от anc

не совсем понимаю вашу мысль… мне нужно чтобы 192.168.2.3 зашел на myip.ru и увидел там ip который назначен ему в postrouting, и извне ввел ip который в prerouting и попал на 192.168.2.3.

сейчас все с подсети 192.168.2.0/24 ходят наружу через подсеть 2.2.2.0/24 но мне нужно один ip из подсети 192.168.2.0/24 пустить наружу через 1.1.1.0/24 - и с этим проблема.

forella
() автор топика
Ответ на: комментарий от forella

Блин. Различие в ваших правилах с использованием модуля set и вашим правилом для отдельного хоста в том, что во втором случае ещё указан исходящий интерфейс, это тоже часть условия. Так понятнее?

anc ★★★★★
()
Ответ на: комментарий от anc

о, так понятнее, но непонятн окак это может мешать если в любом случае оно уходит через один и тот же интерфейс что с сетом что без него?

forella
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.