Шрифт:
Поскольку мы имеем дело с сервером, определяем флаги
NI_NUMERICHOST
и NI_NUMERICSERV
, чтобы избежать поиска в DNS и /etc/services
. 11.9. Первая проблема состоит в том, что второй сервер не может связаться (
bind
) с тем же портом, что и первый сервер, поскольку не установлен параметр сокета SO_REUSEADDR
. Простейший способ справиться с такой ситуацией — создать копию функции udp_server
, переименовать ее в udp_server_reuseaddr
, сделать так, чтобы она установила параметр сокета, и вызывать ее в сервере. 11.10. Когда клиент выводит
Trying 206.62.226.35...
, функция gethostname
возвращает IP-адрес. Пауза перед этим выводом означает, что распознаватель ищет имя узла. Вывод Connected to bsdi.unpbook.com.
значит, что функция connect
возвратила управление. Пауза между этими двумя выводами говорит о том, что функция connect пытается установить соединение. Глава 12
12.1. Далее приведен сокращенный листинг. Обратите внимание, что клиент FTP в системе
freebsd
всегда пытается использовать команду EPRT
(независимо от версии IP), но если это не срабатывает, то он пробует команду PORT
.
freebsd % ftp aix-4
Connected to aix-4.unpbook.com.
220 aix FTP server ...
...
230 Guest login ok. access restrictions apply.
ftp> debug
Debugging on (debug=1).
ftp> passive
Passive mode: off; fallback to active mode= off
ftp> dir
– --> EPRT |1|192 168.42.1|50484|
500 'EPRT |1|192.168.42.1|50484|' command not understood.
disabling epsv4 for this connection
– --> PORT 192.168.42.1.197.52
200 PORT command successful.
– --> LIST
150 Opening ASCII mode data connection for /bin/ls
...
freebsd % ftp ftp.kame.net
Trying 2001.200:0:4819:203:47ff:fea5:3085...
Connected to orange.kame.net.
220 orange.kame.net FTP server ...
...
230 Guest login ok. access restrictions apply.
ftp> debug
Debugging on (debug=1).
ftp> passive
Passive mode: off; fallback to active mode: off.
ftp> dir
– --> EPRT |2|3ffe:b80:3:9ad1::2|50480|
200 EPRT command successful
– --> LIST
150 Opening ASCII mode data connection for '/bin/ls'.
Глава 13
13.1. Все сообщения об ошибках, даже ошибка загрузки, такая как неправильный аргумент командной строки, должны сохраняться в файлах журнала с помощью функции
syslog
. 13.2. TCP-версии серверов
echo
, discard
и chargen
запускаются как дочерние процессы, после того как демон inetd
вызовет функцию fork
, поскольку эти три сервера работают, пока клиент не прервет соединение. Два других TCP-сервера, time
и daytime
, не требуют использования функции fork
, поскольку эти службы легко реализовать (получить текущую дату, преобразовать ее, записать и закрыть соединение). Эти два сервера обрабатываются непосредственно демоном inetd
. Все пять UDP-служб обрабатываются без использования функции fork
, поскольку каждая из них генерирует единственную дейтаграмму в ответ на клиентскую дейтаграмму, которая запускает эту службу. Эти пять служб обрабатываются напрямую демоном inetd
. 13.3. Это известная атака типа «отказ в обслуживании» [18]. Первая дейтаграмма с порта 7 заставляет сервер
chargen
отправить дейтаграмму обратно на порт 7. На эту дейтаграмму приходит эхо-ответ, и серверу chargen
посылается другая дейтаграмма. Происходит зацикливание. Одним из решений, реализованным в системе BSD/OS, является игнорирование дейтаграмм, направленных любому внутреннему серверу, если номер порта отправителя пришедшей дейтаграммы принадлежит одному из внутренних серверов. Другим решением может быть запрещение этих внутренних служб — либо с помощью демона inetd
на каждом узле, либо на маршрутизаторе, связывающем внутреннюю сеть организации с Интернетом. 13.4. IP-адрес и номер порта клиента могут быть получены из структуры адреса сокета, заполняемой функцией
accept
. Причина, по которой демон
inetd
не делает этого для UDP-сокета, состоит в том, что чтение дейтаграмм ( recvfrom
) осуществляется с помощью функции exec
сервером, а не самим демоном inetd
. Демон
inetd
может считать дейтаграмму с флагом MSG_PEEK
(см. раздел 14.7), только чтобы получить IP-адрес и номер порта клиента, но оставляет саму дейтаграмму для чтения серверу.