Architecture and Traffic Flow
When you provision a Citrix ADC CPX instance on a Docker host, the Docker engine creates a virtual interface, eth0, on the CPX instance. This eth0 interface is directly connected to a virtual interface (veth*) on the docker0 bridge. The Docker engine also assigns an IP address to the Citrix ADC CPX instance in the network 172.17.0.0/16.
The default gateway for the CPX instance is the IP address of the docker0 bridge, which means that any communication with the Citrix ADC CPX instance is done through the Docker network. All incoming traffic received from the docker0 bridge is received by the eth0 interface on the Citrix ADC CPX instance and processed by the Citrix ADC CPX packet engine.
The following figure illustrates the architecture of a Citrix ADC CPX instance on a Docker host.
How Single IP Address Works on Citrix ADC CPX
A regular Citrix ADC MPX or VPX appliance requires at least three IP addresses to function:
- Management IP address called the Citrix ADC IP (NSIP) address
- Subnet IP (SNIP) address for communicating with the server farm
- Virtual server IP (VIP) address(es) for accepting client requests
A Citrix ADC CPX instance operates with one single IP address that is used for management as well as for data traffic.
During provisioning, only one private IP address (single IP address) is assigned to a Citrix ADC CPX instance by the Docker engine. The three IP functions of a Citrix ADC instance are multiplexed onto one IP address. This single IP address uses different port numbers to function as the NSIP, SNIP, and VIP(s).
The following image illustrates how a single IP address is used to perform the functions of NSIP, SNIP, and VIP(s).
Traffic Flow for Requests Originating from the Citrix ADC CPX Instance
Docker implicitly configures IP tables and a NAT rule to direct traffic originating from the Citrix ADC CPX instance to the docker0 IP address.
The following figure illustrates how a ping request originating from a Citrix ADC CPX instance reaches the destination.
In this example, the ping request is sent by the packet engine on eth0 interface with source IP address as the Citrix ADC CPX IP address (172.17.0.4). The Docker host, then, performs network address translation (NAT) to add the host IP address (192.68.x.x) as the source IP address and sends the request to the destination (216.58.x.x). The response from the destination IP address follows the same path in reverse. The Docker host performs NAT on the response and forwards the response to the Citrix ADC CPX instance on the eth0 interface.
Traffic Flow for Requests Originating from the External Network
To enable external communication, while provisioning Citrix ADC CPX, you have to set parameters such that Docker exposes certain ports such as 80, 22, and any other port you want. If you have not set any port to be exposed during provisioning, then you have to configure NAT rules on the Docker host to make these ports available.
The client request that originates from the Internet is received by the Docker host, which then performs port address translation (PAT) to map the public IP address and port to the single IP address and port of the Citrix ADC CPX instance, and forwards the traffic to the instance.
The following figure shows how the Docker host performs port address translation to direct traffic to the Citrix ADC CPX single IP address and port.
In this example, the Docker host IP address is 192.68.x.x and the single IP address of the Citrix ADC CPX instance is 172.17.0.4. The SSH port 22 of Citrix ADC CPX instance is mapped to port 1100 on the Docker host. The SSH request from the client is received on IP address 192.68.x.x at port 1100. The Docker host performs port address translation to map this address and port to the single IP address 172.17.0.4 on port 22 and forwards the client request.