NAT преобразование сетевых адресов

NAT (Network Address Translation - преобразование сетевых адресов) — это механизм в сетях Порты TCP. Что такое TCP / IP порт/IP, позволяющий преобразовывать IP- адреса транзитных пакетов. Также имеет названия IP Masquerading, Network Masquerading и Native Address Translation.

Терминология NAT:

  • Внутренний локальный адрес (Inside local address). Это адреса IP, присвоенные узлам внутренней сети. Как правило, эти адреса не являются зарегистрированными NIC (Network Information Center) или поставщиком услуг.
  • Внутренний глобальный адрес (Inside global address). Этот адрес выдается организации центром NIC или поставщиком услуг Интернет. Он представляет один или более внутреннихузлов во внешней сети.
  • Внешний локальный адрес (Outside local address). Это адрес IP, присвоенный внешнему узлу и означающий, что внешний узел принадлежит внутренней сети. Этот адрес не нуждается в регистрации. Этот адрес должен принадлежать такому адресному пространству, которое имеет возможность маршрутизироваться во внутреннюю сеть.
  • Внешний глобальный адрес (Outside global address). Это адрес IP, присвоенный узлу внешней сети владельцем данного узла. Этот адрес принадлежит глобальному адресному или сетевому пространству.

Читайте также: Настройка iptables и NAT, sysctl утилита, предназначенная для управления параметрами ядра

Тюнинг NAT в Linux

Операция NAT является одной из самых ресурсоёмких. NAT- сервер запоминает все соединения, которые через него проходят и сохраняет эти сведения в ОЗУ в памяти в специальной таблице. Когда сессия закрывается, информация о ней из таблицы удаляется. Размер этой таблицы фиксирован. Если сеть большая нужно настроить размеры таблицы хранения отслеживаемых соединений.

  • Размер таблицы NAT
  1. Посмотреть текущий размер таблицы NAT утилитой sysctl:
    # sysctl net.netfilter.nf_conntrack_max
    net.netfilter.nf_conntrack_max = 65536
    или
    # sysctl -a | grep conntrack_max
    net.netfilter.nf_conntrack_max = 65536
    net.ipv4.netfilter.ip_conntrack_max = 65536
    net.nf_conntrack_max = 65536
  2. Посмотреть заполненность таблицы
    # sysctl net.netfilter.nf_conntrack_count
    net.netfilter.nf_conntrack_count = 654
  3. Если будет принято решение об увеличение размера таблицы (sysctl утилита, предназначенная для управления параметрами ядра -w net.netfilter.nf_conntrack_max=ваше_значение), также нужно пропорционально увеличить hash- таблицу, в которой хранятся списки conntrack- записей. Размер hash- таблицы задается по правилам, которые например описаны здесь Conntrack tuning. Размер hash- таблиц задается в файле /sys/module/nf_conntrack/parameters/hashsize, задать новый размер можно при помощи утилиты echo, например
    # echo 16384 >  /sys/module/nf_conntrack/parameters/hashsize
  • Timeout NAT. Информация о сессиях также может быть удалена по timeout. Т.е. если втечение долгого времени в рамках соединения обмена трафика нет - сессия закрывается и информация о ней так же удаляется из таблицы NAT. По умолчанию значения тайм-аутов стоят достаточно большие. Поэтому, при больших потоках трафика, даже если nf_conntrack_max установлен в максимальное значение, существует риск столкнуться с переполнением таблицы и разрывами соединений. Посмотреть установленные значения задержек (в секундах):
    # sysctl -a | grep conntrack | grep timeout
    net.netfilter.nf_conntrack_generic_timeout = 600 - NAT- сервер 
    будет хранить информацию о сессии даже в том случае, если будет проходит 1 пакет в 10 минут.
    net.netfilter.nf_conntrack_tcp_timeout_syn_sent = 120
    net.netfilter.nf_conntrack_tcp_timeout_syn_recv = 60
    net.netfilter.nf_conntrack_tcp_timeout_established = 432000 - TCP- сессию NAT- сервер 
    будет отслеживать 5 дней(!), если даже за это период пройдет только 1 пакет, 
    это может привести к быстрому заполнению nf_conntrack_max
    net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
    net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
    net.netfilter.nf_conntrack_tcp_timeout_last_ack = 30
    net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
    net.netfilter.nf_conntrack_tcp_timeout_close = 10
    net.netfilter.nf_conntrack_tcp_timeout_max_retrans = 300
    net.netfilter.nf_conntrack_tcp_timeout_unacknowledged = 300
    net.netfilter.nf_conntrack_udp_timeout = 30
    net.netfilter.nf_conntrack_udp_timeout_stream = 180
    net.netfilter.nf_conntrack_icmp_timeout = 30
    net.netfilter.nf_conntrack_events_retry_timeout = 15
    net.ipv4.netfilter.ip_conntrack_generic_timeout = 600
    net.ipv4.netfilter.ip_conntrack_tcp_timeout_syn_sent = 120
    net.ipv4.netfilter.ip_conntrack_tcp_timeout_syn_sent2 = 120
    net.ipv4.netfilter.ip_conntrack_tcp_timeout_syn_recv = 60
    net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 432000
    net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120
    net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
    net.ipv4.netfilter.ip_conntrack_tcp_timeout_last_ack = 30
    net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120
    net.ipv4.netfilter.ip_conntrack_tcp_timeout_close = 10
    net.ipv4.netfilter.ip_conntrack_tcp_timeout_max_retrans = 300
    net.ipv4.netfilter.ip_conntrack_udp_timeout = 30
    net.ipv4.netfilter.ip_conntrack_udp_timeout_stream = 180
    net.ipv4.netfilter.ip_conntrack_icmp_timeout = 30

    Значения timeout рекомендуется ставить в пределах 30-120 секунд.

PQ VPS сервера в 28+ странах.