URL: https://www.opennet.dev/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 97151
[ Назад ]

Исходное сообщение
"Помогите перенеаправить DNS на другой интерфейс"

Отправлено AMatvey , 05-Мрт-18 10:18 
Доброе время суток.
Помогите разобраться, гугл уже замучил...
Есть комп с 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

Может кто сталкивался с таким? Очень нужно!


Содержание

Сообщения в этом обсуждении
"Помогите перенеаправить DNS на другой интерфейс"
Отправлено qq , 05-Мрт-18 13:46 
у тебя 2 прова. они могут иметь разные адреса для например гугла. днс гугла в свою очередь может отдавать разные адреса для твоих провов. лучше днс пусть ходит через тот же, что и трафик.
не маркируй. не нужно.
iptables разреши ходить на айпи днс порт 53.
iptables запрети ходить на порт 53
iproute для ip днс пропиши маршрут ходить через вторую сетевую.

"Помогите перенеаправить DNS на другой интерфейс"
Отправлено qq , 05-Мрт-18 14:01 
> у тебя 2 прова. они могут иметь разные адреса для например гугла.
> днс гугла в свою очередь может отдавать разные адреса для твоих
> провов. лучше днс пусть ходит через тот же, что и трафик.
> не маркируй. не нужно.
> iptables разреши ходить на айпи днс порт 53.
> iptables запрети ходить на порт 53
> iproute для ip днс пропиши маршрут ходить через вторую сетевую.

или еще проще
ip rule add to 8.8.8.8 table t_181


"Помогите перенеаправить DNS на другой интерфейс"
Отправлено AMatvey , 05-Мрт-18 14:04 
Этот вариант я рассматривал - не подходит.
Может как-нибудь можно без статических маршрутов?
Что у меня в конфигах не так? Где я "лоханулся"?
У кого-то ведь работает: https://unix.stackexchange.com/questions/21093/output-traffi... , но не у меня.

"Помогите перенеаправить DNS на другой интерфейс"
Отправлено qq , 05-Мрт-18 17:16 
> Этот вариант я рассматривал - не подходит.
> Может как-нибудь можно без статических маршрутов?
> Что у меня в конфигах не так? Где я "лоханулся"?
> У кого-то ведь работает: https://unix.stackexchange.com/questions/21093/output-traffi...
> , но не у меня.

там другая история. там комп как маршрутизатор. нат форвард и тд.



"Помогите перенеаправить DNS на другой интерфейс"
Отправлено qq , 05-Мрт-18 17:43 
>> Этот вариант я рассматривал - не подходит.
>> Может как-нибудь можно без статических маршрутов?
>> Что у меня в конфигах не так? Где я "лоханулся"?
>> У кого-то ведь работает: 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


"Помогите перенеаправить DNS на другой интерфейс"
Отправлено Pahanivo , 06-Мрт-18 08:54 
> Этот вариант я рассматривал - не подходит.

А какая конечная цель этого мозгосношательства?


"Помогите перенеаправить DNS на другой интерфейс"
Отправлено reader , 05-Мрт-18 18:49 

> # 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


"Помогите перенеаправить DNS на другой интерфейс"
Отправлено AMatvey , 06-Мрт-18 11:06 
>> # 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


"Помогите перенеаправить DNS на другой интерфейс"
Отправлено reader , 06-Мрт-18 12:29 
вы запускали tcpdump на разных интерфейсах или с -i any?
Так же посмотрите счетчик на правиле iptables. И не забывайте кеш маршрутизации чистить.



"Помогите перенеаправить DNS на другой интерфейс"
Отправлено AMatvey , 06-Мрт-18 13:43 
> вы запускали 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 это не актуально. Для меня очистка ничего не дала.


"Помогите перенеаправить DNS на другой интерфейс"
Отправлено reader , 06-Мрт-18 14:14 
>> вы запускали 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 это не актуально. Для
> меня очистка ничего не дала.

В смысле не актуально? Там не кешируются маршруты?


"Помогите перенеаправить DNS на другой интерфейс"
Отправлено AMatvey , 06-Мрт-18 16:17 
> а как при -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


"Помогите перенеаправить DNS на другой интерфейс"
Отправлено fantom , 06-Мрт-18 10:50 
>[оверквотинг удален]
> 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 соорудить


"Помогите перенеаправить DNS на другой интерфейс"
Отправлено AMatvey , 06-Мрт-18 11:50 
> 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
В чем разница? Что я не так сделал, что в статье работает, а у меня нет?


"Помогите перенеаправить DNS на другой интерфейс"
Отправлено eRIC , 06-Мрт-18 14:56 

> В чем разница? Что я не так сделал, что в статье работает,
> а у меня нет?

а вы уверены что в статье описанное работает? вы воспроизводили?



"Помогите перенеаправить DNS на другой интерфейс"
Отправлено AMatvey , 06-Мрт-18 16:20 
>> В чем разница? Что я не так сделал, что в статье работает,
>> а у меня нет?
> а вы уверены что в статье описанное работает? вы воспроизводили?

Если бы подобная статья была одна - я бы усомнился. Гугл находит подобные статьи, отсюда делаю вывод, что у кого-то оно работает.


"Помогите перенеаправить DNS на другой интерфейс"
Отправлено eRIC , 06-Мрт-18 16:43 
> Если бы подобная статья была одна - я бы усомнился. Гугл находит
> подобные статьи, отсюда делаю вывод, что у кого-то оно работает.

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

пробуйте:
#iptables -A PREROUTING -t mangle -p udp --dport 53 -j MARK --set-mark 100
#ip rule add pri число_приорита fwmark 100 table ваша_таблица


"Помогите перенеаправить DNS на другой интерфейс"
Отправлено AMatvey , 06-Мрт-18 19:00 
> значит сами плохо изучили 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.


"Помогите перенеаправить DNS на другой интерфейс"
Отправлено eRIC , 07-Мрт-18 07:23 
> Спасибо за ответ, он и ответ reader'a натолкнул меня на решение.
> Однако хочу заметить, что от локальных процессов цепочка PREROUTING в таблице mangle
> не задействуется. Работает OUTPUT.

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


"Помогите перенеаправить DNS на другой интерфейс"
Отправлено AMatvey , 06-Мрт-18 19:08 
Спасибо всем за ответы!
Решение таково:
Вся конфигурация описанная в вопросе осталась такой же за одним исключением:
Для того, чтобы пакет udp попал в другой интерфейс (ens36) переписал правила таким образом, чтобы
правило для пакета с соответствующей меткой имело меньший номер. Собственно, как и советовал reader. Все заработало после этого изменения и очистки кэша маршрутов.
Таким образом в исходной конфигурации выполнил:
# ip rule add from all fwmark 0x2 lookup t_181
# ip route flush cache
И заработало!
Еще раз спасибо всем ответившим!

"Помогите перенеаправить DNS на другой интерфейс"
Отправлено Pahanivo , 07-Мрт-18 10:47 
> Для того, чтобы пакет udp попал в другой интерфейс (ens36) переписал правила

Поздравляемс!
Осталось осознать что DNS еще и по TCP работает и наступит шаааастье!