Задать вопрос
  • Как организовать два активных канала интернет, FreeBSD 11?

    athacker
    @athacker
    Опция IPDIVERT в ядре лишняя, она не нужна для работы ядерного NAT. Мешать она не мешает, но на всякий случай имейте в виду -- её можно спокойно убрать.

    Первый fwd (правило 600) -- тоже не нужен, у вас и так трафик будет улетать в шлюз по умолчанию, и без этого правила.

    А не работает у вас потому, что до второго NAT-а дело не доходит никогда. Схема такая:

    1. Пришёл пакет из интернета (допустим, с внешнего IP ZZZ) на X2:3389.
    2. Первый NAT его поймал и поменяв DST IP на 192.168.0100, отправил пакет в локалку.
    3. Хост 192.168.0.100 на него ответил, и отправил ответ через свой шлюз по умолчанию (это ваша фряха).
    4. Фряха получила пакет от клиента, предназначенный для некоего внешнего адреса ZZZ. Осознала, что он предназначен для внешнего адреса, и НАПРАВИЛА ЕГО В СВОЙ DEFAULT GW. А default GW у неё -- это шлюз на стороне провайдера 1. В сторону этого провайдера смотрит интерфейс tun0
    5. Дальше пакет идёт по правилам файрвола и натыкается на правило: $cmd add 1100 nat 1 ip from any to any via tun0. Пакет под него подпадает, так как он системой отправлен через tun0. Соответственно, согласно этому правилу пакет попадает в NAT, и его SRC IP меняется с 192.168.0.100 на X2.
    6. Дальнейшая обработка продолжается (так как one_pass=0), но мы уже получили что? Что у нас есть исходящий пакет (после обработки первым натом) с IP-адреса X2, предназначенный для внешнего адреса ZZZ и улетающий через интерфейс tun0. Соответственно, второй NAT его не обрабатывает, так как под его условия (via tun1) этот пакет уже не попадает. Поэтому пакет дальше просто уходит в сторону шлюза X1, и всё


    В вашем случае самым простым способом будет выдать хосту 192.168.0.100 ещё один IP-шник (скажем, 192.168.0.101), и через провайдера 2 заворачивать пакеты именно на него. Тогда можно будет сделать так:

    $cmd nat 1 config log if tun0 reset same_ports deny_in redirect_port tcp 192.168.0.100:3389 3389
    $cmd add 1100 nat 1 ip from 192.168.0.100 to any via tun0

    # Второй NAT
    $cmd nat 2 config log if tun1 reset same_ports deny_in redirect_port tcp 192.168.0.101:3389 3389
    $cmd add 1200 nat 2 ip from 192.168.0.101 to any via tun1

    $cmd add 1300 fwd YYY.YYY.YYY.YY1 ip from YYY.YYY.YYY.YY2 to any out via tun0


    Правила схематичные, и не учитывают, что нужен обычный нат для всех остальных клиентов. Просто демонстрация, для понимания логики.
    Ответ написан
    3 комментария