Ключевые слова:redhat, nat, (найти похожие документы)
From: Denis Frolov
Date: Mon, 3 Aug 2010 17:02:14 +0000 (UTC)
Subject: Настройка NAT в Red Hat, CentOS, ASP, Fedora Linux
Оригинал: http://www.redhat-club.org/Articles/DenisFrolov/NATConfiguration
Общие сведения
Задача
Настроить 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 роутером и самым простым
аппаратным решением от брэновых производителей которые смогут
справиться с подобной задачей может достичь несколько порядков.