Multiple LANs without VLANs

Hello!

I'm facing an issue trying to configure multiple LANs without VLANs.

My setup is quite simple: I have a Mikrotik RB750gr3 router (without Wireless) with WAN and just one port of LAN used (just the default VLAN used). This port is connected to a unmanaged 8 port switch. In this switch I have some devices attached, specially a small server with some virtual machines running, all statically addressed. One VM is on standard OpenWRT LAN network (192.168.1.0/24). Another one is on GUEST network (192.168.3.0/24). All of them is using bridge interface on this server, acting as multiple "virtual NICs" on one real NIC port (the small server network port).

I've managed this network configuring two addresses on LAN router port (the bridged one and an alias to it), as presented on my /etc/config/network file:

config interface 'loopback'
	option ifname 'lo'
	option proto 'static'
	option ipaddr '127.0.0.1'
	option netmask '255.0.0.0'

config globals 'globals'
	option ula_prefix 'fdf0:ed02:a420::/48'

config interface 'lan'
	option ifname 'eth0.1'
	option proto 'static'
	option netmask '255.255.255.0'
	option ip6assign '60'
	option ipaddr '192.168.1.1'
	list dns '8.8.8.8'
	list dns '8.8.4.4'
	option igmp_snooping '1'
	option type 'bridge'

config device 'lan_eth0_1_dev'
	option name 'eth0.1'
	option macaddr 'xx:xx:xx:xx:36:0f'

config interface 'wan'
	option ifname 'eth0.2'
	option proto 'pppoe'
	option password 'blah'
	option ipv6 'auto'
	option username 'blah'

config device 'wan_eth0_2_dev'
	option name 'eth0.2'
	option macaddr 'xx:xx:xx:xx:36:10'

config switch
	option name 'switch0'
	option reset '1'
	option enable_vlan '1'

config switch_vlan
	option device 'switch0'
	option vlan '1'
	option ports '1 2 3 4 6t'

config switch_vlan
	option device 'switch0'
	option vlan '2'
	option ports '0 6t'

config interface 'guest'
	option proto 'static'
	option ipaddr '192.168.3.1'
	option netmask '255.255.255.0'
	option ifname '@lan'

So far, so good. But I want to put some firewall rules in it so LAN can access any GUEST address, but GUEST addresses should not access LAN address. I've used https://openwrt.org/docs/guide-user/network/wifi/guestwifi/guest-wlan#firewall but it doesn't worked. For example, an address like 192.168.3.10 can ping an address like 192.168.1.130 and it's not desired.

It's possible to assemble a configuration like this?

Cheers!

No its not. You put them in the same LAN/VLAN. Therefore traffic does not pass the router. When it does, it's in the same zone...see below.

You didn't show the rules.

Try changing might changing the LAN FORWARD rule to REJECT.

Sorry for not putting the firewall rules on the post. Here it is:

config defaults
	option input 'ACCEPT'
	option output 'ACCEPT'
	option forward 'REJECT'
	option synflood_protect '1'

config zone 'lan'
	option name 'lan'
	option output 'ACCEPT'
	option network 'lan'
	option input 'ACCEPT'
	option forward 'REJECT'

config zone 'wan'
	option name 'wan'
	option input 'REJECT'
	option output 'ACCEPT'
	option forward 'REJECT'
	option masq '1'
	option mtu_fix '1'
	option network 'wan'

config forwarding
	option src 'lan'
	option dest 'wan'

config rule
	option name 'Allow-DHCP-Renew'
	option src 'wan'
	option proto 'udp'
	option dest_port '68'
	option target 'ACCEPT'
	option family 'ipv4'

config rule
	option name 'Allow-Ping'
	option src 'wan'
	option proto 'icmp'
	option icmp_type 'echo-request'
	option family 'ipv4'
	option target 'ACCEPT'

config rule
	option name 'Allow-IGMP'
	option src 'wan'
	option proto 'igmp'
	option family 'ipv4'
	option target 'ACCEPT'

config rule
	option name 'Allow-DHCPv6'
	option src 'wan'
	option proto 'udp'
	option src_ip 'fc00::/6'
	option dest_ip 'fc00::/6'
	option dest_port '546'
	option family 'ipv6'
	option target 'ACCEPT'

config rule
	option name 'Allow-MLD'
	option src 'wan'
	option proto 'icmp'
	option src_ip 'fe80::/10'
	list icmp_type '130/0'
	list icmp_type '131/0'
	list icmp_type '132/0'
	list icmp_type '143/0'
	option family 'ipv6'
	option target 'ACCEPT'

config rule
	option name 'Allow-ICMPv6-Input'
	option src 'wan'
	option proto 'icmp'
	list icmp_type 'echo-request'
	list icmp_type 'echo-reply'
	list icmp_type 'destination-unreachable'
	list icmp_type 'packet-too-big'
	list icmp_type 'time-exceeded'
	list icmp_type 'bad-header'
	list icmp_type 'unknown-header-type'
	list icmp_type 'router-solicitation'
	list icmp_type 'neighbour-solicitation'
	list icmp_type 'router-advertisement'
	list icmp_type 'neighbour-advertisement'
	option limit '1000/sec'
	option family 'ipv6'
	option target 'ACCEPT'

config rule
	option name 'Allow-ICMPv6-Forward'
	option src 'wan'
	option dest '*'
	option proto 'icmp'
	list icmp_type 'echo-request'
	list icmp_type 'echo-reply'
	list icmp_type 'destination-unreachable'
	list icmp_type 'packet-too-big'
	list icmp_type 'time-exceeded'
	list icmp_type 'bad-header'
	list icmp_type 'unknown-header-type'
	option limit '1000/sec'
	option family 'ipv6'
	option target 'ACCEPT'

config rule
	option name 'Allow-IPSec-ESP'
	option src 'wan'
	option dest 'lan'
	option proto 'esp'
	option target 'ACCEPT'

config rule
	option name 'Allow-ISAKMP'
	option src 'wan'
	option dest 'lan'
	option dest_port '500'
	option proto 'udp'
	option target 'ACCEPT'

config include
	option path '/etc/firewall.user'

config include 'miniupnpd'
	option type 'script'
	option path '/usr/share/miniupnpd/firewall.include'
	option family 'any'
	option reload '1'

config rule 'wg'
	option name 'Allow-WireGuard'
	option src 'wan'
	option dest_port '51820'
	option proto 'udp'
	option target 'ACCEPT'

config zone 'guest'
	option name 'guest'
	option network 'guest'
	option input 'REJECT'
	option output 'ACCEPT'
	option forward 'REJECT'

config forwarding 'guest_wan'
	option src 'guest'
	option dest 'wan'

config rule 'guest_dns'
	option name 'Allow-DNS-Guest'
	option src 'guest'
	option dest_port '53'
	option proto 'tcp udp'
	option target 'ACCEPT'

config rule 'guest_dhcp'
	option name 'Allow-DHCP-Guest'
	option src 'guest'
	option dest_port '67'
	option family 'ipv4'
	option proto 'udp'
	option target 'ACCEPT'

config forwarding
	option dest 'guest'
	option src 'lan'


I'm already using REJECT on all three zones.

It's not working as expected.

Thanks in advance!

It's not expected to work as it is the same interface and not different interfaces in the same zone, where the REJECT in FORWARD would work.
The solution is not secure at all, users can jump from one network to the other and furthermore you'll have issues with dhcp.
Create a vlan, then assign the guest interface there, create a guest zone and then it will work as intended.

1 Like

I've came to a solution, using MACVLAN. Inspired on https://forum.archive.openwrt.org/viewtopic.php?id=65292.

First the kmod-macvlan package should be installed with opkg (or LUCI, or build in).

/etc/config/network:

config interface 'loopback'
	option ifname 'lo'
	option proto 'static'
	option ipaddr '127.0.0.1'
	option netmask '255.0.0.0'

config globals 'globals'
	option ula_prefix 'xxxxx02:a420::/48'

config device 'lan_eth0_1_dev'
	option name 'eth0.1'
	option macaddr 'xxxx6:0f'

config interface 'lan'
	option ifname 'eth0.1'
	option proto 'static'
	option netmask '255.255.255.0'
	option ip6assign '60'
	option ipaddr '192.168.1.1'

config device 'wan_eth0_2_dev'
	option name 'eth0.2'
	option macaddr 'xxxxxx:10'

config interface 'wan'
	option ifname 'eth0.2'
	option proto 'pppoe'
	option password 'blah'
	option ipv6 'auto'
	option username 'blah'

config switch
	option name 'switch0'
	option reset '1'
	option enable_vlan '1'

config switch_vlan
	option device 'switch0'
	option vlan '1'
	option ports '1 2 3 4 6t'

config switch_vlan
	option device 'switch0'
	option vlan '2'
	option ports '0 6t'

config interface 'guest'
	option ifname 'veth4'
	option proto 'static'
	option netmask '255.255.255.0'
	option ip6assign '60'
	option ipaddr '192.168.3.1'

Changes: LAN interface (originally br-lan) is now directly eth0.1. Interface GUEST now uses veth4 virtuall ethernet port.

/etc/config/firewall:

config defaults
	option input 'ACCEPT'
	option output 'ACCEPT'
	option forward 'REJECT'
	option synflood_protect '1'

config zone 'lan'
	option name 'lan'
	option output 'ACCEPT'
	option network 'lan'
	option input 'ACCEPT'
	option forward 'REJECT'

config zone 'wan'
	option name 'wan'
	option input 'REJECT'
	option output 'ACCEPT'
	option forward 'REJECT'
	option masq '1'
	option mtu_fix '1'
	option network 'wan'

config forwarding
	option src 'lan'
	option dest 'wan'

config rule
	option name 'Allow-DHCP-Renew'
	option src 'wan'
	option proto 'udp'
	option dest_port '68'
	option target 'ACCEPT'
	option family 'ipv4'

config rule
	option name 'Allow-Ping'
	option src 'wan'
	option proto 'icmp'
	option icmp_type 'echo-request'
	option family 'ipv4'
	option target 'ACCEPT'

config rule
	option name 'Allow-IGMP'
	option src 'wan'
	option proto 'igmp'
	option family 'ipv4'
	option target 'ACCEPT'

config rule
	option name 'Allow-DHCPv6'
	option src 'wan'
	option proto 'udp'
	option src_ip 'fc00::/6'
	option dest_ip 'fc00::/6'
	option dest_port '546'
	option family 'ipv6'
	option target 'ACCEPT'

config rule
	option name 'Allow-MLD'
	option src 'wan'
	option proto 'icmp'
	option src_ip 'fe80::/10'
	list icmp_type '130/0'
	list icmp_type '131/0'
	list icmp_type '132/0'
	list icmp_type '143/0'
	option family 'ipv6'
	option target 'ACCEPT'

config rule
	option name 'Allow-ICMPv6-Input'
	option src 'wan'
	option proto 'icmp'
	list icmp_type 'echo-request'
	list icmp_type 'echo-reply'
	list icmp_type 'destination-unreachable'
	list icmp_type 'packet-too-big'
	list icmp_type 'time-exceeded'
	list icmp_type 'bad-header'
	list icmp_type 'unknown-header-type'
	list icmp_type 'router-solicitation'
	list icmp_type 'neighbour-solicitation'
	list icmp_type 'router-advertisement'
	list icmp_type 'neighbour-advertisement'
	option limit '1000/sec'
	option family 'ipv6'
	option target 'ACCEPT'

config rule
	option name 'Allow-ICMPv6-Forward'
	option src 'wan'
	option dest '*'
	option proto 'icmp'
	list icmp_type 'echo-request'
	list icmp_type 'echo-reply'
	list icmp_type 'destination-unreachable'
	list icmp_type 'packet-too-big'
	list icmp_type 'time-exceeded'
	list icmp_type 'bad-header'
	list icmp_type 'unknown-header-type'
	option limit '1000/sec'
	option family 'ipv6'
	option target 'ACCEPT'

config rule
	option name 'Allow-IPSec-ESP'
	option src 'wan'
	option dest 'lan'
	option proto 'esp'
	option target 'ACCEPT'

config rule
	option name 'Allow-ISAKMP'
	option src 'wan'
	option dest 'lan'
	option dest_port '500'
	option proto 'udp'
	option target 'ACCEPT'

config include
	option path '/etc/firewall.user'

config include 'miniupnpd'
	option type 'script'
	option path '/usr/share/miniupnpd/firewall.include'
	option family 'any'
	option reload '1'

config rule 'wg'
	option name 'Allow-WireGuard'
	option src 'wan'
	option dest_port '51820'
	option proto 'udp'
	option target 'ACCEPT'

config zone 'guest'
	option name 'guest'
	option output 'ACCEPT'
	option forward 'REJECT'
	option input 'ACCEPT'
	option network 'guest'

config forwarding 'guest_wan'
	option src 'guest'
	option dest 'wan'

config rule 'guest_dns'
	option name 'Allow-DNS-Guest'
	option src 'guest'
	option dest_port '53'
	option proto 'tcp udp'
	option target 'ACCEPT'

config forwarding
	option dest 'guest'
	option src 'lan'

config rule
	option target 'ACCEPT'
	list proto 'icmp'
	option name 'Allow-ping-Guest'
	option src 'guest'

config rule
	option src 'guest'
	option name 'Block-GUEST-LAN'
	option dest 'lan'
	option target 'DROP'
	list proto 'all'

I've made the last rule to avoid weird messages on ping.

/etc/config/dhcp:

config dnsmasq
	option domainneeded '1'
	option boguspriv '1'
	option filterwin2k '0'
	option localise_queries '1'
	option rebind_protection '1'
	option rebind_localhost '1'
	option local '/lan/'
	option domain 'lan'
	option expandhosts '1'
	option nonegcache '0'
	option authoritative '1'
	option readethers '1'
	option leasefile '/tmp/dhcp.leases'
	option resolvfile '/tmp/resolv.conf.auto'
	option nonwildcard '1'
	option localservice '1'

config dhcp 'lan'
	option interface 'lan'
	option start '100'
	option limit '150'
	option leasetime '12h'
	option dhcpv6 'server'
	option ra 'server'
	option ra_management '1'

config dhcp 'wan'
	option interface 'wan'
	option ignore '1'

config odhcpd 'odhcpd'
	option maindhcp '0'
	option leasefile '/tmp/hosts/odhcpd'
	option leasetrigger '/usr/sbin/odhcpd-update'
	option loglevel '4'

config domain
	option name 'router'
	option ip '192.168.1.1'

config dhcp 'guest'
	option interface 'guest'
	option ra_management '1'
	option ra 'server'
	option dhcpv6 'server'
	option ignore '1'

DHCP is disabled on GUEST network (virtual NIC and subnet).

lastly it's necessary to set-up the virtual macvlan interface outside /etc/config/network (I tried to bring it up from inside, to no avail). Here is /etc/rc.local file:

# Put your custom commands here that should be executed once
# the system init finished. By default this file does nothing.

ip link add link eth0.1 veth4 type macvlan

exit 0

Everything works as expected, with IPv6 too.

But I would like to thank you a lot for throwing light to some issues that arises when mixing traffic of two (or more) subnets on the same NIC. Broadcast, unicast, mDNS, arp-scan, DHCP... all of them may not work properly. On my special case when I'm planning three subnets - LAN, home automation and work (in this thread called GUEST) - it can be worst.

The drawback is the virtualized server (an Intel NUC box), with just one ethernet port. My solution seems to work with this port constrain, but is (very) ugly an insecure. I'm tempted to buy two USB3 ethernet dongles to connect NUC to three subnets, with three VLANs directly to three available ports on the router.

Cheers!

Why not buy a cheap vlan aware switch and just do proper vlans? Sg108e for example or a Zyxel

1 Like

That would be great, and is really cheap.

Thanks.

This topic was automatically closed 10 days after the last reply. New replies are no longer allowed.