вторник, 14 июля 2009 г.

Настройка домашнего интернета (4)

Основная функция нашего интернет-шлюза - работа с пакетами, которые шлются от компьютеров в локальной сети (к гуглу, к аське и т.д. и т.п.) и пакетами, которые шлются из интернета; он собственно должен сортировать - какой пакет кому, какой пакет выбросить, какой запретить.. Для этого в ubuntu есть iptables - монструозная программа, для настройки которой хацкеры напамять помнят:
iptables -A bad_tcp_packets -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j REJECT --reject-with tcp-reset 
Есть способ и попроще :) Этот способ называется Shorewall. Это не то, чтоб файрвол, собственно iptables и есть файрволом, shorewall просто утилита для составления правил для файрвола в виде чуть проще, чем приведенное мною выше. Устанавливается как и все:
sudo apt-get install shorewall
Настраивается тоже достаточно просто, на сайте к тому же есть много доки, в т.ч. и на русском Настройки (опять же как у многих) хранятся в /etc/shorewall; сразу после установки там практически пусто - 2 файла, один из которых надо подправить. Раз править надо будет файл в /etc - значит понадобится sudo; кроме того, в данном конкретном случае удобно будет пользоваться mc - искать по каталогам файлы, копировать их, править.. так что надо запустить mc с правами и с его помощью все настраивать.
sudo mc
Для начала перейдем в папку /etc/shorewall и откроем файл shorewall.conf (по F4); в этом файле надо найти строку
STARTUP_ENABLED=
и убедится, что там указано Yes, дальше надо найти строку
IP_FORWARDING=
и тоже изменить ее значение на Yes, и сохранить файл. Для того, чтобы настроить собственно правила для нашей сети (для обмена между двумя сетями, нашей локальной и глобально-интернетной) надо узнать, что думает обо всем этом shorewall. shorewall думает понятиями "зон" - в нашем случае есть зона - наша локальная сеть, есть зона - весь остальной интернет; есть еще специальная зона - компьютер, на котором запущен shorewall. Определения зон содержаться в файле zones, который должен лежать в папке /etc/shorewall и которого тут пока нет; его можно взять в папке с образцами, которую с помощью mc легко найти в /usr/share/doc/shorewall-common/examples/two-interfaces - копируем его с помощью mc в /etc/shorewall (переход между панелями - левой/правой - в mc делается клавишей Tab) Настоящие хацкеры конечно же делали бы все в хардкорной консольке, введя
cd /usr/share/doc/shorewall-common - перейти в папку с файлом
sudo cp ./zones /etc/shorewall - скопировать файл zones в папку /etc/shorewall, команду копирования (cp - от copy) запустить от sudo
Но с помощью mc имхо быстрее; скопировали, вернулись в /etc/shorewall, посмотрим на zones - вот определение зон для нашего шлюза:
fw    firewall
net   ipv4
loc   ipv4
Теперь, если надо упомянуть любой компьютер в локальной сети, мы просто скажем loc (это не касается шлюза - он стоит особняком и для него - отдельные правила), любой компьютер вне нашей домашней/офисной сети - net. У shorewall действует правило "запрещено все, что не разрешено", т.е. если какое-то взаимоотношение не описано как "можно" - оно будет запрещено; делается это в файле policy, который тоже надо скопировать в /etc/shorewall Если посмотреть на его содержимое, то видим:
loc  net  ACCEPT - разрешены запросы из локальной сети в интернет
loc  $FW  REJECT - будут отвергнуты запросы любого локального компьютера к файрволу
loc  all  REJECT - будут отвергнуты все запросы локальной сети в остальных случаях

$FW  net  REJECT
$FW  loc  REJECT
$FW  all  REJECT - файрволу вообще ничего не разрешено

net  $FW  DROP
net  loc  DROP
net  all  DROP   - запросы из интернета просто дропаются, это делается для того, чтобы отправитель не знал, что по запрашиваемому им адрему кто-то есть

all  all  REJECT - все что не попало под предыдущее правило, запрещено
ключик info около некоторых правил говорит, что в лог будет добавлено сообщение о срабатывании этого правила. По умолчанию правила параноидальные - почти ничего никому нельзя; чтобы хоть что-то работало, существует еще один файл rules - при анализе пакета сначала ищется правило с этом файле, если там ничего нет - тогда срабатывает какое-нибудь правило из policy
DNS/ACCEPT  $FW  net - например это правило разрешит dns-запросы от шлюза к dns-серверу, находящемуся где-то в инете (у провайдера, или OpenDNS)
SSH/ACCEPT  loc  $FW - это правило разрешит удаленный доступ по ssh из локальной сети в шлюз
Ping/DROP   net  $FW - это правило запретит пинговать наш шлюз хацкерам из интернета
Для начала я бы ослабил правила, на время настройки; например, шлюзу надо разрешить доступ в инет хотя бы для работы apt-get; так что в policy поменяем:
loc  $FW  ACCEPT - разрешим пока полный доступ в шлюз из локальной сети
$FW  net  ACCEPT - разрешим полный доступ в интернет шлюзу
Теперь надо связать сетевые карты и зоны - это делается в файле interfaces - копируем и его, смотрим на содержимое: собственно все очень просто, сначала имя зоны, потом - интерфейс, который смотрит в эту зону, скорее всего ничего менять не придется В локальной сети (которая предположительно подключена к eth1) может быть достаточно много компьютеров; но со стороны интернета виден только один IP-адрес, выданный провайдером adsl-модему (или чем там мы подключены), наш шлюз кроме прочего делает преобразования адресов; для того, чтобы оно работало, нужен файлик masq - он как раз определяет, что в что транслируется - первой записью в нем идет интерфейс, смотрящий в net, второй - в loc; копируем и этот файлик в /etc/shorewall Ну собственно настройки пока все; shorewall умеет делать "шейпинг трафика" - т.е. ограничивать трафик по разным условиям, одно время у меня это работало (потому что торрент-клиент забирал весь трафик под себя и компьютеры в локальной сети очень медленно грузили странички сайтов.. но на 5 МБит смысла в нем не стало и я правила эти поудалял, но если найду бекапы - то и о них напишу) А, еще - последний файл, который нужен - routestopped: в нем указание, какие интерфейсы будут работать, если shorewall отключен - указываем там интерфейс, который смотрим в локальную сеть Для проверки созданной конфигурации у shorewall есть специальная команда
sudo shorewall check
смотрим на вывод в консоль; если нет ошибок, то файрвол можно запустить (ключ start); если файрвол запущен и в конфигурации делались правки - то сначала надо проверить все (check), а потом перезапустить файрвол (restart) На самом делел shorewall просто делает конфигурационные файлы для iptables; посмотрим на действующие ДО запуска shorewall правила:
sudo iptables -L
Пусто? должно быть пусто; теперь запустим shorewall, он создаст правила и применит их в iptables; еще раз запустим iptables -L - сколько всего туда добавилось! Чтобы shorewall запустился при старте, надо еще открыть в текстовом редакторе файл /etc/default/shorewall и изменить значение параметра startup на "1"; перезагрузимся для чистоты эксперимента - в логе загрузки видно, что shorewall успешно стартовал; а можно пока не перезагружаться, а установить pdnsd - кеширующий dns-сервер, который в принципе пригодится для локальной сети: однажды зделанный запрос на разрешение имени в IP-адрес сохранится в базе pdnsd и в следующий раз разрешение имен пройдет практически мгновенно. Я устанавливал pdnsd себе из-за того, что у моего провайдера периодически случались глюки с dns-серверами Установка - sudo apt-get install pdnsd; установщик спросит тип конфигурации - я выбирал Manual, после чего для начала работы надо подправить 2 файла Открываем файл /etc/defaults/pdnsd и меняем значение параметра START_DAEMON на yes - это изменение нужно для того, чтобы сервер стартовал вместе с системой; а значение параметра AUDO_MODE оставляем пустым; также надо изменить файл /etc/pdnsd.conf - в нем собственно настройки сервера. Мои настройки такие: 1) секция global: в ней меняем только значение параметра server_ip на 192.168.5.1 (т.е. на IP-адрес карты eth1, которая смотрит в локальную сеть) 2) сразу после закрывающей скобки секции global добавляю секции:
rr {
   name = ubuntu.localhost;
   ns = localhost;
   a = 192.168.5.1;
}

server {
  label = "mydns";
  ip    = 208.67.222.222; - это IP-адрес OpenDNS-сервера, сюда можно записать адрес, выдаваемый провайдером
  proxy_only = off;
}
Все остальное из файла я убрал; первая секция (rr) определяет разрешение локальных ресурсов, servers указывает на внешние dns-сервера, с которых будет при необходимости запрашиваться и сохранятся соответствие адресс = IP. Сохраняем файл; читал также где-то рекомендацию удалить resolvconf, который устанавливается автоматически с pdnsd - мне не жалко, удалил (sudo apt-get remove resolvconf), после чего надо отредактировать файл /etc/resolv.conf - просто вписать туда строчку :
nameserver 192.168.5.1
т.е. вписать IP-адрес сетевой карты, которая смотрит в локальную сеть (помним, что компьютеры локальной сети настроены искать dns по этому адресу) Теперь точно можно для проверки перезапустить компьютер (sudo reboot); после загрузки сначала на шлюзе проверим наличие интернета - хотя у нас сервер с хардкорной консолью, это не значит, что мы не можем в нем чего-нибудь погуглить: существует консольный браузер lynx, который можно установить и "проверить интернет":
sudo apt-get install lynx
lynx google.com
(собственно если lynx установился - значит адреса все еще резолвятся и файрвол ничего не заблокировал (я временно ведь разрешил ему ходить в интернет) Теперь сядем за windows-компьютер, Start -> Run -> cmd, ping google.com - если все нормально, то адрес google.com и здесь отрезолвится и пойдет вывод пинга - мол, все хорошо.. Открываем google.com в броузере - у меня открылся :)

Комментариев нет:

Отправить комментарий