Использование протокола ARP с туннелем с маршрутизацией OpenVPN (TUN)

1

Я настроил сеть, показанную на следующей диаграмме:

введите описание изображения здесь

ROT1 - маршрутизатор на основе томатов. Он имеет сетевой мост BR0 для всех клиентов внутренней сети с подсетью 192.168.1.0/24. Одним из клиентов является устройство NAS (NAS01), которое предоставляет некоторые базовые услуги, такие как ownCloud и SMB-сервер. Клиенты LAP01 и MOB01 могут видеть NAS01 и использовать его сервисы. ROT1 также настроил две VPN: TAP0 - это туннель с мостом OpenVPN, который соединен с BR0, поэтому клиент LAP04 получает IP-адрес от сервера DHCP в подсети 192.168.1.0/24. Этот клиент также может пропинговать устройство NAS01 во внутренней подсети. Маршрутизатор ROT01 запускает arpwakeпрограмму для автоматического пробуждения NAS01 с помощью Magic Packet, когда хост запрашивает другой клиент в сети с запросом ARP (кто имеет). Вы можете найти описание приложения и ссылки на его исходный кодздесь . arpwakeПриложение прослушивает BR0 для запроса ARP, содержащего MAC-адрес NAS01, и автоматически отправляет пакет Magic Packet, если один из клиентов в сети запрашивает его. Проблема в том, что я пытаюсь настроить маршрутизируемый VPN-туннель также с OpenVPN, что позволит мне использовать arpwakeприложение для автоматического пробуждения NAS01, когда один из клиентов из сети TUN0 попросит об этом. Если NAS01 работает, я могу пропинговать его и использовать все сервисы, но если он не работает, я не могу разбудить его с arpwakeприложением, потому что нет запросов ARP на этом интерфейсе (TUN0) - я уже проверил это с tcpdump на маршрутизаторе , Я также пытался использовать Proxy ARP с командой, echo 1 > /proc/sys/net/ipv4/conf/all/proxy_arpно все равно это не работает.

Вот конфигурация маршрутизатора:

Маршруты

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.200.2   *               255.255.255.255 UH    0      0        0 tun0
192.168.0.1     *               255.255.255.255 UH    0      0        0 vlan2
192.168.200.0   192.168.200.2   255.255.255.0   UG    0      0        0 tun0
192.168.1.0     *               255.255.255.0   U     0      0        0 br0
192.168.0.0     *               255.255.255.0   U     0      0        0 vlan2
127.0.0.0       *               255.0.0.0       U     0      0        0 lo
default         192.168.0.1     0.0.0.0         UG    0      0        0 vlan2

iptables (вывод iptables-saveотносительно только TUN0)

# Generated by iptables-save v1.3.8 on Sun Aug 28 12:08:23 2016
*nat
:PREROUTING ACCEPT [50195:5904352]
:POSTROUTING ACCEPT [409:28145]
:OUTPUT ACCEPT [4413:306096]
-A POSTROUTING -o tun0 -j MASQUERADE
COMMIT
# Completed on Sun Aug 28 12:08:23 2016
# Generated by iptables-save v1.3.8 on Sun Aug 28 12:08:23 2016
*mangle
:PREROUTING ACCEPT [1628436:1350223724]
:INPUT ACCEPT [43707:3160699]
:FORWARD ACCEPT [1563428:1344198921]
:OUTPUT ACCEPT [13790:1556262]
:POSTROUTING ACCEPT [1576178:1345632445]
COMMIT
# Completed on Sun Aug 28 12:08:23 2016
# Generated by iptables-save v1.3.8 on Sun Aug 28 12:08:23 2016
*filter
:INPUT DROP [10689:641141]
:FORWARD ACCEPT [19:1151]
:OUTPUT ACCEPT [13539:1531250]
-A INPUT -i tun0 -j ACCEPT
COMMIT
# Completed on Sun Aug 28 12:08:23 2016

TUN0 OpenVPN config (опции, связанные с безопасностью удалены)

local [IP_address]
port [PORT]
proto udp
dev tun
server 192.168.200.0 255.255.255.0
push "route 192.168.1.0 255.255.255.0"
client-to-client
keepalive 10 120
comp-lzo
persist-key
persist-tun
push "dhcp-option DNS 192.168.1.1"

ifconfig для интерфейса TUN0 (по умолчанию OpenVPN отображает этот интерфейс с параметром NOARP, но даже если я включу его снова с помощью команды, ifconfig tun0 arpэто не решит мою проблему).

tun0       Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
           inet addr:192.168.200.1  P-t-P:192.168.200.2  Mask:255.255.255.255
           UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
           RX packets:311 errors:0 dropped:0 overruns:0 frame:0
           TX packets:11 errors:0 dropped:0 overruns:0 carrier:0
           collisions:0 txqueuelen:100
           RX bytes:21166 (20.6 KiB)  TX bytes:3486 (3.4 KiB)

Мой вопрос: как заставить этот интерфейс TUN0 начать работать с ARP?

Кшиштоф Якобчик
источник

Ответы:

1

Трафик не-IP не передается через интерфейсы Layer-3 ( tun ), в этом вся его прелесть: вы экономите на широковещательном трафике и заголовках Ethernet. Обо всем этом вы можете прочитать в вики OpenVPN .

Я не уверен, что понимаю, как работает arpwake , веб-страница, на которую вы ссылаетесь , скорее болтовня , чем вики. Но вы можете попробовать добавить это правило брандмауэра,

 iptables -t nat -A POSTROUTING -o br0 -j MASQUERADE

Это переписывает все IP-адреса источника в заголовках пакетов с IP-адресом маршрутизатора. Я не знаю, вызовет ли это arpwake , но вы можете попробовать.

РЕДАКТИРОВАТЬ :

Я подумал об обходном пути, который не использует arpwake . Добавьте следующее правило iptables ,

iptables -A INPUT -i tun0  -s xxx.xxx.xxx.xxx/24 -d 192.168.1.4/32 -m state --state NEW -m state ! --state ESTABLISHED -j LOG --log-prefix "NEW_CONN_ATTEMPT"

где xxx.xxx.xxx.xxx/24 - сеть VPN-туннеля. Теперь настройте исполняемый скрипт, работающий под sudo , со следующим содержимым:

tail -f /var/log/firewall.log | awk '/NEW_CONN_ATTEMPT/ {system("/usr/local/bin/myscript")}'

где / usr / local / bin / myscript - это скрипт, который отправляет волшебный пакет в NAS. Он должен работать.

MariusMatutiae
источник
Привет, к сожалению, это не решает проблему, все еще нет запросов ARP, но я предполагаю, что это особенность интерфейса Tun.
Кшиштоф Якобчик
@ KrzysztofJakóbczyk Можете ли вы очистить кэш arp ( ip neigh flush dev br0 ), а затем попробовать подключиться к NAS через tun0? Я не понимаю, почему это не работает. Я думал, что вы запустите arpwake на сервере ROT1, и это сделает запрос ARP для 192.168.1.4, который должен быть перехвачен arpwake и преобразован в волшебный пакет WOL. Вы также можете проверить, что запрос ARP от ROT1 действительно отправлен?
MariusMatutiae
Я сделал то, что вы предложили, но все еще безуспешно. arpwake - это инструмент для анализа сети, который ищет запросы ARP, поступающие от клиентов на маршрутизатор ROT1. Если он находит такой запрос на MAC-адрес, переданный через опцию командной строки, он автоматически отправляет пакет WOL на широковещательный адрес сети, в которой находится хост (в общем, он всегда отправляет WOL на .255 каждой подсети, что не всегда должно быть всегда). адрес трансляции, но это в моем случае). Если я проверю с помощью tcpdump -i tun0, что происходит на интерфейсе TUN0, я вижу только IP-передачи, а не ARP.
Кшиштоф Якобчик
Также работает ICMP, но не ARP, однако, согласно вашему ответу, это связано с конкретными интерфейсами TUN: они работают только с трафиком, связанным с IP, поэтому интерфейс TUN0 вызывается с опцией NOARP и даже включается. не позволяет мне видеть трафик ARP. Если я использую интерфейс TAP вместо TUN, запросы ARP перехватываются с помощью tcpdump -i br0, и именно тогда arpwake запускает загрузку устройства NAS с WOL.
Кшиштоф Якобчик
@ KrzysztofJakóbczyk Хорошо, но что я получаю, так это то, почему arpwake не активируется, когда маршрутизатор отправляет пакет ARP для NAS? Я надеялся, что arpwake будет вызван не только внешними ARP-запросами, но и самим внешним. Видишь, на что я намекаю?
MariusMatutiae