Организация NAT в сетке

http://it.icmp.ru/postimages/1474/6887/thumb/c5df10c750218b7ff6ee0c0623641c7c.jpg


приведенный пример с использованием bash скрипта позволяет быстро организовать раздачу интернета через машину с Linux-ом (Ubuntu, Centos, Gentoo...)
Данная конфигурация позволяет организовать доступ в интернет, и если используется 2 интернет канала (внешний и бекбоновский) - разбить траффик, маршрутизируя бекбоновские ресурсы через интерфейс с доступом в бекбон

eth0 - внешний канал
eth1 - локальная сеть
eth2 - бекбон

Если не используется такое - то раскоментировать или убрать параметр BBN и статические роутинги соответственно

#!/bin/bash

OUT="eth0" # Имя исходящего интерфейса, смотрящего в интернет.
OUTADDR="1.1.1.1" # Адрес исходящего интерфейса
IN="eth1" # Имя входящего интерфейса, смотрящего в локальную сеть
INADDR="2.2.2.2" # Адрес входящего интерфейса
BBN="eth2" # Интерфейс в бекбон
BBNADDR="3.3.3.3" # Адрес интерфейса в бекбон
BBNGW="4.4.4.4" # Адрес шлюза вашего бекбоновского провайдЫра
NETWORK="10.0.0.0/8" # Адресация вашей локальной сети
ANYWHERE="0.0.0.0/0" # Назначение, любое.
PORTS="1024:65535" # Порты, которые считаются локальными
MULTICAST="224.0.0.0/4" # Мультикаст пакеты, если у вас не используется оставьте как есть,

ADMINS="10.186.185.127 10.186.186.147" # IP адреса администраторов, имеют полный доступ на сервер, без каких либо ограничений.

##############################################################################################
# Старт и остановка скрипта
# Остановка скрипта
case "$1" in
stop)
echo "Shutting down firewall..."

iptables --flush
iptables --delete-chain
iptables --table nat --flush
iptables --table filter --flush
iptables --table nat --delete-chain
iptables --table filter --delete-chain

iptables -t filter -P INPUT ACCEPT
iptables -t filter -P OUTPUT ACCEPT
iptables -t filter -P FORWARD ACCEPT

echo "...done"
;;
status)
echo $"Table: filter"
iptables --list
echo $"Table: nat"
iptables -t nat --list
;;
restart|reload)
$0 stop
$0 start
;;

##############################################################################################
# Запуск скрипта
start)
echo "Starting Firewall..."
echo ""

# Очистка таблиц и цепочек
iptables --flush
iptables --delete-chain
iptables --table nat --flush
iptables --table filter --flush
iptables --table nat --delete-chain
iptables --table filter --delete-chain

# Назначение глобальных политик фаервола
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD

# Загружаем модули, для корректной работы VPN, Active ftp, DCC in IRC которые будут идти через нат.
modprobe ip_nat_ftp
modprobe ip_nat_pptp
modprobe ip_conntrack_ftp
modprobe ip_conntrack_irc

# Изменение параметров SYSCTL
# Включение форвардинга
echo 1 > /proc/sys/net/ipv4/ip_forward
# Включение форвардинга для VPN
echo 1 > /proc/sys/net/ipv4/ip_dynaddr
# Увеличение размера очередей
echo 32000000 > /proc/sys/net/ipv4/netfilter/ip_conntrack_max
# Время ожидания до закрытия соединения
echo 14400 > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
# Время ожидания до посылки FIN пакета
echo 60 > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_fin_wait
# Время ожидания до посылки FIN пакета
echo 10 > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_syn_sent
# Для защиты от syn флуда
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
# Увеличиваем размер backlog очереди
echo 1280 > /proc/sys/net/ipv4/tcp_max_syn_backlog
# Число начальных SYN и SYNACK пересылок для TCP соединения
echo 4 > /proc/sys/net/ipv4/tcp_synack_retries
echo 4 > /proc/sys/net/ipv4/tcp_syn_retries
#Какие порты использовать в качестве локальных TCP и UDP портов
echo "16384 61000" > /proc/sys/net/ipv4/ip_local_port_range
Сколько секунд ожидать приема FIN до полного закрытия сокета
echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
# Как часто посылать сообщение о поддержании keep alive соединения
echo 1800 > /proc/sys/net/ipv4/tcp_keepalive_time
# Сколько пакетов проверки keepalive посылать, прежде чем соединение будет закрыто.
echo 2 > /proc/sys/net/ipv4/tcp_keepalive_probes
# Зaпрещаем TCP window scaling
echo 0 > /proc/sys/net/ipv4/tcp_window_scaling
# Запрещаем selective acknowledgements, RFC2018
echo 0 > /proc/sys/net/ipv4/tcp_sack
# Запрещаем TCP timestamps, RFC1323
echo 0 > /proc/sys/net/ipv4/tcp_timestamps
# Уличиваем размер буфера для приема и отправки данных через сокеты.
echo 1048576 > /proc/sys/net/core/rmem_max
echo 1048576 > /proc/sys/net/core/rmem_default
echo 1048576 > /proc/sys/net/core/wmem_max
echo 1048576 > /proc/sys/net/core/wmem_default
# Через какое время убивать соединеие закрытое на нашей стороне
echo 1 > /proc/sys/net/ipv4/tcp_orphan_retries

# Полностью временно отключить eth0 Раскоментировать
#iptables -A INPUT -i $OUT -j DROP

# Полный контроль администратора
for admin_ips in $ADMINS; do

iptables -A INPUT -s $admin_ips -m state --state NEW -j ACCEPT
done

##############################################################################################

# Silently Drop Stealth Scans
# All of the bits are cleared
iptables -A INPUT -p icmp --icmp-type timestamp-request -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
# SYN and FIN are both set
iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
# SYN and RST are both set
iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
# FIN and RST are both set
iptables -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j DROP
# FIN is the only bit set, without the expected accompanying ACK
iptables -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j DROP
# PSH is the only bit set, without the expected accompanying ACK
iptables -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j DROP
# URG is the only bit set, without the expected accompanying ACK
iptables -A INPUT -p tcp --tcp-flags ACK,URG URG -j DROP

##############################################################################################

# Игнорирование мультикастов
iptables -A INPUT -s $MULTICAST -j DROP
iptables -A INPUT -d $MULTICAST -j DROP

# пропуск связанных установленных соединений
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# обратка - лупбэк
iptables -A INPUT -i lo -j ACCEPT

# разрешение пинговки из локалки
for net_ips in $NETWORK; do

iptables -A INPUT -p icmp -i $IN --icmp-type echo-request -j ACCEPT
iptables -A INPUT -p icmp -i $OUT --icmp-type echo-request -j ACCEPT

done

############ Открываем нужные нам порты.
# FTP
iptables -A INPUT -p tcp --dport 21 -m state --state NEW -j ACCEPT
# PASSIVE FTP
iptables -t filter -A INPUT -p tcp -m tcp --dport 50000:50500 -m state --state NEW -j ACCEPT
iptables -t filter -A INPUT -p udp -m udp --dport 50000:50500 -m state --state NEW -j ACCEPT
# APACHE
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT

########### OUTPUT

iptables -A OUTPUT -p icmp --icmp-type timestamp-reply -j DROP

########### NAT Вписываем сюда IP своих компьютеров в локальной сети.

iptables -t nat -A POSTROUTING -s 2.2.2.10 -o $OUT -j MASQUERADE
iptables -t nat -A POSTROUTING -s 2.2.2.11 -o $OUT -j MASQUERADE
iptables -t nat -A POSTROUTING -s 2.2.2.12 -o $OUT -j MASQUERADE
iptables -t nat -A POSTROUTING -s 2.2.2.13 -o $OUT -j MASQUERADE
iptables -t nat -A POSTROUTING -s 2.2.2.14 -o $OUT -j MASQUERADE

############ PORT FORWARD Сюда вписываем проброс портов локальную сеть.

iptables -t nat -A PREROUTING -p tcp -d $OUTADDR --dport 8230 -j DNAT --to-destination 2.2.2.10:8230
iptables -t filter -A FORWARD -i $OUT -d 2.2.2.10 -p tcp --dport 8230 -j ACCEPT

############ PORT FORWARD Сюда вписываем проброс портов локальную сеть из бекбона (при ненадобности убрать или раскоментировать)

iptables -t nat -A PREROUTING -p tcp -d $BBNADDR --dport 3328 -j DNAT --to-destination 2.2.2.10:3328
iptables -t filter -A FORWARD -i $OUT -d 2.2.2.10 -p tcp --dport 8230 -j ACCEPT

############ Доступ к бекбону

iptables -t nat -A POSTROUTING -o $BBN -j MASQUERADE

route add -net 91.193.178.0 netmask 255.255.255.0 gw $BBNGW $BBN
route add -net 109.197.200.0 netmask 255.255.255.0 gw $BBNGW $BBN
route add -net 77.242.0.0 netmask 255.255.0.0 gw $BBNGW $BBN
route add -net 78.31.216.0 netmask 255.255.255.0 gw $BBNGW $BBN
route add -net 79.133.86.128 netmask 255.255.255.255 gw $BBNGW $BBN
route add -net 80.72.29.96 netmask 255.255.255.255 gw $BBNGW $BBN
route add -net 80.81.216.0 netmask 255.255.255.0 gw $BBNGW $BBN
route add -net 82.179.48.0 netmask 255.255.255.0 gw $BBNGW $BBN
route add -net 84.237.104.0 netmask 255.255.255.0 gw $BBNGW $BBN
route add -net 87.226.235.0 netmask 255.255.255.0 gw $BBNGW $BBN
route add -net 87.226.236.0 netmask 255.255.255.0 gw $BBNGW $BBN
route add -net 88.82.160.0 netmask 255.255.255.0 gw $BBNGW $BBN
route add -net 88.82.169.151 netmask 255.255.255.255 gw $BBNGW $BBN
route add -net 91.193.176.0 netmask 255.255.255.0 gw $BBNGW $BBN
route add -net 91.211.76.0 netmask 255.255.255.0 gw $BBNGW $BBN
route add -net 94.231.16.0 netmask 255.255.255.0 gw $BBNGW $BBN
route add -net 88.82.172.0 netmask 255.255.255.0 gw $BBNGW $BBN
route add -net 91.193.178.14 netmask 255.255.255.255 gw $BBNGW $BBN
route add -net 88.82.172.203 netmask 255.255.255.255 gw $BBNGW $BBN
route add -net 88.82.172.222 netmask 255.255.255.255 gw $BBNGW $BBN
route add -net 91.193.177.0 netmask 255.255.255.0 gw $BBNGW $BBN

echo "...done"

echo "--> IPTABLES firewall loaded/activated <--"

##--------------------------------End Firewall---------------------------------##

;;
*)
echo "Usage: firewall (start|stop|restart|status) EXTIF INTIF"
exit 1
esac

exit 0


Стартуем: sudo sh firewall.sh start (или же ./firewall.sh start), проверяем

Чтобы запускалось автоматом при старте шлюза - пропишите запуск в /etc/init.d/rc.local (Ubuntu), /etc/rc.local (Centos)
  • 13 февраля 2011, 09:07
  • leonard
  • просмотров: ~3385
  • рейтинг: ?

Комментарии (9)

Вы - anonymous, войти ?

можно использовать bbcode-теги
[b]жирный текст[/b]
[i]курсив[/i]
[u]underline[/u]
[s]зачеркнутый текст[/s]
[size=20px]размер шрифта[/size]
всякие изменения текста
[left][/left]
[right][/right]
[center][/center]
позиционирование элементов: картинки, текст и т.д
[url][/url]
[email][/email]
внутри тега [url] помещайте ссылки, а внутри [email] адрес электронной почты;
так же [url] можно использовать в виде:
[url=http://example.com]пример[/url],
[url=http://test.ru][img]http://flickr.com/givemeimg.png[/img][/url]
[code][/code]
[quote][/quote]
внутри тега [code] можно помещать программный код (подстветка попытается включиться автоматически); для выделения цитат используйте [quote]
также можно напрямую указать язык [code=cpp]int i;[/code]
[list][/list]
создаем списки, каждый элемент пишется после [*].

Можно указывать маркер - [list=marker].
возможные маркеры 1(decimal), i(lower-roman), I(upper-roman), a(lower-alpha), A(upper-alpha). Примеры:

[list][*]1 элемент[*]2 элемент[*]3 элемент[/list]
[list=1][*]1 элемент[*]2 элемент[*]3 элемент[/list]
[list=A][*]1 элемент[*]2 элемент[*]3 элемент[/list]
[table][/table]
оформляем таблицу, используя внутренние теги [tr] и [td].
[tr] - строка, [td] - поле в строке,
[table=100%] - можно задавать ширину в процентах, по-умолчанию ширина 100%
[td=2] - можно задавать сколько столбцов входит в это поле. Пример:

[table=50%][tr][td]столбец 1[/td][td]столбец 2[/td][/tr][tr][td]значение 1[/td][td]значение 2[/td][/tr][tr][td=2]сразу 2 столбца[/td][/tr][/table]
[img][/img]
тег для вставки фото или картинок, мы любим картинки. Примеры использования:

[img]http://ya.ru/logo.png[/img],
[img=100x100px]http://ya.ru/logo.png[/img]
[img=fullimg.url]thumbimg.url[/img],
Пожалуйста загружайте картинки на наш сайт, либо вставляйте с бекбоновских ресурсов.
[video][/video]
Проигрывает видео, внутрь вставляем ссылки на видео, поддерживается Play.Ykt.Ru(нужно вставить ссылку на страницу с видео) и tv.ykt.ru(нужно вставить ссылку на адрес файла)