В приложении устройства мы используем следующую настройку сети VLAN:
В устройстве у нас есть внутренняя сеть для внутренних устройств и внешняя сеть для сети клиента/покупателя. Все устройства подключены через управляемый коммутатор к вычислительному модулю raspberry pi, на котором запускается приложение.
В настройке мы используем следующие VLAN
- VLAN 1: внешняя сеть
- VLAN 2: внутренняя сеть
Вычислительный модуль имеет на интерфейсе eth0 два интерфейса vlan eth0.1 (внешний) и eth0.2 (внутренний). Это сделано для того, чтобы клиент не видел внутренние сетевые устройства. Управляемый коммутатор имеет настроенные VLAN на основе портов.
Для внутренней сети вычислительный модуль использует eth0.2 со статическим ip-адресом 192.168.2.1 — устройства внутренней сети также в той же подсети 192.168.2.x.
Для внешней сети вычислительный модуль использует eth0.1 со статическим IP-адресом 192.168.1.100.
Наш конфиг на вычислительном модуле:
/etc/sysctl.conf
net.ipv4.ip_forward = 1
/etc/сеть/интерфейсы
# Внешний интерфейс VLAN
авто eth0.1
iface eth0.1 инет руководство
vlan-сырье-устройство eth0
# внутренний интерфейс VLAN
авто eth0.2
iface eth0.2 инет руководство
vlan-сырье-устройство eth0
/etc/dhcpcd.conf
интерфейс eth0
статический ip_address=
статические маршрутизаторы =
статическое имя_домена_серверы =
статический domain_search=
интерфейс eth0.1
статический ip_address=192.168.1.100/24
статические маршрутизаторы =
статическое имя_домена_серверы =
статический domain_search=
интерфейс eth0.2
статический ip_address=192.168.2.1/24
статические маршрутизаторы =
статическое имя_домена_серверы =
статический domain_search=
Для связи с внутренним устройством 192.168.2.100 напрямую с ПК клиента через внешний ip мы сделали следующие правила. При этом клиент получит доступ к внутреннему 192.168.2.100:80 через внешний IP-адрес 192.168.1.100:8080 на порту 8080.
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j ПЕРЕНАПРАВЛЕНИЕ --на порт 8080
sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.2.100:80
sudo iptables -t nat -A POSTROUTING -j MASQUERADE
В целом эта настройка работает, но не во всех случаях: клиент может изменить внешний IP-адрес eth0.1. Клиент может настроить IP-адрес eth0.1 на другой статический IP-адрес или DHCP. В случае статического IP-адреса 192.168.2.x на eth0.1 клиент достигнет 192.168.2.1 eth0.2.
Как возможно, что клиент не достигнет внутреннего IP-адреса 192.168.2.1, если внешний IP-адрес eth0.1 находится в той же подсети? Как можно разделить eth0.1 и eth0.2, если они находятся в одной подсети или имеют оба адреса 192.168.2.1?
Например: если eth0.2 имеет тот же IP-адрес, что и устройство из внутренней сети, то подключение к вычислительному модулю невозможно с этим конфликтом IP-адресов.