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

Перенаправлять трафик между VLAN с помощью iptables

У нас есть следующие 4 VLAN в моей сети, подключенные к системе Ubuntu Linux с DHCP. Этот Linux также должен действовать как маршрутизатор L3.

VLAN 10  on interface eth1.10  with subnet 10.10.10.0/24
VLAN 20  on interface eth1.20  with subnet 10.10.20.0/24
VLAN 50  on interface eth1.50  with subnet 10.10.50.0/24
VLAN 100 on interface eth1.100 with subnet 10.10.100.0/24

Здесь /etc/network/interfaces:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
        address 192.168.10.169
        netmask 255.255.255.0
        gateway 192.168.10.1

auto eth1
iface eth1 inet static
        address 10.10.0.1
        network 10.10.0.0
        netmask 255.255.255.0
        broadcast 10.10.0.255

auto eth1.100
iface eth1.100 inet static
        address 10.10.100.1
        network 10.10.100.0
        netmask 255.255.255.0
        broadcast 10.10.100.255

auto eth1.10
iface eth1.10 inet static
        address 10.10.10.1
        network 10.10.10.0
        netmask 255.255.255.0
        broadcast 10.10.10.255

auto eth1.20
iface eth1.20 inet static
        address 10.10.20.1
        network 10.10.20.0
        netmask 255.255.255.0
        broadcast 10.10.20.255

auto eth1.50
iface eth1.50 inet static
        address 10.10.50.1
        network 10.10.50.0
        netmask 255.255.255.0
        broadcast 10.10.50.255

Теперь все клиенты из всех VLAN должны иметь возможность подключаться к общедоступному Интернету через интерфейс. eth0. Эта часть действительно работает с правилом iptables -A POSTROUTING -o eth0 -j MASQUERADE. DHCP-сервер тоже работает.

НО поскольку VLAN 100 будет сетью для компьютеров администрирования, клиенты в VLAN 100 должны иметь доступ ко всем другим компьютерам в VLAN 10, 20 и 50. И клиенты в VLAN 10, 20 и 50 должны иметь доступ только к компьютерам внутри их собственных VLAN.

До сих пор я пробовал следующие правила iptables вместе с MASQUERADE:

-A FORWARD -i eth1.100 -o eth1.10 -j ACCEPT
-A FORWARD -i eth1.100 -o eth1.20 -j ACCEPT
-A FORWARD -i eth1.100 -o eth1.50 -j ACCEPT
-A FORWARD -i eth1.10 -o eth1.100 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth1.20 -o eth1.100 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth1.50 -o eth1.100 -m state --state RELATED,ESTABLISHED -j ACCEPT

Я попытался пропинговать ПК с IP-адресом 10.10.20.100 с ПК с IP-адресом 10.10.100.101, но безуспешно. Я также не смог пинговать 10.10.50.101 из 100-подсети.

И есть странное побочное поведение: сеть VLAN 20 случайно (я понятия не имею, почему) действует так, как должна. Оттуда я могу пинговать компьютеры в VLAN 10 и 100, что в конечном итоге должно быть невозможно.

У меня в ядре включена пересылка IPv4, и внешний Интернет работает должным образом.

Вот полный вывод iptables-save:

# Generated by iptables-save v1.6.0 on Thu May 26 09:28:59 2016
*filter
:INPUT ACCEPT [7375:724156]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [3695:415474]
-A FORWARD -i eth1.100 -o eth1.10 -j ACCEPT
-A FORWARD -i eth1.100 -o eth1.20 -j ACCEPT
-A FORWARD -i eth1.100 -o eth1.50 -j ACCEPT
-A FORWARD -i eth1.10 -o eth1.100 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth1.20 -o eth1.100 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth1.50 -o eth1.100 -m state --state RELATED,ESTABLISHED -j ACCEPT
COMMIT
# Completed on Thu May 26 09:28:59 2016
# Generated by iptables-save v1.6.0 on Thu May 26 09:28:59 2016
*nat
:PREROUTING ACCEPT [32796:9980970]
:INPUT ACCEPT [142:30526]
:OUTPUT ACCEPT [1829:211124]
:POSTROUTING ACCEPT [128:29756]
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
# Completed on Thu May 26 09:28:59 2016

И выход route:

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         192.168.10.1    0.0.0.0         UG    0      0        0 eth0
10.10.0.0       *               255.255.255.0   U     0      0        0 eth1
10.10.10.0      *               255.255.255.0   U     0      0        0 eth1.10
10.10.20.0      *               255.255.255.0   U     0      0        0 eth1.20
10.10.50.0      *               255.255.255.0   U     0      0        0 eth1.50
10.10.100.0     *               255.255.255.0   U     0      0        0 eth1.100
link-local      *               255.255.0.0     U     1000   0        0 eth0
192.168.10.0    *               255.255.255.0   U     0      0        0 eth0

Заранее спасибо, надеюсь, кто-нибудь поймет, какие правила iptables мне следует использовать для достижения желаемого (если это вообще проблема).

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

По просьбе @Sanael я сделал еще несколько записей (-A FORWARD -o eth1+ -p icmp -j LOG --log-prefix "IPTABLES FORWARD: " --log-level 7) и вот результаты:

Пинг 10.10.20.101 -> 10.10.50.100 удалось со следующим журналом:

May 26 12:14:57 homeserver kernel: IPTABLES FORWARD: IN=eth1.20 OUT=eth1.50 MAC=00:0a:5e:50:7c:c1:c8:0a:a9:e5:f0:bc:08:00:45:00:00:3c SRC=10.10.20.101 DST=10.10.50.100 LEN=60 TOS=0x00 PREC=0x00 TTL=127 ID=23708 PROTO=ICMP TYPE=8 CODE=0 ID=1 SEQ=96
May 26 12:14:57 homeserver kernel: IPTABLES FORWARD: IN=eth1.50 OUT=eth1.20 MAC=00:0a:5e:50:7c:c1:00:1e:ec:fa:d1:10:08:00:45:00:00:3c SRC=10.10.50.100 DST=10.10.20.101 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=15185 PROTO=ICMP TYPE=0 CODE=0 ID=1 SEQ=96
May 26 12:14:58 homeserver kernel: IPTABLES FORWARD: IN=eth1.20 OUT=eth1.50 MAC=00:0a:5e:50:7c:c1:c8:0a:a9:e5:f0:bc:08:00:45:00:00:3c SRC=10.10.20.101 DST=10.10.50.100 LEN=60 TOS=0x00 PREC=0x00 TTL=127 ID=23709 PROTO=ICMP TYPE=8 CODE=0 ID=1 SEQ=97
May 26 12:14:58 homeserver kernel: IPTABLES FORWARD: IN=eth1.50 OUT=eth1.20 MAC=00:0a:5e:50:7c:c1:00:1e:ec:fa:d1:10:08:00:45:00:00:3c SRC=10.10.50.100 DST=10.10.20.101 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=15317 PROTO=ICMP TYPE=0 CODE=0 ID=1 SEQ=97
May 26 12:14:59 homeserver kernel: IPTABLES FORWARD: IN=eth1.20 OUT=eth1.50 MAC=00:0a:5e:50:7c:c1:c8:0a:a9:e5:f0:bc:08:00:45:00:00:3c SRC=10.10.20.101 DST=10.10.50.100 LEN=60 TOS=0x00 PREC=0x00 TTL=127 ID=23710 PROTO=ICMP TYPE=8 CODE=0 ID=1 SEQ=98
May 26 12:14:59 homeserver kernel: IPTABLES FORWARD: IN=eth1.50 OUT=eth1.20 MAC=00:0a:5e:50:7c:c1:00:1e:ec:fa:d1:10:08:00:45:00:00:3c SRC=10.10.50.100 DST=10.10.20.101 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=15349 PROTO=ICMP TYPE=0 CODE=0 ID=1 SEQ=98
May 26 12:15:00 homeserver kernel: IPTABLES FORWARD: IN=eth1.20 OUT=eth1.50 MAC=00:0a:5e:50:7c:c1:c8:0a:a9:e5:f0:bc:08:00:45:00:00:3c SRC=10.10.20.101 DST=10.10.50.100 LEN=60 TOS=0x00 PREC=0x00 TTL=127 ID=23711 PROTO=ICMP TYPE=8 CODE=0 ID=1 SEQ=99
May 26 12:15:00 homeserver kernel: IPTABLES FORWARD: IN=eth1.50 OUT=eth1.20 MAC=00:0a:5e:50:7c:c1:00:1e:ec:fa:d1:10:08:00:45:00:00:3c SRC=10.10.50.100 DST=10.10.20.101 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=15597 PROTO=ICMP TYPE=0 CODE=0 ID=1 SEQ=99

Пинг 10.10.20.101 -> 10.10.100.100 не смогли со следующим журналом:

May 26 12:09:06 homeserver kernel: IPTABLES FORWARD: IN=eth1.20 OUT=eth1.100 MAC=00:0a:5e:50:7c:c1:c8:0a:a9:e5:f0:bc:08:00:45:00:00:3c SRC=10.10.20.101 DST=10.10.100.100 LEN=60 TOS=0x00 PREC=0x00 TTL=127 ID=18715 PROTO=ICMP TYPE=8 CODE=0 ID=1 SEQ=85
May 26 12:09:11 homeserver kernel: IPTABLES FORWARD: IN=eth1.20 OUT=eth1.100 MAC=00:0a:5e:50:7c:c1:c8:0a:a9:e5:f0:bc:08:00:45:00:00:3c SRC=10.10.20.101 DST=10.10.100.100 LEN=60 TOS=0x00 PREC=0x00 TTL=127 ID=18716 PROTO=ICMP TYPE=8 CODE=0 ID=1 SEQ=86
May 26 12:09:16 homeserver kernel: IPTABLES FORWARD: IN=eth1.20 OUT=eth1.100 MAC=00:0a:5e:50:7c:c1:c8:0a:a9:e5:f0:bc:08:00:45:00:00:3c SRC=10.10.20.101 DST=10.10.100.100 LEN=60 TOS=0x00 PREC=0x00 TTL=127 ID=18717 PROTO=ICMP TYPE=8 CODE=0 ID=1 SEQ=87

Пинг 10.10.50.100 -> 10.10.20.101 не смогли со следующим журналом:

May 26 12:11:28 homeserver kernel: IPTABLES FORWARD: IN=eth1.50 OUT=eth1.20 MAC=00:0a:5e:50:7c:c1:00:1e:ec:fa:d1:10:08:00:45:00:00:54 SRC=10.10.50.100 DST=10.10.20.101 LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=54378 DF PROTO=ICMP TYPE=8 CODE=0 ID=1903 SEQ=1
May 26 12:11:29 homeserver kernel: IPTABLES FORWARD: IN=eth1.50 OUT=eth1.20 MAC=00:0a:5e:50:7c:c1:00:1e:ec:fa:d1:10:08:00:45:00:00:54 SRC=10.10.50.100 DST=10.10.20.101 LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=54495 DF PROTO=ICMP TYPE=8 CODE=0 ID=1903 SEQ=2
May 26 12:11:30 homeserver kernel: IPTABLES FORWARD: IN=eth1.50 OUT=eth1.20 MAC=00:0a:5e:50:7c:c1:00:1e:ec:fa:d1:10:08:00:45:00:00:54 SRC=10.10.50.100 DST=10.10.20.101 LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=54693 DF PROTO=ICMP TYPE=8 CODE=0 ID=1903 SEQ=3

Пинг 10.10.50.100 -> 10.10.100.100 не смогли со следующим журналом:

May 26 12:12:24 homeserver kernel: IPTABLES FORWARD: IN=eth1.50 OUT=eth1.100 MAC=00:0a:5e:50:7c:c1:00:1e:ec:fa:d1:10:08:00:45:00:00:54 SRC=10.10.50.100 DST=10.10.100.100 LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=8069 DF PROTO=ICMP TYPE=8 CODE=0 ID=1905 SEQ=1
May 26 12:12:25 homeserver kernel: IPTABLES FORWARD: IN=eth1.50 OUT=eth1.100 MAC=00:0a:5e:50:7c:c1:00:1e:ec:fa:d1:10:08:00:45:00:00:54 SRC=10.10.50.100 DST=10.10.100.100 LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=8269 DF PROTO=ICMP TYPE=8 CODE=0 ID=1905 SEQ=2
May 26 12:12:26 homeserver kernel: IPTABLES FORWARD: IN=eth1.50 OUT=eth1.100 MAC=00:0a:5e:50:7c:c1:00:1e:ec:fa:d1:10:08:00:45:00:00:54 SRC=10.10.50.100 DST=10.10.100.100 LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=8375 DF PROTO=ICMP TYPE=8 CODE=0 ID=1905 SEQ=3

Пинг 10.10.100.100 -> 10.10.20.101 не смогли НО не создавал никаких выходных журналов.

Пинг 10.10.100.100 -> 10.10.50.100 удалось НО не создавал никаких выходных журналов.

Проблема теперь хотя бы частично решена (меня это устраивает).

Вначале я тестировал сеть с клиентами Windows, и недавно на обоих компьютерах была установлена ​​Windows 10. Сама проблема была действительно глупой: Windows не отвечала на эхо-запросы, так как в Windows 10 по умолчанию включена новая система безопасности. Когда я добавил в сеть один ноутбук с Linux, я попал в ситуацию, когда все остальные могли пинговать ноутбук с Linux ( политика по умолчанию была ALLOW), но компьютер с Linux не мог пинговать больше ничего (Windows не ответила на пинг). Затем я попробовал удаленный рабочий стол на ПК с Windows в VLAN 10 и 50, с ПК с Linux в VLAN 100 и бум - это сработало!

Так что никаких проблем с правилами iptables / netfilter не было.

Большое спасибо за все ответы и комментарии!

Вот моя последняя, ​​рабочая и упрощенная конфигурация iptables:

# Generated by iptables-save v1.6.0 on Thu May 26 16:00:55 2016
*filter
:INPUT ACCEPT [359:39449]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [563:89333]
-A FORWARD -i eth1+ -o eth1.100 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth1.100 -o eth1+ -j ACCEPT
-A FORWARD -i eth1+ -o eth0 -j ACCEPT
-A FORWARD -i eth0 -o eth1+ -m state --state RELATED,ESTABLISHED -j ACCEPT
COMMIT
# Completed on Thu May 26 16:00:55 2016
# Generated by iptables-save v1.6.0 on Thu May 26 16:00:55 2016
*nat
:PREROUTING ACCEPT [5650:1147271]
:INPUT ACCEPT [91:14019]
:OUTPUT ACCEPT [325:31088]
:POSTROUTING ACCEPT [44:7161]
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
# Completed on Thu May 26 16:00:55 2016

Во-первых, ваша политика по умолчанию в цепочке FORWARD - ACCEPT, поэтому вы фактически не запрещаете какой-либо трафик. Это объясняет, почему работает переадресация 20 -> 50. Вы можете исправить это с помощью iptables -P FORWARD DROP.

Что касается других эхо-запросов, обратите внимание, что в ваших записях журнала TTL равно 127 или 63, что указывает на то, что брандмауэр уже принял решение о маршрутизации и уменьшил TTL. Кроме того, ваш брандмауэр не настроен на блокировку трафика. Это говорит о том, что проблема заключается в конфигурации маршрутизации клиентов. Могу я предложить вам использовать сниффер для получателя ping, чтобы узнать, прибывает ли исходный пакет ping? Убедитесь, что шлюз по умолчанию для клиентов (не брандмауэр) в 10.10.10.0/24 - 10.10.10.1 и т. Д. Удачи!

И, следуя комментарию к таблице маршрутизации, ваша таблица маршрутизации верна, что указывает на то, что ваш брандмауэр напрямую подключен к вашим сетям VLAN.

I. iptables

Вы добавили строку журнала после существующих правил? Если да, то вот что я думаю о вашей проблеме.

  1. -j ACCEPT завершить путь пакета в правиле. Строка журнала означает, что ваши 6 правил не совпадают.
  2. Политика FORWARD по умолчанию - ACCEPT, поэтому пакеты принимаются в любом случае, когда они достигают конца цепочки FORWARD. Вы должны изменить это поведение, добавив iptables -P FORWARD DROP.
  3. Просмотр журналов означает, что пакет будет отброшен, если у вас будут правильные политики по умолчанию. Зарегистрированные 4 эхо-запроса относятся к vlan, отличному от 100, что является ожидаемым поведением.
  4. Отсутствие журнала означает, что пакет соответствует правилу и был принят. Два эхо-запроса от vlan 100 соответствуют правилу, что снова является ожидаемым поведением.

Мы можем увидеть выполняет свою работу, вам просто нужно изменить политику по умолчанию.

II. Маршрутизация

Теперь вам нужно понять, откуда взялась проблема. Например, маршрутизация. Поскольку политика FORWARD по умолчанию - ACCEPT (вы можете сохранить ее, пока не выясните основную причину вашей проблемы), каждый пинг должен быть успешным. Давайте посмотрим на тех, кто этого не делает:
От 20 до 100, от 50 до 20, от 50 до 100, от 100 до 20.

В журналах мы можем проверить MAC, чтобы узнать, правильна ли маршрутизация. Формат <MAC dest (6 bytes)><MAC source (6 bytes)><08:00 & sometimes IP header>.
У нас есть журналы до маршрутизации, поэтому у нас есть <eth1 mac><sender mac><not interesting>.
Мы хотим <receiver mac><eth1 mac><not interesting>, чтобы мы могли видеть, отправляется ли пакет в нужное место.
Для этого мы могли бы установить правило журнала в цепочке POSTROUTING:

-A POSTROUTING -o eth1+ -p icmp -j LOG --log-prefix "IPTABLES POSTROUTING: " --log-level 7

Что мы знаем на данный момент:

  • 10.10.20.101: c8: 0a: a9: e5: f0: bc
  • 10.10.50.100: 00: 1e: ec: fa: d1: 10
  • eth1: 00: 0a: 5e: 50: 7c: c1

Нам также нужно знать MAC для 10.10.10.100.
Кстати, если у вас всего 4 vlan, попробуйте 12 ping, которые вы можете сделать, чтобы предоставить достаточно информации для отладки.
Можете ли вы попробовать 8 ping от (и до) интерфейсов маршрутизатора? (например, на маршрутизаторе: ping -I eth1.100 10.10.100.100)

III. Сторонние причины

Дважды проверьте свою конфигурацию Cisco (и откройте другой вопрос, если вы почти уверены, что это основная причина), убедитесь, что у каждого отдельного vlan есть доступ в Интернет.

Редактировать: Я пишу слишком медленно. Отлично сработано!