MySQL Auth proFTPd w/, позади NAT - Неудавшийся для получения списка каталогов

Как hobodave предложенный в комментарии, это возможно в некоторых клиентах (хотя не, по-видимому, mysql утилита командной строки) для установки ограничения по времени для транзакции. Вот является демонстрационное использование ActiveRecord в Ruby:

require 'rubygems'
require 'timeout'
require 'active_record'

Timeout::timeout(5) {
  Foo.transaction do
    Foo.create(:name => 'Bar')
    sleep 10
  end
}

В этом примере, временные лимиты транзакции после 5 секунд и автоматически откатывается. (Обновление в ответ на комментарий hobodave: Если база данных займет больше чем 5 секунд для ответа, то транзакция будет откатываться, как только она делает — не раньше.), Если Вы хотели удостовериться, чтобы все Ваши транзакции испытали таймаут после n секунды, Вы могли создать обертку вокруг ActiveRecord. Я предполагаю, что это также относится к самым популярным библиотекам в Java.NET, Python, и т.д., но я еще не протестировал их. (Если Вы имеете, отправьте комментарий к этому ответу.)

Транзакции в ActiveRecord также имеют преимущество того, чтобы быть безопасным если a KILL выпущен, в отличие от транзакций, сделанных из командной строки. См. https://dba.stackexchange.com/questions/1561/mysql-client-believes-theyre-in-a-transaction-gets-killed-wreaks-havoc.

Это, кажется, не возможно осуществить максимальное время транзакции на стороне сервера, кроме через сценарий как тот, который я отправил в своем другом ответе.

1
задан 13 April 2017 в 15:14
2 ответа

Вы получаете сообщение об ошибке «Не удалось получить список каталогов», потому что FTP-клиент не получает список каталогов с сервера, скорее всего, из-за проблем с брандмауэром или сетью.

Протокол FTP был изобретен задолго до сетевых брандмауэров и трансляции сетевых адресов, и он использует отдельный командный канал и канал данных для связи.

Когда вы входите в систему, используется только командный канал.

Когда вы выполняете список каталогов, клиент и сервер сообщают друг другу по каналу команд, на каком IP-адресе и порту (60746 в вашем примере) канал данных должен быть динамически настроен для передачи данных списка каталогов.

Это сделано с помощью команды FTP PORT или PASV.

В вашем случае клиент выдает команду PASV, а сервер отвечает: 227 Вход в пассивный режим (109, xxx, xx, xxx, 237,74).

Первые 4 октета в скобках составляют IP-адрес, а последние два - номер порта (256 * 237 + 74 = 60746).

Вы запускаете FTP-сервер внутри виртуальной машины с сетевым адаптером в стиле NAT , настроенным для виртуальной машины (в отличие от Мостовой )? Тогда это, скорее всего, причина ваших проблем, потому что эти типы виртуальных машин обычно недоступны "извне", поскольку они имеют общий IP-адрес физического хоста.

Открыты ли порты 60000-65535 на сервере? В вашей конфигурации указан диапазон, который будет использоваться для пассивных подключений. Вы можете сузить его до более короткого диапазона, чтобы в брандмауэре требовалось меньше открытых портов.

0
ответ дан 4 December 2019 в 08:59

1) Убедитесь, что ваша виртуальная машина работает в сетевом режиме Bridged , чтобы вы получали IP-адрес от NAT вашего маршрутизатора, и вы не подвергались NAT дважды.

2) Вы должны включить параметр MasqueradeAddress в конфигурации ProFTPd и введите свой общедоступный IP-адрес (попробуйте whatismyip.com )

3) Вы должны раскомментировать параметр «Пассивные порты» в конфигурации ProFTPd. Там два числа, они должны образовывать диапазон ОТ - ДО. Вы можете сделать диапазон намного меньше, если хотите.

3) Вам необходимо перенаправить следующие порты с вашего маршрутизатора на соответствующие порты FTP VM: 20, 21 и весь диапазон пассивных портов.

0
ответ дан 4 December 2019 в 08:59

Теги

Похожие вопросы