Post

AWS Gateway Load Balancer

This lab implements a scalable, transparent inspection architecture by integrating AWS Gateway Load Balancer (GWLB) with FortiGate firewalls. We replace legacy Active/Passive NAT designs with a active-active fleet using GENEVE encapsulation with two standalone fortigate firewalls with identical configuration.

x


Instances

Here we have 2 standalone Fortigates with identical configurations and a single linux vm as the client host. The fortigate has Public and Private subnets but we will only use the private one to act as a single-arm firewall to the GWLB.

x


Private is the subnet we use to communicate between all nodes here while Public is only used for FGT management, and we also added an Endpoint Subnet for Geneve Tunnel communication between GWLB and FGT

x


NAT Gateway

Because the FGT no longer handles NAT operation, we need to add NAT Gateway that’ll be used by GWLB for internet access.

x

x


GWLB

Next we’ll create a Target Group, here we select IP Address with protocol GENEVE

x

GENEVE (Generic Network Virtualization Encapsulation) is a tunneling protocol that wraps original packets inside a UDP header (port 6081), allowing the Gateway Load Balancer to ship traffic to the firewall without altering source or destination IPs. This enables “transparent inspection,” where the FortiGate sees and secures the real traffic flow while remaining completely invisible to our applications and routing tables.


For health check we will use a simple HTTP check so Target Group knows whether FGT is up or not

x


Then we add both FGT Private IP Addresses as the targets

x


Review and create

x

x


Next we create the Gateway Load Balancer

x


We map this GWLB to the private subnet and route it to the Target Group

x


Review and create

x


Now we have our GWLB configured

x


And the Target Group targets should turn green

x


We need to take note for the GWLB’s IP Address for later configuration inside the Fortigate

x


Endpoint

Next we’d create an Endpoint Service that points to the GWLB

x


We can actually disable the acceptance requirements for easier configuration, then hit create

x


The Endpoint Service is now up, take note of the Service Name

x


Then create an Endpoint and use the Service Name

x


And importantly we’re gonna use the Endpont subnet for this

x


Now we have the GWLB Endpoint configured, take note of the generated IP Address for later configuration inside the Fortigate

x

x


Routing

Next we deal with routing management, on Private subnet where the Linux client resides, we will send all traffic to our GWLB Endpoint

x


On Endpoint subnet we will send all internet-bound traffic to our NAT Gateway

x


And for our NAT Gateway route table, we send all internet-bound traffic to Internet Gateway, and for the returning traffic we send it to the GWLB Endpoint

x


Fortigate

On Fortigate side we add the following configurations to create Geneve interface under Port2 (private subnet), firewall policy and static routing

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
config system geneve
    edit "awsgeneve"
        set interface "port2"
        set type ppp
        set remote-ip 10.0.2.17
    next
end

config firewall policy
    edit 10
        set name "awsgeneve_policy"
        set srcintf "awsgeneve"
        set dstintf "awsgeneve"
        set srcaddr "all"
        set dstaddr "all"
        set action accept
        set schedule "always"
        set service "ALL"
        set nat disable
    next
end

config router static
    edit 1
        set dst 0.0.0.0/0
        set gateway 10.0.66.23
        set device "awsgeneve"
    next
end


Testing GWLB

On Linux client, we confirm that we can access internet

x


We can see on Fortigate that traffic is hitting the awsgeneve policy, confirming that traffic is coming in and out of the geneve interface

x


And if we put both Fortigate side by side, we can see that they both handle traffic in turn, thus confirming the load balancing is working

x

This setup is not perfect because we can see the returning traffic from Internet back to Linux host is sent out of the port2 instead of to geneve, this is because the Linux host is on the same subnet as FGT’s port2. Room for improvement!

This post is licensed under CC BY 4.0 by the author.