Iptables

From SysadminWiki.ru
Jump to: navigation, search

- Запомнить конфигурацию файрвола можно командой iptables-save, восстановить iptables-restore, хранится она в /etc/sysconfig/iptables.

Добавление и удаления правил

- Если ошиблись, то удаляем, изменяем и прописываем заново

# iptables -t nat -D POSTROUTING 1

где 1 это номер правила по порядку, или удаляем все правила из таблицы POSTROUTING

# iptables -t nat -F POSTROUTING

Также удалить конкретное правило можно использовав директиву -D вместо -A:

# iptables -t nat -D POSTROUTING -s 10.0.0.0/24 -o eth1 -j MASQUERADE

- В целях отладки можно добавить правило на пропуск пингов от клиентов во внешний мир

# iptables -t nat -A POSTROUTING -o eth1 -p icmp -j SNAT --to-source 192.168.100.18

Прямой доступ в Интернет

Добавим правило прямого доступа (без прокси сервера) к Интернет для адреса 10.0.0.244

# iptables -t nat -A POSTROUTING -s 10.0.0.244 -o eth1 -j SNAT --to 192.168.100.18

или для всей подсети

# iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth1 -j MASQUERADE

- Проверяем добавленную запись

# iptables -t nat -L

Ограничение доступа в локальную сеть

Частичная блокировка

Для того, чтобы ограничить доступ в нашу сеть извне не навредив, нужно иметь представление какие ресурсы используют приложения, работающие на сервере. Для этого убедимся, что все службы сервера запущены (httpd, named и т.д.) и определим открытые порты.

Пусть внешний интерфейс eth1 имеет адрес 81.81.81.81.

Проверим открытые порты командой:

# netcat -v -w 4 -z 81.81.81.81 1-1023 | grep succeed

либо

# nmap -sT -O 81.81.81.81

где "-О" это заглавная латинская буква "О". Посмотрим кто сопоставлен, к примеру, с портом 111:

# cat /etc/services | grep 111

sunrpc 111/tcp portmapper # RPC 4.0 portmapper TCP
sunrpc 111/udp portmapper # RPC 4.0 portmapper UDP

Посмотрим, кто его прослушивает:

# netstat -anp | grep 111

tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 2457/portmap
udp 0 0 0.0.0.0:111 0.0.0.0:* 2457/portmap

Посмотрим используется ли он сейчас:

# lsof -i | grep 111

Прописываем правила, закрывающие все порты за исключением 25 (smtp: принимаем почту) и 80 (http: показываем web страницы)

# iptables -A INPUT -i eth1 -p tcp --dport 25 -j ACCEPT
# iptables -A INPUT -i eth1 -p tcp --dport 80 -j ACCEPT
# iptables -A INPUT -i eth1 -p tcp -m tcp --tcp-flags FIN,SYN,ACK SYN -j REJECT --reject-with icmp-port-unreachable
# iptables -A FORWARD -o eth1 -p tcp -j DROP

Теперь наш сервер прикрыт с внешнего мира. Запуск команд netcat и nmap c самого сервера покажет тоже, что и до внесения правил, но если пробовать с другого компьютера, то заметим результат: доступ везде прикрыт, кроме как на разрешённые нами 25 и 80 порты. Можно посмотреть действующие правила:

# iptables -L

Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:smtp
ACCEPT tcp -- anywhere anywhere tcp dpt:http
REJECT tcp -- anywhere anywhere tcpflags:FIN,SYN,ACK/SYN reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT)
target prot opt source destination
DROP tcp -- anywhere anywhere

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

Или те же правила в виде команд:

# iptables-save

# Generated by iptables-save v1.3.1 on Wed Aug 30 14:30:11 2006
*nat
:PREROUTING ACCEPT [2784:423873]
:POSTROUTING ACCEPT [1822:103126]
:OUTPUT ACCEPT [1805:100270]
COMMIT
# Completed on Wed Aug 30 14:30:11 2006
# Generated by iptables-save v1.3.1 on Wed Aug 30 14:30:11 2006
*filter
:INPUT ACCEPT [28890:12820098]
:FORWARD ACCEPT [22:3088]
:OUTPUT ACCEPT [30305:14410374]
-A INPUT -i eth1 -p tcp -m tcp --dport 25 -j ACCEPT
-A INPUT -i eth1 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -i eth1 -p tcp -m tcp --tcp-flags FIN,SYN,ACK SYN -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -o eth1 -p tcp -j DROP
COMMIT
# Completed on Wed Aug 30 14:30:11 2006

Чтобы запомнить эти правила смотрим в /etc/init.d/iptables откуда берёт iptables свою конфигурацию при старте. Видим, что хранит он её в /etc/sysconfig/iptables. Сохраняем новую конфигурацию в этот файл:

# iptables-save > /etc/sysconfig/iptables

Теперь при запуске системы прописанные нами правила восстановятся.


Блокировка всех входящих, открываем все исходящие

Ещё один вариант как настроить элементарный firewall выпускающий все наружу и закрывающий все входящие подключения приведён по адресу http://rlworkman.net/conf/firewall/rc.firewall.desktop.generic. Выполняем при старте системы скрипт:

# Define variables
IPT=/usr/sbin/iptables # change if needed
EXT_IF=eth0 # external interface (connected to internet)

# Enable TCP SYN Cookie Protection
if [ -e /proc/sys/net/ipv4/tcp_syncookies ]; then
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
fi

# Disable ICMP Redirect Acceptance
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects

# Do not send Redirect Messages
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects

# Enable bad error message protection
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses

# Enable broadcast echo protection
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

# Disable source-routed packets
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route

# Set default policy to DROP
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP

# Flush old rules
$IPT -F

# Allow loopback traffic
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT

# Allow packets of established connections and those
# which are related to established connections
$IPT -A INPUT -i $EXT_IF -p all -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allow all outgoing packets
$IPT -A OUTPUT -o $EXT_IF -j ACCEPT

# Allow incoming ssh from internet (uncomment the line below if needed)
#$IPT -A INPUT -i $EXT_IF -p tcp --destination-port 22 --syn -m state --state NEW -j ACCEPT 

Подключение к удалённому рабочему столу (УРС, по протоколу RDP) Windows через фаервол

Постановка задачи:

Необходимо получить доступ к рабочей станции Windows из Интернет. Рабочая станция находится в локальной сети и имеет адрес 192.168.1.1. Доступ в Интернет осуществляется через Линукс сервер, выполняющий роль файрвола, прокси и т.д.

Решение:

С глобальной сети будем подключаться к линуксовому серверу, который будет перенаправлять все запросы к УРС (т.е. на порт 3389) в локальную сеть на ip 192.168.1.1

- На Windows клиенте открыть доступ к УРС:

Свойства "Моего компьютера" - закладка Удалённые сеансы - поставить галочку на "Разрешить удалённый доступ к этому компьютеру"

Не забудем, что:

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

б) обязательно указать имя пользователя в формате: ИмяКомпьютера\ИмяПользователя или ИмяДомена\ИмяПользователя

- Теперь настроим iptables на Linux сервере, для перенаправления запросов:

# iptables -t nat -A PREROUTING -p tcp -d ххх.ххх.ххх.ххх --dport 3389 -j DNAT --to-destination  192.168.1.1:3389
# iptables -A FORWARD -i eth1 -d 192.168.1.1 -p tcp --dport 3389  -j ACCEPT

здесь ХХХ.ХХХ.ХХХ.ХХХ - внешний адрес Linux'a

Anti-ssh-bruteforce

Вот правила iptables (нужна поддержка recent match в ядре):

1. Сохраните текущие правила командой

# iptables-save > /etc/iptables.bak

2. Откройте /etc/iptables.bak в вашем любимом текстовом редакторе.

3. Добавте следующие правила в подходящем порядке в соответствии с уже созданными правилами.

iptables -A INPUT -p tcp --syn --dport 22 -m recent --name radiator --set
iptables -A INPUT -p tcp --syn --dport 22 -m recent --name radiator --update --seconds 60 --hitcount 3 -j DROP

4. Активируйте все правила

# iptables-restore /etc/iptables.bak

После 3 попыток подключиться в течение 60 секунд, робот блокируется и отваливает и почти нет мусора в логах, а главное - лишнего траффика, в отличие от pam_abl. По желанию можно увеличить параметры --hitcount и --seconds.

Примеры некоторых правил

iptables -t nat -A POSTROUTING -s 10.0.3.41 -d 217.217.217.217 -o eth1 -p tcp --dport 25 -j SNAT --to 116.116.116.116

Разрешаем прямой доступ к внешней почте. Подробнее: разрешаем доступ хосту 10.0.3.41 из внутренней сети обращаться к хосту 217.217.217.217 на 25 порт (smtp) протокола tcp; такие обращения пропускаем через интерфейс eth1, который имеет адрес 116.116.116.116

Для доступа к РОР добавляем такое же правило для порта 110

iptables -t nat -A POSTROUTING -s 10.0.3.41 -p tcp --dport 25 -j MASQUERADE

Более короткое правило, аналогичное вышеприведённому, только здесь пользователь с ip 10.0.3.41 имеет доступ к любому почтовому серверу в Интернете.


iptables -L -vxn смотрим счётчики. При создании правил автоматически ведётся счётчик пакетов и байт к которому это правило было применено.
iptables -F
iptables -X
чистим все цепочки

Журналирование событий iptables

Настройка журнала iptables в Debian производится в файле /etc/sysconfig/iptables

...
-A INPUT -i eth1 -p tcp -m tcp --tcp-flags FIN,SYN,ACK SYN -j LOG --log-prefix "**Hackers**" --log-level 4 --log-tcp-options
-A INPUT -i eth1 -p tcp -m tcp --tcp-flags FIN,SYN,ACK SYN -j REJECT --reject-with icmp-port-unreachable
...

В Debian 4.0 iptables по умолчанию пишет логи в /var/log/kern.log, чтобы это изменить создаём файл /var/log/iptables.warn (с правами доступа такими же как и /var/log/kern.log) и добавляем в /etc/syslog.conf (/etc/rsyslog.conf для Debian 5.0) строку "kern.warning -/var/log/iptables.warn":

...
kern.* -/var/log/kern.log
kern.warning -/var/log/iptables.warn
...

Перезагружаем syslogd:

# /etc/init.d/sysklogd restart

или rsyslog в случае Debian 5:

# /etc/init.d/rsyslog restart


Полезные ссылки:

Шаблонный скрипт закрывающий все дыры

Отказывая по умолчанию всем в соединении (default policy drop), открываем только то, что знаем.

(Нажмите ссылку развернуть, чтобы увидеть скрипт)

#!/bin/sh
# Firewall rules by Nail Ahmetgaleev, 2011

###########################################################################
#
# 1. Configuration options.
#

#
# 1.1 Internet Configuration.
#

INET_IP="212.75.220.218"
INET_IFACE="eth0"
INET_BROADCAST="212.75.220.219"
#
# 1.2 Local Area Network configuration.
#
# your LAN's IP range and localhost IP. /24 means to only use the first 24
# bits of the 32 bit IP address. the same as netmask 255.255.255.0
#

LAN_IP="10.108.93.223"
LAN_IP_RANGE="10.0.0.0/8"
LAN_IFACE="eth1:0"

LAN1_IP="192.1.1.1"
LAN1_IP_RANGE="192.1.1.0/24"
LAN1_IFACE="eth2"

LAN2_IP="192.168.1.1"
LAN2_IP_RANGE="192.168.1.0/24"
LAN2_IFACE="eth1"

#
# 1.3 DMZ Configuration.
#

#
# 1.4 Localhost Configuration.
#

LO_IFACE="lo"
LO_IP="127.0.0.1"

#
# 1.5 IPTables Configuration.
#

IPTABLES="/sbin/iptables"

#
# 1.6 Other Configuration.
#

# Flushing rules
$IPTABLES -F
$IPTABLES -t nat -F
$IPTABLES -X

###########################################################################
#
# 2. Module loading.
#

#
# Needed to initially load modules
#

/sbin/depmod -a

#
# 2.1 Required modules
#

/sbin/modprobe ip_tables
/sbin/modprobe ip_conntrack
/sbin/modprobe iptable_filter
/sbin/modprobe iptable_mangle
/sbin/modprobe iptable_nat
/sbin/modprobe ipt_LOG
/sbin/modprobe ipt_limit
/sbin/modprobe ipt_state

#
# 2.2 Non-Required modules
#

#/sbin/modprobe ipt_owner
#/sbin/modprobe ipt_REJECT
#/sbin/modprobe ipt_MASQUERADE
#/sbin/modprobe ip_conntrack_ftp
#/sbin/modprobe ip_conntrack_irc
#/sbin/modprobe ip_nat_ftp
#/sbin/modprobe ip_nat_irc

###########################################################################
#
# 3. /proc set up.
#

#
# 3.1 Required proc configuration
#

echo "1" > /proc/sys/net/ipv4/ip_forward

#
# 3.2 Non-Required proc configuration
#

#echo "1" > /proc/sys/net/ipv4/conf/all/rp_filter
#echo "1" > /proc/sys/net/ipv4/conf/all/proxy_arp
#echo "1" > /proc/sys/net/ipv4/ip_dynaddr

# Enable TCP SYN Cookie Protection
if [ -e /proc/sys/net/ipv4/tcp_syncookies ]; then
  echo 1 > /proc/sys/net/ipv4/tcp_syncookies
fi

# Disable ICMP Redirect Acceptance
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects

# Do not send Redirect Messages
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects

# Enable bad error message protection
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses

# Enable broadcast echo protection
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

# Disable source-routed packets
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route


###########################################################################
#
# 4. rules set up.
#

######
# 4.1 Filter table
#

#
# 4.1.1 Set policies
#

$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP

#
# 4.1.2 Create userspecified chains
#

#
# Create chain for bad tcp packets
#

$IPTABLES -N bad_tcp_packets

#
# Create SSH check table
#

$IPTABLES -N ssh_check


#
# Create separate chains for ICMP, TCP and UDP to traverse
#

$IPTABLES -N allowed
$IPTABLES -N tcp_packets
$IPTABLES -N udp_packets
$IPTABLES -N icmp_packets


#
# 4.1.3 Create content in userspecified chains
#

#
# bad_tcp_packets chain
#

$IPTABLES -A bad_tcp_packets -p tcp --tcp-flags SYN,ACK SYN,ACK \
-m state --state NEW -j REJECT --reject-with tcp-reset
$IPTABLES -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j LOG \
--log-prefix "New not syn:"
$IPTABLES -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP

#
# SSH check table
#

$IPTABLES -A ssh_check -m recent --update --seconds 300 --hitcount 3 \
 --rttl --name SSH -m limit --limit 3/minute --limit-burst 3 -j LOG \
 --log-level DEBUG --log-prefix "IPT SSH_BRUTFORCE:"
$IPTABLES -A ssh_check -m recent --update --seconds 300 --hitcount 3 \
 --rttl --name SSH -j DROP
$IPTABLES -A ssh_check -m recent --set --name SSH -j allowed

#
# allowed chain
#

$IPTABLES -A allowed -p TCP --syn -j ACCEPT
$IPTABLES -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A allowed -p TCP -j DROP

#
# TCP rules
#

# allow ftp,ssh,http,identd incoming packets 
#$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 21 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 22 -m state --state NEW -j ssh_check
#$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 80 -j allowed
#$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 113 -j allowed

$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 6890:6999 -j allowed

# Allow DC++
$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 10853 -j allowed
#$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 6068 -j allowed

# Allow VoIP
$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 1718:1720 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 1731 -j allowed

# Allow Donkey
$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 9407 -j allowed

# Allow Overnet
$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 15649 -j allowed

# Allow Gnutella
$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 17099 -j allowed

#
# UDP ports
#

#$IPTABLES -A udp_packets -p UDP -s 0/0 --destination-port 53 -j ACCEPT
#$IPTABLES -A udp_packets -p UDP -s 0/0 --destination-port 123 -j ACCEPT
#$IPTABLES -A udp_packets -p UDP -s 0/0 --destination-port 2074 -j ACCEPT
#$IPTABLES -A udp_packets -p UDP -s 0/0 --destination-port 4000 -j ACCEPT

# Allow DC++ 
$IPTABLES -A udp_packets -p UDP -s 0/0 --destination-port 6308 -j ACCEPT

# Allow Torrents
$IPTABLES -A udp_packets -p UDP -s 0/0 --destination-port 6771 -j ACCEPT
$IPTABLES -A udp_packets -p UDP -s 0/0 --destination-port 6890:6999 -j ACCEPT

# Allow VoIP
$IPTABLES -A udp_packets -p UDP -s 0/0 --destination-port 5060:5064 -j ACCEPT

# Allow Donkey 
$IPTABLES -A udp_packets -p UDP -s 0/0 --destination-port 9411 -j ACCEPT

# Allow Kademila
$IPTABLES -A udp_packets -p UDP -s 0/0 --destination-port 17354 -j ACCEPT

# Allow Overnet
$IPTABLES -A udp_packets -p UDP -s 0/0 --destination-port 15649 -j ACCEPT

# Allow Gnutella
$IPTABLES -A udp_packets -p UDP -s 0/0 --destination-port 17099 -j ACCEPT

# Allow dns requests
$IPTABLES -A udp_packets -p UDP -i $LAN1_IFACE --destination-port 53 -j ACCEPT

# Allow dhcp and bootp
$IPTABLES -A udp_packets -p UDP -i $LAN2_IFACE --destination-port 67 -j LOG \
    --log-level DEBUG --log-prefix "IPT DHCP request: " 
$IPTABLES -A udp_packets -p UDP -i $LAN2_IFACE --destination-port 67 -j ACCEPT
$IPTABLES -A udp_packets -p UDP -i $LAN2_IFACE --destination-port 69 -j LOG \
    --log-level DEBUG --log-prefix "IPT TFTP request: " 
$IPTABLES -A udp_packets -p UDP -s $LAN2_IP_RANGE --destination-port 69 -j ACCEPT

#
# In Microsoft Networks you will be swamped by broadcasts. These lines
# will prevent them from showing up in the logs.
#

#$IPTABLES -A udp_packets -p UDP -i $INET_IFACE -d $INET_BROADCAST \
#--destination-port 135:139 -j DROP

$IPTABLES -A udp_packets -p UDP -i $INET_IFACE \
--destination-port 135:139 -j DROP
#$IPTABLES -A udp_packets -p UDP -i $INET_IFACE \
#--destination-port 135:139 -j ACCEPT

#
# If we get DHCP requests from the Outside of our network, our logs will
# be swamped as well. This rule will block them from getting logged.
#

#$IPTABLES -A udp_packets -p UDP -i $INET_IFACE -d 255.255.255.255 \
#--destination-port 67:68 -j DROP

#
# ICMP rules
#

$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j ACCEPT
$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT


# 4.1.4 INPUT chain
#

#
# Bad TCP packets we don't want.
#

$IPTABLES -A INPUT -p tcp -j bad_tcp_packets

#
# Rules for special networks not part of the Internet
#

#$IPTABLES -A INPUT -p ALL -i $LAN_IFACE -s $LAN_IP_RANGE -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LO_IP -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LAN_IP -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $INET_IP -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LAN2_IP -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LAN1_IFACE -s $LAN1_IP_RANGE -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LAN2_IFACE -s $LAN2_IP_RANGE -j ACCEPT


$IPTABLES -A INPUT -p ALL -i tun0 -j ACCEPT

#
# Special rule for DHCP requests from LAN, which are not caught properly
# otherwise.
#

#$IPTABLES -A INPUT -p UDP -i $LAN_IFACE --dport 67 --sport 68 -j ACCEPT

#
# Rules for incoming packets from the internet.
#

$IPTABLES -A INPUT -p ALL -d $INET_IP -m state --state ESTABLISHED,RELATED \
-j ACCEPT
$IPTABLES -A INPUT -p ALL -d $LAN_IP -m state --state ESTABLISHED,RELATED \
-j ACCEPT
$IPTABLES -A INPUT -p TCP -i $INET_IFACE -j tcp_packets
$IPTABLES -A INPUT -p UDP -i $INET_IFACE -j udp_packets
$IPTABLES -A INPUT -p ICMP -i $INET_IFACE -j icmp_packets

#
# If you have a Microsoft Network on the outside of your firewall, you may
# also get flooded by Multicasts. We drop them so we do not get flooded by
# logs
#

#$IPTABLES -A INPUT -i $INET_IFACE -d 224.0.0.0/8 -j DROP

#
# Log weird packets that don't match the above.
#

$IPTABLES -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG \
--log-level DEBUG --log-prefix "IPT INPUT packet died: "

#
# 4.1.5 FORWARD chain
#

#
# Bad TCP packets we don't want
#

$IPTABLES -A FORWARD -p tcp -j bad_tcp_packets

#
# Accept the packets we actually want to forward
#

#$IPTABLES -A FORWARD -i $LAN_IFACE -j ACCEPT
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A FORWARD -i $LAN1_IFACE -j ACCEPT

#
# Log weird packets that don't match the above.
#

$IPTABLES -A FORWARD -m limit --limit 3/minute --limit-burst 3 -j LOG \
--log-level DEBUG --log-prefix "IPT FORWARD packet died: "

#
# 4.1.6 OUTPUT chain
#

#
# Bad TCP packets we don't want.
#

$IPTABLES -A OUTPUT -p tcp -j bad_tcp_packets

#
# Special OUTPUT rules to decide which IP's to allow.
#

$IPTABLES -A OUTPUT -p ALL -s $LO_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $LAN_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $INET_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $LAN1_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $LAN2_IP -j ACCEPT

$IPTABLES -A OUTPUT -p ALL -o tun0 -j ACCEPT

#
# Log weird packets that don't match the above.
#

$IPTABLES -A OUTPUT -m limit --limit 3/minute --limit-burst 3 -j LOG \
--log-level DEBUG --log-prefix "IPT OUTPUT packet died: "

######
# 4.2 nat table
#

#
# 4.2.1 Set policies
#

#
# 4.2.2 Create user specified chains
#

#
# 4.2.3 Create content in user specified chains
#

#
# 4.2.4 PREROUTING chain
#

#
# 4.2.5 POSTROUTING chain
#

#
# Enable simple IP Forwarding and Network Address Translation
#

#$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -j SNAT --to-source $INET_IP
$IPTABLES -t nat -A POSTROUTING -s $LAN1_IP_RANGE -o $INET_IFACE -j SNAT --to-source $INET_IP

#
# 4.2.6 OUTPUT chain
#

######
# 4.3 mangle table
#

#
# 4.3.1 Set policies
#

#
# 4.3.2 Create user specified chains
#

#
# 4.3.3 Create content in user specified chains
#

#
# 4.3.4 PREROUTING chain
#

#
# 4.3.5 INPUT chain
#

#
# 4.3.6 FORWARD chain
#

#
# 4.3.7 OUTPUT chain
#

#
# 4.3.8 POSTROUTING chain
#

Полезные ссылки