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

lxdbr0 и маршрутизация на основе источника хост-машины

У меня довольно обычная установка LXD (версия 3.0.3) с интерфейсом моста по умолчанию lxdbr0 в Ubuntu 18.04.2.

С другой стороны, сеть моих хост-машин не самая обычная. У меня есть два моста (br0 и br1), подключенных через две связи к четырем интерфейсам (2 интерфейса на связь, 1 связь на мост).

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

Теперь проблема в том, что я могу пинговать все и везде (хост выполняет маскировку IP), кроме хостов, которые находятся в той же подсети, что и br0 и br1, и поскольку мой прокси-сервер прямого доступа находится в той же подсети, что и br1, у меня проблема. Маршрут по умолчанию для хоста также находится на br1.

Правила и маршруты для хост-машины:

user@host:~$ ip route show
default via 10.10.50.254 dev br1 proto static
10.146.233.0/24 dev lxdbr0 proto kernel scope link src 10.146.233.1
10.10.99.0/24 dev br0 proto kernel scope link src 10.10.99.1
10.10.50.0/24 dev br1 proto kernel scope link src 10.10.50.1

user@host:~$ ip route show table 99
default via 10.10.99.254 dev br0 proto static

user@host:~$ ip rule show table 99
0:      from 10.10.99.0/24 lookup 99

user@host:~$ ip route show table 50
default via 10.10.50.254 dev br1 proto static

user@host:~$ ip rule show table 50
0:      from 10.10.50.0/24 lookup 50

Соответствующая конфигурация netplan выглядит следующим образом:

...
bridges:
    br0:
      addresses: [10.10.99.1/24]
      interfaces: [bond1]
      routes:
      - to: 0.0.0.0/0
        via: 10.10.99.254
        table: 99
      routing-policy:
      - from: 10.10.99.0/24
        table: 99
      parameters:
        stp: true
        forward-delay: 0
    br1:
      addresses: [10.10.50.1/24]
      gateway4: 10.10.50.254
      interfaces: [bond0]
      routes:
      - to: 0.0.0.0/0
        via: 10.10.50.254
        table: 50
      routing-policy:
      - from: 10.10.50.0/24
        table: 50
      parameters:
        stp: true
        forward-delay: 0

Единственные правила IPTABLES генерируются LXD

user@host:~$ sudo iptables -L -nv
Chain INPUT (policy ACCEPT 828 packets, 62176 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 ACCEPT     tcp  --  lxdbr0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:53 /* generated for LXD network lxdbr0 */
   16  1064 ACCEPT     udp  --  lxdbr0 *       0.0.0.0/0            0.0.0.0/0            udp dpt:53 /* generated for LXD network lxdbr0 */
    2   658 ACCEPT     udp  --  lxdbr0 *       0.0.0.0/0            0.0.0.0/0            udp dpt:67 /* generated for LXD network lxdbr0 */

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    7   588 ACCEPT     all  --  *      lxdbr0  0.0.0.0/0            0.0.0.0/0            /* generated for LXD network lxdbr0 */
    7   588 ACCEPT     all  --  lxdbr0 *       0.0.0.0/0            0.0.0.0/0            /* generated for LXD network lxdbr0 */

Chain OUTPUT (policy ACCEPT 540 packets, 69728 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 ACCEPT     tcp  --  *      lxdbr0  0.0.0.0/0            0.0.0.0/0            tcp spt:53 /* generated for LXD network lxdbr0 */
   16  1020 ACCEPT     udp  --  *      lxdbr0  0.0.0.0/0            0.0.0.0/0            udp spt:53 /* generated for LXD network lxdbr0 */
    2   680 ACCEPT     udp  --  *      lxdbr0  0.0.0.0/0            0.0.0.0/0            udp spt:67 /* generated for LXD network lxdbr0 */

Правила NAT

user@host:~$ sudo iptables -t nat -L -nv
Chain PREROUTING (policy ACCEPT 1649 packets, 66895 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain INPUT (policy ACCEPT 9 packets, 899 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 10 packets, 927 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain POSTROUTING (policy ACCEPT 10 packets, 927 bytes)
 pkts bytes target     prot opt in     out     source               destination
    3   252 MASQUERADE  all  --  *      *       10.146.233.0/24     !10.146.233.0/24      /* generated for LXD network lxdbr0 */

Если я пингую адреса подсети, отличные от br0 или br1, я могу видеть запросы и ответы на интерфейсах br1, lxdbr0 и veth. Если я пингую адреса br0 или br1, я вижу только запросы на интерфейсах lxdbr0 и veth. Нет трафика на br1 и ответов на любом из вышеупомянутых интерфейсов.

и, наконец, конфигурация моих интерфейсов с пропущенными интерфейсами eth, lo и bond:

user@host:~$ ip a
7: br1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether ee:f1:6a:84:6f:df brd ff:ff:ff:ff:ff:ff
    inet 10.10.50.1/24 brd 10.10.50.255 scope global br1
       valid_lft forever preferred_lft forever
8: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether ce:13:19:08:56:ad brd ff:ff:ff:ff:ff:ff
    inet 10.10.99.1/24 brd 10.10.99.255 scope global br0
       valid_lft forever preferred_lft forever
22: lxdbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether fe:cb:12:0f:9f:d7 brd ff:ff:ff:ff:ff:ff
    inet 10.146.233.1/24 scope global lxdbr0
       valid_lft forever preferred_lft forever
    inet6 fe80::70f5:3eff:feac:2ae6/64 scope link
       valid_lft forever preferred_lft forever
26: vethANRBKX@if25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master lxdbr0 state UP group default qlen 1000
    link/ether fe:cb:12:0f:9f:d7 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::fccb:12ff:fe0f:9fd7/64 scope link
       valid_lft forever preferred_lft forever

Моим желаемым результатом было бы ограничение NAT на 10.10.50.254 и 10.10.99.254 и доступ в Интернет из контейнеров через мой прокси в подсети br1. Мне, вероятно, нужно что-то сделать с моими правилами маршрутизации / политики или iptables или настроить lxdbr0 по-другому, но на данный момент я, похоже, застрял.

Вам следует добавить маршруты с прямым подключением в дополнительные таблицы маршрутизации. В текущей конфигурации при пинге адресов интерфейсов моста ответы маршрутизируются через шлюзы (10.10.50.254 и 10.10.99.254) наружу.

Проверить маршрутизацию можно с помощью команд:

  • ip route get 10.146.233.2 from 10.10.50.1
  • ip route get 10.146.233.2 from 10.10.99.1

Вы увидите актуальные маршруты и, возможно, немного запутаетесь.

Итак, ваши таблицы маршрутизации должны выглядеть так:

user@host:~$ ip route show table 50
default via 10.10.50.254 dev br1 proto static
10.146.233.0/24 dev lxdbr0 proto static scope link src 10.146.233.1
10.10.99.0/24 dev br0 proto static scope link src 10.10.99.1
10.10.50.0/24 dev br1 proto static scope link src 10.10.50.1

user@host:~$ ip route show table 99
default via 10.10.99.254 dev br0 proto static
10.146.233.0/24 dev lxdbr0 proto static scope link src 10.146.233.1
10.10.99.0/24 dev br0 proto static scope link src 10.10.99.1
10.10.50.0/24 dev br1 proto static scope link src 10.10.50.1