Назад | Перейти на главную страницу

Слепое соединение беспроводного клиента с MAC-NAT

Это обычный вопрос «Я хочу связать Wi-Fi с Ethernet», но здесь мне нужно что-то конкретное.

В моем Linux-боксе есть wlan0 интерфейс в режиме станции, с MAC aa:aa:aa:aa:aa:aa, и интерфейс VLAN (vlan0) с MAC bb:bb:bb:bb:bb:bb. Только один конкретный хост общается со мной по VLAN, поэтому все пакеты, поступающие из VLAN, будут иметь MAC-адрес источника cc:cc:cc:cc:cc:cc.

А из-за трехадресного кадрирования в WiFi все пакеты, поступающие из wlan0 будет иметь MAC-адрес назначения aa:aa:aa:aa:aa:aa. Это правильно, или я слишком упрощаю?


Я хочу сделать простой мост MAC NAT, в котором:

  1. Пакет от wlan0 получает MAC-адрес назначения, измененный на cc:cc:cc:cc:cc:cc и вслепую отправляется через VLAN.

    Got from wlan0                       Sent through vlan0
    SRC: whatever it is                  SRC: whatever it is
    DST: aa:aa:aa:aa:aa:aa      -->      DST: cc:cc:cc:cc:cc:cc
    (payload)                            (payload)
    
  2. Пакет от vlan0 получает MAC-адрес источника, измененный на aa:aa:aa:aa:aa:aa и вслепую послал через wlan0.

    Sent through wlan0                   Got from vlan0
    SRC: aa:aa:aa:aa:aa:aa               SRC: cc:cc:cc:cc:cc:cc
    DST: whatever it is         <--      DST: whatever it is
    (payload)                            (payload)
    
  3. Входящие ARP-ответы от vlan0 также обновите MAC-адрес ARP. Пример:

    Sent through wlan0                   Got from vlan0
    SRC: aa:aa:aa:aa:aa:aa               SRC: cc:cc:cc:cc:cc:cc
    DST: whatever it is         <--      DST: whatever it is
    1.2.3.4 can be found at              1.2.3.4 can be found at
    aa:aa:aa:aa:aa:aa                    cc:cc:cc:cc:cc:cc
    

ebtables звучит как идеальный способ сделать это ... если бы я только мог соединить два интерфейса вместе.
Любая идея? Я слышал о relaydможет это помочь?

Я знаю, что это старый вопрос, но мне нужно было решить именно эту проблему, и мне пришлось потратить несколько дней на то, чтобы найти лучший способ ее решения. https://xkcd.com/979/

Назовем интерфейсы на Linux box A (wlan0), B (vlan0) и клиентский хост C (vlan0). Итак, вам нужно что-то вроде моста между A и B (wlan0 и vlan0), за исключением того, что вы не можете связать эти интерфейсы в Linux (и WiFi STA все равно не заставит C работать).

Что я в итоге сделал и подтвердил, что это работает:

  • изменил MAC-адрес C (client vlan0) на тот же, что и A (host wlan0)
  • очищенные IP-адреса A, B и C
  • написал демон для перемещения кадров Ethernet между A и B

Демон открывает необработанные сокеты для чтения как из A, так и из B, фильтрации и передачи на другой интерфейс. Уловка состоит в том, чтобы фильтровать на основе MAC-адреса источника, чтобы избежать петель (исходящие должны быть такими же, как wlan0, входящие не должны быть wlan0).

Вот и все. ARP, DHCP, ping и HTTP просто работают.