Kitten: NAT и несколько VPN - соединений: помогите решить проблему

9 сообщений / 0 new
Последнее сообщение
Гость
Kitten: NAT и несколько VPN - соединений: помогите решить проблему

Поднят сервер на ASPLinux 10. В нем две сетевые карты. Одна смотрит в локальную сеть 192.168.0.0/24, другая во внешнюю 10.0.4.68/255.255.255.252 Провайдер дает Инет по VPN. Естественно, на сервере поднят NAT, разрешен в IPTables порт 1723 и протокол GRE. Пока учетная запись была одна - проблем не было. Но решили разделить отделы и посадить каждый на свою учетку. Первый канал поднимается без проблем, но как только пытаешься поднять второй канал, доходит дело только до авторизации (висит сообщение "Поверка имени пользователя и пароля") и рвется первое соединение. Дальше дело не идет. Попробовал обновить IPTables до версии 1.3.1. Если на сервере остановить IPTables, а потом стартовать заново через какое-то короткое время, то иногда удается поднять и второе соединение. Чую, что проблема в IPTables, но не пойму где. Или нереально поднять больше одного VPN в таких условия или я чего-то упускаю. Рабочие станиции на Windows XP professional. Вот скрипт для настройки IPTables:
#!/bin/bash
#******************************************************
# Предопределения
#******************************************************
# Для инета
# Сетевой инет-интерфейс
INET_IFACE="eth1"
INET_IP="10.0.4.70"

# Для локальной стороны
# Сетевой интерфейс, свзязанный с локалкой
LAN_IFACE="eth0"
# IP-адрес "локального" сетевого интерфеса
LAN_IP="192.168.0.1"
# Диапазон ip-адресов локальной подсети
LAN_IP_RANGE="192.168.0.0/24"

# Для внутренних дел (интерфейс обратной петли)
# Название
LO_IFACE="lo"
# IP-адрес
LO_IP="127.0.0.1"

# Ускоренное обращение к утилитам
IPTABLES="/sbin/iptables"
DEPMOD="/sbin/depmod"
MODPROBE="/sbin/modprobe"

#******************************************************
# Загрузка модулей, отвечающих за работу фильтрации
#******************************************************
$DEPMOD -a
$MODPROBE ip_conntrack
$MODPROBE ip_conntrack_irc
$MODPROBE ip_tables
$MODPROBE iptable_nat
$MODPROBE iptable_filter
$MODPROBE iptable_mangle
$MODPROBE ipt_state
$MODPROBE ip_nat_irc

#******************************************************
# Работаем с таблицей filter
#******************************************************
# Определение политик по умолчанию
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD DROP

#ICMP
$IPTABLES -N icmp-packets
$IPTABLES -A icmp-packets -p ICMP --icmp-type 3 -j ACCEPT
$IPTABLES -A icmp-packets -p ICMP --icmp-type 8 -j ACCEPT
$IPTABLES -A icmp-packets -p ICMP --icmp-type 11 -j ACCEPT
$IPTABLES -A icmp-packets -p ICMP --icmp-type 12 -j ACCEPT
$IPTABLES -A icmp-packets -p ICMP -j DROP

#$IPTABLES -A INPUT -p ICMP -j icmp-packets
#$IPTABLES -A FORWARD -p ICMP -j icmp-packets

#Подключаем 22 порт для SSH, 137, 138, 139, 445 для SAMBA, 1723 для VPN
$IPTABLES -N tcp_packets
$IPTABLES -A tcp_packets -p TCP -i $LAN_IFACE --dport 22 -j ACCEPT
$IPTABLES -A tcp_packets -p TCP -i $LAN_IFACE --dport 1723 -j ACCEPT
$IPTABLES -A tcp_packets -p TCP -i $LAN_IFACE --dport 137 -j ACCEPT
$IPTABLES -A tcp_packets -p TCP -i $LAN_IFACE --dport 139 -j ACCEPT
$IPTABLES -A tcp_packets -p TCP -i $LAN_IFACE --dport 113 -j ACCEPT
$IPTABLES -A tcp_packets -p TCP -j DROP

#Подключаем порт 135, 138, 139 для SAMBA udp
$IPTABLES -N udp_packets
$IPTABLES -A udp_packets -p UDP -i $LAN_IFACE --dport 137 -j ACCEPT
$IPTABLES -A udp_packets -p UDP -i $LAN_IFACE --dport 138 -j ACCEPT
$IPTABLES -A udp_packets -p UDP -j DROP

#LO
$IPTABLES -A INPUT -i lo -j ACCEPT
$IPTABLES -A OUTPUT -o lo -j ACCEPT

#bad_packets
$IPTABLES -N bad_packets
$IPTABLES -A bad_packets -p TCP --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j REJECT --reject-with tcp-reset

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

$IPTABLES -A INPUT -p UDP -i $LAN_IFACE -s $LAN_IP_RANGE -j ACCEPT
$IPTABLES -A INPUT -p TCP -i $LAN_IFACE -s $LAN_IP_RANGE -j ACCEPT
$IPTABLES -A INPUT -p TCP -j bad_packets
$IPTABLES -A INPUT -p TCP -i $INET_IFACE -j DROP

#Обеспечим минимальный уровень безопасности
$IPTABLES -A FORWARD -m state --state NEW -i $LAN_IFACE -s $LAN_IP_RANGE -j ACCEPT
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -o $LAN_IFACE -j ACCEPT
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -o $INET_IFACE -j ACCEPT

#VPN
$IPTABLES -A FORWARD -p GRE -j ACCEPT

#******************************************************
# Работаем с таблицей nat
#******************************************************

#******************************************************
# Таблица nat - стандартная цепочка POSTROUTING
#******************************************************
# Включаем пересылку и маскирование (маскарад) адресов локальной сети
#$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -j MASQUERADE
$IPTABLES -t nat -A POSTROUTING -s $LAN_IP_RANGE -j SNAT --to-source $INET_IP

igorsia (не проверено)

Насколько я в курсе - проблема аналогична той, по которой для прохождения NAT используют только пассивный FTP
Решается поднятием VPN-proxy сервера.
[ Редактирование 09.08.2006 - 09:24:17 ]

Kitten (не проверено)

Что есть VPN-proxy сервер? Можно поподробнее?

maax (не проверено)

судя по порту 1723 речь идет о vpn на pptp, так вот: протокол pptp не поддерживает больше одного соединения с одного айпи, читаем rfc, точнее он не поддерживает второе control connection, так что iptables здесь совсем не при чем

Kitten (не проверено)

А админ провайдера говорит, что у него все работает как надо, правда, он шлюзы поднимает на FreeBSD. И сам я у клиентов видел, что с Windows поднимается VPN и выходят в Инет. И с одной машины два VPN соединения поднимаются без проблем. Проблема, что невозможно поднять два VPN соединения с разных машин сети, скрытых за шлюзом.

maax (не проверено)

поднимая шлюзы хоть на линукс хоть на фре он скорее всего использует poptop-сервер, опен-сурс реализация протокола pptp.. мне интереснее другое: два впн соединения на один и тот же сервер? поднимаются? не говоря уже о целесообразности такого подключения, вспоминается ошибка 721 и падение обоих интерфейсов, и старого и свежеподнятого... если ошибаюсь, то пихните меня в бок :)

проблема подъема двух vpn соединений за NAT роутером вполне понятна, даже если забыть об ограничениях самого протокола... дело в том что pptp использует протокол GRE для передачи данных, он представляет собой, грубо говоря, сырой поток IP для ipnat'а, в котором нет информации о портах, таким образом выделить частные соединения не представляется возможным, есть поток только на определенный ip и с определенного ip...

если подходить практически, то не вижу здесь никакой проблемы, достаточно расширить ip-блок во внешнюю сеть, далее рутить подключения с разных машин через разные внешние айпи-адреса.. есть еще более простой вариант: попросить админа увеличить количество ip-адресов на +1, в итоге каждая машина за натом будет коннектится к разным ip адресам одного и того же сервера.. учитывая что адреса в сети из частной подсетки класса А, то вряд ли вы испытываете недостаток в ip-адресах...

Kitten (не проверено)

Каждое VPN соединение имеет свой адрес на сервере. Проблема именно во втором control connection при поднятии второго VPN туннеля. Судя по анализу пакетов не проходит именно это. Но все решается очень просто: обновляемся до ASPLinux 11, ядро 2.6.14. В скрипте подключаем модуль ip_conntract_pptp (в ASPLinux 10, ядро 2.6.9 его нет) и вуаля!!! Второе соедиение поднимается, первое не обрывает, и все работает. Всем спасибо.

maax (не проверено)

при установке vpn-соединения с сервером у сервера один адрес, то что после lcp/ipcp поднимается интерфейс с другим айпи адресом совсем другое... то что не поднимается второе соединение, то тут проблема в нате на шлюзе, почему так, выше я уже написал... а модуль pptp-conntrack-nat насколько помнится был нерабочим долгое время :) видимо довели до ума...

Kitten (не проверено)

Сегодня утром пришел, проверил, посмотрел внимательно. Скорей всего модуль должен быть ip_nat_pptp.

RSS-материал