Здравствуйте.
Подскажите пожалуйста как мне правильно настроить iptables.
У меня установлен сервер Ubuntu 11.10 x64. На нем установлено 2 сетевых карты:
eth0 (213.xxx.xxx.xxx) — внешний интерфейс
eth1 (192.168.99.1 ) - внутренний интерфейс, локальная сеть 192.168.99.0/24
Выход в интернет осуществляется через pppoe (интерфейс ppp0), с динамическим адресом. Внутри туннеля pppoe провайдер заворачивает на меня пул из 5 статических ip адресов 213.xxx.xxx.xxx/28.
На интерфейсе eth0 с ip адреса 213.xxx.xxx.xxx поднят IP SEC VPN туннель с Cisco ASA (ip 83.xxx.xxx.xxx), за которой находится локальная сеть (192.168.1.0/24).
При запуске сервера у меня выполняются вот такие настройки для iptables
# !/bin/sh
#Включаем ip forward
echo 1 > /proc/sys/net/ipv4/ip_forward
#Добавляем роутинг на локальные сети для VPN
route add -net 192.168.1.0 netmask 255.255.255.0 gw 192.168.99.1
# Настраиваем iptables
INET_IP="213.xxx.xxx.xxx"
INET_DMZ="213.xxx.xxx.xxx/28"
LOCAL_NET="192.168.99.0/24"
ASA_IP="83.xxx.xxx.xxx"
VPN_LOCAL_NET="192.168.1.0/24"
#Сбрасываем настройки
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
iptables -t nat -F
#Почта
iptables -A INPUT -i eth0 -p tcp -d $INET_IP --dport 25 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -d $INET_IP --dport 993 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -d $INET_IP --dport 465 -j ACCEPT
#ssh
iptables -A INPUT -i eth0 -p tcp -d $INET_IP --dport 22 -j ACCEPT
#разрешаем ходить траффику между интерфейсами (тут я не уверен)
iptables -A FORWARD -s $LOCAL_NET -i eth1 -j ACCEPT
iptables -A FORWARD -d $LOCAL_NET -o eth1 -j ACCEPT
iptables -A FORWARD -s $LOCAL_NET -i eth0 -j ACCEPT
iptables -A FORWARD -d $LOCAL_NET -o eth0 -j ACCEPT
#разрешаем нужные порты для VPN туннеля
iptables -A INPUT -p udp -i eth0 -s $VPN_ASA_IP --sport 500 --dport 500 -j ACCEPT
iptables -A OUTPUT -p udp -o eth0 -d $VPN_ASA_IP --sport 500 --dport 500 -j ACCEPT
iptables -A INPUT -p esp -i eth0 -s $VPN_ASA_IP -j ACCEPT
iptables -A OUTPUT -p esp -o eth0 -d $VPN_ASA_IP -j ACCEPT
iptables -A INPUT -p ah -i eth0 -s $VPN_ASA_IP -j ACCEPT
iptables -A OUTPUT -p ah -o eth0 -d $VPN_ASA_IP -j ACCEPT
iptables -A INPUT -i eth0 -s $VPN_ASA_IP -j DROP
iptables -A OUTPUT -o eth0 -d $VPN_ASA_IP -j DROP
#настраиваем нат для VPN (без этого удаленная сеть недоступна)
iptables -t nat -A POSTROUTING -s $LOCAL_NET -d $VPN_LOCAL_NET -o ppp0 -j SNAT --to-source 192.168.99.1
#настраиваем нат для локальной сети, включая сам сервер. При этом сервера из $INET_DMZ будут ходить со совими реальными ip адресами
iptables -t nat -A POSTROUTING ! -s $INET_DMZ -o ppp0 -j SNAT --to-source $INET_IP
#Запрещаем все что не разрешено
iptables -A INPUT -i eth0 -p tcp -m tcp --tcp-flags FIN,SYN,ACK SYN -j LOG --log-level 7 --log-tcp-options
iptables -A INPUT -i eth0 -p tcp -m tcp --tcp-flags FIN,SYN,ACK SYN -j REJECT --reject-with icmp-port-unreachable
iptables -A FORWARD -o eth0 -p tcp -j DROP
iptables -A FORWARD -o eth1 -p tcp -j DROP
После выполнения этого скрипа iptables выглядит вот так:
root@ss:~# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
fail2ban-dovecot tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 80,443,25,465,110,995,143,993,4190
fail2ban-postfix tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 80,443,25,465,110,995,143,993,4190
fail2ban-roundcube tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 80,443,25,465,110,995,143,993,4190
fail2ban-ssh tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
ACCEPT tcp -- 0.0.0.0/0 213.xxx.xxx.xxx tcp dpt:25
ACCEPT tcp -- 0.0.0.0/0 213.xxx.xxx.xxx tcp dpt:993
ACCEPT tcp -- 0.0.0.0/0 213.xxx.xxx.xxx tcp dpt:465
ACCEPT tcp -- 0.0.0.0/0 213.xxx.xxx.xxx tcp dpt:22
ACCEPT udp -- 83.xxx.xxx.xxx 0.0.0.0/0 udp spt:500 dpt:500
ACCEPT esp -- 83.xxx.xxx.xxx 0.0.0.0/0
ACCEPT ah -- 83.xxx.xxx.xxx 0.0.0.0/0
DROP all -- 83.xxx.xxx.xxx 0.0.0.0/0
LOG tcp -- 0.0.0.0/0 0.0.0.0/0 tcp flags:0x13/0x02 LOG flags 2 level 7
REJECT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp flags:0x13/0x02 reject-with icmp-port-unreachable
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 192.168.99.0/24 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 192.168.99.0/24
ACCEPT all -- 192.168.99.0/24 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 192.168.99.0/24
DROP tcp -- 0.0.0.0/0 0.0.0.0/0
DROP tcp -- 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT udp -- 0.0.0.0/0 83.xxx.xxx.xxx udp spt:500 dpt:500
ACCEPT esp -- 0.0.0.0/0 83.xxx.xxx.xxx
ACCEPT ah -- 0.0.0.0/0 83.xxx.xxx.xxx
DROP all -- 0.0.0.0/0 83.xxx.xxx.xxx
Chain fail2ban-dovecot (1 references)
target prot opt source destination
RETURN all -- 0.0.0.0/0 0.0.0.0/0
Chain fail2ban-postfix (1 references)
target prot opt source destination
RETURN all -- 0.0.0.0/0 0.0.0.0/0
Chain fail2ban-roundcube (1 references)
target prot opt source destination
RETURN all -- 0.0.0.0/0 0.0.0.0/0
Chain fail2ban-ssh (1 references)
target prot opt source destination
RETURN all -- 0.0.0.0/0 0.0.0.0/0
root@ss:~# iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT all -- 192.168.99.0/24 192.168.1.0/24 to:192.168.99.1
SNAT all -- !213.xxx.xxx.xxx/28 0.0.0.0/0 to:213.xxx.xxx.xxx
Теперь о том, что я хочу — я хочу, чтобы трафик из подсети 192.168.99/24 проходил до удалённой подсети 192.168.1.0/24 без ната. Как мне это сделать? Если я убираю запись
iptables -t nat -A POSTROUTING -s $LOCAL_NET -d $VPN_LOCAL_NET -o ppp0 -j SNAT --to-source 192.168.99.1
то у меня получается следующее: пакет уходит от 192.168.99.2 → 192.168.99.1 → 192.168.1.2
а вот потом он приходит так 192.168.1.2 → 213.xxx.xxx.xxx → 192.168.99.2.
Естественно, что при этом ничего не работает, т. к. ответ приходит не от того ip с которого его ждали …. Что у меня неправильно?