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

Ubuntu 12.04 - проблема с маршрутизацией между Ethernet и связью / мостом

У меня есть устройство, на котором есть 3 устройства Ethernet и одно устройство WiFi.
Я использую eth0 для внутренней сети (192.168.1.0/24) и eth1, eth2 и wlan0 для подключения к внешней сети (192.168.0.0/24). eth1 и eth2 настроены в мосте br0, а br0 и wlan0 настроены в связке (активное резервное копирование, при этом br0 является основным устройством).

Вот визуализация установки:

                                                                          +---------------+
                                                              +-----------+ 192.168.0.3   |
                                                              |           | (Router)      |
                                                              |           +---------------+
                                                    +---------+--------+  +---------------+
                                                 +->+ External Network +--+ 192.168.0.160 |
                                                 |  | 192.168.0.0/24   |  +---------------+
                                                 |  +------------------+
                                                 |
                         +----------------------------------------------------------------+
                         | My Device             |                                        |
+------------------+     | +------+           +--+---+        +------+        +-------+   |
| Internal Network +-------+ eth0 +------+    | eth1 |        | eth2 |        | wlan0 |   |
| 192.168.1.0/24   |     | +------+      |    +--+---+        +--+---+        +-------+   |
+--------+---------+     | 192.168.1.1   |       |               |                        |
         |               |               |       +-------+-------+                +       |
         |               |               |               |                                |
  +------+-------+       |               |            +--+--+                     +       |
  | 192.168.1.62 |       |               |            | br0 |                             |
  +--------------+       |               |            +--+--+                     +       |
                         |               |               |                                |
                         |               |               +-----------++ + + + + + +       |
                         |               |                           |                    |
                         |               |                       +---+---+                |
                         |               +-----------------------+ bond0 |                |
                         |                                       +-------+                |
                         |                                       192.168.0.235            |
                         |                                                                |
                         +----------------------------------------------------------------+

Я бы хотел, чтобы устройство работало как маршрутизатор из внутренней сети во внешнюю. К сожалению, я не могу заставить его работать. Вот моя конфигурация (wlan0 на данный момент не настроен):

# /etc/network/interfaces

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
    address         192.168.1.1
    network         192.168.1.0
    netmask         255.255.255.0
    broadcast       192.168.1.255

# Network bridge between eth1 and eth2
allow-hotplug eth1
iface eth1 inet manual
    pre-up          ifconfig $IFACE up
    pre-down        ifconfig $IFACE down

allow-hotplug eth2
iface eth2 inet manual
    pre-up          ifconfig $IFACE up
    pre-down        ifconfig $IFACE down

auto br0
iface br0 inet manual
    bridge_ports    eth1 eth2
    bond-master     bond0
    bond-primary    br0
    bond-mode       active-backup

auto bond0
iface bond0 inet static
    address         192.168.0.235
    netmask         255.255.255.0
    gateway         192.168.0.3
    dns-nameservers 8.8.8.8 8.8.4.4
    bond-master     bond0
    bond-primary    br0
    bond-mode       active-backup
    bond-miimon     100
    bond-slaves     none

Я использовал следующие команды для настройки iptables и включения пересылки:

/sbin/iptables -A FORWARD -o bond0 -i eth0 -m conntrack --ctstate NEW -j ACCEPT
/sbin/iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -t nat -A POSTROUTING -o bond0 -j MASQUERADE
/sbin/sysctl -w net.ipv4.ip_forward=1

Вот как выглядит таблица маршрутизации:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.3     0.0.0.0         UG    100    0        0 bond0
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 bond0
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0

Теперь, когда я пытаюсь бежать ping 192.168.0.160 на устройстве, подключенном к eth0 (у устройства IP 192.168.1.62), я не получаю никаких ответов. Это tcpdump с этого устройства:

07:22:44.568488 IP 192.168.1.62 > 192.168.0.160: ICMP echo request, id 27191, seq 1, length 64
07:22:45.571836 IP 192.168.1.62 > 192.168.0.160: ICMP echo request, id 27191, seq 2, length 64
07:22:46.571892 IP 192.168.1.62 > 192.168.0.160: ICMP echo request, id 27191, seq 3, length 64
07:22:47.571984 IP 192.168.1.62 > 192.168.0.160: ICMP echo request, id 27191, seq 4, length 64

Вот tcpdump с моего устройства (192.168.1.1 / 192.168.0.235)

07:22:44.566474 IP 192.168.0.235 > 192.168.0.160: ICMP echo request, id 27191, seq 1, length 64      
07:22:45.569468 IP 192.168.0.235 > 192.168.0.160: ICMP echo request, id 27191, seq 2, length 64      
07:22:46.569490 IP 192.168.0.235 > 192.168.0.160: ICMP echo request, id 27191, seq 3, length 64      
07:22:47.569496 IP 192.168.0.235 > 192.168.0.160: ICMP echo request, id 27191, seq 4, length 64      

А вот и tcpdump с целевого устройства (192.168.0.160)

01:19:10.509404 IP 192.168.0.235 > 192.168.0.160: ICMP echo request, id 27191, seq 1, length 64
01:19:10.509477 IP 192.168.0.160 > 192.168.0.235: ICMP echo reply, id 27191, seq 1, length 64
01:19:11.512402 IP 192.168.0.235 > 192.168.0.160: ICMP echo request, id 27191, seq 2, length 64
01:19:11.512450 IP 192.168.0.160 > 192.168.0.235: ICMP echo reply, id 27191, seq 2, length 64
01:19:12.512369 IP 192.168.0.235 > 192.168.0.160: ICMP echo request, id 27191, seq 3, length 64
01:19:12.512414 IP 192.168.0.160 > 192.168.0.235: ICMP echo reply, id 27191, seq 3, length 64
01:19:13.512347 IP 192.168.0.235 > 192.168.0.160: ICMP echo request, id 27191, seq 4, length 64
01:19:13.512393 IP 192.168.0.160 > 192.168.0.235: ICMP echo reply, id 27191, seq 4, length 64

Судя по всему, цель действительно получает пинг и отправляет ответ, но мое устройство ничего с этим не делает.

Вот что я получаю в системном журнале во время выполнения эхо-запросов:

Mar 16 07:22:44 cb035 kernel: [ 4673.602509] martian source 192.168.1.64 from 192.168.0.3, on dev br0
Mar 16 07:22:44 cb035 kernel: [ 4673.602562] ll header: 00:0d:b9:3c:23:71:40:4a:03:06:ef:86:08:00
Mar 16 07:22:44 cb035 kernel: [ 4673.737283] martian source 192.168.1.62 from 192.168.0.160, on dev br0
Mar 16 07:22:44 cb035 kernel: [ 4673.737306] ll header: 00:0d:b9:3c:23:71:00:0d:b9:2b:27:8c:08:00
Mar 16 07:22:45 cb035 kernel: [ 4674.740295] martian source 192.168.1.62 from 192.168.0.160, on dev br0
Mar 16 07:22:45 cb035 kernel: [ 4674.740318] ll header: 00:0d:b9:3c:23:71:00:0d:b9:2b:27:8c:08:00
Mar 16 07:22:46 cb035 kernel: [ 4675.740317] martian source 192.168.1.62 from 192.168.0.160, on dev br0
Mar 16 07:22:46 cb035 kernel: [ 4675.740341] ll header: 00:0d:b9:3c:23:71:00:0d:b9:2b:27:8c:08:00
Mar 16 07:22:47 cb035 kernel: [ 4676.740294] martian source 192.168.1.62 from 192.168.0.160, on dev br0
Mar 16 07:22:47 cb035 kernel: [ 4676.740317] ll header: 00:0d:b9:3c:23:71:00:0d:b9:2b:27:8c:08:00

Означает ли это, что мое устройство получает ответы на неправильном интерфейсе (br0 вместо bond0) и поэтому не знает, что с ними делать? Есть способ исправить?