The OpenNET Project / Index page

[ новости/++ | форум | wiki | теги | ]



"Помогите перенеаправить DNS на другой интерфейс"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Открытые системы на сервере (Маршрутизация, NAT)
Изначальное сообщение [ Отслеживать ]

"Помогите перенеаправить DNS на другой интерфейс"  +/
Сообщение от AMatvey email(ok) on 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

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

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Помогите перенеаправить DNS на другой интерфейс"  +/
Сообщение от qq (??) on 05-Мрт-18, 13:46 
у тебя 2 прова. они могут иметь разные адреса для например гугла. днс гугла в свою очередь может отдавать разные адреса для твоих провов. лучше днс пусть ходит через тот же, что и трафик.
не маркируй. не нужно.
iptables разреши ходить на айпи днс порт 53.
iptables запрети ходить на порт 53
iproute для ip днс пропиши маршрут ходить через вторую сетевую.
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "Помогите перенеаправить DNS на другой интерфейс"  +/
Сообщение от AMatvey email(ok) on 05-Мрт-18, 14:04 
Этот вариант я рассматривал - не подходит.
Может как-нибудь можно без статических маршрутов?
Что у меня в конфигах не так? Где я "лоханулся"?
У кого-то ведь работает: https://unix.stackexchange.com/questions/21093/output-traffi... , но не у меня.
Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

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

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


Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

5. "Помогите перенеаправить DNS на другой интерфейс"  +/
Сообщение от qq (??) on 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

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

7. "Помогите перенеаправить DNS на другой интерфейс"  +/
Сообщение от Pahanivo (ok) on 06-Мрт-18, 08:54 
> Этот вариант я рассматривал - не подходит.

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

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

6. "Помогите перенеаправить DNS на другой интерфейс"  +1 +/
Сообщение от reader (ok) on 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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

9. "Помогите перенеаправить DNS на другой интерфейс"  +/
Сообщение от AMatvey email(ok) on 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

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

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


Ответить | Правка | ^ к родителю #9 | Наверх | Cообщить модератору

12. "Помогите перенеаправить DNS на другой интерфейс"  +/
Сообщение от AMatvey email(ok) on 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 это не актуально. Для меня очистка ничего не дала.

Ответить | Правка | ^ к родителю #11 | Наверх | Cообщить модератору

13. "Помогите перенеаправить DNS на другой интерфейс"  +/
Сообщение от reader (ok) on 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 это не актуально. Для
> меня очистка ничего не дала.

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

Ответить | Правка | ^ к родителю #12 | Наверх | Cообщить модератору

15. "Помогите перенеаправить DNS на другой интерфейс"  +/
Сообщение от AMatvey email(ok) on 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

Ответить | Правка | ^ к родителю #13 | Наверх | Cообщить модератору

8. "Помогите перенеаправить DNS на другой интерфейс"  +/
Сообщение от fantom (??) on 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 соорудить

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

10. "Помогите перенеаправить DNS на другой интерфейс"  +/
Сообщение от AMatvey email(ok) on 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
В чем разница? Что я не так сделал, что в статье работает, а у меня нет?

Ответить | Правка | ^ к родителю #8 | Наверх | Cообщить модератору

14. "Помогите перенеаправить DNS на другой интерфейс"  +/
Сообщение от eRIC (ok) on 06-Мрт-18, 14:56 

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

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


Ответить | Правка | ^ к родителю #10 | Наверх | Cообщить модератору

16. "Помогите перенеаправить DNS на другой интерфейс"  +/
Сообщение от AMatvey email(ok) on 06-Мрт-18, 16:20 
>> В чем разница? Что я не так сделал, что в статье работает,
>> а у меня нет?
> а вы уверены что в статье описанное работает? вы воспроизводили?

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

Ответить | Правка | ^ к родителю #14 | Наверх | Cообщить модератору

17. "Помогите перенеаправить DNS на другой интерфейс"  +1 +/
Сообщение от eRIC (ok) on 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 ваша_таблица

Ответить | Правка | ^ к родителю #16 | Наверх | Cообщить модератору

18. "Помогите перенеаправить DNS на другой интерфейс"  +/
Сообщение от AMatvey email(ok) on 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.

Ответить | Правка | ^ к родителю #17 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #18 | Наверх | Cообщить модератору

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

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

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


Ответить | Правка | ^ к родителю #19 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема


  Закладки на сайте
  Проследить за страницей
Created 1996-2018 by Maxim Chirkov  
ДобавитьПоддержатьВебмастеруГИД  
Hosting by Ihor