PBR на один шлюз.

Проблемы установки, настройки и работы Правильной Операционной Системы

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [cоde] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
kharkov_max
капитан
Сообщения: 1811
Зарегистрирован: 2008-10-03 14:56:40

PBR на один шлюз.

Непрочитанное сообщение kharkov_max » 2009-12-01 13:38:17

День добрый.

Бьюсь над проблемой маршрутизации на один шлюз провайдера через разные сетевые интерфейсы.
Схема в картинке.

Смысл вопроса на словах:
1. Есть провайдер, который проверяет подключения клиента по IP и Mac адресу, если они не соответствуют, то происходит бан соответствующего IP.
2. У провайдера арендовано 2 IP адреса с белыми, для провайдера, IP и MAC адресами.
3. Хочу привязать 2 компа из внутренней подсети к сетевым интерфейсам смотрящими на провайдера. Цель заставить работать FlylinkDC++ в активном режиме.

Проблема заключается в том, что шлюз для 2х IP адресов ОДИН. Если бы IP адресам полученным у провайдера соответствовали разные шлюзы, то вопрос бы решился обычным PBR без всяких проблем.

Что имею: Freebsd 7.2 и PF с перекомпилиным под него ядром.

Код: Выделить всё

uname -a
FreeBSD gateway7.2-RELEASE-p3 FreeBSD 7.2-RELEASE-p3 #3: Wed Sep 23 11:28:18 EEST 2009     root@gateway:/usr/obj/usr/src/sys/MY  i386
ifconfig:

Код: Выделить всё

re0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=389b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,WOL_UCAST,WOL_MCAST,WOL_MAGIC>
        ether 00:e0:4d:a1:d3:28
        inet 192.168.10.250 netmask 0xffffff00 broadcast 192.168.10.255
        media: Ethernet 100baseTX <full-duplex>
        status: active
em0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=389b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,WOL_UCAST,WOL_MCAST,WOL_MAGIC>
        ether 00:01:23:23:45:46
        inet6 fe80::64b:80ff:fe80:8044%em0 prefixlen 64 scopeid 0x3
        inet 10.10.10.121 netmask 0xfffff000 broadcast 10.10.10.255
        media: Ethernet 100baseTX <full-duplex>
        status: active
vr0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=2808<VLAN_MTU,WOL_UCAST,WOL_MAGIC>
        ether 00:1q:4e:54:23:56
        inet6 fe80::21a:4dff:fe74:ad45%vr0 prefixlen 64 scopeid 0x4
        inet 10.10.10.111 netmask 0xfffff000 broadcast 10.10.10.255
        media: Ethernet 100baseTX <full-duplex>
        status: active
pfsync0: flags=0<> metric 0 mtu 1460
        syncpeer: 224.0.0.240 maxupd: 128
pflog0: flags=141<UP,RUNNING,PROMISC> metric 0 mtu 33204
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x7
        inet6 ::1 prefixlen 128
        inet 127.0.0.1 netmask 0xff000000
tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> metric 0 mtu 1492
        inet 92.112.89.100 --> 195.5.5.204 netmask 0xffffffff
        Opened by PID 624
PF:

Код: Выделить всё

## Описываем переменные, содержащие имена интерфейсов

int_if="re0"
ext_adsl="tun0"
ext_inet="rl0"
ext_if1="em0"
ext_if2="vr0"

## Описываем сети и хосты
int_lan="192.168.10.0/24"
comp1="192.168.10.11"
comp2="192.168.10.12"
ext_gateway="10.10.10.1"

# ICMP Unreacheble
set block-policy return
set skip on lo0

# Нормализация входящего трафика
scrub in all

# Проброс портов в локалку на comp1
rdr on $ext_if1 from any to any  -> $comp1

# Проброс потров в локалку на comp2 
rdr on $ext_if2 from any to any -> $comp2

nat on $ext_if1 from any to any -> ($ext_if1:0)
nat on $ext_if2 from any to any -> ($ext_if2:0)

#  default deny
block in all
block out all
# pass all

pass  in quick on $int_if from $int_lan to $int_if
pass out quick on $int_if from $int_if to $int_lan

pass  in quick on $ext_adsl from any to any
pass out quick on $ext_adsl from any to any

pass  in quick on $ext_inet from any to any
pass out quick on $ext_inet from any to any

# ------------------LocalHost-----------------
pass  in quick on $ext_if1 from any to localhost
pass out quick on $ext_if1 from localhost to any
pass  in quick on $ext_if2 from any to localhost
pass out quick on $ext_if2 from localhost to any
# ------------------End LocalHost-------------

# ---------------Interface IntLan------------
pass  in quick on $int_if route-to ($ext_if1 $ext_gateway) from $comp1 to any tag COMP1_TAG
pass out quick on $int_if from any to $comp1

pass  in quick on $int_if route-to ($ext_if2 $ext_gateway) from $comp2 to any tag COPM2_TAG
pass out quick on $int_if from any to $comp2
# -------------End Interface IntLan----------

# ------------------- Comp1 ----------------
pass  in quick on $ext_if1 from any to any
pass out quick on $ext_if1 from any to any tagged COMP1_TAG
pass out quick on $ext_if1 route-to ($ext_if2 $ext_gateway) from $ext_if2 to any
# ------------------End Comp1-------------

# ------------------ Comp2 ----------------
pass  in quick on $ext_if2 from any to any
pass out quick on $ext_if2 from any to any tagged COMP2_TAG
pass out quick on $ext_if2 route-to ($ext_if1 $ext_gateway) from $ext_if1 to any
Что в результате получилось:
Comp1 и Comp2 нормально видит сеть провайдера и выходит на сеть провайдера под своим (соответствующим ему) IP адресом.
Если отключаю на выходе метки пакетов для соответствующих ПК, то ПК не видят сеть провайдера. Т.е. вроде как все работает верно.

Но вот DC++ нормально работает только на Comp1 (в активном режиме).
На Comp2 происходит следующее. Работает поиск, с него могут качать, но сам Comp2 не может качать ничего.

Не могу понять в чем проблема, видимо что то не докрутил. Логи tcpdump пока мне ничего не могут подсказать.
Пробовал пускать Comp1 и Comp2 напрямую через свич смотрящий на провайдера, все работает нормально, но нужно пропустить трафик через шлюз.

так же на шлюзе валятся ошибки arp (связано с петлей на свиче), но это не столь важно готов эти ошибки игнорировать.

Подскажите как докрутить данную схему.
Заранее спасибо.
Вложения
Документ1.jpg

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
kharkov_max
капитан
Сообщения: 1811
Зарегистрирован: 2008-10-03 14:56:40

Re: PBR на один шлюз.

Непрочитанное сообщение kharkov_max » 2009-12-02 13:42:47

Не уже ли никто ни чего не подскажет?

Аватара пользователя
kharkov_max
капитан
Сообщения: 1811
Зарегистрирован: 2008-10-03 14:56:40

Re: PBR на один шлюз.

Непрочитанное сообщение kharkov_max » 2009-12-03 14:03:30

Up

Аватара пользователя
kharkov_max
капитан
Сообщения: 1811
Зарегистрирован: 2008-10-03 14:56:40

Re: PBR на один шлюз.

Непрочитанное сообщение kharkov_max » 2009-12-03 20:18:51

Народ понимаю что задачка сложная и возможно не решаемая, но очень нужна Ваша помошь.
Хоть скажите что так сделать не возможно или хочть чего нить ...

Аватара пользователя
ban
мл. сержант
Сообщения: 145
Зарегистрирован: 2009-07-22 22:36:29
Откуда: г.Волжский Волг. обл.

Re: PBR на один шлюз.

Непрочитанное сообщение ban » 2009-12-03 21:19:54

внешние интерфейсы на серваке из одной подсети:

Код: Выделить всё

ext_if1="em0" = 10.10.10.121 netmask 0xfffff000
ext_if2="vr0" = 10.10.10.111 netmask 0xfffff000
я почему-то искренне верую, что это не правильно... так, нет? Если не так, то хотелось бы знать почему.

насчет DC++ у меня предположение, что запросы "хочу скачать файл с компа с таим-то IP" отправляются в сетку по правилу:

Код: Выделить всё

nat on $ext_if1 from any to any -> ($ext_if1:0)
и для Comp1 и для Comp2. Соответственно, на запросы обоих компов входящий ответ из сетки валится на ext_if1 и пробрасывается правилом:

Код: Выделить всё

rdr on $ext_if1 from any to any  -> $comp1
всегда только на Comp1.

Подтвердить мою теорию сможет tcpdump. Запусти пару окон SSH и слушай ext_if1 и ext_if2 по тем портам, которые у тебя в DC++ клиенте прописаны. Итак, если я прав, то при запросе на скачивание файла из клиента DC++ на Comp2 ответы будут валиться на Comp1 через ext_if1.

вот мои мысли по DC++ и PF:
Изображение
кто никуда не торопится, тот везде успевает

Аватара пользователя
mayor
сержант
Сообщения: 215
Зарегистрирован: 2008-09-06 10:11:49
Контактная информация:

Re: PBR на один шлюз.

Непрочитанное сообщение mayor » 2009-12-04 0:31:58

To ban
рисунок конкретный .. :good: :good:

Аватара пользователя
kharkov_max
капитан
Сообщения: 1811
Зарегистрирован: 2008-10-03 14:56:40

Re: PBR на один шлюз.

Непрочитанное сообщение kharkov_max » 2009-12-04 8:37:44

Код: Выделить всё

внешние интерфейсы на серваке из одной подсети:
Код: Выделить всё • Развернуть
ext_if1="em0" = 10.10.10.121 netmask 0xfffff000ext_if2="vr0" = 10.10.10.111 netmask 0xfffff000я почему-то искренне верую, что это не правильно... так, нет? Если не так, то хотелось бы знать почему.
Да из одной подсети, ибо провайдер их выдает такими (провайдер предполагает что это будут 2 разных компа). Собственно по этому и обращаюсь на форум.
Проброс потров в локалку работает и для первого компа и для вторго. Только полноценно работает только тот компьютер, сетевая карта которого (на шлюзе) в rc.conf указана первая. Т.е. какая сетевая поднялась первая, то тот комп полноценно и работает.

Код: Выделить всё

насчет DC++ у меня предположение, что запросы "хочу скачать файл с компа с таим-то IP" отправляются в сетку по правилу:
Код: Выделить всё • Развернуть
nat on $ext_if1 from any to any -> ($ext_if1:0)и для Comp1 и для Comp2. Соответственно, на запросы обоих компов входящий ответ из сетки валится на ext_if1 и пробрасывается правилом:
Код: Выделить всё • Развернуть
rdr on $ext_if1 from any to any  -> $comp1всегда только на Comp1.

Подтвердить мою теорию сможет tcpdump. Запусти пару окон SSH и слушай ext_if1 и ext_if2 по тем портам, которые у тебя в DC++ клиенте прописаны. Итак, если я прав, то при запросе на скачивание файла из клиента DC++ на Comp2 ответы будут валиться на Comp1 через ext_if1.

Попробую ....

Хм.. вполне возможно что и так.
Но ведь правило nat это правило только для подмены IP адреса, а выпускающими правилами от Comp1 являются

Код: Выделить всё

pass  in quick on $int_if route-to ($ext_if1 $ext_gateway) from $comp1 to any tag COMP1_TAG
pass out quick on $ext_if1 from any to any tagged COMP1_TAG
По крайней мере задумка у меня была такая ...

А не может быть весь вопрос в arp ?
Может таблица маршрутизации с ума сходит, т.к. схемка у меня не адекватная :( ?

Аватара пользователя
ban
мл. сержант
Сообщения: 145
Зарегистрирован: 2009-07-22 22:36:29
Откуда: г.Волжский Волг. обл.

Re: PBR на один шлюз.

Непрочитанное сообщение ban » 2009-12-04 8:48:09

наты попробуй так:

Код: Выделить всё

nat on $ext_if1 from $comp1 to any -> $ext_if1
nat on $ext_if2 from $comp2 to any -> $ext_if2
кто никуда не торопится, тот везде успевает

Аватара пользователя
kharkov_max
капитан
Сообщения: 1811
Зарегистрирован: 2008-10-03 14:56:40

Re: PBR на один шлюз.

Непрочитанное сообщение kharkov_max » 2009-12-04 8:59:20

Подтвердить мою теорию сможет tcpdump. Запусти пару окон SSH и слушай ext_if1 и ext_if2 по тем портам, которые у тебя в DC++ клиенте прописаны. Итак, если я прав, то при запросе на скачивание файла из клиента DC++ на Comp2 ответы будут валиться на Comp1 через ext_if1.
Да вроде нет таких пакетов вообще ....
Проверял так.

Код: Выделить всё

tcpdump -i em0 -tqp dst host 10.10.10.111 and not src host 10.10.10.121

Аватара пользователя
kharkov_max
капитан
Сообщения: 1811
Зарегистрирован: 2008-10-03 14:56:40

Re: PBR на один шлюз.

Непрочитанное сообщение kharkov_max » 2009-12-04 9:06:22

ban писал(а):наты попробуй так:

Код: Выделить всё

nat on $ext_if1 from $comp1 to any -> $ext_if1
nat on $ext_if2 from $comp2 to any -> $ext_if2
Вот тут тоже интересный момент, почему я именно все натом крою, потому что если через сетевую полезет пакет не соответствующий IP и Mac адресу сетевой карты смотряжей на провайдера, провайдер банет Host по Mac адресу (провайдер, домовые сети с ними сильно не повоюешь)...

Да и собственно пускай натится все, какая разница...
Главное что б пакеты от нужных компов попали на соответствующие интерфейсы (route-to в обход маршрутизации), а потом с них же вернулись назад (через rdr).
Т.е. моя логика была такова ....

Аватара пользователя
ban
мл. сержант
Сообщения: 145
Зарегистрирован: 2009-07-22 22:36:29
Откуда: г.Волжский Волг. обл.

Re: PBR на один шлюз.

Непрочитанное сообщение ban » 2009-12-04 9:21:04

kharkov_max писал(а):Да вроде нет таких пакетов вообще ....
Проверял так.

Код: Выделить всё

tcpdump -i em0 -tqp dst host 10.10.10.111 and not src host 10.10.10.121
не понял что ты этим хотел добиться...

слушай порт, где-то так:

1-е окно
tcpdump -i em0 port ПортDCклиентаComp1

2-е окно
tcpdump -i vr0 port ПортDCклиентаComp2

и как только ты из Comp2 инициируешь скачивание ДОЛЖНЫ валиться куча входящих пакетов на одном из окон (предполагаю что на первом).
кто никуда не торопится, тот везде успевает

Аватара пользователя
kharkov_max
капитан
Сообщения: 1811
Зарегистрирован: 2008-10-03 14:56:40

Re: PBR на один шлюз.

Непрочитанное сообщение kharkov_max » 2009-12-04 9:25:56

Дело в том что даже не знаю какой порт слушать.
Т.к. DC в активном режиме, то она может выбрать любой порт ...
Чат висит на 411 а вот переда данных вроде как по любому может идти ...

Аватара пользователя
ban
мл. сержант
Сообщения: 145
Зарегистрирован: 2009-07-22 22:36:29
Откуда: г.Волжский Волг. обл.

Re: PBR на один шлюз.

Непрочитанное сообщение ban » 2009-12-04 9:34:21

так и я про активный режим говорю
ставь галку брандмауер с ручным перенаправлением портов и порты указывай TCP (качаем) и UDP (ищем)
поставь 5000 порты (TCP, UDP) везде и на компе 1 и на 2 и два окна

tcpdump -i em0 tcp port 5000
tcpdump -i vr0 tcp port 5000
кто никуда не торопится, тот везде успевает

Аватара пользователя
kharkov_max
капитан
Сообщения: 1811
Зарегистрирован: 2008-10-03 14:56:40

Re: PBR на один шлюз.

Непрочитанное сообщение kharkov_max » 2009-12-05 7:53:12

Ввиду определенных обстоятельств вынужден временно прекратить свои эксперименты (.
Но надеюсь через недельку начать заново ...

Спасибо за помощь.