Ошибки в работе nmap во FreeBSD 10.0
20 января 2014 года был анонсирован выпуск новейшей на сегодняшний день версии моей любимой FreeBSD – 10.0-RELEASE. В прошлом месяце я осуществлял обновление всех своих серверов до этого релиза (оттого так мало записей было внесено в мой дневник). В сети вы найдете много документов и Release Notes, описывающих те многочисленные (можно даже сказать – фундаментальные) изменения, которые произвели разработчики в данной операционной системе. В своих дальнейших заметках я буду по прежнему делиться теми проблемами и трудностями, с которыми мне приходится сталкиваться при администрировании данной ОС. Эта статья как раз об одной из них… |
На каждом сервере первым делом я осуществляю сборку и установку своего собственного ядра, из которого исключаю ненужные функции и поддержку драйверов отсутствующих в моих серверах периферийных устройств и т.д. Всегда мною исключается поддержка протокола IPv6 (выставлением комментария # в строке файла настройки ядра):
#options INET6 # IPv6 communications protocols
Так вот, после компиляции ядра, его установки и довольно продолжительной успешной работы с ним возникла непонятная проблема в работе сканера портов nmap (у меня установлена версия 6.40 – последняя на момент написания заметки). Причем ошибка возникла как на серверах с архитектурой amd64 так и на сервере с архитектурой i386.
Покажу на примере одного сервера, в чем заключается проблема…
Вывод команды uname
:
# uname -a FreeBSD host.domain.ru 10.0-RELEASE FreeBSD 10.0-RELEASE #1: Mon Mar 31 15:43:08 MSK 2014 root@host.domain.ru:/usr/obj/usr/src/sys/MYKERNEL i386
Так вот, после установки nmap и попытке вывести существующие сетевые интерфейсы и маршруты (с уровнем отладки 2) командой nmap --iflist -d2
, выскочили следующие ошибки:
# nmap --iflist -d2 Starting Nmap 6.40 ( http://nmap.org ) at 2014-04-08 09:42 MSK Fetchfile found /usr/local/share/nmap/nmap-services PORTS: Using top 1000 ports found open (TCP:1000, UDP:0, SCTP:0) INTERFACES: NONE FOUND(!) Reason: getinterfaces_dnet: intf_open() failed ROUTES: NONE FOUND(!) Reason: getsysroutes_dnet: sysroutes_dnet_find_interfaces() failed
Ошибки говорят об отсутствии сетевых интерфейсов и каких-либо маршрутов, хотя данный сервер успешно используется в качестве маршрутизатора и файервола между двумя различными сетями.
Вывод команды netstat -rn
:
# netstat -rn Routing tables Internet: Destination Gateway Flags Refs Use Netif Expire default 192.168.10.3 UGS 0 14302 age0 127.0.0.1 link#3 UH 0 1590 lo0 172.16.1.0/24 link#2 U 0 1101323 re0 172.16.1.10 link#2 UHS 0 1843 lo0 192.168.10.0/24 link#1 U 0 1545853 age0 192.168.10.14 link#1 UHS 0 0 lo0
Вывод команды ifconfig
:
# ifconfig age0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 options=c319b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,TSO4,WOL_MCAST,WOL_MAGIC,VLAN_HWTSO,LINKSTATE> ether 00:18:f3:a4:81:34 inet 192.168.10.14 netmask 0xfffffc00 broadcast 192.168.10.255 media: Ethernet autoselect (1000baseT <full-duplex>) status: active re0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500 options=8209b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,WOL_MAGIC,LINKSTATE> ether 00:1c:f0:bc:68:64 inet 172.16.1.10 netmask 0xffffff00 broadcast 172.16.1.255 media: Ethernet autoselect (100baseTX <full-duplex>) status: active lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384 options=600003<RXCSUM,TXCSUM,RXCSUM_IPV6,TXCSUM_IPV6> inet 127.0.0.1 netmask 0xff000000
При попытке же просканировать порты на каком-либо IP, выскакивает следующая ошибка:
# nmap -v -sS -P0 -O 192.168.10.3 Starting Nmap 6.40 ( http://nmap.org ) at 2014-04-08 10:04 MSK route_dst_generic: Failed to obtain system routes: getsysroutes_dnet: sysroutes_dnet_find_interfaces() failed
Если выполнить сканирование с ключём, обозначающим определенный интерфейс, с которого необходимо осуществить сканирование, выскочит ошибка с уведомлением, что данного сетевого интерфейса не существует:
# nmap -v -e age0 -sT -Pn 192.168.10.3 Starting Nmap 6.40 ( http://nmap.org ) at 2014-04-08 10:07 MSK I cannot figure out what source address to use for device age0, does it even exist? QUITTING!
Однако все-таки существует один-единственный способ осуществить сканирование удаленного IP. Его необходимо выполнять одновременно с ключами -sT и -Pn и больше никаких (см. предыдущий пример):
# nmap -v -sT -Pn 192.168.10.3 Starting Nmap 6.40 ( http://nmap.org ) at 2014-04-08 10:13 MSK Initiating Parallel DNS resolution of 1 host. at 10:13 Completed Parallel DNS resolution of 1 host. at 10:13, 0.00s elapsed Initiating Connect Scan at 10:13 Scanning proxy2.domain.ru (192.168.10.3) [1000 ports] Discovered open port 22/tcp on 192.168.10.3 Discovered open port 21/tcp on 192.168.10.3 Discovered open port 80/tcp on 192.168.10.3 Discovered open port 25/tcp on 192.168.10.3 Discovered open port 3128/tcp on 192.168.10.3 Completed Connect Scan at 10:14, 41.24s elapsed (1000 total ports) Nmap scan report for proxy2.domain.ru (192.168.10.3) Host is up (0.0010s latency). Not shown: 995 filtered ports PORT STATE SERVICE 21/tcp open ftp 22/tcp open ssh 25/tcp open smtp 80/tcp open http 3128/tcp open squid-http Read data files from: /usr/local/share/nmap Nmap done: 1 IP address (1 host up) scanned in 41.43 seconds
Данная проблема возникает только на серверах с версией ОС FreeBSD 10.0-RELEASE. На сервере под управлением FreeBSD 8.4-RELEASE nmap работает без нареканий. В обоих случаях поддержка IPv6 отключена на уровне ядра. Даже архитектуры совпадают!
Тут я начал копать глубже и выяснил, что даже при отсутствии галочки в меню опций сборки порта security/nmap
-
[ ] IPV6 IPv6 protocol support поддержка ipv6 не отключается!
# nmap --version
Nmap version 6.40 ( http://nmap.org )
Platform: i386-portbld-freebsd10.0
Compiled with: liblua-5.2.3 libpcre-8.34 libpcap-1.5.2 nmap-libdnet-1.12 ipv6
Compiled without: openssl
Available nsock engines: kqueue poll select
Только при внесении вручную в файл Makefile опции --disable-ipv6
:
nano -w /usr/ports/security/nmap/Makefile ... CONFIGURE_ARGS+=--without-localdirs \ --without-zenmap \ --without-ndiff \ --with-libpcre=${LOCALBASE} \ --with-liblua=included \ --without-nmap-update \ --disable-ipv6 ...
мне удалось выключить поддержку ipv6. Параллельно я обновил все зависимости для nmap до последних. Как-то:
- порт lang/lua52, поставляющий библиотеку liblua-5.2.3;
- порт devel/pcre, поставляющий библиотеку libpcre-8.34;
- порт net/libpcap, поставляющий библиотеку libpcap-1.5.2;
- и даже порт net/libdnet, с которым теоретически может работать nmap, но упорно продолжает использовать собственную встроенную библиотеку nmap-libdnet-1.12…
Как я предполагаю, проблема как раз в использовании именно этой библиотеки. Вот что пишут сами разработчики:
--with-libdnet=DIR Use an existing (compiled) dnet lib from DIR/include and DIR/lib. This is NOT RECOMMENDED because we have made many important fixes to our included libdnet, as described at http://nmap.org/svn/libdnet-stripped/NMAP_MODIFICATIONS
При попытке же скомпилировать порт security/nmap с поддержкой порта net/libdnet
(в Makefile опция --with-libdnet=/usr/local
)
постоянно появляется ошибка:
nmap.cc:166:10: fatal error: 'libdnet-stripped/include/config.h' file not found #include "libdnet-stripped/include/config.h" ^ 1 error generated. gmake[2]: *** [makefile.dep] Ошибка 1 gmake[2]: Выход из каталога `/usr/ports/security/nmap/work/nmap-6.40' *** Error code 1 Stop. make[1]: stopped in /usr/ports/security/nmap *** Error code 1 Stop. make: stopped in /usr/ports/security/nmap
Так что все эти ошибки в работе сканера портов nmap на серверах по управлением FreeBSD 10.0-RELEASE с отключенной поддержкой IPv6 на уровне ядра я пока не смог “победить”. Возможно что-то сделают в следующих версиях nmap…
P.S. если же не отключать в ядре поддержку IPv6, то nmap успешно работает. Специально пересобирал ядро с включением/отключением только это опции… Какие предложите решения?
Предложение написать меинтейнерам порта nmap и сообщить о проблеме. :)
Но вообще интересно чем вызвана такая паталогическая неприязнь к ipv6?
Выпиливать его из ядра, значит выпиливать целый стек и не позволять системе общаться даже с самой собой через стек ipv6, равно как и поломать кучу зависимостей. Для этого есть действительно веские причины?
Примерно то же самое можно будет наблюдать если выпилить из ядра inet, оставить только Inet6 и посмотреть сколько всего поломается.
Впрочем такие преценденты есть https://www.zabbadoz.net/users/bz/blog/20140131-e9e7b6ead61ee2fd3e7337576663b128.html
Выпиливание Inet6 это классика, я читал на opennet нашли баг что не работает ipnat без Inet6, так что похоже чревато
под пользователем root nmap выдает такие ошибки
а под обычным пользователем все нормально
Алексей, точно, проверил, так и есть, из под юзера без ошибок.