На днях потребовалось просканировать удалённый хост на наличие открытых портов. Дело не пыльное, тем более, когда есть такой инструмент как nmap. Но тут меня ждал облом. При запуске программы на сканирование, она завершала работу с ошибкой…
Пару лет назад я сталкивался с такой проблемой, и решение было очень простым. Надо было всего лишь указать интерфейс, через который nmap должен посылать пакеты, но тут меня опять ждала неудача:
Самое интересное, что под обычным пользователем, nmap сканировал “на ура”, но как известно, самые “вкусные” возможности доступны лишь с правами супер пользователя. С чем это связано так и не понял.
Погуглив на эту тему, ничего путного не нашёл. Решил разобраться сам. В поисках хоть какой-нибудь зацепки пришёл к выводу, что всё упирается в «кривую» настройку сети. Первым делом, я открыл хэндбук, где, в принципе, был «скрытый» ответ. Цитирую:
27.2.3. Хосты с двойным подключением
Есть еще один тип подключения, который мы должны рассмотреть, и это случай, когда хост находится в двух различных сетях. Технически, любая машина, работающая как сетевой шлюз (в примере выше использовалось PPP-соединение), считается хостом с двойным подключением. Однако этот термин реально используется для описания машины, находящейся в двух локальных сетях.
В одном случае у машины имеется два адаптера Ethernet, каждый имеющий адрес в разделенных подсетях. Как альтернативу можно рассмотреть вариант с одним Ethernet-адаптером и использованием алиасов в команде ifconfig(8). В первом случае используются два физически разделённые сети Ethernet, в последнем имеется один физический сегмент сети, но две логически разделённые подсети.
В любом случае таблицы маршрутизации настраиваются так, что для каждой подсети эта машина определена как шлюз (входной маршрут) в другую подсеть. Такая конфигурация, при которой машина выступает в роли маршрутизатора между двумя подсетями, часто используется, если нужно реализовать систему безопасности на основе фильтрации пакетов или функций брандмауэра в одном или обоих направлениях.
Если вы хотите, чтобы эта машина действительно перемещала пакеты между двумя интерфейсами, то вам нужно указать FreeBSD на включение этой функции. Обратитесь к следующей главе, чтобы узнать, как это сделать.
Дело в том, что у меня так же хост с двойным подключением и одной сетевой картой, а namp всё таки не мог найти верный маршрут, хотя с www, ftp, irc, icq etc. проблем не было. Было решено в качестве дефолтового маршрута выставить сетевой адрес выдаваемый мне провайдером, как было написано в выше приведённой цитате:
После этих нехитрый действий, программа заработала на все 100%.
Всё это хорошо, но как сделать, чтобы после перезагрузки системы маршрут выставлялся автоматически? Для тех у кого статический ip-адрес проблема решается редактирование файла /etc/ppp/ppp.conf. Найти строку, отвечающую за добавление дефолтового маршрута и выставить нужный. Тут всё понятно, а что же делать тем у кого динамически выдаваемый сетевой адрес?
Почему то сразу в голову пришла мысль, вытащить из вывода команды ifconfig сетевой адрес и передать её команде route. Был написан небольшой сценарий, который реализовывал данные действия:
#touch change_getway.sh
#!/bin/sh
change_getway=`ifconfig ХХХ | grep inet | awk ‘{print $2}’` #ХХХ your interface
`route del default >> /dev/null`
`route add default ${change_getway} >> /dev/null`
Теперь его необходимо поместить в /usr/local/etc/rc.d и сделать выполняемым:
#mv change_getway.sh /usr/local/etc/rc.d/
#chmod 600 /usr/local/etc/rc.d/ change_getway.sh
#shutdown -h now
Для тех кто пользуется pppd есть возможность воспользоваться файлом /etc/ppp/ip-up, который выполняется после успешного соединения с Интернетом и корректно выставленной переменной окружения IPLOCAL.
P.S. Просьба не пинать за вышеприведённый способ, т.к. я и сам понимаю, что он не элегантен. Прошу тех, кто знает, как улучшить ту или иную часть данного способа (а может быть кто-то предложит другой вариант решения данной проблемы) отписаться в комментариях или же мне в жабу (JID в профиле). Заранее благодарен.