На главную  |  English version

Описание:

Насколья понял, в RFC четко не определено, как должен выглядеть ответ сервера после сообщения 227 при установке пассивного соединения. Модуль ядра ip_conntrack_ftp отслеживает строку, которую используют большинство ftp-серверов:

227 Entering Passive Mode (xx,xx,xxx,x,yyy,yyy)

где xx,xx,xxx,x относится к ip-адресу, а yyy,yyy -- к порту, который сервер открывает для подключения клиента, причем наличие последней скобки обязательно, насколько я мог понять из кода модуля.
Ftpd из состава publicfile-0.52 отвечает:

227 =xx,xx,xxx,x,193,62

что вообщем-то тоже не противоречит RFC, т.к. все сообщения после пробела предназначены для пользователя. Из-за этого непонимания модуль не может определить передаваемый клиенту сокет и выдает ошибку ядра вроде:

kernel: conntrack_ftp: partial 227 4144999967+24

т.е. он считает, что пакет неполный или поврежден. Эта проблем решается соответствующим изменением кода в ftpd.c.
Оригинал:


void pasv(void)
{
  unsigned char x[6];

  startlistening(x);

  out_puts("227 =");
  out_put(strnum,fmt_ulong(strnum,(unsigned long) x[0]));
  out_puts(",");
  out_put(strnum,fmt_ulong(strnum,(unsigned long) x[1]));
  out_puts(",");
  out_put(strnum,fmt_ulong(strnum,(unsigned long) x[2]));
  out_puts(",");
  out_put(strnum,fmt_ulong(strnum,(unsigned long) x[3]));
  out_puts(",");
  out_put(strnum,fmt_ulong(strnum,(unsigned long) x[4]));
  out_puts(",");
  out_put(strnum,fmt_ulong(strnum,(unsigned long) x[5]));
  out_puts("\r\n");
}
После изменнения:
void pasv(void)
{
  unsigned char x[6];

  startlistening(x);

  out_puts("227 Entering Passive Mode (");
  out_put(strnum,fmt_ulong(strnum,(unsigned long) x[0]));
  out_puts(",");
  out_put(strnum,fmt_ulong(strnum,(unsigned long) x[1]));
  out_puts(",");
  out_put(strnum,fmt_ulong(strnum,(unsigned long) x[2]));
  out_puts(",");
  out_put(strnum,fmt_ulong(strnum,(unsigned long) x[3]));
  out_puts(",");
  out_put(strnum,fmt_ulong(strnum,(unsigned long) x[4]));
  out_puts(",");
  out_put(strnum,fmt_ulong(strnum,(unsigned long) x[5]));
  out_puts(")\r\n");
}

Download:

Сам патч publicfile-0.52.conntrack-ftp.patch. Дата создания 27.01.03. Обращения в mail-list publicfile и к разработчикам ядра понимания не встретили. Проверялся только на RH9, однако в последнем ядре (2.6.1) ничего не изменилось. Если кто будет тестировать — пишите.

Ссылки:



По всем вопросам пишите на articles <at> lithium.opennet.ru
Рейтинг@Mail.ru