Фаервол нам нужен для ограничения подключения из вне, NATа, а также проброса портов. Для удоства написал скрипт на bash. Вставляем в файл /etc/init.d/rc.firewall
#!/bin/bash
IPTABLES="/sbin/iptables"
############### Config #######
LNETS="eth1 eth2 wlan0"
DESKTOP="192.168.1.1"
DESKTOP_OPEN_PORT="8010 9000"
DESKTOP2="192.168.2.1"
DESKTOP2_OPEN_PORT="9003"
HOME_MASKS="192.168.1.0/24 192.168.2.0/24 192.168.3.0/24"
PROVIDER="eth0"
PROVIDER_IP="10.0.4.59"
PROVIDER_MASK="10.0.0.0/8"
INET="ppp+"
WHITE_IP="77.77.77.77"
OPEN_PORTS="22,80"
###################
echo 1 > /proc/sys/net/ipv4/conf/default/rp_filter
echo 1 > /proc/sys/net/ipv4/ip_forward
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe nf_nat_pptp
modprobe nf_conntrack_pptp
modprobe nf_conntrack_proto_gre
modprobe nf_nat_proto_gre
modprobe iptable_nat
modprobe ip_nat_ftp
modprobe ipt_LOG
$IPTABLES -P INPUT ACCEPT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD DROP
$IPTABLES -F
$IPTABLES -X
$IPTABLES -t nat -F PREROUTING
$IPTABLES -t nat -F POSTROUTING
############ DELETE IF ALL WORKING FINE ######
#$IPTABLES -A INPUT -j ACCEPT
#####################################
#mtu for vpn magick command, mega debian epic fail
$IPTABLES -o $INET -A FORWARD -p tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 800:1536 -j TCPMSS --clamp-mss-to-pmtu
# DENY SECTIONS
$IPTABLES -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
$IPTABLES -A INPUT -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j DROP
# local interface, allow all
$IPTABLES -A INPUT -i lo -j ACCEPT
# ALLOW PACKETS IF CONNECTION ESTABLISHED
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# access from white ip
$IPTABLES -A INPUT -s $WHITE_IP -j ACCEPT
# access from home net
for i in $HOME_MASKS; do
$IPTABLES -A INPUT -s $i -j ACCEPT
done
# defence for ssh for server
$IPTABLES -A INPUT -p tcp -m state --state NEW --dport 22 -m recent --update --seconds 20 -j DROP
$IPTABLES -A INPUT -p tcp -m state --state NEW --dport 22 -m recent --set -j ACCEPT
# open ports for server
$IPTABLES -A INPUT -p tcp --syn -m multiport --destination-ports $OPEN_PORTS -j ACCEPT
######### FORWARD ##########
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
#forward each home eth to provider eth and ppp+
for i in $LNETS; do
$IPTABLES -A FORWARD -i $INET -o $i -j ACCEPT
$IPTABLES -A FORWARD -i $i -o $INET -j ACCEPT
$IPTABLES -A FORWARD -i $i -o $PROVIDER -j ACCEPT
#forward each home eth to other home eth
for j in $LNETS; do
if [ "$i" != "$j" ] ; then
$IPTABLES -A FORWARD -i $i -o $j -j ACCEPT
$IPTABLES -A FORWARD -i $j -o $i -j ACCEPT
fi
done
done
###########################
######### LOCAL NAT ########
for i in $HOME_MASKS; do
$IPTABLES -t nat -A POSTROUTING -s $i -d $PROVIDER_MASK -j SNAT --to-source $PROVIDER_IP
done
############################
######### INET NAT #########
for i in $HOME_MASKS; do
$IPTABLES -t nat -A POSTROUTING -s $i -j SNAT --to-source $WHITE_IP
done
############################
########## FORWARD PORTS #########
for i in $DESKTOP_OPEN_PORT; do
$IPTABLES -t nat -A PREROUTING -p tcp --dport $i -j DNAT --to $DESKTOP:$i
$IPTABLES -A FORWARD -p tcp -d $DESKTOP --dport $i -j ACCEPT
done
for i in $DESKTOP2_OPEN_PORT; do
$IPTABLES -t nat -A PREROUTING -p tcp --dport $i -j DNAT --to $DESKTOP2:$i
$IPTABLES -A FORWARD -p tcp -d $DESKTOP2 --dport $i -j ACCEPT
done
# ssh for destop with defence
$IPTABLES -t nat -A PREROUTING -p tcp --dport 12345 -j DNAT --to $DESKTOP:22
$IPTABLES -A FORWARD -p tcp -m state -d $DESKTOP --state NEW --dport 12345 -m recent --update --seconds 20 -j DROP
$IPTABLES -A FORWARD -p tcp -m state -d $DESKTOP --state NEW --dport 12345 -m recent --set -j ACCEPT
# ping
$IPTABLES -A INPUT -p ICMP --icmp-type 8 -j ACCEPT
# deny other ICMP packets
$IPTABLES -A INPUT -p icmp -j DROP
# other reject
$IPTABLES -A INPUT -j DROP $IPTABLES -A FORWARD -j DROP
Делаем скрипт исполняемым:
1
chmod +x /etc/init.d/rc.firewall
И прописываем в автозагрузку
1
update-rc.d rc.firewall defaults
По сути в нём всё лаконично закоментированно, но iptables – та ещё магия. В скрипте почти все настройки вынесены. Скрипт разрешает форвардинг между всеми интерфейсами, включает NAT, разрешает пинги до сервера. Всё что явно не разрешено, то запрещено. Бонусом есть защита ssh от брута, форвардинг ssh с порта 12345 на 22 порт домашнего компьютера, форвардинг портов на внутренние компьютеры (разделяются пробелом) Там найдёте магическую строку с моим негативом. Дебиан почему-то не может поставить MTU для ppp. Всё бы ничего, но некоторые сайты не открываются (nix.ru, mail.ru). Как говорят знакомые админы баг тянется ещё с etch. Отписал баг-репорт, ничего внятного так и не ответили. В Ubuntu 9.10, когда настраивал VPN скриптом, всё с mtu было нормально. Благодарю нашего админа за предоставление конфигов и помощи в настройках Теперь у всех домашних компьютеров есть интернет и настроен фаервол. Следующие статьи будут о полезных программах, настройке веб-сервера.
Втыкаем патч корд в сервер в сетевую карту eth1, а другой конец в главный десктоп. Пока что настройте на десктопе вручную сеть: ip: 192.168.1.1, маска: 255.255.255.0, шлюз 192.168.1.254.
Не всегда известно у сетевой карты интерфейс. Попробуйте с компьютера попинговать 192.168.1.254, если не пингуется, вставляйте в другую сетевуху до того момента, когда пинги появятся. Для удобства можно измененить названия интерфейсов (eth0, eth1, eth2 и т.д.) для сетевых карт. Для этого поправьте файл /etc/udev/rules.d/70-persistent-net.rules
Ставим пакеты ssh-server для удалённого управления сервером и pptp-linux для интернета. Во время установки не вынимайте CD диск с установщиком – на нём находятся эти пакеты.
1
aptitude install openssh-server pptp-linux
Теперь можно зайти на сервер по ssh с десктопа. На компьютере у меня Ubuntu 10.04, поэтому я захожу на сервер командой:
1
ssh root@192.168.1.254
Принимаем rsa ключ и вводим пароль. Всё, мы на сервере.
Создаём настройки для vpn:
1
nano /etc/ppp/peers/tvoynet
Настройки для vpn-соединения такие: сервер: vpn.tvoynet.ru, шифрование 128 бит
В конфигурации указано следующее: если через 40 секунд (4 раза по 10 секунд) не будет доступен интернет, то будет переподниматься vpn-соединение с промежутками 20 секунд до тех пор, пока соединение не подниметься. Записываем пароль в файл /etc/ppp/chap-secrets:
1
ЛОГИН PPTP ПАРОЛЬ
Интернет подключается по команде
1
pon tvoynet
Отключается:
1
poff tvoynet
Добавляем маршруты для локальных ресурсов (и на всякий случай убираем дефолтные маршруты в домашних подсетях) и подключение к интернету при загрузке. В файл /etc/rc.local вставляем до строки exit 0
1234
route del default dev eth1
route del default dev eth2
route add -net 10.0.0.0 netmask 255.0.0.0 gw 10.0.4.254 eth0
pon tvoynet
Перезагружаем сервер для проверки: shutdown -r now. Должен появиться интерфейс ppp0. Как обычно проверяем наличие интернета пингом до ya.ru
Интернет есть, теперь обновляемся.
Запускаем aptitude. Нажимаем U (это эквивалентно aptitude update) для обновления списка пакетов. Если будут обновления, полявиться раздел: Upgradable Packages (n). Выбираем этот раздел и нажимаем +(плюс). Далее нажимаем g, выведуться все пакеты для обновления, удаления, установки. Можно отменить обновление какого-либо пакета, выбрав его и нажав :(двоеточие). И снова нажимаем g для обновления.
Нужно установить сервер dhcp для раздачи автоматических настроек для домашних компьютеров, а также DNS-сервер bind9.
В aptitude нажимаем .(точка в английской раскладке, левее правого шифта) – это вызовет поиск. Вводим dhcp3 и нажимаем n до тех пор, пока не найдём пакет dhcp3-server, нажимаем +(плюс). Далее опять вызываем поиск, вводим ^bind9$ (^ – означает начало строки, $ – конец строки), т.е. мы ищем по полному совпадению, ставим и его.
Последний абзац означает привязку ip адреса 192.168.1.1 к mac-адресу 00:1a:1d:9f:46:91 для хоста stamm-desktop. Аналогично добавляем для других домашних компьютеров. Чтобы узнать mac адрес других компьютеров в сети, наберите arp.
Меняем файл /etc/default/dhcp3-server для установки прослушивающих интерфейсов для DHCP сервера
1
INTERFACES="eth1 eth2 wlan0"
Рестартуем dhcp сервер:
1
invoke-rc.d dhcp3-server restart
Теперь очередь за bind9 /etc/bind/named.conf.options
1234567891011
options {
directory "/var/cache/bind";
forwarders {
10.0.0.1;
10.0.0.10;
};
auth-nxdomain no; # conform to RFC1035
listen-on-v6 { none; };
};
Этим мы просто форвардим запросы на другие dns-сервера. В данном случае 10.0.0.1 и 10.0.0.10
Рестартуем bind9:
1
invoke-rc.d bind9 restart
Теперь убираем ручные настройки на компьютере, должен присвоиться адрес 192.168.1.1. Теперь можно подключить второй компьютер.
Есть несколько инструкций по настройке wi-fi карты dlink DWA-520, например, Ubuntu 9.04 По команде
1
lspci -v
Выдаёт информацию по карте:
123456
01:06.0 Ethernet controller: Atheros Communications Inc. Atheros AR5001X+ Wireless Network Adapter (rev 01)
Subsystem: D-Link System Inc Device 3a73
Flags: bus master, medium devsel, latency 168, IRQ 16
Memory at e4000000 (32-bit, non-prefetchable) [size=64K]
Capabilities: [44] Power Management version 2
Kernel driver in use: ath5k
Устанавливаем hostapd
1
aptitude install hostapd
Редактируем файл /etc/hostapd/hostapd.conf
1234567891011121314151617
interface=wlan0
driver=nl80211
#Названии точки доступа
ssid=Server1
hw_mode=g
channel=2
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_key_mgmt=WPA-PSK
wpa_passphrase=SuperParol
wpa_pairwise=TKIP
rsn_pairwise=TKIP
Пока без NAT компьютеры не могут выходить в интернет. Читайте в следующей статье. Учтите, ваш сервер доступен из-вне. На него можно законектиься по ssh через интернет – будьте осторожны. Нужно настроить фаервол. В следующей статье мы как раз этим и займёмся.
Есть цель написать статьи по настройке домашнего сервера для различных нужд:
шлюз для выхода всех компьютеров в квартире в интернет через vpn (pptp) + wi-fi
веб-сервер
торрент-качалка + samba
эксперименты
Схема сети такая:
Эти статьи будут и как напоминающая инструкция самому себе.
Начну с самого начала: установка системы GNU/Linux.
Лирическое отступление:
Есть довольного много серверных дистрибутивов: Debian, Ubuntu, Gentoo, Arch, Slackware, etch. Можно много холиварить на эти темы. Мой выбор Debian был обусловлен несколькими факторами:
Человек, который мне порекомендовал посмотреть Linux, пользовался Debian и это оставило свой след: я мог спросить о непонятных вещах и получить быстрый толковый ответ. На мой взгляд, ОС должна быть простой и понятной Люблю пакетные дистрибутивы Почему не Ubuntu, спросите вы? Знакомые linux-админы ставили ubuntu LTS: 6.06 и 8.04 на боевые сервера. По их словам 6.06 был отличным, но 8.04 стал очень медленным. Поставленный Debian на тот же сервак летал по сравнению с Ubuntu 8.04. Сам на домашнем компьютере использую Ubuntu, Debian уж слижком чопорный для десктопа. Но в качестве серверного дистрибутива однозначно Debian.
Другие дистрибутивы пробывал, но они жили в моей виртуалке не больше суток. Каждый выбирает свой дистрибутив, но я покажу установку, а в следующих постах и базовую настройку Debian 5.0.5 с апгрейдом до sid. Вопреки стериотипам, Sid (он же unstable) работает довольно стабильно. За всё время его использования не возникало проблем. Плюс в репозитариях присутствуют свежие пакеты программ.
Итак, поехали.
Скачиваем последний дистрибутив Debian. Если у вас 64 битный процессор, то лучше скачать amd64, если 32 битный, то i386. В процессе своей работы столкнулся с такой проблемой: на 32-битной системе функция intval работала только с числами от -2147483648 до 2147483647. Решение данной проблемы было найдено только на 2-ой день на php.net.
The maximum value depends on the system. 32 bit systems have a maximum signed integer range of -2147483648 to 2147483647. So for example on such a system, intval(’1000000000000′) will return 2147483647. The maximum signed integer value for 64 bit systems is 92233720368547758007 Ставлю Debian на старый компьютер (Athlon 1700, 512 Mb Ram, 40+160 Gb HDD) В моём случае Debian 5.0.5 i386.
Установка тривиально, в интернете полно статей по этому поводу со скриншотами. Несколько замечаний от меня: ставить только английский язык и устанавливать только базовую систему.
Здравствуйте, обычно при создании проектов в интернете при вопросе безопасности большее внимание уделяют веб-приложению, а о защите самого сервера забывают, а именно о firewall’е. Я понимаю, что настройкой сервера, и в том числе firewall’а, должен заниматься специальный человек — сисадмин, но во многих ситуациях получается так, что программист сам себе админ. На настройку firewall’а даже у программиста уйдёт всего лишь около 1 дня — это избавит от потенциальных проблем. От каких? Сейчас расскажу небольшую историю «взлома». В моём городе у провайдера, который занимает лидирующее положение, есть локальный трекер, довольно таки большой (не будем про нелегальность, нас интересует только вопрос безопасности проекта). Т.к. я занимаюсь разработкой другого трекера меня интересуют различные новые возможности, и я периодически захожу на разные трекеры, в том числе и на него. Однажды я увидел ошибку 502 Bad Gateway от nginx, и решил позже зайти прямо на apache. Обычно apache перевешивают на порт 8080. Зашёл — значит firewall не настроен, посмотрел на заголовки ответа — стояла FreeBSD. Я думаю, что те, кто ставит фряху, должен быть довольно опытен в настройке и просто забыл закрыть порт, при установке nginx как фронтэнда, а apache’а как бэкенда. И я решил проверить Nmap проверил, что все порты, которые используют приложения открыты: 21, 22, 25, 80, 3306, 8080 и ещё несколько портов. Т.к. я тоже занимаюсь разработкой, я знал, что этот движок трекера (torrentpier) имеет возможность использования кэширования через memcached. Проверил стандартный порт memcached — порт был открыт. Написал простецкий скрипт соединения к memcached. Изучив исходники torrentpier, я узнал названия ключей, в которых происходит запись кэша. Из них интересными оказались 2 значения: массив настроек трекера и полный html-код главной страницы для незалогиненного пользователя. Из настроек трекера я узнал логин, пароль и адрес smtp сервера, т.е. потенциальный взломщик уже может рассылать спам (smtp же тоже не закрыт). Попробовал пароль от smtp в качестве пароля администратора трекера — получилось, я получил администраторский доступ к трекеру. Я понимаю, что это было «удачное» стечение обстоятельств, но просто закрытие портов уже бы помогло.
Заключение
Кроме безопасности самого веб-приложения (php, python, ruby, etc), но и о безопасности самого сервера (в частности firewall’а) и всех используемых параллельно инструментов. Так же нужно делать разные пароли для всего (почта, БД, ftp) даже на уровне 1 проекта.
P.S.: Делал это я не для того, чтобы что-то сломать, а просто из «спортивного» интереса. Администратор трекера был почти сразу уведомлён о возможности «взлома», в том числе о каждом шаге. %Username%, а у тебя настроен firewall?