Решено: Пренаправление http трафика (на второй (из двух) внешних каналов)
Модераторы: SLEDopit, Модераторы разделов
-
fjey
- Сообщения: 26
- ОС: Ubuntu 8.04 LTS
Решено: Пренаправление http трафика
Доброго времени суток, уважаемые.
Чтобы не утомлять текстом ни вас ни себя, напишу кратко.
Задача:
Перенаправить трафик, идущий на порты 53,80,443... на eth2. При этом особо не заморачиваясь и без сквида.
Условия:
OS: Ubuntu
два внешних интерфейса, допустим eth1 (основной) и eth2 (только для серфинга), с соответствующими GW(n)_IP.
На данный момент маршрутизация настроена таким образом что с помощью iptables SNAT трафик уходит в internet через eth1.
Спасибо.
Чтобы не утомлять текстом ни вас ни себя, напишу кратко.
Задача:
Перенаправить трафик, идущий на порты 53,80,443... на eth2. При этом особо не заморачиваясь и без сквида.
Условия:
OS: Ubuntu
два внешних интерфейса, допустим eth1 (основной) и eth2 (только для серфинга), с соответствующими GW(n)_IP.
На данный момент маршрутизация настроена таким образом что с помощью iptables SNAT трафик уходит в internet через eth1.
Спасибо.
-
ALexhha
- Сообщения: 109
Re: Решено: Пренаправление http трафика
Перенаправить трафик, идущий на порты 53,80,443... на eth2.
А зачем его перенаправлять, есл можно маршрутизировать?
Помечаем весь трафик, который мы хотим пускать через eth2
# iptables -A PREROUTING -t mangle -i eth0 -p tcp -m multiport --dport 53,80,443 -j MARK --set-mark 2
На основе метки маршрутизируем трафик через определенное устройство
# echo 200 eth2-out >> /etc/iproute2/rt_tables
# ip rule add fwmark 2 table eth2-out
# ip route add default via xxx.xxx.xxx.xxx dev eth2 table eth2-out
# ip route add default via yyy.yyy.yyy.yyy dev eth1
# ip route flush cache
При этом особо не заморачиваясь и без сквида.
сквид тут тебе и не поможет, точнее только отчасти.
Спасибо сказали:
-
fjey
- Сообщения: 26
- ОС: Ubuntu 8.04 LTS
Re: Решено: Пренаправление http трафика
Совет для неопытных сисадминов -- мои грабли:
Не забывайте что вышеописанный способ задаёт маршрут пакету, но не более того. Может быть и в вашем случае дальнейший шлюз пропускает пакеты только с вашего IP-адреса. Так что не забываем добавить соответствующие правила в, например, iptables.
Не забывайте что вышеописанный способ задаёт маршрут пакету, но не более того. Может быть и в вашем случае дальнейший шлюз пропускает пакеты только с вашего IP-адреса. Так что не забываем добавить соответствующие правила в, например, iptables.
-
ALexhha
- Сообщения: 109
Re: Решено: Пренаправление http трафика
Используя connmark маркируется только первый пакет из соединения, все остальные идут через этот же шлюз. Или ты что то другое имел ввиду? И какие правила iptables?
-
fjey
- Сообщения: 26
- ОС: Ubuntu 8.04 LTS
Re: Решено: Пренаправление http трафика
я имел ввиду что пакеты хоть и уходят по нужному пути и через нужный интерфейс, но они всё равно не попадают в internet из-за того что дальнейший шлюз пропускает пакеты только с моего IP-адреса. В данном случае помог SNAT.
-
pelmen
- Сообщения: 1268
- ОС: debian
Re: Решено: Пренаправление http трафика
это очевидно
Можно попросить Вас рассказать про эти строчки подробнее (зачем они и что без них не получится), а то я не силен в этом, а познать хочется.
-
ALexhha
- Сообщения: 109
Re: Решено: Пренаправление http трафика
# echo 200 eth2-out >> /etc/iproute2/rt_tables
создаем таблицу eth2-out
# ip rule add fwmark 2 table eth2-out
все пакеты с меткой 2 направляем в таблицу eth2-out (заставляем уходить через нужный нам канал)
# ip route flush cache
сбрасываем кеш
http://www.opennet.ru/docs/RUS/LARTC/ - советую прочитать
А эту картинку держать у себя перед глазами для понимания работы iptables + iproute http://l7-filter.sourceforge.net/PacketFlow.png
-
pelmen
- Сообщения: 1268
- ОС: debian
Re: Решено: Пренаправление http трафика
Картинку я вроде как понимаю (держу перед глазами), а вот про правила (таблицы) не очень понимаю.
1. Что за 200 ?
2. eth2-out - это название, оно может быть произвольным?
3. нам необходимо создать таблицу, или можно воспользоваться существующими?
в этом случае все пакеты, идущие через эту (существующую) таблицу будут идти через eth2, согласно "ip route add default via xxx.xxx.xxx.xxx dev eth2 table eth2-out"?
или таблиц вообще еще нет и нам прихзодится создавать "первую"?
1. Что за 200 ?
2. eth2-out - это название, оно может быть произвольным?
3. нам необходимо создать таблицу, или можно воспользоваться существующими?
в этом случае все пакеты, идущие через эту (существующую) таблицу будут идти через eth2, согласно "ip route add default via xxx.xxx.xxx.xxx dev eth2 table eth2-out"?
или таблиц вообще еще нет и нам прихзодится создавать "первую"?
-
fjey
- Сообщения: 26
- ОС: Ubuntu 8.04 LTS
Re: Решено: Пренаправление http трафика
pelmen писал(а): ↑03.11.2009 01:04Картинку я вроде как понимаю (держу перед глазами), а вот про правила (таблицы) не очень понимаю.
1. Что за 200 ?
2. eth2-out - это название, оно может быть произвольным?
3. нам необходимо создать таблицу, или можно воспользоваться существующими?
в этом случае все пакеты, идущие через эту (существующую) таблицу будут идти через eth2, согласно "ip route add default via xxx.xxx.xxx.xxx dev eth2 table eth2-out"?
или таблиц вообще еще нет и нам прихзодится создавать "первую"?
1. 200 -- ID таблицы.
2. да
3. /etc/iproute2/rt_tables там все перечислены. По умолчанию эти:
Таблица Local (ID 255) - специальная таблица маршрутизации с самым большим
приоритетом, которая содержит таблицы для локальных и широковещательных
адресов.
Таблица Main (ID 254) - обычная таблица маршрутизации.
Таблица Default (ID 253) - пустая по умолчанию таблица.
-
fjey
- Сообщения: 26
- ОС: Ubuntu 8.04 LTS
Re: Решено: Пренаправление http трафика
Можно небольшое уточнение? Как мне быть с настройкой сети? Шлюзы вообще не прописывать нигде? я имею ввиду /etc/network/interfaces
-
pelmen
- Сообщения: 1268
- ОС: debian
Re: Решено: Пренаправление http трафика
так ID или приоритет? И на что влияет приоритет, если в разных таблицах разные маршруты? Т.е. как ни крути порядок выполнения таблиц, все равно к Васе пойдет через eth0, а к Пете через eth1. Это как если бы это были правила в цепочках iptables (например, input и forward) а с помощью приоритета можно сделать, чтобы forward выполнялся раньше input ??? Или я совсем не понимаю?
Таким образом мы можем не создавать новую таблицу, а воспользоваться существующей, например Default, раз уж она все равно пустая?
-
ALexhha
- Сообщения: 109
Re: Решено: Пренаправление http трафика
2 pelmen
документацию из принципа не читаем? Там все разжевано
документацию из принципа не читаем? Там все разжевано
-
fjey
- Сообщения: 26
- ОС: Ubuntu 8.04 LTS
Re: Решено: Пренаправление http трафика
Сделал для теста на виртуальной машине (далее сервер) следующую конфигурацию:
Да, пакеты действительно пошли на GW_IP, но там у меня правило простое:
iptables -t nat -A POSTROUTING -s IP_сервера -j MASQUERADE
Т.к. пакеты на сервере должным образом не обрабатываются, то и Gateway, разумеется, их не пропустил. По этому добавил правило на сервер (Случай 1):
iptables -t nat -A POSTROUTING -s $LAN -j SNAT --to-source IP_сервера
Результат -- интернета на клиенте нету (почему? -- пытаюсь выяснить). Но если я пропишу на Gateway-е правило (Случай 2):
iptables -t nat -A POSTROUTING -s $LAN -j MASQUERADE
-- интернет на клиенте появится.
В "случае 1" tcpdump-ом сливаю пакеты на шлюзе и на сервере. Пакеты ходят от клиента в интернет и обратно до сервера, но к клиенту не возвращаются. Почему? (forwarding разрешен)
Код: Выделить всё
# iptables -A PREROUTING -t mangle -s $LAN -j MARK --set-mark 2
# echo 200 eth2-out >> /etc/iproute2/rt_tables
# ip rule add fwmark 2 table eth2-out
# ip route add default via GW_IP dev eth2 table eth2-out
# ip route flush cacheДа, пакеты действительно пошли на GW_IP, но там у меня правило простое:
iptables -t nat -A POSTROUTING -s IP_сервера -j MASQUERADE
Т.к. пакеты на сервере должным образом не обрабатываются, то и Gateway, разумеется, их не пропустил. По этому добавил правило на сервер (Случай 1):
iptables -t nat -A POSTROUTING -s $LAN -j SNAT --to-source IP_сервера
Результат -- интернета на клиенте нету (почему? -- пытаюсь выяснить). Но если я пропишу на Gateway-е правило (Случай 2):
iptables -t nat -A POSTROUTING -s $LAN -j MASQUERADE
-- интернет на клиенте появится.
В "случае 1" tcpdump-ом сливаю пакеты на шлюзе и на сервере. Пакеты ходят от клиента в интернет и обратно до сервера, но к клиенту не возвращаются. Почему? (forwarding разрешен)
-
ALexhha
- Сообщения: 109
Re: Решено: Пренаправление http трафика
Чтобы предметно говорить, необходим вывод след команд
# ip ro sh
# ip ru sh
# ip ro sh table eth2-out
# ip ro sh
# ip ru sh
# ip ro sh table eth2-out
-
fjey
- Сообщения: 26
- ОС: Ubuntu 8.04 LTS
Re: Решено: Пренаправление http трафика
user@host:~$ ip ro sh
192.160.0.0/24 dev eth0 proto kernel scope link src IP_сервера_192.168.0.143
user@host:~$ ip ru sh
0: from all lookup local
32765: from all fwmark 0x2 lookup eth2-out
32766: from all lookup main
32767: from all lookup default
user@host:~$ ip ro sh table eth2-out
default via IP_шлюза_192.168.0.5 dev eth0
192.160.0.0/24 dev eth0 proto kernel scope link src IP_сервера_192.168.0.143
user@host:~$ ip ru sh
0: from all lookup local
32765: from all fwmark 0x2 lookup eth2-out
32766: from all lookup main
32767: from all lookup default
user@host:~$ ip ro sh table eth2-out
default via IP_шлюза_192.168.0.5 dev eth0
-
fjey
- Сообщения: 26
- ОС: Ubuntu 8.04 LTS
Re: Решено: Пренаправление http трафика
отмена. Прошу прощения, засиделся с этой проблемой намудрил там где всё просто.
[cut]
[cut]
-
ALexhha
- Сообщения: 109
-
fjey
- Сообщения: 26
- ОС: Ubuntu 8.04 LTS
Re: Решено: Пренаправление http трафика
это виртуальная машина с 1-ним интерфейсом. На данный момент работает SNAT, но пока не добавляю шлюз по умолчанию для всего сущего (route add default gw IP_GW) пакеты от клиента идут в интернет, но обратно дальше виртуальной машины не возвращаются.
-
ALexhha
- Сообщения: 109
Re: Решено: Пренаправление http трафика
Ничего не понял. Я просил показать вывод команд с машины, которая подключена к двум провайдерам, а не с виртуалки с одним интерфейсом!!!
-
pelmen
- Сообщения: 1268
- ОС: debian
-
fjey
- Сообщения: 26
- ОС: Ubuntu 8.04 LTS
Re: Решено: Пренаправление http трафика
какая разница сколько интерфейсов? Да и зачем ставить эксперименты на рабочей машине?
Есть виртуальная машинка под линуксом. Пакеты бегут на неё с клиента, а на ней работают правила, которые вы указали мне во втором сообщении этой темы (за что вам и спасибо), и никаких других правил кроме ваших и SNAT-а, как я уже говорил -- нету. Но пакеты не возвращаются к клиенту, стопорятся на сервере (уже на обратном пути). Вы не нервничайте так, я постараюсь дальше сам разобраться, вы и без того уже помогли.
Есть виртуальная машинка под линуксом. Пакеты бегут на неё с клиента, а на ней работают правила, которые вы указали мне во втором сообщении этой темы (за что вам и спасибо), и никаких других правил кроме ваших и SNAT-а, как я уже говорил -- нету. Но пакеты не возвращаются к клиенту, стопорятся на сервере (уже на обратном пути). Вы не нервничайте так, я постараюсь дальше сам разобраться, вы и без того уже помогли.
-
fjey
- Сообщения: 26
- ОС: Ubuntu 8.04 LTS
Re: Решено: Пренаправление http трафика
Во! Это даже лучше что я на виртуальной машине тестирую. Пришел к окончательному выводу что надо как-то доработать правило:
iptables -A PREROUTING -t mangle -i eth0 -p tcp -m multiport --dport 53,80,443 -j MARK --set-mark 2
Этого недостаточно. Пакеты идущие на эти порты в итоге уходят через нужный маршрут, но возвращаются они по стандартному шлюзу (проверено на рабочем сервере) или не возвращаются вообще, если стандартного шлюза нету (проверено на вирт.машинке).
К сведению, следующее правило заставляет успешного проходить пакеты в оба направления и без основного шлюза:
# ip ru add from IP_клиента table eth2-out
Так что, надо думать что делать с маркировкой. Т.к. на деле необходимо пропускать весь http (хотябы) трафик через доп. шлюз.
iptables -A PREROUTING -t mangle -i eth0 -p tcp -m multiport --dport 53,80,443 -j MARK --set-mark 2
Этого недостаточно. Пакеты идущие на эти порты в итоге уходят через нужный маршрут, но возвращаются они по стандартному шлюзу (проверено на рабочем сервере) или не возвращаются вообще, если стандартного шлюза нету (проверено на вирт.машинке).
К сведению, следующее правило заставляет успешного проходить пакеты в оба направления и без основного шлюза:
# ip ru add from IP_клиента table eth2-out
Так что, надо думать что делать с маркировкой. Т.к. на деле необходимо пропускать весь http (хотябы) трафик через доп. шлюз.
-
ALexhha
- Сообщения: 109
Re: Решено: Пренаправление http трафика
Этого недостаточно. Пакеты идущие на эти порты в итоге уходят через нужный маршрут, но возвращаются они по стандартному шлюзу
т.е. ты хочешь сказать, что на роутере есть два интерфейса, eth1 - смотрит в сторону ISP1 он же шлюз по умолчанию, eth2 - смотрит в сторону ISP2.
Клиент из твоей локалки пытается скачать что то по http протоколу, запрос от него уходит через eth2, а ответ он получает через eth1?
-
pelmen
- Сообщения: 1268
- ОС: debian
Re: Решено: Пренаправление http трафика
Такое может быть только в том случае, если SNAT делать криво.
По ссылке (http://www.opennet.ru/docs/RUS/LARTC/) не рассказано, что за 200, зачем он нужен и почему нельзя использовать имеющуюся пустую таблицу
По ссылке (http://www.opennet.ru/docs/RUS/LARTC/) не рассказано, что за 200, зачем он нужен и почему нельзя использовать имеющуюся пустую таблицу
-
fjey
- Сообщения: 26
- ОС: Ubuntu 8.04 LTS
Re: Решено: Пренаправление http трафика
действительно, SNAT был неправильно настроен. Теперь правильно SNAT сделал. Пакеты уходят как задумано, и (что логично, рас SNAT правильно сделан) приходят обратно на нужный интерфейс, но дальше сервера, опять же, не возвращаются. приходят на сервер с заSNAT-еным адресом, и дальше куда идти не знают.
eth2: IP:192.168.1.101 - тот самый запасной канал
91.203.4.17.www - адрес сайта, порт 80 (он же www)
Вывод команды: # tcpdump port 80 -i eth2
eth2: IP:192.168.1.101 - тот самый запасной канал
91.203.4.17.www - адрес сайта, порт 80 (он же www)
Вывод команды: # tcpdump port 80 -i eth2
Код: Выделить всё
15:03:08.264934 IP 192.168.1.101.1749 > 91.203.4.17.www: S 798220991:798220991(0) win 64240 <mss 1360,nop,wscale 0,nop,nop,sackOK>
15:03:08.343839 IP 91.203.4.17.www > 192.168.1.101.1749: S 1038145225:1038145225(0) ack 798220992 win 65535 <mss 1360,nop,wscale 3,sackOK,eol>
15:03:11.353925 IP 91.203.4.17.www > 192.168.1.101.1749: S 1038145225:1038145225(0) ack 798220992 win 65535 <mss 1360,nop,wscale 3,sackOK,eol>
15:03:11.446478 IP 192.168.1.101.1749 > 91.203.4.17.www: S 798220991:798220991(0) win 64240 <mss 1360,nop,wscale 0,nop,nop,sackOK>
15:03:11.532261 IP 91.203.4.17.www > 192.168.1.101.1749: S 1038145225:1038145225(0) ack 798220992 win 65535 <mss 1360,nop,wscale 3,sackOK,eol>
15:03:14.534287 IP 91.203.4.17.www > 192.168.1.101.1749: S 1038145225:1038145225(0) ack 798220992 win 65535 <mss 1360,nop,wscale 3,sackOK,eol>-
fjey
- Сообщения: 26
- ОС: Ubuntu 8.04 LTS
Re: Решено: Пренаправление http трафика
С рабочей машины:
# ip ro sh
...
10.0.1.113 dev ppp17 proto kernel scope link src 10.0.0.3
10.0.1.76 dev ppp31 proto kernel scope link src 10.0.0.3
10.0.1.70 dev ppp10 proto kernel scope link src 10.0.0.3
10.0.1.91 dev ppp7 proto kernel scope link src 10.0.0.3
10.0.1.86 dev ppp53 proto kernel scope link src 10.0.0.3
10.0.1.81 dev ppp16 proto kernel scope link src 10.0.0.3
82.207.101.24/30 dev eth0 proto kernel scope link src 82.207.101.26
192.168.1.0/24 dev eth2 proto kernel scope link src 192.168.1.101
192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.2
default via 82.207.101.25 dev eth1 metric 100
# ip ru sh
0: from all lookup local
32765: from all fwmark 0x2 lookup eth2-out
32766: from all lookup main
32767: from all lookup default
# ip ro sh table eth2-out
default via 192.168.1.1 dev eth2
# ip ro sh
...
10.0.1.113 dev ppp17 proto kernel scope link src 10.0.0.3
10.0.1.76 dev ppp31 proto kernel scope link src 10.0.0.3
10.0.1.70 dev ppp10 proto kernel scope link src 10.0.0.3
10.0.1.91 dev ppp7 proto kernel scope link src 10.0.0.3
10.0.1.86 dev ppp53 proto kernel scope link src 10.0.0.3
10.0.1.81 dev ppp16 proto kernel scope link src 10.0.0.3
82.207.101.24/30 dev eth0 proto kernel scope link src 82.207.101.26
192.168.1.0/24 dev eth2 proto kernel scope link src 192.168.1.101
192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.2
default via 82.207.101.25 dev eth1 metric 100
# ip ru sh
0: from all lookup local
32765: from all fwmark 0x2 lookup eth2-out
32766: from all lookup main
32767: from all lookup default
# ip ro sh table eth2-out
default via 192.168.1.1 dev eth2
-
ALexhha
- Сообщения: 109
Re: Решено: Пренаправление http трафика
# ip ru sh
0: from all lookup local
32765: from all fwmark 0x2 lookup eth2-out
32766: from all lookup main
32767: from all lookup default
и где тут PBR?
-
ALexhha
- Сообщения: 109
Re: Решено: Пренаправление http трафика
Примерно так должно быть
# iptables -t mangle -A OUTPUT -p tcp --dport 80 -j MARK --set-mark 0x2
# iptables -t nat -A POSTROUTING -s xxx.xxx.xxx.xxx -o eth1 --to-source ip1
# iptables -t nat -A POSTROUTING -s xxx.xxx.xxx.xxx -o eth2 --to-source ip2
# ip rule add fwmark 0x2 table isp2
# ip route add default via gw1 dev eth1 table isp1
# ip route add default via gw2 dev eth2 table isp2
# iptables -t mangle -A OUTPUT -p tcp --dport 80 -j MARK --set-mark 0x2
# iptables -t nat -A POSTROUTING -s xxx.xxx.xxx.xxx -o eth1 --to-source ip1
# iptables -t nat -A POSTROUTING -s xxx.xxx.xxx.xxx -o eth2 --to-source ip2
# ip rule add fwmark 0x2 table isp2
# ip route add default via gw1 dev eth1 table isp1
# ip route add default via gw2 dev eth2 table isp2
-
fjey
- Сообщения: 26
- ОС: Ubuntu 8.04 LTS
Re: Решено: Пренаправление http трафика
Простите, а по какому критерию пакеты будут попадать в table isp2 ?
И разве транзитные пакеты будут проходить цепочку OUTPUT?
И разве транзитные пакеты будут проходить цепочку OUTPUT?
-
ALexhha
- Сообщения: 109
Re: Решено: Пренаправление http трафика
Простите, а по какому критерию пакеты будут попадать в table isp2 ?
# iptables -t mangle -A OUTPUT -p tcp --dport 80 -j MARK --set-mark 0x2
+
# ip rule add fwmark 0x2 table isp2
И разве транзитные пакеты будут проходить цепочку OUTPUT?
может все таки прочитаешь LARTC + iptables how to?