LINUX.ORG.RU

SNAT для локального приложения

 ,


0

2

Добрый день!

Нужно подменять source у пакетов генерируемых локальным приложением. Все таблицы ACCEPT, nat сейчас такой:

Chain PREROUTING (policy ACCEPT 13230 packets, 869K bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 2206 packets, 130K bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 SNAT       all  --  *      eth0    0.0.0.0/0            0.0.0.0/0           to:192.168.110.159 

Chain OUTPUT (policy ACCEPT 2572 packets, 152K bytes)
 pkts bytes target     prot opt in     out     source               destination 
 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 0a:c3:4a:44:3e:bb brd ff:ff:ff:ff:ff:ff
    inet 192.168.216.246/30 brd 192.168.106.247 scope global eth0
    inet 192.168.110.159/32 scope global eth0
    inet6 fe80::8c3:4aff:fe44:3ebb/64 scope link 
       valid_lft forever preferred_lft forever

Пакетики не тикают. nat не отрабатывает.

13:17:00.762657 IP 192.168.197.16.41887 > 192.168.216.246.sip: S 1420687104:1420687104(0) win 29200 <mss 1460,sackOK,timestamp 153693613 0,nop,wscale 7>
13:17:00.762837 IP 192.168.216.246.sip > 192.168.197.16.41887: S 586147860:586147860(0) ack 1420687105 win 5792 <mss 1460,sackOK,timestamp 3728277676 153693613,nop,wscale 7>
13:17:00.762881 IP 192.168.197.16.41887 > 192.168.216.246.sip: R 1420687105:1420687105(0) win 0


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

iptables-save пустой кроме одного правила в nat. ip a для eth0 вы первом сообщении.

пробовал без eth0 один хрен не работает

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

Прозевал.
Дык у тебя пакеты считаются уходящими с бриджа, а не с eth0.
Кроме того, не вижу селектора по приложению, потому и прошу правило из iptables-save.

thesis ★★★★★
()
Ответ на: комментарий от thesis
# Generated by iptables-save v1.3.5 on Thu Nov  5 14:38:24 2015
*mangle
:PREROUTING ACCEPT [710363:567027885]
:INPUT ACCEPT [704372:566539955]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [753088:91182712]
:POSTROUTING ACCEPT [753309:91198200]
COMMIT
# Completed on Thu Nov  5 14:38:24 2015
# Generated by iptables-save v1.3.5 on Thu Nov  5 14:38:24 2015
*nat
:PREROUTING ACCEPT [24883:1646686]
:POSTROUTING ACCEPT [4320:257154]
:OUTPUT ACCEPT [4146:245907]
-A POSTROUTING -j SNAT --to-source 1.1.1.1 
COMMIT
# Completed on Thu Nov  5 14:38:24 2015
# Generated by iptables-save v1.3.5 on Thu Nov  5 14:38:24 2015
*filter
:INPUT ACCEPT [2499922263:423836859984]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [2652526754:403919398770]
COMMIT
# Completed on Thu Nov  5 14:38:24 2015

делаю ping 8.8.8.8 и вижу, что работает:

14:37:14.149450 IP 1.1.1.1 > 8.8.8.8: ICMP echo request, id 55064, seq 1, length 64
14:37:15.149680 IP 1.1.1.1 > 8.8.8.8: ICMP echo request, id 55064, seq 2, length 64

Далее, запускаю приложение и вижу, что source не изменяется:

14:39:35.172003 IP 192.168.55.55.46390 > 192.168.100.246.sip: S 2735509705:2735509705(0) win 29200 <mss 1460,sackOK,timestamp 154932215 0,nop,wscale 7>
14:39:35.172142 IP 192.168.100.246.sip > 192.168.55.55.46390: S 2647903661:2647903661(0) ack 2735509706 win 5792 <mss 1460,sackOK,timestamp 3733232086 154932215,nop,wscale 7>
14:39:35.172689 IP 192.168.55.55.46390 > 192.168.100.246.sip: R 2735509706:2735509706(0) win 0

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

Логирую все цепочки. и не вижу, чтобы пакет попадал в nat POSTROUTING.

nat PREROUTING: IN=eth0 OUT= SRC=192.168.55.55 DST=192.168.100.246 LEN=60 TOS=0x18 PREC=0xA0 TTL=61 ID=13129 DF PROTO=TCP SPT=46635 DPT=5060 WINDOW=29200 RES=0x00 SYN URGP=0 
filter INPUT: IN=eth0 OUT= SRC=192.168.55.55 DST=192.168.100.246 LEN=60 TOS=0x18 PREC=0xA0 TTL=61 ID=13129 DF PROTO=TCP SPT=46635 DPT=5060 WINDOW=29200 RES=0x00 SYN URGP=0 
filter OUTPUT: IN= OUT=eth0 LEN=60 TOS=0x10 PREC=0x00 TTL=64 ID=0 DF PROTO=TCP SPT=5060 DPT=46635 WINDOW=5792 RES=0x00 ACK SYN URGP=0 
mangle POSTROUTING: IN= OUT=eth0 SRC=192.168.100.246 DST=192.168.55.55 LEN=60 TOS=0x10 PREC=0x00 TTL=64 ID=0 DF PROTO=TCP SPT=5060 DPT=46635 WINDOW=5792 RES=0x00 ACK SYN URGP=0 
quntm
() автор топика

Нужно подменять source у пакетов генерируемых локальным приложением

очевидно, что это надо делать в цепочке OUTPUT. Ведь источником пакетов является ЛОКАЛЬНОЕ приложение, да?

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

Кажется, я не очень корректно выразился. Или норм... Ппц никак не проснусь. Да, вроде таблица nat цепочка output должна быть.

targitaj ★★★★★
()
Последнее исправление: targitaj (всего исправлений: 1)
Ответ на: комментарий от targitaj

Добавил. Не попадают пакеты в цепочку.

Вообще схема такая:

Client->proxy(tproxy)->SERVER

proxy подставляет source ip:port клиента и отправляет на SERVER. Далее нужно, чтобы SERVER ответил на Client, подставив в source тот IP, который был dst у клиента.

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

Сейчас не помогу, проснуться никак не могу. Ненавижу работать днём.
Мой тебе совет - воспользуйся визуализацией. Возьми доску/лист бумаги и подробно распиши блок-схему. Что откуда куда и как. А потом примени доку, что я выше давал. Вот прямо пошагово. И на каждом шаге понатыкай -j LOG чтобы видеть что происходит.

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

Вот что-то мне тоже так кажется... Не могу сообразить, моск спит (((

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

и вот что имеем:

mangle PREROUTING: IN=eth0 OUT= SRC=192.168.55.55 DST=192.168.100.246 LEN=60 TOS=0x18 PREC=0xA0 TTL=61 ID=31487 DF PROTO=TCP SPT=48328 DPT=5060 WINDOW=29200 RES=0x00 SYN URGP=0 
nat PREROUTING: IN=eth0 OUT= SRC=192.168.55.55 DST=192.168.100.246 LEN=60 TOS=0x18 PREC=0xA0 TTL=61 ID=31487 DF PROTO=TCP SPT=48328 DPT=5060 WINDOW=29200 RES=0x00 SYN URGP=0 
mangle OUTPUT: IN= OUT=eth0 SRC=192.168.100.246 DST=192.168.55.55 LEN=60 TOS=0x10 PREC=0x00 TTL=64 ID=0 DF PROTO=TCP SPT=5060 DPT=48328 WINDOW=5792 RES=0x00 ACK SYN URGP=0 
mangle POSTROUTING: IN= OUT=eth0 SRC=192.168.100.246 DST=192.168.55.55 LEN=60 TOS=0x10 PREC=0x00 TTL=64 ID=0 DF PROTO=TCP SPT=5060 DPT=48328 WINDOW=5792 RES=0x00 ACK SYN URGP=0 
mangle PREROUTING: IN=eth0 OUT= SRC=192.168.55.55 DST=192.168.100.246 LEN=40 TOS=0x18 PREC=0xA0 TTL=63 ID=50715 DF PROTO=TCP SPT=48328 DPT=5060 WINDOW=0 RES=0x00 RST URGP=0 
quntm
() автор топика
Ответ на: комментарий от quntm

А разжуй плиз подробнее свою схему с client-proxy-server, до уровня физ. хостов и интерфейсов. И дополнительно уточни, где именно ты станишь трафик (на 'server'?)

Поясню просьбу: решение о попадании в nat принимается при установке нового соединения. Охота прикинуть как идут пакеты «с самого начала».

thesis ★★★★★
()
Последнее исправление: thesis (всего исправлений: 1)
Ответ на: комментарий от thesis

192.168.55.55 - client 192.168.110.9 - proxy 192.168.100.246 - server

client -> proxy:5060 -> server:5060

Приложение клиента общается с proxy:tcp:5060. Прокси работает прозрачно, используя TPROXY (реализовано через haproxy), т.е. он берёт IP:PORT клиента, и при пересылке пакетов на server, подставляет их как SOURCE. Сервер видит, что отправитель пакетов - client, и отправляет пакеты на client:IP:PORT, НО cо своим адресом в поле SOURCE (server:tcp:5060), следовательно, клиент не сможет обработать эти сообщения, т.к. он ждёт ответа от proxy:tcp:5060. И поэтому я хочу научить сервер подставлять в поле SOURCE ip адрес proxy сервера (proxy:tcp:5060)

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

я хочу научить сервер подставлять в поле SOURCE ip адрес proxy сервера

А почему у тебя указан 159й айпишник в правиле SNAT тогда?

Вообще, видимо, так уж работает netfilter. Сейчас попробовал на первом попавшщемся хосте - свои исходящие соединения натит, ответы на входящие - нет. Бережет логику соединения.

Похоже, твою задачу, какой бы она ни была, надо решать по-другому. Возможно, ломать адреса в mangle, или вообще принципиально иначе.

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

Не получится. В таблицу NAT попадает только первый пакет соединения, по нему делаются записи в conntrack. По этом записи пакеты и модифицируются. А не по правилу ″-t nat″.

Для вашей задачи вам нужен stateless nat, который был давно и не правда и делался командой ″ip route″.

А без nat нужно поднимать тунель (GRE) между прокси и сервером и делать, чтобы прокси шла через тунель, а сервер, на то, что пришло из тунеля, отвечал в тунель.

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

Ага, правила применяет, но не работает:

Warning: route NAT is deprecated

Нашел способ делать это с помощью tc, но походу версия tc на столько стара, что не знает про action nat:

bad action type nat
Usage: ... gact <ACTION> [RAND] [INDEX]
Where: 	ACTION := reclassify | drop | continue | pass 
	RAND := random <RANDTYPE> <ACTION> <VAL>
	RANDTYPE := netrand | determ
	VAL : = value not exceeding 10000
	INDEX := index value used

bad action parsing
parse_action: bad value (4:nat)!
Illegal "action"

tc обновляется только вместе я ядром?

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

Нет.

И потом ещё вопрос, а proxy примет пакеты, идущие на его адрес, а не на адрес клиента, от которого она устанавливала соединение с сервером? Или вы потом ещё на proxy будете nat накостыливать?

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

А зачем на proxy это?

Тут proxy занимается пересылкой запросов от клиента до сервера. Сам же сервер на прямую общается с клиентом. Это я хочу реализовать.

Т.е. получается, что клиент посылает запросы на один сервер, а получает ответы от другого (при этом клиент этого не замечает)

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

(при этом клиент этого не замечает)

Если tcp, то, скорее всего, заметит, ведь sequence number другой будет?

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