Contents
Настройка NAT в Red Hat, CentOS, ASP, Fedora Linux.
Общие сведения
Задача
Настроить 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 указан в качестве шлюза по умолчанию.
Разрешение пересылки пакетов между сетевыми интерфейсами
Для того чтобы разрешить пересылку сетевых пакетов между сетевыми интерфейсами в системе добавьте в конец файла /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.
Сетевой трафик:
Нагрузка на CPU:
Использование памяти:
Как мы видим, наш сервер прекрасно справляется в возложенной на него задачей, причем разница в цене между Linux роутером и самым простым аппаратным решением от брэновых производителей которые смогут справиться с подобной задачей может достичь несколько порядков.
