суббота, 3 января 2009 г.

FTP over NAT (Cisco asa)

Приветствую!
Недавно имело место очередное приключение, а именно решение проблемы с ftp сессиями проходящими через nat организованный на cisco asa.
В общем и целом симптомы выглядели примерно так:
500 Illegal PORT command.
Данное сообщение повествует о том что data plane в ftp сессии не сработал.
Иными словами произошло следующее:
После установки TCP соединения клиента на 21 порт сервера, передачи пары логин/пароль, происходит выбор режима передачи из 2х доступных:
- ascii
- binary
/Не будем погружаться в разницу между двумя режимами передачи/
Далее двум системам надо определить порты для передачи самих данных т.е. 21 порт это control plane а определение data plane только начинается. Существует команда port она принимает следующее значение:
клиент сообщает серверу адрес и порт на котором он ждет данные:
port 192,168,0,2,42,23
В примере адрес 192.168.0.2 порт 4223.
Но тут происходит интересная череда событий, asa которая стоит на границе получив пакет предназначенный для ftp сервера и содержащий в себе команду port отправляет его серверу, но соответствующую трансляцию о канале передачи данных не создает, сервер получив команду от клиента начинает слать данные на указанный в команде адрес и порт, листинг домашней директории, и т.д. asa отбрасывает пакеты пришедшие к ней для клиента т.к. записи о сеансе трансляции нет.
Получилось так:
- соединение есть, но данные не идут.
Что надо сделать, что бы всё вернулось на круги своя? Правильно, заставить asa разбирать пакеты не только на 3/4 уровне, а еще и на 7 заглядывать, и на основании данных которыми перестреливаются клиент/сервер подстраивать работу nat.
Как это сделать? Просто:
/Кусочек конфига для Cisco ASA/PIX (PIX/ASA OS ver. > 7.0)/

class-map ftp
description "FTP inspection"
match port tcp eq ftp
!
policy-map type inspect ftp ftp-inspection
parameters
mask-banner
mask-syst-reply
match request-command help
reset
!
policy-map outside_protection
class ftp
inspect ftp strict ftp-inspection
set connection conn-max 1500
!
service-policy outside_protection interface outside
Вот и весь секрет.

закопанные косточки