mirror of
https://github.com/vyos/vyos-documentation.git
synced 2025-10-26 08:41:46 +01:00
Add CGNAT documantation
This commit is contained in:
parent
ef0911854c
commit
1dd3a2160d
143
docs/configuration/nat/cgnat.rst
Normal file
143
docs/configuration/nat/cgnat.rst
Normal file
@ -0,0 +1,143 @@
|
|||||||
|
.. _cgnat:
|
||||||
|
|
||||||
|
#####
|
||||||
|
CGNAT
|
||||||
|
#####
|
||||||
|
|
||||||
|
:abbr:`CGNAT (Carrier-Grade Network Address Translation)` , also known as
|
||||||
|
Large-Scale NAT (LSN), is a type of network address translation used by
|
||||||
|
Internet Service Providers (ISPs) to enable multiple private IP addresses to
|
||||||
|
share a single public IP address. This technique helps to conserve the limited
|
||||||
|
IPv4 address space.
|
||||||
|
The 100.64.0.0/10 address block is reserved for use in carrier-grade NAT
|
||||||
|
|
||||||
|
Overview
|
||||||
|
========
|
||||||
|
|
||||||
|
CGNAT works by placing a NAT device within the ISP's network. This device
|
||||||
|
translates private IP addresses from customer networks to a limited pool of
|
||||||
|
public IP addresses assigned to the ISP. This allows many customers to share a
|
||||||
|
smaller number of public IP addresses.
|
||||||
|
|
||||||
|
Not all :rfc:`6888` requirements are implemented in CGNAT.
|
||||||
|
|
||||||
|
Implemented the following :rfc:`6888` requirements:
|
||||||
|
|
||||||
|
- REQ 2: A CGN must have a default "IP address pooling" behavior of "Paired".
|
||||||
|
CGN must use the same external IP address mapping for all sessions associated
|
||||||
|
with the same internal IP address, be they TCP, UDP, ICMP, something else,
|
||||||
|
or a mix of different protocols.
|
||||||
|
- REQ 3: The CGN function should not have any limitations on the size or the
|
||||||
|
contiguity of the external address pool.
|
||||||
|
- REQ 4: A CGN must support limiting the number of external ports (or,
|
||||||
|
equivalently, "identifiers" for ICMP) that are assigned per subscriber
|
||||||
|
|
||||||
|
Advantages of CGNAT
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
- **IPv4 Address Conservation**: CGNAT helps mitigate the exhaustion of IPv4 addresses by allowing multiple customers to share a single public IP address.
|
||||||
|
- **Scalability**: ISPs can support more customers without needing a proportional increase in public IP addresses.
|
||||||
|
- **Cost-Effective**: Reduces the cost associated with acquiring additional public IPv4 addresses.
|
||||||
|
|
||||||
|
Considerations
|
||||||
|
--------------
|
||||||
|
|
||||||
|
- **Traceability Issues**: Since multiple users share the same public IP address, tracking individual users for security and legal purposes can be challenging.
|
||||||
|
- **Performance Overheads**: The translation process can introduce latency and potential performance bottlenecks, especially under high load.
|
||||||
|
- **Application Compatibility**: Some applications and protocols may not work well with CGNAT due to their reliance on unique public IP addresses.
|
||||||
|
- **Port Allocation Limits**: Each public IP address has a limited number of ports, which can be exhausted, affecting the ability to establish new connections.
|
||||||
|
- **Port Control Protocol**: PCP is not implemented.
|
||||||
|
|
||||||
|
Port calculation
|
||||||
|
================
|
||||||
|
|
||||||
|
When implementing CGNAT, ensuring that there are enough ports allocated per subscriber is critical. Below is a summary based on RFC 6888.
|
||||||
|
|
||||||
|
1. **Total Ports Available**:
|
||||||
|
|
||||||
|
- Total Ports: 65536 (0 to 65535)
|
||||||
|
- Reserved Ports: Assume 1024 ports are reserved for well-known services and administrative purposes.
|
||||||
|
- Usable Ports: 65536 - 1024 = 64512
|
||||||
|
|
||||||
|
2. **Estimate Ports Needed per Subscriber**:
|
||||||
|
|
||||||
|
- Example: A household might need 1000 ports to ensure smooth operation for multiple devices and applications.
|
||||||
|
|
||||||
|
3. **Calculate the Number of Subscribers per Public IP**:
|
||||||
|
|
||||||
|
- Usable Ports / Ports per Subscriber
|
||||||
|
- 64512 / 1000 ≈ 64 subscribers per public IP
|
||||||
|
|
||||||
|
|
||||||
|
Configuration
|
||||||
|
=============
|
||||||
|
|
||||||
|
.. cfgcmd:: set nat cgnat pool external <pool-name> external-port-range <port-range>
|
||||||
|
|
||||||
|
Set an external port-range for the external pool, the default range is
|
||||||
|
1024-65535. Multiple entries can be added to the same pool.
|
||||||
|
|
||||||
|
.. cfgcmd:: set nat cgnat pool external <pool-name> external-port-range per-user-limit port <num>
|
||||||
|
|
||||||
|
Set external source port limits that will be allocated to each subscriber
|
||||||
|
individually. The default value is 2000.
|
||||||
|
|
||||||
|
.. cfgcmd:: set nat cgnat pool external <pool-name> range [address | address range | network]
|
||||||
|
|
||||||
|
Set the range of external IP addresses for the CGNAT pool.
|
||||||
|
|
||||||
|
.. cfgcmd:: set nat cgnat pool internal <pool-name> range [address range | network]
|
||||||
|
|
||||||
|
Set the range of internal IP addresses for the CGNAT pool.
|
||||||
|
|
||||||
|
.. cfgcmd:: set nat cgnat pool rule <num> source pool <internal-pool-name>
|
||||||
|
|
||||||
|
Set the rule for the source pool.
|
||||||
|
|
||||||
|
.. cfgcmd:: set nat cgnat pool rule <num> translation pool <external-pool-name>
|
||||||
|
|
||||||
|
Set the rule for the translation pool.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Configuration Examples
|
||||||
|
======================
|
||||||
|
|
||||||
|
Single external address
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
Example of setting up a basic CGNAT configuration:
|
||||||
|
In the following example, we define an external pool named `ext-1` with one external IP address
|
||||||
|
|
||||||
|
|
||||||
|
Each subscriber will be allocated a maximum of 2000 ports from the external pool.
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
set nat cgnat pool external ext1 external-port-range '1024-65535'
|
||||||
|
set nat cgnat pool external ext1 per-user-limit port '2000'
|
||||||
|
set nat cgnat pool external ext1 range '192.0.2.222/32'
|
||||||
|
set nat cgnat pool internal int1 range '100.64.0.0/28'
|
||||||
|
set nat cgnat rule 10 source pool 'int1'
|
||||||
|
set nat cgnat rule 10 translation pool 'ext1'
|
||||||
|
|
||||||
|
Multiple external addresses
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
set nat cgnat pool external ext1 external-port-range '1024-65535'
|
||||||
|
set nat cgnat pool external ext1 per-user-limit port '8000'
|
||||||
|
set nat cgnat pool external ext1 range '192.0.2.1-192.0.2.2'
|
||||||
|
set nat cgnat pool external ext1 range '203.0.113.253-203.0.113.254'
|
||||||
|
set nat cgnat pool internal int1 range '100.64.0.1-100.64.0.32'
|
||||||
|
set nat cgnat rule 10 source pool 'int1'
|
||||||
|
set nat cgnat rule 10 translation pool 'ext1'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Further Reading
|
||||||
|
===============
|
||||||
|
|
||||||
|
- :rfc:`6598` - IANA-Reserved IPv4 Prefix for Shared Address Space
|
||||||
|
- :rfc:`6888` - Requirements for CGNAT
|
||||||
@ -11,3 +11,4 @@ NAT
|
|||||||
nat44
|
nat44
|
||||||
nat64
|
nat64
|
||||||
nat66
|
nat66
|
||||||
|
cgnat
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user