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

iproute2 + MARK

 ,


1

1

Попробую расписать по минимуму. Таблиц много Если надо будет, уточню, добавлю инфо.

Есть несколько провайдеров и несколько таблиц маршрутизации. Не работает маркировка:

Вот так не работает:

iptables -A POSTROUTING -j SNAT --to-source 217.*.*.* -t nat -o vlan107 -s 10.0.0.124
iptables -A PREROUTING -s 10.0.0.124 -j MARK --set-mark 3 -t mangle    # Ростелеком
 /sbin/ip rule add fwmark 3 table  rostelecom
 

Правила добавляются метка 3 ставится

IP (tos 0x0, ttl 128, id 29371, offset 0, flags [none], proto ICMP (1), length 60)
    10.0.0.124 > 8.8.8.8: ICMP echo request, id 10, seq 48892, length 40

пинг идет по нужному каналу

IP (tos 0x0, ttl 127, id 30962, offset 0, flags [none], proto ICMP (1), length 60)
    217.*.*.* > 8.8.8.8: ICMP echo request, id 10, seq 54940, length 40
IP (tos 0x24, ttl 50, id 0, offset 0, flags [none], proto ICMP (1), length 60)
    8.8.8.8 > 217.*.*.*: ICMP echo reply, id 10, seq 54940, length 40

но не возвращается почему-то

Работает только так вот:

/sbin/ip rule add from 10.0.0.124 table rostelecom

Тогда пакеты обратно уходят:

IP (tos 0x24, ttl 49, id 0, offset 0, flags [none], proto ICMP (1), length 60)
    8.8.8.8 > 10.0.0.124: ICMP echo reply, id 10, seq 54690, length 40

Дык если используется MARK, то и правила должны быть типа

ip ru add fwmark 3 lookup rostelecom

MARK сам по себе ничего не делает.

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

Ну, так, а как же:

iptables -A PREROUTING -s 10.0.0.124 -j MARK --set-mark 3 -t mangle    # Ростелеком 
adxfighter
() автор топика
Ответ на: комментарий от vel

Все остальное в таблице rostelekom прописано. И работает, когда

/sbin/ip rule add from 10.0.0.124 table rostelecom
adxfighter
() автор топика
Ответ на: комментарий от vel
ip ru add fwmark 3 lookup rostelecom

И так то же пробовал. На самом деле: lookup и table в данном случае идентичны.

# ip rule ls | grep fw
# 30718:  from all fwmark 0x3 lookup rostelecom
adxfighter
() автор топика
Ответ на: комментарий от uspen

а, тебе чего надо? чтобы от хоста в локалке шли пакеты в таблицу?
тогда ip rule add from IP table TABLE желательно prio указывать, а то выйдет попа.

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

ip rule add from IP table TABLE так работает, но мне с MARKом надо. На самом деле, мне надо OpenVPN завернуть через другую таблицу. Для этого маркировка нужна будет. А маркировка не работает. А от хоста в локалке тоже не работает с MARK, это в качестве примера

Самое интересное, что вся эта маркировка работала на старом шлюзе (ядро 2.6) Debian. А на Ubuntu 12 (ядро 3) не хочет.

CONNMARK тоже пробовал в декабре еще, не помогло. А можешь в 2-х словах рассказать про CONNMARK ??? Мне читать не лень, но в прошлый раз так и не разобрался с ним...

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

то есть тебе трафик от openvpn, а не от всего хоста надо завернуть на другую таблицу? в оппосте у тебя правила для всего хоста, без указания порта.

CONNMARK - это маркеровка соединения, если не ошибаюсь с udp не работает.

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

Да, опенвпн, и как-раз udp 1194. У меня ОпенВПН на одном канале работает, а на втором не хочет. (это на случай падения 1го канала.) Думаю, тут без маркировки не обойтись, а она не работает (( Интересно, что пакет в таблицу, вроде, заворачивается, но не возвращается

anonymous
()
Ответ на: комментарий от uspen

rp_filter - еще те грабли.

Если ничего не помогает, то есть смысл попробовать

iptables -t raw -A PREROUTING -s 10.0.0.124 -j TRACE
Только если с 10.0.0.124 идет большой трафик, то в логах будет очень много записей

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

работает для всех протоколов.

спасибо, что поправили.

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

а, да, конечно. тебе надо же заруливать все входящие пакеты туда, откуда они ушли.

это для самого маршрутизатора:

-t mangle -A INPUT -i IFACE -m conntrack --ctstate NEW -j CONNMARK --set-mark MARK
-t mangle -A OUTPUT -j CONNMARK --restore-mark
ip rule add fwmark MARK table TABLE

это для forward:

-t nat -A PREROUTING -i IFACE -p tcp --dst IP --dport PORT -j CONNMARK --set-mark MARK
-t mangle -A PREROUTING -i IFACE -p tcp --src IP --sport PORT -j CONNMARK --restore-mark
ip rule add fwmark MARK table TABLE

setmark идет на внешний ифейс!

это на DNAT - т.е. на внешние подключения к хосту в лан.

поэксперементируй наоборот.

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

Спасибо! Обязательно поэксперементирую. Напишу, когда результат будет

anonymous
()
Ответ на: комментарий от uspen

Решил попробовать на тестовой машине. Чтобы 192.168.1.16 попадал в таблицу rostelecom

ip rule ls | grep fw
from all fwmark 0x3 lookup rostelecom

Подгрузил модули:

modprobe nf_conntrack modprobe nf_conntrack_ipv4 modprobe xt_connmark ###modprobe xt_CONNMARK # этот модуль не был найден! не знаю нужен он или нет?? modprobe xt_state modprobe ipt_state modprobe xt_SECMARK modprobe xt_mark modprobe xt_CONNSECMARK

Дальше начал эксперементировать. Прошу сильно не пинать, но я не понимаю, когда надо делать --restore-mark

eth3 - это входящий Интерфейс провайдера Ростелеком

ipt="iptables"
$ipt -A FORWARD -o eth3 -j CONNMARK --set-mark 3 -t mangle    
$ipt -A FORWARD -i eth3 -j CONNMARK --restore-mark -t mangle    
$ipt -A FORWARD -s 192.168.1.16 -j CONNMARK --set-mark 3 -t mangle
$ipt -A PREROUTING -s 192.168.1.16 -j CONNMARK --set-mark 3 -t mangle  

Пробовал так же воткнуть: -m conntrack --ctstate NEW

В итоге: трафик с 192.168.1.16 шел по таблице main, и в нужную таблицу rostelecom так и не попал

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

Пробую тестировать, чтобы 192.168.1.16 ходил через таблицу:

ip rule ls | grep fw
from all fwmark 0x3 lookup rostelecom 
$ipt -A PREROUTING -s 192.168.1.16 -j MARK --set-mark 3 -t mangle
$ipt -A POSTROUTING -j SNAT --to-source 95.*.*.* -t nat -o eth3 -s 192.168.1.16
$ipt -A PREROUTING -s 192.168.1.16 -j TRACE -t raw
$ipt -A PREROUTING -s 8.8.8.8 -j TRACE -t raw
cat /var/log/syslog | grep 8.8.8.8
Apr 23 09:05:12 First kernel: [82911.731074] TRACE: raw:PREROUTING:rule:2 IN=eth0 OUT= MAC=00:1b:21:d2:a3:34:00:15:5d:01:6d:0f:08:00 SRC=192.168.1.16 DST=8.8.8.8 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=ICMP TYPE=8 CODE=0 ID=5093 SEQ=357
Apr 23 09:05:12 First kernel: [82911.735427] TRACE: raw:PREROUTING:rule:4 IN=eth0 OUT= MAC=00:1b:21:d2:a3:34:00:15:5d:01:6d:0f:08:00 SRC=192.168.1.16 DST=8.8.8.8 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=ICMP TYPE=8 CODE=0 ID=5093 SEQ=357
Apr 23 09:05:12 First kernel: [82911.739761] TRACE: raw:PREROUTING:rule:6 IN=eth0 OUT= MAC=00:1b:21:d2:a3:34:00:15:5d:01:6d:0f:08:00 SRC=192.168.1.16 DST=8.8.8.8 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=ICMP TYPE=8 CODE=0 ID=5093 SEQ=357
Apr 23 09:05:12 First kernel: [82911.744094] TRACE: raw:PREROUTING:policy:8 IN=eth0 OUT= MAC=00:1b:21:d2:a3:34:00:15:5d:01:6d:0f:08:00 SRC=192.168.1.16 DST=8.8.8.8 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=ICMP TYPE=8 CODE=0 ID=5093 SEQ=357
Apr 23 09:05:12 First kernel: [82911.748428] TRACE: mangle:PREROUTING:rule:1 IN=eth0 OUT= MAC=00:1b:21:d2:a3:34:00:15:5d:01:6d:0f:08:00 SRC=192.168.1.16 DST=8.8.8.8 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=ICMP TYPE=8 CODE=0 ID=5093 SEQ=357
Apr 23 09:05:12 First kernel: [82911.752761] TRACE: mangle:PREROUTING:policy:2 IN=eth0 OUT= MAC=00:1b:21:d2:a3:34:00:15:5d:01:6d:0f:08:00 SRC=192.168.1.16 DST=8.8.8.8 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=ICMP TYPE=8 CODE=0 ID=5093 SEQ=357 MARK=0x3
Apr 23 09:05:12 First kernel: [82911.757093] TRACE: mangle:FORWARD:policy:1 IN=eth0 OUT=eth3 MAC=00:1b:21:d2:a3:34:00:15:5d:01:6d:0f:08:00 SRC=192.168.1.16 DST=8.8.8.8 LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=0 DF PROTO=ICMP TYPE=8 CODE=0 ID=5093 SEQ=357 MARK=0x3
Apr 23 09:05:12 First kernel: [82911.761425] TRACE: filter:FORWARD:rule:21 IN=eth0 OUT=eth3 MAC=00:1b:21:d2:a3:34:00:15:5d:01:6d:0f:08:00 SRC=192.168.1.16 DST=8.8.8.8 LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=0 DF PROTO=ICMP TYPE=8 CODE=0 ID=5093 SEQ=357 MARK=0x3
Apr 23 09:05:12 First kernel: [82911.765751] TRACE: mangle:POSTROUTING:policy:1 IN= OUT=eth3 SRC=192.168.1.16 DST=8.8.8.8 LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=0 DF PROTO=ICMP TYPE=8 CODE=0 ID=5093 SEQ=357 MARK=0x3
Apr 23 09:05:12 First kernel: [82911.810685] TRACE: raw:PREROUTING:rule:5 IN=eth3 OUT= MAC=54:04:a6:f3:ad:d4:00:26:88:d6:67:c0:08:00 SRC=8.8.8.8 DST=95.*.*.* LEN=84 TOS=0x00 PREC=0x00 TTL=52 ID=0 PROTO=ICMP TYPE=0 CODE=0 ID=5093 SEQ=357
Apr 23 09:05:12 First kernel: [82911.815011] TRACE: raw:PREROUTING:rule:7 IN=eth3 OUT= MAC=54:04:a6:f3:ad:d4:00:26:88:d6:67:c0:08:00 SRC=8.8.8.8 DST=95.*.*.* LEN=84 TOS=0x00 PREC=0x00 TTL=52 ID=0 PROTO=ICMP TYPE=0 CODE=0 ID=5093 SEQ=357
Apr 23 09:05:12 First kernel: [82911.819337] TRACE: raw:PREROUTING:policy:8 IN=eth3 OUT= MAC=54:04:a6:f3:ad:d4:00:26:88:d6:67:c0:08:00 SRC=8.8.8.8 DST=95.*.*.* LEN=84 TOS=0x00 PREC=0x00 TTL=52 ID=0 PROTO=ICMP TYPE=0 CODE=0 ID=5093 SEQ=357
Apr 23 09:05:12 First kernel: [82911.823669] TRACE: mangle:PREROUTING:policy:2 IN=eth3 OUT= MAC=54:04:a6:f3:ad:d4:00:26:88:d6:67:c0:08:00 SRC=8.8.8.8 DST=95.*.*.* LEN=84 TOS=0x00 PREC=0x00 TTL=52 ID=0 PROTO=ICMP TYPE=0 CODE=0 ID=5093 SEQ=357

C 192.168.1.16 пинг не идет:

ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.

--- 8.8.8.8 ping statistics ---
462 packets transmitted, 0 received, 100% packet loss, time 461476ms
traceroute 8.8.8.8
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
 1  * * *
 2  95.*.*.* (95.*.*.*)  741.599 ms  741.593 ms  741.586 ms
 3  * * *
 4  * * *
 5  * * *
 6  * * *
 7  * * *
95.*.*.* - это шлюз Ростелекома, т.е. попадает в правильную таблицу.

Наверное, надо переходить на CONNMARK

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

с -j connmark судя по логам маркировка работает

Apr 23 10:00:19 First kernel: [86218.572028] TRACE: mangle:POSTROUTING:rule:1 IN= OUT=eth3 SRC=192.168.1.16 DST=8.8.8.8 LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=0 DF PROTO=ICMP TYPE=8 CODE=0 ID=22941 SEQ=90 MARK=0x3
Apr 23 10:00:19 First kernel: [86218.576356] TRACE: mangle:POSTROUTING:policy:2 IN= OUT=eth3 SRC=192.168.1.16 DST=8.8.8.8 LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=0 DF PROTO=ICMP TYPE=8 CODE=0 ID=22941 SEQ=90 MARK=0x3
Apr 23 10:00:19 First kernel: [86218.732931] TRACE: mangle:FORWARD:rule:2 IN=vlan228 OUT=eth0 MAC=54:04:a6:f3:ad:d3:00:1f:ca:f5:4f:1a:08:00 SRC=8.8.8.8 DST=192.168.1.16 LEN=84 TOS=0x04 PREC=0x20 TTL=49 ID=0 PROTO=ICMP TYPE=0 CODE=0 ID=22941 SEQ=90 MARK=0x3
Apr 23 10:00:19 First kernel: [86218.737275] TRACE: mangle:FORWARD:policy:4 IN=vlan228 OUT=eth0 MAC=54:04:a6:f3:ad:d3:00:1f:ca:f5:4f:1a:08:00 SRC=8.8.8.8 DST=192.168.1.16 LEN=84 TOS=0x04 PREC=0x20 TTL=49 ID=0 PROTO=ICMP TYPE=0 CODE=0 ID=22941 SEQ=90 MARK=0x3
Apr 23 10:00:19 First kernel: [86218.741623] TRACE: filter:FORWARD:rule:21 IN=vlan228 OUT=eth0 MAC=54:04:a6:f3:ad:d3:00:1f:ca:f5:4f:1a:08:00 SRC=8.8.8.8 DST=192.168.1.16 LEN=84 TOS=0x04 PREC=0x20 TTL=49 ID=0 PROTO=ICMP TYPE=0 CODE=0 ID=22941 SEQ=90 MARK=0x3
Apr 23 10:00:19 First kernel: [86218.745971] TRACE: mangle:POSTROUTING:policy:2 IN= OUT=eth0 SRC=8.8.8.8 DST=192.168.1.16 LEN=84 TOS=0x04 PREC=0x20 TTL=49 ID=0 PROTO=ICMP TYPE=0 CODE=0 ID=22941 SEQ=90 MARK=0x3

Но трассировка идет через таблицу main:

raceroute 8.8.8.8
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
 1  pbx (192.168.1.12)  56.761 ms * *
 2  217.*.*.* (217.*.*.*)  1323.758 ms  1323.756 ms  1323.753 ms
 3  volgattk-gw.transtelecom.net (217.150.41.245)  1323.749 ms  1323.951 ms  1323.946 ms
 4  srv15.transtelecom.net (217.150.41.246)  1323.940 ms  1323.934 ms  1324.110 ms
 5  72.14.219.177 (72.14.219.177)  1324.385 ms  1324.382 ms  1324.379 ms
 6  209.85.250.222 (209.85.250.222)  1324.378 ms  2010.033 ms 209.85.250.224 (209.85.250.224)  743.177 ms
 7  209.85.249.175 (209.85.249.175)  743.343 ms 209.85.249.77 (209.85.249.77)  1073.823 ms 209.85.249.173 (209.85.249.173)  1074.019 ms

Это не смотря на то, что

$ipt -A POSTROUTING -j SNAT --to-source 95.*.*.* -t nat -o eth3 -s 192.168.1.16

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

ох, заставил ты меня практически это попробовать. получилось сразу же. почему вечно какие-то проблемы??

вот ДВЕ команды, блин

iptables -A PREROUTING -t mangle -i eth0 -s 192.168.0.155 -p tcp --dport 5000 -j MARK --set-mark 5000
ip rule add fwmark 5000 table wan3
tcpdump -ni eth3 port 5000
12:08:44.457757 IP WAN3-IP.45823 > 87.250.250.3.5000: Flags [S], seq 3898212296, win 14600, options [mss 1460,sackOK,TS val 232904616 ecr 0,nop,wscale 7], length 0
uspen ★★★★★
()
Ответ на: комментарий от uspen

Не так все просто. Если посмотреть на мой первый пост, то можно увидеть эти самые команды, такие же как у тебя)))

Именно с этим вопросом я и написал.

Где-то криворучу, наверное. Или дело в чем-то другом Говорю же, на старом шлюзе все тоже самое работало.

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

значит проблема в том, что не возвращаются? дампи ифейсы, смотри src ip в дампе, ты ДОЛЖЕН видеть приходящие пакеты. Другое дело, если они приходят, но не доходят до хоста в локалке.
ты проверил rp_filter как я писал выше?

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

только что попробовал еще раз, все возвращается.

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

Точно! Это бы rp filter! наверное, будет вопрос: почему я тупил и сразу не проверил? Просто у меня не сало интерфейсов:

ls -l /proc/sys/net/ipv4/conf/
dr-xr-xr-x 0 root root 0 апр.  22 10:03 all
dr-xr-xr-x 0 root root 0 апр.  22 10:03 default
dr-xr-xr-x 0 root root 0 апр.  22 10:03 eth0
dr-xr-xr-x 0 root root 0 апр.  22 10:03 eth1
dr-xr-xr-x 0 root root 0 апр.  22 10:03 eth2
dr-xr-xr-x 0 root root 0 апр.  22 10:03 eth3
dr-xr-xr-x 0 root root 0 апр.  23 13:07 eth4
dr-xr-xr-x 0 root root 0 апр.  23 13:07 eth5
dr-xr-xr-x 0 root root 0 апр.  23 13:07 eth6
dr-xr-xr-x 0 root root 0 апр.  23 13:07 eth7
dr-xr-xr-x 0 root root 0 апр.  23 13:07 eth8
dr-xr-xr-x 0 root root 0 апр.  23 13:07 eth9
dr-xr-xr-x 0 root root 0 апр.  22 10:03 lo
dr-xr-xr-x 0 root root 0 апр.  23 13:07 tun0
dr-xr-xr-x 0 root root 0 апр.  23 13:07 virbr0
dr-xr-xr-x 0 root root 0 апр.  22 10:03 vlan107
dr-xr-xr-x 0 root root 0 апр.  22 10:03 vlan110
dr-xr-xr-x 0 root root 0 апр.  22 10:03 vlan141
dr-xr-xr-x 0 root root 0 апр.  22 10:03 vlan143
dr-xr-xr-x 0 root root 0 апр.  22 10:03 vlan144
dr-xr-xr-x 0 root root 0 апр.  22 10:03 vlan150
dr-xr-xr-x 0 root root 0 апр.  22 10:03 vlan152
dr-xr-xr-x 0 root root 0 апр.  22 10:03 vlan157
dr-xr-xr-x 0 root root 0 апр.  22 10:03 vlan158
dr-xr-xr-x 0 root root 0 апр.  23 13:07 vlan159
dr-xr-xr-x 0 root root 0 апр.  22 10:03 vlan161
dr-xr-xr-x 0 root root 0 апр.  22 10:03 vlan162
dr-xr-xr-x 0 root root 0 апр.  22 10:03 vlan163
dr-xr-xr-x 0 root root 0 апр.  22 10:03 vlan228
dr-xr-xr-x 0 root root 0 апр.  22 10:03 vlan4000

Отдельные-то я проверял, а надо было сделать:

for i in /proc/sys/net/ipv4/conf/*/rp_filter ;
do
  echo 0 > $i
done

Спасибо за подсказку!

adxfighter
() автор топика
Ответ на: комментарий от vel
iptables -t raw -A PREROUTING -s 10.0.0.124 -j TRACE

это дело ооочень сильно тормозит систему

Пинг до ШЛЮЗА взлетел до 100 мс!

Весь день разбирался, что случилось.

Потом догадался сделать:

iptables -F -t raw

И все ожило!

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

Проверил, без CONNMARK не работает. А с CONNMARK завелось!

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