Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revision | |||
en:dpi:faq:cgnat:start [2024/09/04 07:30] – elena.krasnobryzh | en:dpi:faq:cgnat:start [Unknown date] (current) – removed - external edit (Unknown date) 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== CG-NAT and NAT (Service 11)====== | ||
- | {{indexmenu_n> | ||
- | < | ||
- | < | ||
- | < | ||
- | The non-blocking dispatch algorithm in DPI, which distributes sessions across worker threads, imposes a limitation on which public IP address can be assigned to a subscriber from the pool: | ||
- | - To ensure that a subscriber receives their designated public address, the pool must contain at least as many addresses as there are worker threads (typically 2 for SSG-6 and 4 for SSG-10 and higher). You can determine the number of worker threads with the command <code bash> | ||
- | - If the pool contains only one address, it may not be assigned to all subscribers but only to those who fit the load balancing algorithm. | ||
- | </ | ||
- | |||
- | < | ||
- | You can see which public address has been assigned to a private one with the command <code bash> | ||
- | |||
- | Predicting the exact address that will be assigned to a subscriber from the pool in advance is impossible; it depends on various factors, particularly the current pool load. | ||
- | </ | ||
- | |||
- | < | ||
- | < | ||
- | Indeed, the session lifetime in NAT is limited because the number of sessions per subscriber is a limited resource, and a large number of inactive sessions in the pool reduces NAT and overall performance. | ||
- | |||
- | NAT cannot distinguish whether a session became inactive due to an accident or simply because there is no activity, and it closes such long-hanging sessions by inactivity timeout. This behavior is standard and supported by most CG-NAT manufacturers. | ||
- | |||
- | In SSG, session lifetimes can be adjusted with the following parameters: | ||
- | * '' | ||
- | * '' | ||
- | |||
- | <note warning> | ||
- | |||
- | To maintain long inactive connections, | ||
- | |||
- | You can configure '' | ||
- | |||
- | **Example** configuration on the ssh server: add the line to the ''/ | ||
- | <code bash> | ||
- | ServerAliveInterval 60 | ||
- | </ | ||
- | |||
- | **Example** configuration on the ssh client: add the lines to the '' | ||
- | <code bash> | ||
- | Host * | ||
- | ServerAliveInterval 60 | ||
- | </ | ||
- | or in the command line: | ||
- | <code bash> | ||
- | ssh -o TCPKeepAlive=yes -o ServerAliveInterval=60 user@example.com | ||
- | </ | ||
- | |||
- | **Example** configuration for all applications in CentOS: add the lines to the ''/ | ||
- | <code bash> | ||
- | net.ipv4.tcp_keepalive_time = 600 | ||
- | net.ipv4.tcp_keepalive_intvl = 60 | ||
- | net.ipv4.tcp_keepalive_probes = 20 | ||
- | </ | ||
- | </ | ||
- | |||
- | < | ||
- | <note important> | ||
- | |||
- | Details: | ||
- | |||
- | By default, 64512 ports (65535-1023, | ||
- | |||
- | On average, an individual creates 50-60 simultaneous sessions, meaning 64512/ | ||
- | |||
- | Also, consider the feature of port release mechanism in the NAT Pool: | ||
- | - When Service 11 is enabled for a subscriber, [[dpi: | ||
- | - When a subscriber starts establishing sessions, ports are taken from the common SSG DPI queue and [[dpi: | ||
- | - If a specific Public IP has many subscribers competing for free ports, subscribers may experience access issues. | ||
- | |||
- | Recommendations for creating and operating NAT Pools: | ||
- | - Subscribers under blocking (Service 5 + policing) should be placed in a separate NAT Pool to avoid impacting active subscribers. For instance, an iPhone may establish many sessions searching for an active service. | ||
- | - Create sparse pools and separate clients into different NAT Pools by type: individuals and corporate users. | ||
- | - Monitor clients generating high load and work with them. For receiving, processing, and storing NetFlow from DPI, we suggest using the [[dpi: | ||
- | </ | ||
- | |||
- | < | ||
- | < | ||
- | - Changing the session limit:< | ||
- | - Adding additional addresses to the pool:< | ||
- | - Reducing the pool | ||
- | |||
- | <note important> | ||
- | In this case, you will need to free the pool, delete it, and create it with new parameters.</ | ||
- | |||
- | For convenience, | ||
- | <code bash> | ||
- | yum install epel-release yum-utils | ||
- | yum-config-manager --disable epel | ||
- | yum --enablerepo epel install jq | ||
- | </ | ||
- | |||
- | Then save the information about the subscribers of the current pool, delete and recreate the pool, and reconnect the subscribers: | ||
- | <code bash> | ||
- | fdpi_ctrl list all --service 11 --profile.name test_nat_4000 --outformat json | jq ' | ||
- | fdpi_ctrl list all --service 11 --profile.name test_nat_4000 --outformat json | jq -r ' | ||
- | fdpi_ctrl del all --service 11 --profile.name test_nat_4000 | ||
- | fdpi_ctrl del profile --service 11 --profile.name test_nat_4000 | ||
- | fdpi_ctrl load profile --service 11 --profile.name test_nat_4000 --profile.json '{ " | ||
- | fdpi_ctrl load --service 11 --profile.name test_nat_4000 --file save_users.txt | ||
- | </ | ||
- | Do not forget to change the pool name and its new parameters in the commands to the ones you need. | ||
- | </ | ||
- | |||
- | < | ||
- | If a subscriber has only one private address and it is necessary to assign a specific public address to the subscriber, the dependency between the private and public addresses must be considered, which is imposed by the non-blocking address dispatching algorithm in DPI. | ||
- | |||
- | < | ||
- | |||
- | where the mask depends on the number of working threads: | ||
- | * with 4 working threads, mask=3 (typical for SSG >= 10) | ||
- | * with 2 working threads, mask=1 (typical for SSG <= 6) | ||
- | |||
- | In fact, for older versions of SSG, subscribers with even private addresses should be assigned even public addresses, and subscribers with odd private addresses should be assigned odd public addresses. Only the last byte NNN in the IP address XXX.YYY.ZZZ.NNN needs to be considered. | ||
- | |||
- | Accordingly, | ||
- | |||
- | With one working thread, the dependency between the addresses disappears. | ||
- | |||
- | The exact mask value can be found in the DPI log: | ||
- | < | ||
- | If the service has been running for a long time, perform a reload: | ||
- | < | ||
- | |||
- | <note important> | ||
- | |||
- | **Example for SSG-20:** | ||
- | A subscriber with a private address of 10.0.0.15 needs to be assigned a public address of 188.99.99.27\\ | ||
- | mask=3\\ | ||
- | 15&3=3 equals 27&3=3 - this means that the address can be assigned (otherwise, either the private address assigned to the subscriber or the public address intended for the subscriber would need to be changed). | ||
- | |||
- | **Assign the address to the subscriber with the command:** | ||
- | < | ||
- | |||
- | < | ||
- | </ | ||
- | |||
- | < | ||
- | < | ||
- | |||
- | 1. The pools in the profile must be of the same size ((The requirement is not relevant if '' | ||
- | Correct: | ||
- | < | ||
- | type_profile=1, | ||
- | </ | ||
- | Incorrect: | ||
- | < | ||
- | type_profile=1, | ||
- | </ | ||
- | |||
- | 2. For subscribers who are blocked, a different profile with different pools should be applied. Many network devices, when blocked, can generate a large number of requests, leading to the consumption of free ports on the public address. | ||
- | |||
- | 3. Check the uniformity of the distribution of private addresses across public addresses in the profile. | ||
- | < | ||
- | fdpi_ctrl list all status --service 11 --profile.name nat_pool |grep whiteip|cut -f7|sort|uniq -c|sort -n | ||
- | </ | ||
- | |||
- | 4. Check the number of subscribers using ports beyond the value of the $P variable. On average, a subscriber uses about 600 ports. | ||
- | < | ||
- | fdpi_ctrl list all status --service 11 --profile.name nat_pool | awk 'BEGIN {FS=" | ||
- | </ | ||
- | |||
- | 5. Check how the addresses are distributed across pools (subnets) in the profile. | ||
- | < | ||
- | fdpi_ctrl list all status --service 11 --profile.name nat_pool |grep whiteip|cut -f7|cut -d" | ||
- | </ | ||
- | |||
- | </ | ||
- | |||
- | </ | ||