Настраиваем NAT в Ubuntu 12 с помощью Iptables

Настройка Ubuntu сетевым шлюзом для раздачи интернета в локальную сеть

Для начала мы распишем, что мы имеем:

1. Интернет от провайдера приходит в виде статичного подключения (eth0) или pppoe соединения (ppp0)
2. Маломощный компьютер с двумя сетевыми картами на котором установлена Ubuntu
3. Компьютер подключенный с серверу напрямую или через свитч

Белый интернет с реальным ip адресом eth0 — 10.10.10.10/255.255.255.252
Серый ip адрес для локальной сети eth1 — 192.168.0.1/255.255.255.0

Приступим к настройки сервера:

Для начала пропишем необходимые параметры в файле /etc/sysctl.conf

— находим и разкоментируем:

# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1

— там же в самом низу добавляем:

# Для защиты от SYN атак включаем SYN-cookies
net.ipv4.tcp_syncookies=1
# Увеличиваем размер очереди полуоткрытых соединений (также полезно при SYN флуде) (default 512)
net.ipv4.tcp_max_syn_backlog=4096
# Проверять TCP-соединение каждую минуту. Если на другой стороне - легальная машина,.
# она сразу ответит. Дефолтовое значение - 2 часа.
net.ipv4.tcp_keepalive_time=60
# Повторить пробу через десять секунд
net.ipv4.tcp_keepalive_intvl=10
# Количество проверок перед закрытием соединения
net.ipv4.tcp_keepalive_probes=5
# Уменьшение времени удержания «полуоткрытых» соединений
# Сделаем так, чтобы передача осуществлялась на 3 секунде
# и  полное время хранения полуоткрытых соединений в очереди составило 9 секунд
net.ipv4.tcp_synack_retries=1
# Изменяем время ожидания приема FIN до полного закрытия сокета
net.ipv4.tcp_fin_timeout=10

Сохраняем и выходим

Создаем файл с конфигурацией iptables и настраиваем его:


touch /opt/iptables.sh
chmod +x /opt/iptables.sh
mcedit /opt/iptables.sh

— пишем следующий код для NAT MASQUERADE, такой тип nat можно использовать как для белых динамических и статических ip адресов получаемых у правайдера

#!/bin/sh

# удаляем все имеющиеся правила
iptables -F
iptables -t nat -F
iptables -t mangle -F

iptables -X
iptables -t nat -X
iptables -t mangle -X

iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

#Увеличиваем ttl
iptables -t mangle -I POSTROUTING -o eth0 -j TTL --ttl-set 128

#Ставим приоритет трафика для часто использующих портов, данный параметр необходим если вы будите качать торренты, которые за частую съедают весь ваш трафик и не дают нормально серфить по интернету
iptables -A PREROUTING -t mangle -p tcp --sport 0:1024 -j TOS --set-tos Minimize-Delay
iptables -A PREROUTING -t mangle -p tcp --sport 1025:65535 -j TOS --set-tos Maximize-Throughput
iptables -A OUTPUT -t mangle -p tcp --dport 0:1024 -j TOS --set-tos Minimize-Delay
iptables -A OUTPUT -t mangle -p tcp --dport 1025:65535 -j TOS --set-tos Maximize-Throughput

#Параметр помогающий вылечить проблему с MTU
iptables -A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

#Немного защитим наше белое соединение от атак и флуда
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
iptables -A INPUT -f -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -I INPUT -i eth0 -s 10.0.0.0/8 -j DROP
iptables -I INPUT -i eth0 -s 172.16.0.0/12 -j DROP
iptables -I INPUT -i eth0 -s 192.168.0.0/16 -j DROP
iptables -I INPUT -i eth0 -s 127.0.0.0/8 -j DROP
#Syn-flood
iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
#scan port
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
#Ping of death
iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

iptables -N BAD_PACKETS
iptables -A INPUT -j BAD_PACKETS

# будет препятствовать спуфингу от нашего имени.
# Ведь если мы получаем пакет с установленными флагами SYN и ACK
# (такой комбинацией флагов обладает только ответ на SYN-пакет) по еще не открытому соединению,
# это означает, что кто-то послал другому хосту SYN-пакет от нашего имени, и ответ пришел к нам.
# Конечно, злоумышленнику предстоит еще угадать номер последовательности.
# Согласно приведенному правилу, наш хост ответит RST-пакетом, после получения которого
# атакуемый хост закроет соединение.
iptables -I INPUT -m conntrack --ctstate NEW,INVALID -p tcp --tcp-flags SYN,ACK SYN,ACK -j REJECT --reject-with tcp-reset

# Маскарад, тоесть тот самый параметр который отвечает за раздачу интернета
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE 

#Проброс порта для торрент клиента Torrent client, ip выставляете тот на котором будет стоять torrent client
iptables -t nat -A PREROUTING -p tcp --dport 60000 -i eth0 -j DNAT --to 192.168.0.2
iptables -t nat -A PREROUTING -p udp --dport 60000 -i eth0 -j DNAT --to 192.168.0.2
iptables -t filter -A INPUT -i eth0 -p tcp --dport 60000 -j ACCEPT
iptables -t filter -A INPUT -i eth0 -p udp --dport 60000 -j ACCEPT

#Сохраняем результат для системы восстановления после перезагрузки
iptables-save > /etc/iptables.up.rules

— пишем следующий код для NAT SNAT, такой тип nat можно использовать только для белых ip адресов получаемых у правайдера

#!/bin/sh

# удаляем все имеющиеся правила
iptables -F
iptables -t nat -F
iptables -t mangle -F

iptables -X
iptables -t nat -X
iptables -t mangle -X

iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

#Увеличиваем ttl
iptables -t mangle -I POSTROUTING -o eth0 -j TTL --ttl-set 128

#Ставим приоритет трафика для часто используемых портов, данный параметр необходим если вы будите качать торренты, которые за частую съедают весь ваш трафик и не дают нормально серфить по интернету
iptables -A PREROUTING -t mangle -p tcp --sport 0:1024 -j TOS --set-tos Minimize-Delay
iptables -A PREROUTING -t mangle -p tcp --sport 1025:65535 -j TOS --set-tos Maximize-Throughput
iptables -A OUTPUT -t mangle -p tcp --dport 0:1024 -j TOS --set-tos Minimize-Delay
iptables -A OUTPUT -t mangle -p tcp --dport 1025:65535 -j TOS --set-tos Maximize-Throughput

#Параметр помогающий вылечить проблему с MTU
iptables -A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

#Немного защитим наше белое соединение от атак и флуда
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
iptables -A INPUT -f -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -I INPUT -i eth0 -s 10.0.0.0/8 -j DROP
iptables -I INPUT -i eth0 -s 172.16.0.0/12 -j DROP
iptables -I INPUT -i eth0 -s 192.168.0.0/16 -j DROP
iptables -I INPUT -i eth0 -s 127.0.0.0/8 -j DROP
#Syn-flood
iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
#scan port
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
#Ping of death
iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

iptables -N BAD_PACKETS
iptables -A INPUT -j BAD_PACKETS

# будет препятствовать спуфингу от нашего имени.
# Ведь если мы получаем пакет с установленными флагами SYN и ACK
# (такой комбинацией флагов обладает только ответ на SYN-пакет) по еще не открытому соединению,
# это означает, что кто-то послал другому хосту SYN-пакет от нашего имени, и ответ пришел к нам.
# Конечно, злоумышленнику предстоит еще угадать номер последовательности.
# Согласно приведенному правилу, наш хост ответит RST-пакетом, после получения которого
# атакуемый хост закроет соединение.
iptables -I INPUT -m conntrack --ctstate NEW,INVALID -p tcp --tcp-flags SYN,ACK SYN,ACK -j REJECT --reject-with tcp-reset

# SNAT для тех у  кого статичный ip адресс
iptables -t nat -A POSTROUTING -j SNAT --to-source 10.10.10.10 --persistent

#Проброс порта для торрент клиента Torrent client, ип выставляете тот на котором будет стоять torrent client
iptables -t nat -A PREROUTING -p tcp --dport 60000 -i eth0 -j DNAT --to 192.168.0.2
iptables -t nat -A PREROUTING -p udp --dport 60000 -i eth0 -j DNAT --to 192.168.0.2
iptables -t filter -A INPUT -i eth0 -p tcp --dport 60000 -j ACCEPT
iptables -t filter -A INPUT -i eth0 -p udp --dport 60000 -j ACCEPT

#Сохраняем результат для системы восстановления после перезагрузки
iptables-save > /etc/iptables.up.rules

— затем поставим iptables в автозагрузку

touch /etc/network/if-pre-up.d/iptables 
chmod +x touch /etc/network/if-pre-up.d/iptables
mcedit touch /etc/network/if-pre-up.d/iptables

— в файле /etc/network/if-pre-up.d/iptables прописываем

#!/bin/bash

/sbin/iptables-restore < /etc/iptables.up.rules

сохраняем выходим

После всех действий нужно все сохранить и перегрузить сервер, после перезагрузки проверить интернет на компьютере клиента (192.168.0.2).
Если что то не получается пишите, с удовольствием Вам помогу.

Материалы для статьи взяты на разных сайтах по it.
При размещении на других ресурсах просьба ставить источник.

Яндекс.Метрика