Доброе время суток.
Помогите разобраться, гугл уже замучил...
Есть комп с Centos 7 с двумя сетевыми картами. Соответственно два канала в интернет.
Задача: весь трафик пускать по одному каналу, а DNS по другому.
Сейчас настроено так (пакеты не уходят в нужный интерфейс и, видимо поэтому, [bad udp cksum 0x109a -> 0x7832!]):
# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens35: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:b9:39:6c brd ff:ff:ff:ff:ff:ff
inet 192.168.133.181/24 brd 192.168.133.255 scope global ens35
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:feb9:396c/64 scope link
valid_lft forever preferred_lft forever
3: ens36: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:b9:39:76 brd ff:ff:ff:ff:ff:ff
inet 192.168.132.20/24 brd 192.168.132.255 scope global ens36
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:feb9:3976/64 scope link
valid_lft forever preferred_lft forever#!/bin/bash
IPT=/sbin/iptables
IPTS=/sbin/iptables-save
ext_ip1="192.168.133.181"
ext_ip2="192.168.132.20"
$IPT -F
$IPT -t nat -F
$IPT -t mangle -F
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
### STATE RULES
$IPT -A INPUT -m state --state INVALID -j DROP
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
### LOCALHOST
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT
### DNS
$IPT -A INPUT -p udp --sport 53 -j ACCEPT
$IPT -A OUTPUT -p udp --dport 53 -j ACCEPT
### ICMP
$IPT -A INPUT -p icmp -j ACCEP
$IPT -A OUTPUT -p icmp -j ACCEP
### SSH
$IPT -A INPUT -p tcp --dport 22 -j ACCEPT
$IPT -A OUTPUT -p tcp --sport 22 -j ACCEPT
$IPT -t mangle -A OUTPUT -p udp --dport 53 -j MARK --set-mark 2
$IPT -t nat -A POSTROUTING -o ens35 -j SNAT --to $ext_ip1
$IPT -t nat -A POSTROUTING -o ens36 -j SNAT --to $ext_ip2
$IPTS > /etc/sysconfig/iptables# ip route list
default via 192.168.132.130 dev ens36
127.0.0.0/8 dev lo scope link src 127.0.0.1
169.254.0.0/16 dev ens35 scope link metric 1002
169.254.0.0/16 dev ens36 scope link metric 1003
192.168.132.0/24 dev ens36 proto kernel scope link src 192.168.132.20
192.168.133.0/24 dev ens35 proto kernel scope link src 192.168.133.181# ip route list table t_181
default via 192.168.133.131 dev ens35
127.0.0.0/8 dev lo scope link src 127.0.0.1
192.168.133.0/24 dev ens35 proto kernel scope link src 192.168.133.181# ip route list table t_20
default via 192.168.132.130 dev ens36
192.168.132.0/24 dev ens36 proto kernel scope link src 192.168.132.20
192.168.133.0/24 dev ens35 proto kernel scope link src 192.168.133.181# ip rule list
0: from all lookup local
32762: from all fwmark 0x1 lookup t_20
32763: from 192.168.132.20 lookup t_20
32764: from all fwmark 0x2 lookup t_181
32765: from 192.168.133.181 lookup t_181
32766: from all lookup main
32767: from all lookup default# sysctl -a|grep rp_filter
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.ens35.stable_secret"
net.ipv4.conf.all.arp_filter = 0
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.arp_filter = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.ens35.arp_filter = 0
net.ipv4.conf.ens35.rp_filter = 0
net.ipv4.conf.ens36.arp_filter = 0
net.ipv4.conf.ens36.rp_filter = 0
net.ipv4.conf.lo.arp_filter = 0
net.ipv4.conf.lo.rp_filter = 0
sysctl: reading key "net.ipv6.conf.ens36.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"ping ya.ru
# tcpdump -i any udp port 53 -nn -vv
tcpdump: listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
13:53:33.832951 IP (tos 0x0, ttl 64, id 14782, offset 0, flags [DF], proto UDP (17), length 51)
192.168.132.20.39072 > 192.168.11.4.53: [bad udp cksum 0x109a -> 0x7832!] 1357+ A? ya.ru. (23)
13:53:33.840414 IP (tos 0x0, ttl 127, id 16365, offset 0, flags [DF], proto UDP (17), length 67)
192.168.11.4.53 > 192.168.132.20.39072: [udp sum ok] 1357 q: A? ya.ru. 1/0/0 ya.ru. A 87.250.250.242 (39)
^C
2 packets captured
2 packets received by filter
0 packets dropped by kernelМожет кто сталкивался с таким? Очень нужно!
у тебя 2 прова. они могут иметь разные адреса для например гугла. днс гугла в свою очередь может отдавать разные адреса для твоих провов. лучше днс пусть ходит через тот же, что и трафик.
не маркируй. не нужно.
iptables разреши ходить на айпи днс порт 53.
iptables запрети ходить на порт 53
iproute для ip днс пропиши маршрут ходить через вторую сетевую.
> у тебя 2 прова. они могут иметь разные адреса для например гугла.
> днс гугла в свою очередь может отдавать разные адреса для твоих
> провов. лучше днс пусть ходит через тот же, что и трафик.
> не маркируй. не нужно.
> iptables разреши ходить на айпи днс порт 53.
> iptables запрети ходить на порт 53
> iproute для ip днс пропиши маршрут ходить через вторую сетевую.или еще проще
ip rule add to 8.8.8.8 table t_181
Этот вариант я рассматривал - не подходит.
Может как-нибудь можно без статических маршрутов?
Что у меня в конфигах не так? Где я "лоханулся"?
У кого-то ведь работает: https://unix.stackexchange.com/questions/21093/output-traffi... , но не у меня.
> Этот вариант я рассматривал - не подходит.
> Может как-нибудь можно без статических маршрутов?
> Что у меня в конфигах не так? Где я "лоханулся"?
> У кого-то ведь работает: https://unix.stackexchange.com/questions/21093/output-traffi...
> , но не у меня.там другая история. там комп как маршрутизатор. нат форвард и тд.
>> Этот вариант я рассматривал - не подходит.
>> Может как-нибудь можно без статических маршрутов?
>> Что у меня в конфигах не так? Где я "лоханулся"?
>> У кого-то ведь работает: https://unix.stackexchange.com/questions/21093/output-traffi...
>> , но не у меня.
> там другая история. там комп как маршрутизатор. нат форвард и тд.попробуй убери
$IPT -t nat -A POSTROUTING -o ens35 -j SNAT --to $ext_ip1
$IPT -t nat -A POSTROUTING -o ens36 -j SNAT --to $ext_ip2
> Этот вариант я рассматривал - не подходит.А какая конечная цель этого мозгосношательства?
> # ip rule list
> 0: from all lookup local
> 32762: from all fwmark 0x1 lookup t_20
> 32763: from 192.168.132.20 lookup t_20
> 32764: from all fwmark 0x2 lookup t_181
> 32765: from 192.168.133.181 lookup t_181
> 32766: from all lookup main
> 32767: from all lookup defaultпоменяйте местами правила 32763 и 32764
>> # ip rule list
>> 0: from all lookup local
>> 32762: from all fwmark 0x1 lookup t_20
>> 32763: from 192.168.132.20 lookup t_20
>> 32764: from all fwmark 0x2 lookup t_181
>> 32765: from 192.168.133.181 lookup t_181
>> 32766: from all lookup main
>> 32767: from all lookup default
> поменяйте местами правила 32763 и 32764Поменял - не помогло. те же ошибочные пакеты. Интерфейс не поменялся.
# ip rule list
0: from all lookup local
32762: from all fwmark 0x1 lookup t_20
32763: from all fwmark 0x2 lookup t_181
32764: from 192.168.132.20 lookup t_20
32765: from 192.168.133.181 lookup t_181
32766: from all lookup main
32767: from all lookup default
вы запускали tcpdump на разных интерфейсах или с -i any?
Так же посмотрите счетчик на правиле iptables. И не забывайте кеш маршрутизации чистить.
> вы запускали tcpdump на разных интерфейсах или с -i any?
> Так же посмотрите счетчик на правиле iptables. И не забывайте кеш маршрутизации
> чистить.Запускал tcpdump на разных интерфейсах, но это не удобно. Поскольку нагрузки сейчас нет, то мне удобнее на -i any.
Счетчик меняется.
Перед:
# iptables -nvL
Chain INPUT (policy DROP 8 packets, 938 bytes)
pkts bytes target prot opt in out source destination
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 state INVALID
...
Chain OUTPUT (policy DROP 1596 packets, 121K bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- * lo 0.0.0.0/0 0.0.0.0/0
183 10327 ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:53
2 168 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
После:
# iptables -nvL
Chain INPUT (policy DROP 8 packets, 938 bytes)
pkts bytes target prot opt in out source destination
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 state INVALID
...
Chain OUTPUT (policy DROP 1967 packets, 149K bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- * lo 0.0.0.0/0 0.0.0.0/0
185 10429 ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:53
3 252 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
spt:22Что касается кэша, вроде бы для Centos 7 это не актуально. Для меня очистка ничего не дала.
>> вы запускали tcpdump на разных интерфейсах или с -i any?
>> Так же посмотрите счетчик на правиле iptables. И не забывайте кеш маршрутизации
>> чистить.
> Запускал tcpdump на разных интерфейсах, но это не удобно. Поскольку нагрузки сейчас
> нет, то мне удобнее на -i any.а как при -i any вы определяете через какой интерфейс идут пакеты? IP источника и исходящий интерфейс это не одно и тоже.
здесь нет правила маркировки, а вить смотреть нужно было его.
iptables-save -c>[оверквотинг удален]
> 0.0.0.0/0
> 0.0.0.0/0
> udp dpt:53
> 3 252 ACCEPT
> icmp -- * *
> 0.0.0.0/0
> 0.0.0.0/0
> spt:22
> Что касается кэша, вроде бы для Centos 7 это не актуально. Для
> меня очистка ничего не дала.В смысле не актуально? Там не кешируются маршруты?
> а как при -i any вы определяете через какой интерфейс идут пакеты?
> IP источника и исходящий интерфейс это не одно и тоже.Вы правы. По началу я действительно смотрел на конкретных интерфейсах. Поскольку ситуация не менялась решил смотреть на -i any. Но не суть... Вы натолкнули меня на непонятку:
ping ya.ru
# tcpdump -i ens35 udp port 53 -nn -vv
tcpdump: listening on ens35, link-type EN10MB (Ethernet), capture size 262144 bytes
18:57:37.465114 IP (tos 0x0, ttl 64, id 29497, offset 0, flags [DF], proto UDP (17), length 51)
192.168.132.20.49293 > 192.168.11.4.53: [udp sum ok] 51838+ A? ya.ru. (23)
18:57:37.473301 IP (tos 0x0, ttl 127, id 2093, offset 0, flags [DF], proto UDP (17), length 67)
192.168.11.4.53 > 192.168.132.20.49293: [udp sum ok] 51838 q: A? ya.ru. 1/0/0 ya.ru. A 87.250.250.242 (39)
^C
2 packets captured
2 packets received by filter
0 packets dropped by kernelа теперь еще раз тоже самое:
# tcpdump -i ens36 udp port 53 -nn -vv
tcpdump: listening on ens36, link-type EN10MB (Ethernet), capture size 262144 bytes
18:57:55.221887 IP (tos 0x0, ttl 64, id 42904, offset 0, flags [DF], proto UDP (17), length 51)
192.168.132.20.45533 > 192.168.11.4.53: [bad udp cksum 0x109a -> 0x4f50!] 5362+ A? ya.ru. (23)
18:57:55.222711 IP (tos 0x0, ttl 127, id 3520, offset 0, flags [DF], proto UDP (17), length 67)
192.168.11.4.53 > 192.168.132.20.45533: [udp sum ok] 5362 q: A? ya.ru. 1/0/0 ya.ru. A 87.250.250.242 (39)
Как так?> здесь нет правила маркировки, а вить смотреть нужно было его.
# iptables-save -c меняется с обращением к DNS
[9:573] -A OUTPUT -p udp -m udp --dport 53 -j ACCEPT
:POSTROUTING ACCEPT [63:10049]
[9:573] -A OUTPUT -p udp -m udp --dport 53 -j MARK --set-xmark 0x2/0xffffffff
>[оверквотинг удален]
> 0x7832!] 1357+ A? ya.ru. (23)
> 13:53:33.840414 IP (tos 0x0, ttl 127, id 16365, offset 0, flags [DF],
> proto UDP (17), length 67)
> 192.168.11.4.53 > 192.168.132.20.39072: [udp sum ok] 1357 q:
> A? ya.ru. 1/0/0 ya.ru. A 87.250.250.242 (39)
> ^C
> 2 packets captured
> 2 packets received by filter
> 0 packets dropped by kernel
> Может кто сталкивался с таким? Очень нужно!https://habrahabr.ru/post/108690/
или VRF-light соорудить
> https://habrahabr.ru/post/108690/
> или VRF-light соорудитьНу вроде бы я так и сделал как в статье:
Допустим нам нужно, чтобы пакеты на 80 порт уходили только через 11.22.33.1. Для этого делаем следующее:
# iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 80 -j MARK --set-mark 0x2
# ip route add default via 11.22.33.1 dev eth0 table 102
# ip rule add fwmark 0x2/0x2 lookup 102
А у меня:
$IPT -t mangle -A OUTPUT -p udp --dport 53 -j MARK --set-mark 2
# ip route list table t_181
default via 192.168.133.131 dev ens35
...
192.168.133.0/24 dev ens35 proto kernel scope link src 192.168.133.181
# ip rule list
0: from all lookup local
...
32764: from all fwmark 0x2 lookup t_181
В чем разница? Что я не так сделал, что в статье работает, а у меня нет?
> В чем разница? Что я не так сделал, что в статье работает,
> а у меня нет?а вы уверены что в статье описанное работает? вы воспроизводили?
>> В чем разница? Что я не так сделал, что в статье работает,
>> а у меня нет?
> а вы уверены что в статье описанное работает? вы воспроизводили?Если бы подобная статья была одна - я бы усомнился. Гугл находит подобные статьи, отсюда делаю вывод, что у кого-то оно работает.
> Если бы подобная статья была одна - я бы усомнился. Гугл находит
> подобные статьи, отсюда делаю вывод, что у кого-то оно работает.значит сами плохо изучили Policy Routing и ориентируетесь на возможно нерабочие, неподходящие или старые статье в сети Интернет.
пробуйте:
#iptables -A PREROUTING -t mangle -p udp --dport 53 -j MARK --set-mark 100
#ip rule add pri число_приорита fwmark 100 table ваша_таблица
> значит сами плохо изучили Policy Routing и ориентируетесь на возможно нерабочие, неподходящие
> или старые статье в сети Интернет.Возможно это и так. Если бы я знал вопрос в совершенстве, то не задавал бы здесь вопросов.
> пробуйте:
> #iptables -A PREROUTING -t mangle -p udp --dport 53 -j MARK --set-mark
> 100
> #ip rule add pri число_приорита fwmark 100 table ваша_таблицаСпасибо за ответ, он и ответ reader'a натолкнул меня на решение.
Однако хочу заметить, что от локальных процессов цепочка PREROUTING в таблице mangle не задействуется. Работает OUTPUT.
> Спасибо за ответ, он и ответ reader'a натолкнул меня на решение.
> Однако хочу заметить, что от локальных процессов цепочка PREROUTING в таблице mangle
> не задействуется. Работает OUTPUT.верно, только для траффика из самого хоста, ну если вы дальше конечно этот хост не превратите в шлюз.
Спасибо всем за ответы!
Решение таково:
Вся конфигурация описанная в вопросе осталась такой же за одним исключением:
Для того, чтобы пакет udp попал в другой интерфейс (ens36) переписал правила таким образом, чтобы
правило для пакета с соответствующей меткой имело меньший номер. Собственно, как и советовал reader. Все заработало после этого изменения и очистки кэша маршрутов.
Таким образом в исходной конфигурации выполнил:
# ip rule add from all fwmark 0x2 lookup t_181
# ip route flush cache
И заработало!
Еще раз спасибо всем ответившим!
> Для того, чтобы пакет udp попал в другой интерфейс (ens36) переписал правилаПоздравляемс!
Осталось осознать что DNS еще и по TCP работает и наступит шаааастье!