Настройка NAT в RHEL, CentOS, Fedora

Данная статья описывает настройку NAT на Linux сервере.

Для определенности будет полагать, что ethernet кабель, по которому поставщик услуг связи (провайдер) предоставляет свои услуги, подключен в сетевой интерфейс eth0. Провайдер выделяет нам один IP-адрес 192.168.0.1, сетевая маска 255.255.255.252, шлюз 192.168.0.2.

Локальная сеть подключена к интерфейсу eth1.

На данном сетевой интерфейсе сетевой адрес 172.16.0.1, маска сети 255.240.0.0. На всех машинах локальной сети IP-адрес 172.16.0.1 указан в качестве шлюза по умолчанию.

Настройка NAT в RHEL, CentOS, Fedora - nat_schema

Разрешение пересылки пакетов между сетевыми интерфейсами

Для того, чтобы разрешить пересылку сетевых пакетов между сетевыми интерфейсами в системе, добавьте в конец файла /etc/sysctl.conf следующую строку:

net.ipv4.ip_forward = 1

Сохраните изменения и выполните:

# sysctl -p

для того, чтобы изменения вступили с силу.

Настрока сетевых интерфейсов

В каталоге /etc/sysconfig/network-scripts/ создайте файл ifcfg-eth0 следующего содержания:

DEVICE=eth0
BOOTPROTO=static
IPADDR=192.168.0.1
NETMASK=255.255.255.252
NETWORK=192.168.0.0
GATEWAY=192.168.0.2
ONBOOT=yes

и файл ifcfg-eth1:

DEVICE=eth1
BOOTPROTO=static
IPADDR=172.16.0.1
NETMASK=255.240.0.0
NETWORK=172.16.0.0
ONBOOT=yes

перегагрузите сервис network с помошью команды:

# service network restart

Установка дополнительных параметров ядра через sysctl

Наш роутер будет пропускать через себя большое количество сетевых соединений и нам необходимо внести некоторые коррективы в поведение сетевой подсистемы Linux ядра для того, чтобы заставить его работать в полную силу.

Данные параметры необходимо добавить в конец файла /etc/sysctl.conf.

В первую очередь нам необходимо внести изменения в размеры буферов для приема и отправки данных через сокеты:

net.core.rmem_default = 16777216
net.core.rmem_max = 16777216
net.core.wmem_default = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 16777216  16777216
net.ipv4.tcp_wmem = 4096 16777216  16777216

Включим защиту от «наводнения» syn пакетами:

net.ipv4.tcp_syncookies = 1

Запретим принимать ICMP редиректы:

net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0

Игнорируем широковещательные ICMP запросы:

net.ipv4.icmp_echo_ignore_broadcasts=1

Игнорируем пакеты в которых указан путь до источника:

net.ipv4.conf.all.accept_source_route=0

Укажем диапазон портов, которые разрешено использовать в качестве локальных. По умолчанию этот диапазон достаточно мал, и при высокой нагрузке вам их может просто не хватить:

net.ipv4.ip_local_port_range = 16384    61000

Уменьшим время которое используется для сообщений о поддержке keep alive соединений:

net.ipv4.tcp_keepalive_time = 1800

Уменьшим время до закрытия TCP-соединения. Данный параметр стоит менять только на высоко нагруженных серверах?

net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 200000

Увеличиваем количество conntrack соединений. Необходимо менять значение по умолчанию только на высоко нагруженных серверах.

net.ipv4.ip_conntrack_max = 64000000

Указываем время в секундах, в течении которого следует ожидать приема FIN до закрытия сокета:

net.ipv4.tcp_fin_timeout = 30

Указываем количество пакетов проверки keepalive посылать, прежде чем TCP соединение будет закрыто:

net.ipv4.tcp_keepalive_probes = 2

Указываем максимальное количество начальных SYN и SYN+ACK повторов для установки TCP соединения. Данные параметры следует использовать с осторожностью на плохих линиях связи т.к. есть вероятность, что TCP сессии никогда не будут установлены.

net.ipv4.tcp_synack_retries = 3
net.ipv4.tcp_syn_retries = 3

Следующие параметры явно не влияют на производительность сетевой подсистемы.

В случае kernel panic производить перезагрузку роутера через 10 секунд.

kernel.panic = 10

Отключаем tcp_ timestamps, чтобы сетевые сканеры не могли узнать uptime роутера по его сетевым откликам:

net.ipv4.tcp_timestamps=0

Более подробно о параметрах sysctl, влияющих на сетевую подсистему Linux, можно прочитать на этой странице http://ipsysctl-tutorial.frozentux.net/chunkyhtml/tcpvariables.html.

Для применения данных параметров выполните:

# sysctl -p

Настройка iptables

Создайте файл /etc/sysconfig/iptables следующего содержания:

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
### Здесь могут располагаться ваши правила для фильтрации ###
-A FORWARD -d 0.0.0.0/8 -j DROP
-A FORWARD -d 127.0.0.0/8 -j DROP
-A FORWARD -d 255.255.255.255 -j DROP
-A FORWARD -d 224.0.0.0/4 -j DROP
-A FORWARD -d 240.0.0.0/5 -j DROP
-A FORWARD -d 239.255.255.0/24 -j DROP
-A FORWARD -p tcp --tcp-flags ALL ALL -j DROP
-A FORWARD -p tcp --tcp-flags ALL NONE -j DROP
-A FORWARD -p icmp -m icmp --icmp-type address-mask-request -j DROP
-A FORWARD -p icmp -m icmp --icmp-type timestamp-request -j DROP
-A FORWARD -p icmp --fragment -j DROP
#
COMMIT
#
*nat
-A POSTROUTING -o eth0 -s 172.16.0.0/12 -j SNAT --to 192.168.0.1
#
COMMIT

Внесите следующие изменения в файл /etc/sysconfig/iptables-config:

# Подгружаем дополнительные модули чтобы через NAT работали протоколы ftp и irc
IPTABLES_MODULES="ip_nat_ftp ip_nat_irc"
# Не выгружать модули iptables при рестарте
IPTABLES_MODULES_UNLOAD="no"

Перезапустите iptables c помощью команды

service iptables restart

Тестирование производительности

В качестве платформы для проведения тестов была взята обычная рабочая машина с совершенно заурядной конфигурацией:

  • Процессор: Atlhon XP 1600 Mhz
  • Память: 2 модуля DIMM DDR400 по 256 МБ
  • Сеть: 2 сетевые карты 3Com Corporation 3c905B 100BaseTX

Согласитесь, что система достаточно простая ?

Помимо NAT-а никаких иных функций машина не выполняла, так что можем с уверенностью сказать, что чистота эксперимента не нарушена.

Тестирование проводилось 1 месяц. За время тестирования машина была выключена 1 раз – для переноса ее в другое место.

Количество пользователей работающих через NAT 2500 человек.

Данные о проходящем сетевом трафике:

В среднем через сетевой интерфейс eth0 проходит:

  • Исходящих пакетов в секунду 3000-6000
  • Входящих пакетов в секунду 4000-8000.

Сетевой трафик:

Настройка NAT в RHEL, CentOS, Fedora - nat_network

Нагрузка на CPU:

Настройка NAT в RHEL, CentOS, Fedora - nat_cpu

Использование памяти:

Настройка NAT в RHEL, CentOS, Fedora - nat_memory

Как мы видим, наш сервер прекрасно справляется в возложенной на него задачей, причем разница в цене между Linux роутером и самым простым аппаратным решением от брэновых производителей, которые смогут справиться с подобной задачей, может достичь несколько порядков.

Статьи по Теме

Категории
Поиск