VLAN 与虚拟接口对
VLAN 与虚拟接口对
网络需求
内部有两个 VLAN(trunk 环境),网关在路由器上,防火墙工作在虚拟接口对方式部署在核心交换与核心路由之间,允许两个 VLAN 访问外网,同时两个 VLAN 之间需要互访,并且对这两个 VLAN 进行保护,开启反病毒过滤。
网络拓扑
拓扑 1:单 VLAN 透传

拓扑 2:多 VLAN 透传,VLAN 之间互访

配置要点
拓扑 1:单 VLAN 透传
- SW 交换机/Internet_R 路由器的基础配置
- 配置虚拟接口对(Port1 & Port2)
- 配置安全策略允许内网 PC(VLAN10 内主机)访问互联网
拓扑 2:多 VLAN 透传,VLAN 之间互访
- SW 交换机/Internet_R 路由器的基础配置
- 配置虚拟接口对(Port1 & Port2)
- 配置安全策略允许内网 PC(VLAN10 和 VLAN20 内主机)访问互联网
配置步骤
拓扑 1:单 VLAN 透传
SW 交换机/Internet_R 路由器的基础配置。
SW:
interface Ethernet0/0 switchport trunk allowed vlan 1,10 switchport trunk encapsulation dot1q switchport mode trunk ! interface Ethernet0/1 switchport access vlan 10 switchport mode accessInternet_R:
hostname Internet_R ! interface Ethernet0/0 ip address 192.168.1.99 255.255.255.0 no shutdown ip nat inside ! interface Ethernet0/0.10 encapsulation dot1Q 10 ip address 192.168.10.99 255.255.255.0 no shutdown ip nat inside ! interface Ethernet0/1 ip address 202.100.1.179 255.255.255.0 no shutdown ip nat outside ! ip route 0.0.0.0 0.0.0.0 202.100.1.192 ! access-list 101 permit ip any any ip nat inside source list 101 interface Ethernet0/1 overload配置虚拟接口对(Port1 & Port2),防火墙处于路由模式的情况下,直接创建虚拟接口对,将 port1 和 port2 加入到虚拟接口对中并开启通配符 VLAN,识别 VLAN-Tag 的数据。



虚拟接口对通道正式打通,可以认为 port1 和 port2 之间可以透明的传输数据了(需要防火墙策略放通),对应的 CLI 如下。
config system virtual-wire-pair edit "VWP1" set member "port1" "port2" set wildcard-vlan enable //这个命令很关键,识别VLAN-TAG,VWP模式下无需再到本地创建对应的VLAN接口和Forwar-Domain了,大大的简化了策略的配置量 next end配置虚拟接口对的策略:允许 LAN(Port2,VLAN10 内网主机)到 WAN(port1)的上网流量穿过 FGT,策略 & 对象的位置会多出“防火墙虚拟线对策略”(如果没有看到,则刷新页面或注销管理登陆,重新登陆 FGT 即可看到)。

右上角选择 VWP1 线对,方向选择 port1 → port2(也可选择双向的方向),新建 VWP 策略(虚拟连接对可以选择多个,在同一条相同动作的策略中进行多接口控制)。


重要
只需要配置 VALN10 网段到 WAN 的策略即可实现,配置很简单,可以忽略 VLAN - TAG 接口和 Forward-Domain 等透明模式下需要考虑的因素。
拓扑 2:多 VLAN 透传,VLAN 之间互访
SW 交换机/Internet_R 路由器的基础配置。
SW:
interface Ethernet0/0 switchport trunk allowed vlan 1,10,20 switchport trunk encapsulation dot1q switchport mode trunk ! interface Ethernet0/1 switchport access vlan 10 switchport mode access ! interface Ethernet0/2 switchport access vlan 20 switchport mode accessInternet_R:
hostname Internet_R ! interface Ethernet0/0 ip address 192.168.1.99 255.255.255.0 no shutdown ip nat inside ! interface Ethernet0/0.10 encapsulation dot1Q 10 ip address 192.168.10.99 255.255.255.0 no shutdown ip nat inside ! interface Ethernet0/0.20 encapsulation dot1Q 20 ip address 192.168.20.99 255.255.255.0 no shutdown ip nat inside ! interface Ethernet0/1 ip address 202.100.1.179 255.255.255.0 no shutdown ip nat outside ! ip route 0.0.0.0 0.0.0.0 202.100.1.192 ! access-list 101 permit ip any any ip nat inside source list 101 interface Ethernet0/1 overload配置虚拟接口对(Port1 & Port2),防火墙处于路由模式的情况下,直接创建虚拟接口对,将 port1 和 port2 加入到虚拟接口对中并开启通配符 VLAN,识别 VLAN-Tag 的数据。


虚拟接口对通道正式打通,可以认为 port1 和 port2 之间可以透明的传输数据了(需要防火墙策略放通),对应的 CLI 如下。
config system virtual-wire-pair edit "VWP1" set member "port1" "port2" set wildcard-vlan enable //这个命令很关键,识别VLAN-TAG,VWP模式下无需再到本地创建对应的VLAN接口和Forwar-Domain了,大大的简化了策略的配置量 next end配置虚拟接口对的策略:允许 LAN(port1)到 WAN(port2)的上网流量穿过 FGT,策略 & 对象的位置会多出“防火墙虚拟线对策略”(如果没有看到,则刷新页面或注销管理登陆,重新登陆 FGT 即可看到)。

右上角选择 VWP1 线对,方向选择 port1 → port2(也可选择双向的方向),新建 VWP 策略(虚拟连接对可以选择多个,在同一条相同动作的策略中进行多接口控制)。


重要
其实配置上上述两条策略数据就已经通了,因为两条策略的目的 IP 都是 any,包括了 192.168.20.0/24 和 192.168.10.0/24,如果要明细配置策略则需要将策略中的目标地址改为明细的地址对象,并放置到策略的最前面,以便优先匹配。
只需要配置 VALN10/VLAN20 网段相互之间的策略即可,配置很简单,可以忽略 VLAN - TAG 接口和 Forward-Domain 等透明模式下需要考虑的因素。配置相对很简单。
效果验证
拓扑 1:单 VLAN 透传
VLAN10 内的 PC 通过透明模式的 FortiGate 访问互联网,可以正常访问。

拓扑 2:多 VLAN10/20 透传,VLAN 之间互访
VLAN20 内的 PC 访问互联网,可以正常访问。

VLAN10 内的 PC 访问 VLAN20 的 PC,可以正常访问。

抓包查看 VLAN10 内的 PC 访问 VLAN20 的 PC 的流量,注意入方向携带 VLAN - TAG 的数据 sniffer 无法正常的显示明细数据。
FortiGate_VWP # diagnose sniffer packet any 'none' 4 Using Original Sniffing Mode interfaces=[any] filters=[none] 21.060512 port1 in 802.1Q vlan#10 P0 21.060542 port2 out 192.168.10.10 -> 192.168.20.10: icmp: echo request 21.062168 port2 in 802.1Q vlan#20 P0 21.062178 port1 out 192.168.10.10 -> 192.168.20.10: icmp: echo request 21.065095 port1 in 802.1Q vlan#20 P0 21.065106 port2 out 192.168.20.10 -> 192.168.10.10: icmp: echo reply 21.065540 port2 in 802.1Q vlan#10 P0 21.065546 port1 out 192.168.20.10 -> 192.168.10.10: icmp: echo replydebug flow 以上流量。
id=20085 trace_id=1 func=print_pkt_detail line=5871 msg="vd-root:0 received a packet(proto=1, 192.168.10.10:1->192.168.20" id=20085 trace_id=1 func=init_ip_session_common line=6050 msg="allocate a new session-00000821, tun_id=0.0.0.0" id=20085 trace_id=1 func=br_fw_forward_handler line=573 msg="Allowed by Policy-1:" id=20085 trace_id=1 func=__if_queue_push_xmit line=391 msg="send out via dev-port2, dst-mac-aa:bb:cc:00:20:00" id=20085 trace_id=2 func=print_pkt_detail line=5871 msg="vd-root:0 received a packet(proto=1, 192.168.10.10:1->192.168.20.10:2048) tun_id" id=20085 trace_id=2 func=resolve_ip_tuple_fast line=5957 msg="Find an existing session, id-00000821, original direction" id=20085 trace_id=2 func=br_fw_forward_dirty_handler line=274 msg="auxiliary ses proto=1 dev=4->3 192.168.10.10/1=>192.168.20.10/8" id=20085 trace_id=2 func=npu_handle_session44 line=1183 msg="Trying to offloading session from port2 to port1, skb.npu_flag=00000400 ses." id=20085 trace_id=2 func=br_fw_forward_dirty_handler line=297 msg="state=00008200, state2=00000000, npu_state=00000100" id=20085 trace_id=2 func=__if_queue_push_xmit line=391 msg="send out via dev-port1, dst-mac-00:0c:29:ae:55:70" id=20085 trace_id=3 func=print_pkt_detail line=5871 msg="vd-root:0 received a packet(proto=1, 192.168.20.10:1->192.168.10.10:0) tun_id=0." id=20085 trace_id=3 func=resolve_ip_tuple_fast line=5957 msg="Find an existing session, id-00000821, reply direction" id=20085 trace_id=3 func=br_fw_forward_dirty_handler line=274 msg="auxiliary ses proto=1 dev=4->3 192.168.10.10/1=>192.168.20.10/8" id=20085 trace_id=3 func=npu_handle_session44 line=1183 msg="Trying to offloading session from port1 to port2, skb.npu_flag=00000000 ses." id=20085 trace_id=3 func=br_fw_forward_dirty_handler line=297 msg="state=00008200, state2=00000000, npu_state=00000100" id=20085 trace_id=3 func=__if_queue_push_xmit line=391 msg="send out via dev-port2, dst-mac-aa:bb:cc:00:20:00" id=20085 trace_id=4 func=print_pkt_detail line=5871 msg="vd-root:0 received a packet(proto=1, 192.168.20.10:1->192.168.10.10:0) tun_id=0." id=20085 trace_id=4 func=resolve_ip_tuple_fast line=5957 msg="Find an existing session, id-00000821, reply direction" id=20085 trace_id=4 func=npu_handle_session44 line=1183 msg="Trying to offloading session from port2 to port1, skb.npu_flag=00000400 ses." id=20085 trace_id=4 func=br_fw_forward_dirty_handler line=297 msg="state=00008200, state2=00000000, npu_state=00000100" id=20085 trace_id=4 func=__if_queue_push_xmit line=391 msg="send out via dev-port1, dst-mac-00:0c:29:57:97:29"相关会话信息,可以看到 reflect session 的数量为 1,为反向流量会话。
session info: proto=1 proto_state=00 duration=2 expire=57 timeout=0 flags=00000000 socktype=0 sockport=0 av_idx=0 use=4 origin-shaper= reply-shaper= per_ip_shaper= class_id=0 ha_id=0 policy_dir=0 tunnel=/ vlan_cos=0/0 state=may_dirty br statistic(bytes/packets/allow_err): org=120/2/1 reply=120/2/1 tuples=2 tx speed(Bps/kbps): 50/0 rx speed(Bps/kbps): 50/0 orgin->sink: org pre->post, reply pre->post dev=3->4/4->3 gwy=0.0.0.0/0.0.0.0 hook=pre dir=org act=noop 192.168.10.10:1->192.168.20.10:8(0.0.0.0:0) hook=post dir=reply act=noop 192.168.20.10:1->192.168.10.10:0(0.0.0.0:0) misc=0 policy_id=1 pol_uuid_idx=14730 auth_info=0 chk_client_info=0 vd=0 serial=0000096d tos=ff/ff app_list=0 app=0 url_cat=0 rpdb_link_id=00000000 ngfwid=n/a vlanid=10 npu_state=0x000100 no_ofld_reason: npu-flag-off ext_header_type=0x22:0x22 reflect info 0: dev=4->3/3->4 npu_state=0x000100 npu info: flag=0x00/0x00, offload=0/0, ips_offload=0/0, epid=0/0, ipid=0/0, vlan=0x0000/0x0000 vlifid=0/0, vtag_in=0x0000/0x0000 in_npu=0/0, out_npu=0/0, fwd_en=0/0, qid=0/0 total reflect session num: 1 total session 1使用 VLAN20 内网 PC 访问 VLAN10 内网 PC,也可以正常访问(具体抓包和 debug 过程和上述一致)。

补充说明
关于 VLAN-forward 参数,默认在 VWP 的环境下,成员接口的 vlanforward 是打开的。
onfig system interface edit "port1" set vdom "root" set vlanforward enable //默认开启 set type physical set alias "WAN" set snmp-index 1 next end FortiGate_VWP (port1) # next FortiGate_VWP (interface) # edit port2 FortiGate_VWP (port2) # show config system interface edit "port2" set vdom "root" set vlanforward enable //默认开启 set type physical set alias "LAN" set snmp-index 2 next end但是如果已经开启了 set wildcard-vlan enable 的情况下,set vlanforward enable 是不生效的。set wildcard-vlan enable 的优先级比 vlanforward 要高,都开启的情况下,FortiGate 会优先使用 set wildcard-vlan enable。
总结
开启了 wildcard-vlan enable,vlanforward 不生效,wildcard-vlan 优先,识别 VLAN - TAG,并上送到 FGT 的 CPU 上去策略处理。这是推荐的配置。
如果关闭了 wildcard-vlan disable,则 vlanforward 生效,则携带了 vlan-tag 的数据会直接穿透 VWP 接口,不再匹配策略,直接 bypass 可通(不推荐这样使用,流量不可见也不可控,这不是安全设备想要的结果,具体参考 网络管理 → 透明模式 → 传统透明模式 → VLAN 与透明模式 → vlanforward章节)。
具体现象可以尝试关闭 wildcard-vlan,清空 VWP 策略。
config system virtual-wire-pair edit "VWP1" set member "port1" "port2" set wildcard-vlan disable //关闭wildcard next end config system interface edit "port1" set vdom "root" set vlanforward enable set type physical set alias "WAN" set snmp-index 1 next edit "port2" set vdom "root" set vlanforward enable set type physical set alias "LAN" set snmp-index 2 next end FortiGate_VWP # config firewall policy FortiGate_VWP (policy) # purge (清除策略,让设备没有任何策略) This operation will clear all table! Do you want to continue? (y/n)y FortiGate_VWP (policy) # end具体的数据转发现象呢?我们会发现,所有的携带了 VLAN - TAG 的数据都是通的,VLAN10/20 的 PC 可以上网,VLAN10 和 VLAN20 的 PC 相互可通信。但是在 FGT 上看不到任何的信息,抓不到任何的包,直接 bypass 掉携带了 VLAN - TAG 的数据。VWP 不处理携带了 VLAN - TAG 的数据。而不携带 VLAN - TAG 的数据(VLAN1)将会上送到 FGT 的 CPU 进行策略匹配处理。携带了 VLAN - TAG 的数据被 bypass 掉了,直接可通。(vlan1 的不携带 vlan-tag 的数据会上送到 CPU 进行处理,需要策略放通才可以正常通信。)


抓不到相应的报文。但是数据是可通的。
FortiGate_VWP # diagnose sniffer packet any "host 192.168.20.10" 4 interfaces=[any] filters=[host 192.168.20.10]实际上可以抓到 VLAN - TAG 的数据,只是 FGT 由于开启了 vlanforward,不处理携带了 VLAN - TAG 的数据,直接 bypass 掉了(不推荐这样的部署)。
FortiGate_VWP # diagnose sniffer packet any "none" 4 interfaces=[any] filters=[none] 1.189503 port2 in 802.1Q vlan#20 P0 1.475067 port2 in 802.1Q vlan#20 P0 1.475081 port1 out 802.1Q vlan#20 P0 1.475749 port1 in 802.1Q vlan#20 P0 1.475756 port2 out 802.1Q vlan#20 P0 1.568623 port2 in 802.1Q vlan#10 P0 1.568668 port1 out 802.1Q vlan#10 P0 2.211987 port2 in 802.1Q vlan#10 P0 2.226707 port2 in 802.1Q vlan#10 P0 2.226719 port1 out 802.1Q vlan#10 P0 2.246979 port2 in 802.1Q vlan#10 P0 2.246985 port1 out 802.1Q vlan#10 P0 2.248370 port2 in 802.1Q vlan#10 P0 2.248377 port1 out 802.1Q vlan#10 P0 2.356281 port2 in 802.1Q vlan#10 P0 2.356287 port1 out 802.1Q vlan#10 P0 2.357778 port2 in 802.1Q vlan#10 P0 2.357784 port1 out 802.1Q vlan#10 P0 2.468629 port2 in 802.1Q vlan#10 P0 2.468643 port1 out 802.1Q vlan#10 P0 2.489493 port2 in 802.1Q vlan#20 P0 2.489500 port1 out 802.1Q vlan#20 P0 2.490062 port1 in 802.1Q vlan#20 P0 2.490067 port2 out 802.1Q vlan#20 P0 3.290091 port2 in 802.1Q vlan#20 P0 3.502555 port2 in 802.1Q vlan#20 P0 3.502570 port1 out 802.1Q vlan#20 P0 3.503316 port1 in 802.1Q vlan#20 P0 3.503322 port2 out 802.1Q vlan#20 P0推荐开启 wildcard-vlan (set wildcard-vlan enable),让 FGT 可以识别 VLAN - TAG 的数据,然后使用策略控制所有的携带和不携带 VLAN - TAG 的数据流。