Бьюсь над проблемой маршрутизации на один шлюз провайдера через разные сетевые интерфейсы.
Схема в картинке.
Смысл вопроса на словах:
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
Код: Выделить всё
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
Код: Выделить всё
## Описываем переменные, содержащие имена интерфейсов
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 (связано с петлей на свиче), но это не столь важно готов эти ошибки игнорировать.
Подскажите как докрутить данную схему.
Заранее спасибо.