在设备应用程序中,我们使用以下 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 external interface
auto eth0.1
iface eth0.1 inet manual
vlan-raw-device eth0
# VLAN internal interface
auto eth0.2
iface eth0.2 inet manual
vlan-raw-device eth0
/etc/dhcpcd.conf
interface eth0
static ip_address=
static routers=
static domain_name_servers=
static domain_search=
interface eth0.1
static ip_address=192.168.1.100/24
static routers=
static domain_name_servers=
static domain_search=
interface eth0.2
static ip_address=192.168.2.1/24
static routers=
static domain_name_servers=
static domain_search=
对于客户 PC 直接通过外部 IP 与内部设备 192.168.2.100 进行通信,我们制定了以下规则。这样,客户将通过端口 8080 上的外部 IP 地址 192.168.1.100:8080 访问内部 192.168.2.100:80。
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 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
一般情况下,此设置有效,但并非在所有情况下都有效:客户可以更改 eth0.1 的外部 IP 地址。客户可以将 eth0.1 的 IP 配置为另一个静态 IP 地址或 dhcp。如果 eth0.1 上的静态 IP 地址为 192.168.2.x,则客户将访问 eth0.2 的 192.168.2.1。
如果 eth0.1 的外部 IP 位于同一子网中,那么客户怎么可能访问不到内部 IP 192.168.2.1?如果 eth0.1 和 eth0.2 位于同一子网中或两者都是 192.168.2.1,那么如何区分它们?
例如:如果 eth0.2 具有与内部网络设备相同的 IP 地址,则由于此 IP 冲突,无法连接到计算模块。