Я установил hostapd на RP3, чтобы можно было подключить к нему некоторые устройства IoT. Внутри RP3 у меня есть несколько контейнеров докеров, в одном из которых работает MQTT Broker.
Брокер MQTT работает в мостовой сети (172.16.1.0), Hostapd настроен под wlan0 на мосту с eth0 для доступа в Интернет (br0), а dnsmasq назначает IP в диапазоне 192.168.2.150-192.168.2.250, что то же самое Диапазон IP-адресов, который работает RP3 (192.168.2.10).
Проблема в том, что я не могу подключиться от внешнего клиента к брокеру MQTT, но я могу подключиться к брокеру с RP3, хотя он говорит, что клиент с диапазоном IP-адресов 172.16.1.x пытается получить доступ вместо IP-адреса RP3 (192.168.1.1). 2.10).
Я думаю, что чего-то не хватает, маршрутизации между клиентами hostapd и сетью моста контейнера докеров, но я не уверен, как этого добиться. Это в iptables, в dnsmasq? Я не хочу запускать докер MQTT в режиме хоста.
Некоторые настройки конфигурации:
net.ipv4.ip_forward=1 is enabled
$ nano /etc/hostapd/hostapd.conf
interface=wlan0
bridge=br0
...
$ nano /etc/dnsmasq.conf
interface=wlan0
dhcp-range=192.168.2.150,192.168.2.250,255.255.255.0,24h
$ nano /etc/dhcpcd.conf
...
denyinterfaces wlan0 eth0
interface eth0
static ip_address=192.168.2.10
static routers=192.168.2.1
# static domain_name_servers=200.30.192.14
interface wlan0
static ip_address=192.168.2.149
static routers=192.168.2.1
nohook wpa_supplicant
interface br0
static ip_address=192.168.2.10
static routers=192.168.2.1
$ ifconfig
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.2.10 netmask 255.255.255.0 broadcast 192.168.2.255
inet6 fe80::93db:ce25:c561:7628 prefixlen 64 scopeid 0x20<link>
ether b8:27:eb:36:86:95 txqueuelen 1000 (Ethernet)
RX packets 1363877 bytes 557765234 (531.9 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1852401 bytes 209982006 (200.2 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
br-34828e803471: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.16.1.254 netmask 255.255.0.0 broadcast 172.16.255.255
inet6 fe80::f2df:bb3a:df64:d8b9 prefixlen 64 scopeid 0x20<link>
ether 02:42:1f:98:2a:39 txqueuelen 0 (Ethernet)
RX packets 29239 bytes 1416296 (1.3 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 862702 bytes 111847089 (106.6 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
ether b8:27:eb:36:86:95 txqueuelen 1000 (Ethernet)
RX packets 256255 bytes 15930835 (15.1 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 710584 bytes 104106492 (99.2 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
ether b8:27:eb:63:d3:c0 txqueuelen 1000 (Ethernet)
RX packets 2640481 bytes 1215747996 (1.1 GiB)
RX errors 0 dropped 18255 overruns 0 frame 0
TX packets 3941056 bytes 472915664 (451.0 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
...
$ iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N DOCKER
-N DOCKER-ISOLATION-STAGE-1
-N DOCKER-ISOLATION-STAGE-2
-N DOCKER-USER
-N f2b-sshd
-A INPUT -p tcp -m multiport --dports 22 -j f2b-sshd
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A FORWARD -i br-34828e803471 -o br-34828e803471 -j ACCEPT
-A FORWARD -o br-b66bbdf9b3a6 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o br-b66bbdf9b3a6 -j DOCKER
-A FORWARD -i br-b66bbdf9b3a6 ! -o br-b66bbdf9b3a6 -j ACCEPT
-A FORWARD -i br-b66bbdf9b3a6 -o br-b66bbdf9b3a6 -j ACCEPT
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 ! -s 172.16.0.0/16 -o br-34828e803471 -j DROP
-A DOCKER-ISOLATION-STAGE-1 ! -d 172.16.0.0/16 -i br-34828e803471 -j DROP
-A DOCKER-ISOLATION-STAGE-1 -i br-b66bbdf9b3a6 ! -o br-b66bbdf9b3a6 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -o br-b66bbdf9b3a6 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
-A DOCKER-USER -j RETURN
-A f2b-sshd -j RETURN
Легко, просто измените сетевой адаптер докера с internal: true на internal: false. Это решило проблему, хотя мне пришлось подключиться к IP-адресу RP3 192.168.2.10:1883