Наши партнеры

UnixForum






Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Тематический каталог -> Безопасность работы с системой Linux

Настройка "проброса" порта через IPtables

Оригинал: An Easy Tutorial on IP Tables and Port Knocking
Автор: Мэтт Вальдо (Matt Waldo)
Дата: 04 февраля 2008 г.
Перевод: Сергей Супрунов
Дата перевода: 25 февраля 2009 г.

Первоначальные приготовления

Вам хотелось бы иметь доступ к своему домашнему файловому серверу, при этом не открывая широко ваш пакетный фильтр для атак? Что ж, сегодня для вас удачный день! Хотя вы можете реализовать это на любой ОС, проще всего это сделать в Linux. Эта статья покажет вам, как "запереть" ваш пакетный фильтр и реализовать проброс портов, который позволит вам проникать в защищаемую зону.

Мы будем решать эту задачу, используя файрвол Linux и сервер, для конкретики SLED 10.1. Да, придётся править конфигурационные файлы, но я предоставлю вам образец для работы, так что вы сможете просто скопировать его и изменить то, что нужно.

Прежде чем мы начнём, вам нужно будет кое-что установить в вашу ОС. А именно:

  • Метапакет (паттерн) C/C++ Compiler and Tools
  • Метапакет (паттерн) Common Code Base (for certification)
  • пакет kernel-source
  • пакет kernel-syms

Всё это можно установить через YaST2, только проверьте, что у вас есть инсталляционный диск и не забудьте установить зависимые пакеты.

Первое, что нужно сделать - это настроить обе сетевые карты. Да, всё правильно - я сказал "обе". Вам нужны две сетевых карты в компьютере, чтобы использовать его как брандмауэр. Одну нужно настроить как "внутреннюю" (internal), вторую - как "внешнюю" (external). Опять-таки, вы можете сделать это с помощью YaST2.

Заодно проверьте, что на "внешней" карте нет открытых портов, а на "внутренней", наоборот, все порты открыты. Внешняя карта будет смотреть в Интернет, и именно на ней будет работать наш файрвол. Если вы не можете разобраться, где какая карта, откройте терминал, наберите su -, чтобы получить права суперпользователя, и введите ifconfig. Запомните MAC-адрес каждой карты (обычно это eth0 и eth1) и затем сравните с MAC-адресами, которые вы увидите в окне конфигурации YaST2. Если ваш провайдер предоставляет вам статический IP-адрес, пропишите его также на внешней карте, иначе настройте эту карту на получение IP-адреса по DHCP. В итоге мы должны получить примерно такую схему:

Модем -> Сервер SLED (файрвол) -> Маршрутизатор -> Остальные компьютеры

Оставшиеся шаги настройки сетевых карт я пропущу - там не должно быть особых сложностей. Вам нужно будет либо настроить вашу внутреннюю карту так, чтобы она выдавала IP-адреса, либо просто вбить её адрес в маршрутизатор как шлюз по умолчанию. И не бойтесь экспериментировать: самое ужасное, что, может быть, вам придётся сделать, - это переустановить или перезагрузить ваш маршрутизатор.

Базовая конфигурация

Теперь перейдём к защите вашего файрвола. Файрвол, используемый YaST2, неплох, за исключением одной вещи. Существует два типа пакетов, которые рассматриваются по-разному. Для любого пакета (за некоторым исключением, о котором будет сказано ниже), если порт закрыт, файрвол просто "проглатывает" его. С точки зрения атакующего всё выглядит так, как будто отправляемые пакеты вообще никуда не попадают и, следовательно, там нет компьютера.

Однако для пакетов ICMP типа 8 (echo-request) и пакетов IDENT файрвол отправит ответ, что порт закрыт, чем вы радушно пригласите взломщика к себе в гости, поскольку он теперь будет знать, что что-то там есть. Для того, чтобы файрвол обрабатывал эти пакеты так же, как и остальные, вам нужно будет добавить кое-что в IPTables. Откройте консоль, введите su -, чтобы стать суперпользователем, перейдите в /etc/sysconfig/scripts и откройте в текстовом редакторе SuSEfirewall2-custom. И скопируйте приведённый ниже фрагмент в секцию fw_custom_after_antispoofing().

Заодно, пока вы здесь, скопируйте сразу после предыдущего фрагмента следующий код:

Измените параметры Token* со значений 10, 20, 30 и 40 на любые другие числа не более 1024. Рассматривайте эту комбинацию чисел как ваш код доступа, поскольку он им и является. Именно её вам нужно будет отправить файрволу, чтобы попасть внутрь, так что запомните её.

Вам нужно будет изменить ещё кое-что, прежде чем перезапустить файрвол: il>
  • Отредактируйте /etc/sysconfig/SuSEfirewall2: измените FW_CUSTOMRULES="" на FW_CUSTOMRULES="/etc/sysconfig/scripts/SuSEfirewall2-custom", а FW_DEV_EXT="any eth-id-xx:xx:xx:xx:xx:xx" - на FW_DEV_EXT="eth0" или FW_DEV_EXT="eth1" (в зависимости от того, какая из карт является внешней).
  • Перезапустите файрвол, выполнив в терминале с правами root следующие команды: il>
  • SuSEfirewall2 stop
    SuSEfirewall2 start
    

    Итак, полностью защищённый файрвол, который позволит вам проходить сквозь него. Как же его использовать? Ну, это зависит от того, пытаетесь ли вы подключиться с Linux-машины или из Windows, хотя концепция остаётся той же самой. Мы продемонстрируем использование в аспекте Windows-машины, поскольку настройка здесь чуть сложнее.

    Подключение из Windows

    Чтобы установить SSH-туннель, вам нужно скачать cygwin. Этот эмулятор Linux вы можете взять на http://www.cygwin.com. Запустите setup.exe, выберите установку по сети, сохраните его в C:\ и выберите сайт-зеркало, откуда будет выполняться загрузка. Далее вы увидите длинный список программ, которые вы можете скачать и установить. Раскройте раздел Net и отметьте установку "curl" и "openssh".

    Curl позволит вам отправлять ровно один пакет на соответствующий порт на вашем сервере. Так что всё, что вам нужно будет сделать - создать командный файл, отправляющий четыре пакета на ваш файрвол в том порядке, в котором вы определили четыре порта в переменных TOKEN*. После этого файрвол откроет ssh-порт на 10 секунд. В конце командного файла будет запущена ssh с указанным файлом конфигурации, чтобы установить шифруемый ssh-туннель, так что вы сможете войти в свою сеть. Это проще простого. Только убедитесь, что все командные и конфигурационные файлы, а также каталог cygwin, располагаются в корневом каталоге C:\.

    Ниже приводится пример командного файла и файла конфигурации:

    cygwin\bin\curl -s -m 1 http://"IPADDRESS":"TOKEN1"
    cygwin\bin\curl -s -m 1 http://"IPADDRESS":"TOKEN2"
    cygwin\bin\curl -s -m 1 http://"IPADDRESS":"TOKEN3"
    cygwin\bin\curl -s -m 1 http://"IPADDRESS":"TOKEN4"
    cygwin\bin\ssh "username"@"IP ADDRESS" -F \"config file name"
    

    Конфигурация может выглядеть следующим образом:

    # Туннель для доступа к моему "приватному" веб-серверу (192.168.0.10)
    LocalForward 127.168.0.10:80 192.168.0.10:80
    
    # Туннель для ssh-доступа к моему серверу (192.168.0.10)
    LocalForward 127.168.0.10:22 192.168.0.10:22
    
    # Туннель для удалённого доступа к рабочему столу Windows (192.168.0.20)
    LocalForward 127.168.0.20:3389 192.168.0.20:3389
    

    Чтобы создать такой командный файл, откройте Notepad, скопируйте приведённый выше код и затем сохраните его с расширением .bat. Имя пользователя "username" должно соответствовать учётной записи на вашем компьютере, к которому вы пытаетесь получить доступ, а IPADDRESS - это адрес того компьютера.

    Если теперь вы попытаетесь подключиться к серверу, то вы, если всё пройдёт нормально, будете перенаправлены на 22-й порт вашего маршрутизатора. IPADDRESS в командном файле - это адрес вашего сервера, но 192.168.*.* - это ваш внутренний IP-адрес. Так что после установления SSH-соединения с вашим сервером вы сможете либо получить доступ к самому серверу, либо подключиться через туннель к другим компьютерам вашей сети. Как видите, создать шифрованный туннель для сессии удалённого рабочего стола на вашем домашнем компьютере, не открывая широкого доступа к вашей сети, - это реальность.

    Если вы хотели бы иметь возможность выполнять подключение с любого компьютера, за которым работаете, сохраните ваш командный файл, файл конфигурации и каталог cygwin в корень USB-флешки. Теперь вы сможете просто открыть устройство и выполнить автоматическое соединение.