Документация
cipe.info: info-файл, входящий в дистрибутив
"HOWTO: Firewall", автор Mark Grennan, markg@netplus.net
"Мини-HOWTO: IP-маскарадинг", автор Ambrose Au, ambrose@writeme.com
"HOWTO: IPChains", автор Paul Russell, Paul.Russell@rustcorp.com.au
Дополнительная информация о скриптах и VPN
Приведенные здесь скрипты ip-up рассчитаны на сети класса C. Если хотите, чтобы машина B могла связаться с машиной C, вам придется исправить соответствующие скрипты ip-up и ip-down. В них надо исправить маски ptpaddr и myaddr. Ниже приводятся два скрипта ip-up - один для ipchains, второй для ipfwadm. Также и для скриптов ip-down. Измените с /24 на /16 соответствующие правила интерфейса cipe для входящего, исходящего или проходящего потоков. Если вы изменяете правило в ip-up (ipfwadm), не забудьте изменить его в скрипте ip-down, чтобы оно удалялось при отключении интерфейса. Что же касается варианта для ipchains, то изменения в ip-up не требуют изменений в ip-down, ip-down просто удаляет все правила пользователя.
Вам также придется раскомментировать в файлах rc.cipe машин B и C строку с указанием маршрута на сети друг друга.
/Etc/cipe/ip-down
#!/bin/bash # ip-down #3/29/1999 #Это пример скрипта ip-down для старых ядер версий 1.x 2.x, использующих ipfwadm, #удаляющий маршруты и правила firewall, заданные ранее для соединения вашей сети класса c #с удаленной сетью класса c. #Вопросы и предложения посылайте по адресу acj@home.com #-------------------------------------------------------------------------- #Настраиваем некоторые переменные device=$1 # Интерфейс CIPE me=$2 # Наш UDP-адрес pid=$3 # ID процесса демона ipaddr=$4 # IP-адрес нашего CIPE-устройства ptpaddr=$5 # IP-адрес удаленного CIPE-устройства option=$6 # аргументы, переданные через опции скрипта PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin" #рас(за)-комментируйте следующую строку для включение в системный журнал #всех попыток неавторизованного доступа. Эта строка должна соответствовать #строке в скрипте ip-up для правильного отключения правил. log="-o" #-------------------------------------------------------------------------- umask 022 # пример записи в журнал #echo "DOWN $*" >> /var/adm/cipe.log # во многих системах требуются такие pid-файлы #rm -f /var/run/$device.pid #-------------------------------------------------------------------------- #Правила для входящего потока firewall для интерфейса cipe #удаляем запрещение всех остальных входящих с интерфейса cipe пакетов ipfwadm -I -d deny -W $device -S 0/0 -D 0/0 $log #удаляем разрешение всех пакетов, входящих с интерфейса cipe из удаленной сети для локальной ipfwadm -I -d accept -W $device -S $ptpaddr/24 -D $ipaddr/24 #удаляем разрешение всех пакетов, входящих с интерфейса cipe из локальной сети для удаленной ipfwadm -I -d accept -W $device -S $ipaddr/24 -D $ptpaddr/24 #удаляем запрещение всех пакетов, входящих с интерфейса cipe из локальной сети для локальной ipfwadm -I -d deny -W $device -S $ipaddr/24 -D $ipaddr/24 $log #-------------------------------------------------------------------------- #Правила для исходящего потока firewall для интерфейса cipe # удаляем запрещение всех остальных, исходящих из интерфейса cipe, пакетов ipfwadm -O -d deny -W $device -S 0/0 -D 0/0 $log #удаляем разрешение всех пакетов, исходящих из интерфейса cipe, из удаленной сети для локальной ipfwadm -O -d accept -W $device -S $ptpaddr/24 -D $ipaddr/24 #удаляем разрешение всех пакетов, исходящих из интерфейса cipe, из локальной сети для удаленной ipfwadm -O -d accept -W $device -S $ipaddr/24 -D $ptpaddr/24 #удаляем запрещение всех пакетов, исходящих из интерфейса cipe, из локальной сети для локальной ipfwadm -O -d deny -W $device -S $ipaddr/24 -D $ipaddr/24 $log #-------------------------------------------------------------------------- #Правила для проходящего потока firewall для интерфейса cipe #удаляем запрещение всех остальных пакетов, проходящих через интерфейс cipe ipfwadm -F -d deny -W $device -S 0/0 -D 0/0 $log #удаляем разрешение всех пакетов, проходящих через интерфейс cipe, из удаленной сети для локальной ipfwadm -F -d accept -W $device -S $ptpaddr/24 -D $ipaddr/24 #удаляем разрешение всех пакетов, проходящих через интерфейс cipe, из локальной сети для удаленной ipfwadm -F -d accept -W $device -S $ipaddr/24 -D $ptpaddr/24 #-------------------------------------------------------------------------- #Дополнение к системе безопасности - в случае, если стандартное правило для #проходящего потока установлено в DENY или REJECT. #define machine interfaces #localif="eth0" #staticif="eth1" ;для пользователей кабельных модемов #staticif="ppp0" ;для пользователей обычных модемов #По-настоящему грубо определяем удаленный ip-адрес, взяв его из файла options. #В идеале этот адрес надо передавать скрипту через аргументы #Надо раскомментировать обе строки #peerfile=`grep $device /etc/cipe/options.* | cut -f1 -d:` #peer=`grep peer $peerfile | cut -f1 -d: | awk '{print $2}'` #Запоминаем удаленный ip-адрес для скрипта ip-down (???) #echo $peer > /var/run/$device.peerip #удаляем разрешение пересылки пакетов из локальной сети в удаленную, через сетевую карту #ipfwadm -F -d accept -W $localif -S $ipaddr/24 -D $ptpaddr/24 #удаляем разрешение пересылки пакетов из удаленной сети в локальную, через сетевую карту #ipfwadm -F -d accept -W $localif -S $ptpaddr/24 -D $ipaddr/24 #удаляем разрешение пересылки пакетов через интерфейс staticif от этой системы к удаленной #myaddr=`echo $me | cut -f1 -d:` #ipfwadm -F -d accept -W $staticif -S $myaddr -D $peer #-------------------------------------------------------------------------- #Второе дополнение к системе безопасности - блокируем все запросы к udp-порту #cipe, кроме идущих от удаленной машины #необходимо определить udp-порты интерфейса cipe #получаем наш udp-порт #if [ "$option" = "" ]; then # myport=`echo $me | cut -f2 -d:` #else # myport=$option #fi #получаем удаленный udp-порт # переменная peerfile должна быть задана #peerport=`grep peer $peerfile | cut -f2 -d:` #запоминаем удаленный udp-порт cipe для скрипта ip-down (???) #echo $peerport > /var/run/$device.peerport #получаем наш ip-адрес #myaddr=`echo $me | cut -f1 -d:` #удаляем запрещение всех запросов к udp-порту cipe #ipfwadm -I -d deny -P udp -W $staticif -S 0/0 -D $myaddr $myport $log #удаляем разрешение всех запросов к udp-порту cipe, идущих из интерфейса staticif, от удаленной машины #ipfwadm -I -d accept -P udp -W $staticif -S $peer $peerport \ #-D $myaddr $myport exit 0 |
Ядро 2.1/2.2, ipchains, cipe 1.2.x
#!/bin/sh # ip-down #3/29/1999 #Это пример скрипта ip-down для новых ядер версий 2.1/2.2, использующих ipchains, #удаляющий маршруты и правила firewall, заданные ранее для соединения вашей сети класса c #с удаленной сетью класса c. #Вопросы и предложения посылайте по адресу acj@home.com. #-------------------------------------------------------------------------- #Настраиваем некоторые переменные device=$1 # Интерфейс CIPE me=$2 # Наш UDP-адрес pid=$3 # ID процесса демона ipaddr=$4 # IP-адрес нашего CIPE-устройства ptpaddr=$5 # IP-адрес удаленного CIPE-устройства option=$6 # аргументы, переданные через опции скрипта PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin" #рас(за)-комментируйте следующую строку для включение в системный журнал #всех попыток неавторизованного доступа. Эта строка должна соответствовать #строке в скрипте ip-up для правильного отключения правил. log="-l" #-------------------------------------------------------------------------- umask 022 # пример записи в журнал #echo "DOWN $*" >> /var/adm/cipe.log # во многих системах требуются такие pid-файлы #rm -f /var/run/$device.pid #-------------------------------------------------------------------------- #удаляем с главных потоков ссылки на пользовательские ipchains -D input -i $device -j $device"i" ipchains -D output -i $device -j $device"o" ipchains -D forward -i $device -j $device"f" #-------------------------------------------------------------------------- # Удаляем все правила из пользовательского входящего потока ipchains -F $device"i" #Удаляем пользовательский входящий поток ipchains -X $device"i" #-------------------------------------------------------------------------- #Удаляем все правила из пользовательского исходящего потока ipchains -F $device"o" #Удаляем пользовательский исходящий поток ipchains -X $device"o" #-------------------------------------------------------------------------- #Удаляем все правила из пользовательского проходящего потока ipchains -F $device"f" #Удаляем пользовательский проходящий поток ipchains -X $device"f" #-------------------------------------------------------------------------- #Удаляем дополнительные меры безопасности #получаем ip-адрес удаленной машины #peer=`cat /var/run/$device.peerip` #определяем интерфейсы машины #localif="eth0" #staticif="eth1" ;для пользователей кабельных модемов #staticif="ppp0" ;для пользователей обычных модемов #получаем наш ip-адрес #myaddr=`echo $me |cut -f1 -d:` #удаляем разрешение пересылки пакетов из локальной сети в удаленную, через сетевую карту #ipchains -D forward -j ACCEPT -i $localif -s $ipaddr/24 -d $ptpaddr/24 #удаляем разрешение пересылки пакетов из удаленной сети в локальную, через сетевую карту #ipchains -D forward -j ACCEPT -i $localif -s $ptpaddr/24 -d $ipaddr/24 #удаляем разрешение пересылки пакетов через интерфейс staticif от этой системы к удаленной #ipchains -D forward -j ACCEPT -i $staticif -s $myaddr -d $peer #удаляем файл с запомненным удаленным ip-адресом #rm /var/run/$device.peerip #-------------------------------------------------------------------------- #Удаляем дополнительные меры безопасности #получаем удаленный udp-порт #peerport=`cat /var/run/$device.peerport` #получаем наш udp-порт #if [ "$option" = "" ]; then # myport=`echo $me | cut -f2 -d:` #else # myport=$option #fi #удаляем запрещение всех запросов к udp-порту cipe #ipchains -D input -j DENY -p udp -i $staticif -s 0/0 \ #-d $myaddr $myport $log #удаляем разрешение всех запросов к udp-порту cipe, идущих из интерфейса staticif, от удаленной машины #ipchains -D input -j ACCEPT -p udp -i $staticif -s $peer $peerport \ #-d $myaddr $myport #удаляем файл с запомненным удаленным ip-адресом #rm /var/run/$device.peerport #-------------------------------------------------------------------------- exit 0 |
Ядро 2.1/2.2, ipchains
#!/bin/sh #04/04/1999 #Пример скрипта rc.firewall для новых ядер версий 2.1/2.2, использующих ipchains, #определяющий пользовательские потоки для каждого интерфейса. Здесь есть также #правила, защищающие от spoofing-а, которые может быть и не очень нужны - #подобная защита уже встроена в ядро. #Вопросы и предложения посылайте по адресу acj@home.com. #--------------------------------------------------------------------- #Переменные #--------------------------------------------------------------------- #локальный ethernet-интерфейс localip= localif=eth0 #статический ethernet-интерфейс staticip= staticif=eth1 #интерфейс обратной петли loopback=lo PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin" #--------------------------------------------------------------------- #Удаляем все правила для входящего, исходящего и проходящего потоков #По умолчанию отбрасываем все пакеты #--------------------------------------------------------------------- #устанавливаем запрет всего для входящего потока ipchains -P input DENY #удаляем все правила для входящего потока ipchains -F input #--------------------------------------------------------------------- #устанавливаем запрет всего для исходящего потока ipchains -P output DENY #удаляем все правила для исходящего потока ipchains -F output #--------------------------------------------------------------------- #устанавливаем запрет всего для проходящего потока ipchains -P forward DENY #удаляем все правила для проходящего потока ipchains -F forward #--------------------------------------------------------------------- #удаляем все правила вообще (в том числе и пользовательские) #ipchains -F #удаляем все пользовательские потоки - вам это может понадобиться #ipchains -X #--------------------------------------------------------------------- #Политика Firewall для входящего потока #--------------------------------------------------------------------- #создаем пользовательский входящий поток для статического интерфейса ipchains -N $staticif"-i" # в этом потоке удаляем все правила (на всякий случай) ipchains -F $staticif"-i" #блокируем все входящие SYN-пакеты на всех портах на статическом интерфейсе #это может показаться грубым, но это правильно #ipchains -A $staticif"-i" -j DENY -p tcp -y -i $staticif -s 0/0 \ #-d $staticip : -l #запрещаем все пакеты, идущие из статического интерфейса, "от локальных машин" (spoofing) #записываем это в журнал ipchains -A $staticif"-i" -j DENY -i $staticif -s $localip/16 -d 0/0 -l #разрешаем все пакеты, идущие, откуда угодно, на статический интерфейс ipchains -A $staticif"-i" -j ACCEPT -i $staticif -s 0/0 -d $staticip/32 #запрещаем все остальные входящие пакеты - записываем это в журнал ipchains -A $staticif"-i" -j DENY -s 0/0 -d 0/0 -l #--------------------------------------------------------------------- #создаем пользовательский входящий поток для интерфейса локальной сети ipchains -N $localif"-i" #в этом потоке удаляем все правила (на всякий случай) ipchains -F $localif"-i" #разрешено посылать пакеты, куда угодно, с локального интерфейса с локальных машин ipchains -A $localif"-i" -j ACCEPT -i $localif -s $localip/24 -d 0/0 #запрещаем все остальные входящие пакеты - записываем это в журнал ipchains -A $localif"-i" -j DENY -s 0/0 -d 0/0 -l #--------------------------------------------------------------------- #создаем пользовательский входящий поток для интерфейса обратной петли ipchains -N $loopback"-i" #в этом потоке удаляем все правила (на всякий случай) ipchains -F $loopback"-i" #разрешено все, идущее на интерфейс обратной петли ipchains -A $loopback"-i" -j ACCEPT -i $loopback -s 0/0 -d 0/0 #запрещаем все остальные входящие пакеты - записываем это в журнал ipchains -A $loopback"-i" -j DENY -s 0/0 -d 0/0 -l #-------------------------------------------------------------------------- #Политика Firewall для проходящего потока #-------------------------------------------------------------------------- # создаем пользовательский проходящий поток для статического интерфейса ipchains -N $staticif"-f" #в этом потоке удаляем все правила (на всякий случай) ipchains -F $staticif"-f" #маскарадинг для всего, что идет из локальной сети, куда угодно ipchains -A $staticif"-f" -j MASQ -i $staticif -s $localip/24 -d 0/0 #запрещаем все остальные проходящие пакеты - записываем это в журнал ipchains -A $staticif"-f" -j DENY -s 0/0 -d 0/0 -l #--------------------------------------------------------------------- #создаем пользовательский проходящий поток для интерфейса локальной сети ipchains -N $localif"-f" #в этом потоке удаляем все правила (на всякий случай) ipchains -F $localif"-f" #запрещаем все остальные проходящие пакеты - записываем это в журнал ipchains -A $localif"-f" -j DENY -s 0/0 -d 0/0 -l #--------------------------------------------------------------------- #создаем пользовательский проходящий поток для интерфейса обратной петли ipchains -N $loopback"-f" #в этом потоке удаляем все правила (на всякий случай) ipchains -F $loopback"-f" #запрещаем все остальные проходящие пакеты - записываем это в журнал ipchains -A $loopback"-f" -j DENY -s 0/0 -d 0/0 -l #--------------------------------------------------------------------- #Политика Firewall для исходящего потока #--------------------------------------------------------------------- #создаем пользовательский исходящий поток для статического интерфейса ipchains -N $staticif"-o" #в этом потоке удаляем все правила (на всякий случай) ipchains -F $staticif"-o" #запрещены исходящие через статический интерфейс пакеты для локальной сети (ошибка маршрутизации) ipchains -A $staticif"-o" -j DENY -i $staticif -s 0/0 -d $localip/24 -l #запрещены исходящие через статический интерфейс пакеты из локальной сети (ошибка маскарадинга) ipchains -A $staticif"-o" -j DENY -i $staticif -s $localip/24 -d 0/0 -l # разрешено все остальное от статического интерфейса ipchains -A $staticif"-o" -j ACCEPT -i $staticif -s $staticip/32 -d 0/0 #запрещаем все остальные исходящие пакеты - записываем это в журнал ipchains -A $staticif"-o" -j DENY -s 0/0 -d 0/0 -l #--------------------------------------------------------------------- #создаем пользовательский исходящий поток для интерфейса локальной сети ipchains -N $localif"-o" #в этом потоке удаляем все правила (на всякий случай) ipchains -F $localif"-o" #разрешены пакеты, откуда угодно, на локальном интерфейса для локальных машин ipchains -A $localif"-o" -j ACCEPT -i $localif -s 0/0 -d $localip/24 #запрещаем все остальные исходящие пакеты - записываем это в журнал ipchains -A $localif"-o" -j DENY -s 0/0 -d 0/0 -l #--------------------------------------------------------------------- #создаем пользовательский исходящий поток для интерфейса обратной петли ipchains -N $loopback"-o" #в этом потоке удаляем все правила (на всякий случай) ipchains -F $loopback"-o" #разрешено все, идущее из интерфейса обратной петли ipchains -A $loopback"-o" -j ACCEPT -i $loopback -s 0/0 -d 0/0 #запрещаем все остальные исходящие пакеты - записываем это в журнал ipchains -A $loopback"-o" -j DENY -s 0/0 -d 0/0 -l #-------------------------------------------------------------------------- #Для большей уверенности разрешаем ядру переадресацию пакетов #-------------------------------------------------------------------------- /bin/echo 1 > /proc/sys/net/ipv4/ip_forward #-------------------------------------------------------------------------- #добавляем в стандартные потоки правила со ссылками на пользовательские потоки #-------------------------------------------------------------------------- #входящий поток на интерфейсе локальной сети ipchains -A input -i $localif -j $localif"-i" #входящий поток на статическом интерфейсе ipchains -A input -i $staticif -j $staticif"-i" # входящий поток на интерфейсе обратной петли ipchains -A input -i $loopback -j $loopback"-i" #------------------------------------------------------------------------- #исходящий поток на интерфейсе локальной сети ipchains -A output -i $localif -j $localif"-o" #исходящий поток на статическом интерфейсе ipchains -A output -i $staticif -j $staticif"-o" #исходящий поток на интерфейсе обратной петли ipchains -A output -i $loopback -j $loopback"-o" #------------------------------------------------------------------------- #проходящий поток на интерфейсе локальной сети ipchains -A forward -i $localif -j $localif"-f" #проходящий поток на статическом интерфейсе ipchains -A forward -i $staticif -j $staticif"-f" #проходящий поток на интерфейсе обратной петли ipchains -A forward -i $loopback -j $loopback"-f" #--------------------------------------------------------------------- #Проверка Сверх-Параноика --- несмотря на отказ всем пакетам по умолчанию, #блокируем все пакеты на всех интерфейсах #--------------------------------------------------------------------- #запрещаем все остальные входящие пакеты - записываем это в журнал ipchains -A input -j DENY -s 0/0 -d 0/0 -l #запрещаем все остальные исходящие пакеты - записываем это в журнал ipchains -A output -j DENY -s 0/0 -d 0/0 -l #запрещаем все остальные проходящие пакеты - записываем это в журнал ipchains -A forward -j DENY -s 0/0 -d 0/0 -l exit 0 |
Мини-HOWTO: Cipe+Маскарадинг в Linux
Anthony Ciaravalo
acj@home.com
Перевод: Станислав Рогин, ASPLinux
В этом документе дается описание настройки виртуальной частной сети (VPN), с использованием Linux-версии Cipe, работающей с использованием маскарадинга.
Настройка firewall
В этом документе я предполагаю, что ваше ядро уже поддерживает IP-маскарадинг. См. раздел "Ссылки", в котором приведены ссылки на информацию о включении в ядро поддержки IP-маскарадинга.
Шлюз
У всех машин сети 192.168.1.0 шлюз по умолчанию должен быть установлен в 192.168.1.1. Если этого не сделать - ничего не будет работать.
У всех машин сети 192.168.2.0 шлюз по умолчанию должен быть установлен в 192.168.2.1. Если этого не сделать - ничего не будет работать.
У всех машин сети 192.168.2.0 шлюз по умолчанию должен быть установлен в 192.168.2.1. Если этого не сделать - ничего не будет работать.
Собираем все вместе
Ниже приведен пример скрипта rc.local, запускающего все остальное при загрузке системы. Он включает в ядре защиту от spoofing-а, задает правила маскарадинга на firewall, и включает интерфейс(ы) cipe.
#!/bin/bash #4/4/99 #Пример скрипта rc.local #Вопросы и предложения посылайте по адресу acj@home.com. echo #Включаем в ядре защиту от spoofing-а #Это справедливо только для ядер версий 2.1/2.2 #if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ]; then # echo -n "Включаем защиту от IP-spoofing..." # for f in /proc/sys/net/ipv4/conf/*/rp_filter; do # echo 1 > $f # done # echo "done." #else # echo ВНИМАНИЕ! НЕ УДАЛОСЬ ВКЛЮЧИТЬ ЗАЩИТУ ОТ SPOOFING-а. # echo "Клавиши CONTROL-D прервут работу этой оболочки, и процесс загрузки системы продолжится." # echo # # Запускаем однопользовательскую оболочку на консоли # /sbin/sulogin $CONSOLE #fi echo #Настраиваем firewall if [ -x /etc/rc.d/rc.firewall ]; then echo Настройка правил фильтрования пакетов firewall. echo . /etc/rc.d/rc.firewall fi #Включение интерфейса(ов) cipe if [ -x /etc/rc.d/rc.cipe ]; then echo Запуск интерфейсов VPN. . /etc/rc.d/rc.cipe fi exit 0 |
Соединяемся с СЕТЬЮ (WAN)
К этому моменту ваш интерфейс cipe должен работать. Попробуйте дать команду ping, указав ей адрес машины в другой сети. Если это не удалось, то проверьте на firewall-машине следующее:
Включена ли переадресация пакетов в ядре?
Выдает ли команда ifconfig примерно следующее:
cipcb0 Link encap:IPIP Tunnel HWaddr inet addr:192.168.1.1 P-t-P:192.168.2.1 Mask:255.255.255.255 UP POINTOPOINT NOTRAILERS RUNNING NOARP MTU:1442 Metric:1 RX packets:28163 errors:6 dropped:0 overruns:0 frame:6 TX packets:29325 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 |
Есть ли в таблице маршрутизации строка, относящаяся к удаленной cipe-машине:
192.168.2.1 * 255.255.255.255 UH 0 0 0 cipcb0 |
Есть ли в таблице маршрутизации строка, относящаяся к удаленной cipe-сети:
192.168.2.0 * 255.255.255.0 U 0 0 0 cipcb0 |
Проверьте журналы - нет ли в них сообщений об ошибках?
Если машины за разными firewall не видят друг друга, то проверьте правильность настройки обоих шлюзов.
После того, как, между машинами в разных подсетях, у вас начнет работать ping, ftp, telnet, и т.п., то следующим вашим шагом будет настройка межсетевой работы SAMBA. Подсказка: вам потребуются lmhosts или wins-сервер, а также "trusted domains" для NT. У меня все работает, но это находится за пределами обсуждения данного документа (как минимум, на текущий момент).
Если вы использовали пример настройки маскарадирующего firewall, то ваши машины должны иметь возможность подключиться к internet. Если нет - проверьте системные журналы. Вы можете также попробовать использовать tcpdump - посмотрите, что происходит с пакетами.
Структура VPN
Машины связаны по технологии "звезда". Мы установим одно cipe-соединение между машинами A и B, и второе между A и C.
Веб-сайты
Linux HQ ---хороший сайт с информацией по linux