У меня довольно обычная установка 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