Fortinet white logo
Fortinet white logo

Administration Guide

Redundant hub and spoke VPN

Redundant hub and spoke VPN

A redundant hub and spoke configuration allows VPN connections to radiate from a central FortiGate unit (the hub) to multiple remote peers (the spokes). Traffic can pass between private networks behind the hub and private networks behind the remote peers. Traffic can also pass between remote peer private networks through the hub.

This is a sample configuration of hub and spoke IPsec VPN. The following applies for this scenario:

  • The spokes have two WAN interfaces and two IPsec VPN tunnels for redundancy.
  • The secondary VPN tunnel is up only when the primary tunnel is down by dead peer detection.

Because the GUI can only complete part of the configuration, we recommend using the CLI.

To configure redundant hub and spoke VPN using the FortiOS CLI:
  1. Configure the hub.
    1. Configure the WAN, internal interface, and static route.

      config system interface

      edit "port13"

      set alias "WAN"

      set ip 172.16.202.1 255.255.255.0

      next

      edit "port9"

      set alias "Internal"

      set ip 172.16.101.1 255.255.255.0

      next

      end

      config router static

      edit 1

      set gateway 172.16.202.2

      set device "port13"

      next

      end

    2. Configure the IPsec phase1-interface and phase2-interface.

      config vpn ipsec phase1-interface

      edit "hub"

      set type dynamic

      set interface "port13"

      set peertype any

      set net-device enable

      set proposal aes128-sha256 aes256-sha256 aes128-sha1 aes256-sha1

      set dpd on-idle

      set psksecret sample

      set dpd-retryinterval 60

      next

      end

      config vpn ipsec phase2-interface

      edit "hub"

      set phase1name "hub"

      set proposal aes128-sha1 aes256-sha1 aes128-sha256 aes256-sha256 aes128gcm aes256gcm chacha20poly1305

      next

      end

    3. Configure the firewall policy.

      config firewall policy

      edit 1

      set name "spoke-hub"

      set srcintf "hub"

      set dstintf "port9"

      set srcaddr "all"

      set dstaddr "172.16.101.0"

      set action accept

      set schedule "always"

      set service "ALL"

      next

      edit 2

      set name "spoke-spoke"

      set srcintf "hub"

      set dstintf "hub"

      set srcaddr "all"

      set dstaddr "all"

      set action accept

      set schedule "always"

      set service "ALL"

      next

      end

  2. Configure the spokes.
    1. Configure the WAN, internal interface, and static route.
      1. Configure Spoke1.

        config system interface

        edit "port1"

        set ip 172.16.200.1 255.255.255.0

        next

        edit "wan1"

        set mode dhcp

        set distance 10

        set priority 100

        next

        edit "dmz"

        set ip 10.1.100.1 255.255.255.0

        next

        end

        config router static

        edit 1

        set gateway 172.16.200.2

        set device "port1"

        next

        end

      2. Configure Spoke2.

        config system interface

        edit "wan1"

        set ip 172.16.200.3 255.255.255.0

        next

        edit "wan2"

        set mode dhcp

        set distance 10

        set priority 100

        next

        edit "lan1"

        set ip 192.168.4.1 255.255.255.0

        next

        end

        config router static

        edit 1

        set gateway 172.16.200.2

        set device "wan1"

        next

        end

    2. Configure IPsec phase1-interface and phase2-interface.
      1. Configure Spoke1.

        config vpn ipsec phase1-interface

        edit "primary"

        set interface "port1"

        set peertype any

        set net-device enable

        set proposal aes128-sha256 aes256-sha256 aes128-sha1 aes256-sha1

        set remote-gw 172.16.202.1

        set psksecret sample

        next

        edit "secondary"

        set interface "wan1"

        set peertype any

        set net-device enable

        set proposal aes128-sha256 aes256-sha256 aes128-sha1 aes256-sha1

        set remote-gw 172.16.202.1

        set monitor "primary"

        set psksecret sample

        next

        end

        config vpn ipsec phase2-interface

        edit "primary"

        set phase1name "primary"

        set proposal aes128-sha1 aes256-sha1 aes128-sha256 aes256-sha256 aes128gcm aes256gcm chacha20poly1305

        set auto-negotiate enable

        set src-subnet 10.1.100.0 255.255.255.0

        next

        edit "secondary"

        set phase1name "secondary"

        set proposal aes128-sha1 aes256-sha1 aes128-sha256 aes256-sha256 aes128gcm aes256gcm chacha20poly1305

        set auto-negotiate enable

        set src-subnet 10.1.100.0 255.255.255.0

        next

        end

      2. Configure Spoke2.

        config vpn ipsec phase1-interface

        edit "primary"

        set interface "wan1"

        set peertype any

        set net-device enable

        set proposal aes128-sha256 aes256-sha256 aes128-sha1 aes256-sha1

        set remote-gw 172.16.202.1

        set psksecret sample

        next

        edit "secondary"

        set interface "wan2"

        set peertype any

        set net-device enable

        set proposal aes128-sha256 aes256-sha256 aes128-sha1 aes256-sha1

        set remote-gw 172.16.202.1

        set monitor "primary"

        set psksecret sample

        next

        end

        config vpn ipsec phase2-interface

        edit "primary"

        set phase1name "primary"

        set proposal aes128-sha1 aes256-sha1 aes128-sha256 aes256-sha256 aes128gcm aes256gcm chacha20poly1305

        set auto-negotiate enable

        set src-subnet 192.168.4.0 255.255.255.0

        next

        edit "secondary"

        set phase1name "secondary"

        set proposal aes128-sha1 aes256-sha1 aes128-sha256 aes256-sha256 aes128gcm aes256gcm chacha20poly1305

        set auto-negotiate enable

        set src-subnet 192.168.4.0 255.255.255.0

        next

        end

    3. Configure the firewall policy.
      1. Configure Spoke1.

        config firewall policy

        edit 1

        set srcintf "dmz"

        set dstintf "primary" "secondary"

        set srcaddr "10.1.100.0"

        set dstaddr "172.16.101.0"

        set action accept

        set schedule "always"

        set service "ALL"

        next

        end

      2. Configure Spoke2.

        config firewall policy

        edit 1

        set srcintf "lan1"

        set dstintf "primary" "secondary"

        set srcaddr "192.168.4.0"

        set dstaddr "172.16.101.0"

        set action accept

        set schedule "always"

        set service "ALL"

        next

        end

    4. Configure the static route.
      1. Configure Spoke1.

        config router static

        edit 3

        set dst 172.16.101.0 255.255.255.0

        set distance 1

        set device "primary"

        next

        edit 4

        set dst 172.16.101.0 255.255.255.0

        set distance 3

        set device "secondary"

        next

        end

      2. Configure Spoke2.

        config router static

        edit 3

        set dst 172.16.101.0 255.255.255.0

        set distance 1

        set device "primary"

        next

        edit 4

        set dst 172.16.101.0 255.255.255.0

        set distance 3

        set device "secondary"

        next

        end

  3. Run diagnose and get commands.
    1. Run the Spoke1 # diagnose vpn tunnel list command. The system should return the following:

      name=primary ver=1 serial=1 172.16.200.1:0->172.16.202.1:0

      bound_if=11 lgwy=static/1 tun=intf/0 mode=auto/1 encap=none/528 options[0210]=create_dev frag-rfc accept_traffic=1

      proxyid_num=1 child_num=0 refcnt=15 ilast=0 olast=0 ad=/0

      stat: rxp=1879 txp=1881 rxb=225480 txb=112860

      dpd: mode=on-demand on=1 idle=20000ms retry=3 count=0 seqno=1

      natt: mode=none draft=0 interval=0 remote_port=0

      proxyid=primary proto=0 sa=1 ref=2 serial=2 auto-negotiate

      src: 0:10.1.100.0/255.255.255.0:0 dst: 0:0.0.0.0/0.0.0.0:0 SA: ref=3 options=18227 type=00 soft=0 mtu=1438 expire=41002/0B replaywin=2048

      seqno=758 esn=0 replaywin_lastseq=00000758 itn=0

      life: type=01 bytes=0/0 timeout=42901/43200 dec: spi=0908732f esp=aes key=16 20770dfe67ea22dd8ec32c44d84ef4d5

      ah=sha1 key=20 edc89fc2ec06309ba13de95e7e486f9b795b8707

      enc: spi=a1d9eed1 esp=aes key=16 8eeea2526fba062e680d941083c8b5d1

      ah=sha1 key=20 f0f5deaf88b2a69046c3154e9f751739b3f411f5

      dec:pkts/bytes=1879/112740, enc:pkts/bytes=1879/225480

      name=secondary ver=1 serial=2 172.17.200.1:0->172.16.202.1:0

      bound_if=5 lgwy=static/1 tun=intf/0 mode=auto/1 encap=none/528 options[0210]=create_dev frag-rfc accept_traffic=0

      proxyid_num=1 child_num=0 refcnt=10 ilast=1892 olast=1892 ad=/0

      stat: rxp=0 txp=0 rxb=0 txb=0

      dpd: mode=on-demand on=0 idle=20000ms retry=3 count=0 seqno=0

      natt: mode=none draft=0 interval=0 remote_port=0

      proxyid=secondary proto=0 sa=0 ref=2 serial=2 auto-negotiate

      src: 0:10.1.100.0/255.255.255.0:0 dst: 0:0.0.0.0/0.0.0.0:0

    2. Run the Spoke1 # get router info routing-table static command. The system should return the following:

      Routing table for VRF=0

      ................

      S 172.16.101.0/24 [1/0] is directly connected, primary

Redundant hub and spoke VPN

Redundant hub and spoke VPN

A redundant hub and spoke configuration allows VPN connections to radiate from a central FortiGate unit (the hub) to multiple remote peers (the spokes). Traffic can pass between private networks behind the hub and private networks behind the remote peers. Traffic can also pass between remote peer private networks through the hub.

This is a sample configuration of hub and spoke IPsec VPN. The following applies for this scenario:

  • The spokes have two WAN interfaces and two IPsec VPN tunnels for redundancy.
  • The secondary VPN tunnel is up only when the primary tunnel is down by dead peer detection.

Because the GUI can only complete part of the configuration, we recommend using the CLI.

To configure redundant hub and spoke VPN using the FortiOS CLI:
  1. Configure the hub.
    1. Configure the WAN, internal interface, and static route.

      config system interface

      edit "port13"

      set alias "WAN"

      set ip 172.16.202.1 255.255.255.0

      next

      edit "port9"

      set alias "Internal"

      set ip 172.16.101.1 255.255.255.0

      next

      end

      config router static

      edit 1

      set gateway 172.16.202.2

      set device "port13"

      next

      end

    2. Configure the IPsec phase1-interface and phase2-interface.

      config vpn ipsec phase1-interface

      edit "hub"

      set type dynamic

      set interface "port13"

      set peertype any

      set net-device enable

      set proposal aes128-sha256 aes256-sha256 aes128-sha1 aes256-sha1

      set dpd on-idle

      set psksecret sample

      set dpd-retryinterval 60

      next

      end

      config vpn ipsec phase2-interface

      edit "hub"

      set phase1name "hub"

      set proposal aes128-sha1 aes256-sha1 aes128-sha256 aes256-sha256 aes128gcm aes256gcm chacha20poly1305

      next

      end

    3. Configure the firewall policy.

      config firewall policy

      edit 1

      set name "spoke-hub"

      set srcintf "hub"

      set dstintf "port9"

      set srcaddr "all"

      set dstaddr "172.16.101.0"

      set action accept

      set schedule "always"

      set service "ALL"

      next

      edit 2

      set name "spoke-spoke"

      set srcintf "hub"

      set dstintf "hub"

      set srcaddr "all"

      set dstaddr "all"

      set action accept

      set schedule "always"

      set service "ALL"

      next

      end

  2. Configure the spokes.
    1. Configure the WAN, internal interface, and static route.
      1. Configure Spoke1.

        config system interface

        edit "port1"

        set ip 172.16.200.1 255.255.255.0

        next

        edit "wan1"

        set mode dhcp

        set distance 10

        set priority 100

        next

        edit "dmz"

        set ip 10.1.100.1 255.255.255.0

        next

        end

        config router static

        edit 1

        set gateway 172.16.200.2

        set device "port1"

        next

        end

      2. Configure Spoke2.

        config system interface

        edit "wan1"

        set ip 172.16.200.3 255.255.255.0

        next

        edit "wan2"

        set mode dhcp

        set distance 10

        set priority 100

        next

        edit "lan1"

        set ip 192.168.4.1 255.255.255.0

        next

        end

        config router static

        edit 1

        set gateway 172.16.200.2

        set device "wan1"

        next

        end

    2. Configure IPsec phase1-interface and phase2-interface.
      1. Configure Spoke1.

        config vpn ipsec phase1-interface

        edit "primary"

        set interface "port1"

        set peertype any

        set net-device enable

        set proposal aes128-sha256 aes256-sha256 aes128-sha1 aes256-sha1

        set remote-gw 172.16.202.1

        set psksecret sample

        next

        edit "secondary"

        set interface "wan1"

        set peertype any

        set net-device enable

        set proposal aes128-sha256 aes256-sha256 aes128-sha1 aes256-sha1

        set remote-gw 172.16.202.1

        set monitor "primary"

        set psksecret sample

        next

        end

        config vpn ipsec phase2-interface

        edit "primary"

        set phase1name "primary"

        set proposal aes128-sha1 aes256-sha1 aes128-sha256 aes256-sha256 aes128gcm aes256gcm chacha20poly1305

        set auto-negotiate enable

        set src-subnet 10.1.100.0 255.255.255.0

        next

        edit "secondary"

        set phase1name "secondary"

        set proposal aes128-sha1 aes256-sha1 aes128-sha256 aes256-sha256 aes128gcm aes256gcm chacha20poly1305

        set auto-negotiate enable

        set src-subnet 10.1.100.0 255.255.255.0

        next

        end

      2. Configure Spoke2.

        config vpn ipsec phase1-interface

        edit "primary"

        set interface "wan1"

        set peertype any

        set net-device enable

        set proposal aes128-sha256 aes256-sha256 aes128-sha1 aes256-sha1

        set remote-gw 172.16.202.1

        set psksecret sample

        next

        edit "secondary"

        set interface "wan2"

        set peertype any

        set net-device enable

        set proposal aes128-sha256 aes256-sha256 aes128-sha1 aes256-sha1

        set remote-gw 172.16.202.1

        set monitor "primary"

        set psksecret sample

        next

        end

        config vpn ipsec phase2-interface

        edit "primary"

        set phase1name "primary"

        set proposal aes128-sha1 aes256-sha1 aes128-sha256 aes256-sha256 aes128gcm aes256gcm chacha20poly1305

        set auto-negotiate enable

        set src-subnet 192.168.4.0 255.255.255.0

        next

        edit "secondary"

        set phase1name "secondary"

        set proposal aes128-sha1 aes256-sha1 aes128-sha256 aes256-sha256 aes128gcm aes256gcm chacha20poly1305

        set auto-negotiate enable

        set src-subnet 192.168.4.0 255.255.255.0

        next

        end

    3. Configure the firewall policy.
      1. Configure Spoke1.

        config firewall policy

        edit 1

        set srcintf "dmz"

        set dstintf "primary" "secondary"

        set srcaddr "10.1.100.0"

        set dstaddr "172.16.101.0"

        set action accept

        set schedule "always"

        set service "ALL"

        next

        end

      2. Configure Spoke2.

        config firewall policy

        edit 1

        set srcintf "lan1"

        set dstintf "primary" "secondary"

        set srcaddr "192.168.4.0"

        set dstaddr "172.16.101.0"

        set action accept

        set schedule "always"

        set service "ALL"

        next

        end

    4. Configure the static route.
      1. Configure Spoke1.

        config router static

        edit 3

        set dst 172.16.101.0 255.255.255.0

        set distance 1

        set device "primary"

        next

        edit 4

        set dst 172.16.101.0 255.255.255.0

        set distance 3

        set device "secondary"

        next

        end

      2. Configure Spoke2.

        config router static

        edit 3

        set dst 172.16.101.0 255.255.255.0

        set distance 1

        set device "primary"

        next

        edit 4

        set dst 172.16.101.0 255.255.255.0

        set distance 3

        set device "secondary"

        next

        end

  3. Run diagnose and get commands.
    1. Run the Spoke1 # diagnose vpn tunnel list command. The system should return the following:

      name=primary ver=1 serial=1 172.16.200.1:0->172.16.202.1:0

      bound_if=11 lgwy=static/1 tun=intf/0 mode=auto/1 encap=none/528 options[0210]=create_dev frag-rfc accept_traffic=1

      proxyid_num=1 child_num=0 refcnt=15 ilast=0 olast=0 ad=/0

      stat: rxp=1879 txp=1881 rxb=225480 txb=112860

      dpd: mode=on-demand on=1 idle=20000ms retry=3 count=0 seqno=1

      natt: mode=none draft=0 interval=0 remote_port=0

      proxyid=primary proto=0 sa=1 ref=2 serial=2 auto-negotiate

      src: 0:10.1.100.0/255.255.255.0:0 dst: 0:0.0.0.0/0.0.0.0:0 SA: ref=3 options=18227 type=00 soft=0 mtu=1438 expire=41002/0B replaywin=2048

      seqno=758 esn=0 replaywin_lastseq=00000758 itn=0

      life: type=01 bytes=0/0 timeout=42901/43200 dec: spi=0908732f esp=aes key=16 20770dfe67ea22dd8ec32c44d84ef4d5

      ah=sha1 key=20 edc89fc2ec06309ba13de95e7e486f9b795b8707

      enc: spi=a1d9eed1 esp=aes key=16 8eeea2526fba062e680d941083c8b5d1

      ah=sha1 key=20 f0f5deaf88b2a69046c3154e9f751739b3f411f5

      dec:pkts/bytes=1879/112740, enc:pkts/bytes=1879/225480

      name=secondary ver=1 serial=2 172.17.200.1:0->172.16.202.1:0

      bound_if=5 lgwy=static/1 tun=intf/0 mode=auto/1 encap=none/528 options[0210]=create_dev frag-rfc accept_traffic=0

      proxyid_num=1 child_num=0 refcnt=10 ilast=1892 olast=1892 ad=/0

      stat: rxp=0 txp=0 rxb=0 txb=0

      dpd: mode=on-demand on=0 idle=20000ms retry=3 count=0 seqno=0

      natt: mode=none draft=0 interval=0 remote_port=0

      proxyid=secondary proto=0 sa=0 ref=2 serial=2 auto-negotiate

      src: 0:10.1.100.0/255.255.255.0:0 dst: 0:0.0.0.0/0.0.0.0:0

    2. Run the Spoke1 # get router info routing-table static command. The system should return the following:

      Routing table for VRF=0

      ................

      S 172.16.101.0/24 [1/0] is directly connected, primary