Развёртывание домашнего сервера
Материал из Gentoo Linux Wiki
- Вернуться в раздел руководства
Содержание |
[править] Введение
Это руководство посвящено настройке чистой Gentoo в качестве домашнего шлюза и файрвола. Но не смотря на то, что здесь даются некоторые дополнительные сведения, эта статья не углубляется в особенности сетевой безопасности.
[править] Установка Gentoo
Для начала, выполните установку системы, следуя этому Gentoo Handbook руководству.
[править] USE FLAGS
Отключите X, поскольку использование X сервера может снизить безопасность нашей системы.
| Файл: /etc/make.conf |
USE="-kde -gnome -X" |
| Примечание: можно также добавить "-gtk" |
| Файл: /usr/src/linux/.config |
# config from a gentoo-sources : 2.6.16-r7 # Loadable module support # CONFIG_MODULES=y # CONFIG_MODULE_UNLOAD is not set CONFIG_OBSOLETE_MODPARM=y # CONFIG_MODVERSIONS is not set # CONFIG_MODULE_SRCVERSION_ALL is not set CONFIG_KMOD=y # # Networking # CONFIG_NET=y # # Networking options # # CONFIG_NETDEBUG is not set CONFIG_PACKET=y CONFIG_PACKET_MMAP=y CONFIG_UNIX=y # CONFIG_NET_KEY is not set CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y CONFIG_ASK_IP_FIB_HASH=y # CONFIG_IP_FIB_TRIE is not set CONFIG_IP_FIB_HASH=y # CONFIG_IP_MULTIPLE_TABLES is not set # CONFIG_IP_ROUTE_MULTIPATH is not set # CONFIG_IP_ROUTE_VERBOSE is not set # CONFIG_IP_PNP is not set # CONFIG_NET_IPIP is not set # CONFIG_NET_IPGRE is not set # CONFIG_IP_MROUTE is not set # CONFIG_ARPD is not set # CONFIG_SYN_COOKIES is not set # CONFIG_INET_AH is not set # CONFIG_INET_ESP is not set # CONFIG_INET_IPCOMP is not set # CONFIG_INET_TUNNEL is not set CONFIG_INET_DIAG=y CONFIG_INET_TCP_DIAG=y # CONFIG_TCP_CONG_ADVANCED is not set CONFIG_TCP_CONG_BIC=y # # IP: Virtual Server Configuration # # CONFIG_IP_VS is not set # CONFIG_IPV6 is not set CONFIG_NETFILTER=y # CONFIG_NETFILTER_DEBUG is not set # # Core Netfilter Configuration # # CONFIG_NETFILTER_NETLINK is not set CONFIG_NETFILTER_XTABLES=m CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m # CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set CONFIG_NETFILTER_XT_TARGET_MARK=m CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m # CONFIG_NETFILTER_XT_TARGET_NOTRACK is not set CONFIG_NETFILTER_XT_MATCH_COMMENT=m # CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set # CONFIG_NETFILTER_XT_MATCH_CONNMARK is not set CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m CONFIG_NETFILTER_XT_MATCH_DCCP=m CONFIG_NETFILTER_XT_MATCH_HELPER=m CONFIG_NETFILTER_XT_MATCH_LENGTH=m CONFIG_NETFILTER_XT_MATCH_LIMIT=m CONFIG_NETFILTER_XT_MATCH_MAC=m CONFIG_NETFILTER_XT_MATCH_MARK=m CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m CONFIG_NETFILTER_XT_MATCH_REALM=m CONFIG_NETFILTER_XT_MATCH_SCTP=m CONFIG_NETFILTER_XT_MATCH_STATE=m CONFIG_NETFILTER_XT_MATCH_STRING=m CONFIG_NETFILTER_XT_MATCH_TCPMSS=m # # IP: Netfilter Configuration # CONFIG_IP_NF_CONNTRACK=m CONFIG_IP_NF_CT_ACCT=y CONFIG_IP_NF_CONNTRACK_MARK=y CONFIG_IP_NF_CONNTRACK_EVENTS=y # CONFIG_IP_NF_CT_PROTO_SCTP is not set CONFIG_IP_NF_FTP=m CONFIG_IP_NF_IRC=m # CONFIG_IP_NF_NETBIOS_NS is not set # CONFIG_IP_NF_TFTP is not set # CONFIG_IP_NF_AMANDA is not set # CONFIG_IP_NF_PPTP is not set # CONFIG_IP_NF_QUEUE is not set CONFIG_IP_NF_IPTABLES=m CONFIG_IP_NF_MATCH_IPRANGE=m CONFIG_IP_NF_MATCH_MULTIPORT=m CONFIG_IP_NF_MATCH_TOS=m CONFIG_IP_NF_MATCH_RECENT=m CONFIG_IP_NF_MATCH_ECN=m CONFIG_IP_NF_MATCH_DSCP=m CONFIG_IP_NF_MATCH_AH_ESP=m CONFIG_IP_NF_MATCH_TTL=m CONFIG_IP_NF_MATCH_OWNER=m CONFIG_IP_NF_MATCH_ADDRTYPE=m CONFIG_IP_NF_MATCH_HASHLIMIT=m CONFIG_IP_NF_FILTER=m CONFIG_IP_NF_TARGET_REJECT=m CONFIG_IP_NF_TARGET_LOG=m CONFIG_IP_NF_TARGET_ULOG=m CONFIG_IP_NF_TARGET_TCPMSS=m CONFIG_IP_NF_NAT=m CONFIG_IP_NF_NAT_NEEDED=y CONFIG_IP_NF_TARGET_MASQUERADE=m CONFIG_IP_NF_TARGET_REDIRECT=m CONFIG_IP_NF_TARGET_NETMAP=m CONFIG_IP_NF_TARGET_SAME=m CONFIG_IP_NF_NAT_SNMP_BASIC=m CONFIG_IP_NF_NAT_IRC=m CONFIG_IP_NF_NAT_FTP=m CONFIG_IP_NF_MANGLE=m CONFIG_IP_NF_TARGET_TOS=m CONFIG_IP_NF_TARGET_ECN=m CONFIG_IP_NF_TARGET_DSCP=m CONFIG_IP_NF_TARGET_TTL=m CONFIG_IP_NF_TARGET_CLUSTERIP=m CONFIG_IP_NF_RAW=m # CONFIG_IP_NF_ARPTABLES is not set # # DCCP Configuration (EXPERIMENTAL) # # CONFIG_IP_DCCP is not set # # SCTP Configuration (EXPERIMENTAL) # # CONFIG_IP_SCTP is not set # # TIPC Configuration (EXPERIMENTAL) # # CONFIG_TIPC is not set # CONFIG_ATM is not set # CONFIG_BRIDGE is not set # CONFIG_VLAN_8021Q is not set # CONFIG_DECNET is not set # CONFIG_LLC2 is not set # CONFIG_IPX is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_NET_DIVERT is not set # CONFIG_ECONET is not set # CONFIG_WAN_ROUTER is not set # # QoS and/or fair queueing # # CONFIG_NET_SCHED is not set CONFIG_NET_CLS_ROUTE=y # # Network testing # # CONFIG_NET_PKTGEN is not set # CONFIG_HAMRADIO is not set # CONFIG_IRDA is not set # CONFIG_BT is not set # CONFIG_IEEE80211 is not set |
Используйте эти настройки только в качестве руководства, поскольку они расчитаны на конкретно мою конфигурацию. Но если вы знаете что делаете, изменяйте их на своё усмотрение.
[править] Сеть
Одним из требований к нашему серверу является правильное обеспечение доступа как со стороны локальной сети, так и со стороны Интернет. Всё это можно найти в Gentoo Handbook.
[править] Проект сети
Проект сети, которая описывается в этом руководстве, выглядит так:
__________ _____________ ______________ __________ | | | | | | | | | internet |=====| cable modem |===(R) gentoo box (G)===| intranet | |__________| |_____________| |______________| |__________| Интерфейс R (или Red) : eth0, 123.1.1.1. Интерфейс G (или Green): eth1, 192.168.0.1.
Сервер получает свой IP (123.1.1.1) на внешнем сетевом интерфейсе eth0 через DHCP от модема (cable modem). Другой интерфейс, eth1, имеет статический IP (192.168.0.1) и связан с локальной сетью (intranet). Для этого сделайте следующие изменения в файле /etc/conf.d/net:
| Файл: /etc/conf.d/net |
config_eth0="dhcp" config_eth1="192.168.0.1 netmask 255.255.255.0" |
Не забудьте закомментировать другие строки (помещая # в начало каждой строки). Теперь добавим сетевые устройства в сценарий загрузки:
cd /etc/init.d ln -sf net.lo net.eth0 ln -sf net.lo net.eth1 rc-update add net.eth0 default rc-update add net.eth1 default # start interfaces /etc/init.d/net.eth0 start /etc/init.d/net.eth1 start
Если всё заработало, вы должны увидеть нечто подобное при вызове ifconfig:
nexus linux # ifconfig
eth0 Link encap:Ethernet HWaddr 00:C5:2C:D5:F5:48
inet addr:123.1.1.1 Bcast:123.1.1.255 Mask:255.255.255.0
UP BROADCAST NOTRAILERS RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2628042 errors:0 dropped:0 overruns:0 frame:0
TX packets:1014124 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:510846263 (487.1 Mb) TX bytes:510083552 (486.4 Mb)
Interrupt:11 Base address:0x6c00
eth1 Link encap:Ethernet HWaddr 00:F0:7C:D3:B7:98
inet addr:192.168.0.1 Bcast:192.168.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:853111 errors:0 dropped:0 overruns:0 frame:0
TX packets:748590 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:500603484 (477.4 Mb) TX bytes:231023059 (220.3 Mb)
Interrupt:10 Base address:0x8800
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:549 errors:0 dropped:0 overruns:0 frame:0
TX packets:549 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:43074 (42.0 Kb) TX bytes:43074 (42.0 Kb)
Заработало! Теперь, когда мы убедились, что базовые сетевые настройки работают, давайте займёмся делом... Для начала:
[править] Файрволл
Так, это очень важно... если ваш сервер будет работать круглыми сутками, то попытки его взлома весьма вероятны. Я думаю, что при распространённости W32.blaster-подобных червей и троянов, мне не придёться объяснять пользу от файрвола. Здесь даны лишь базовые настройки, так что не поленитесь в дальнейшем настроить iptable-rules в соответствии с требуемым уровнем безопасности. Маскарадинг даёт компьютерам в вашей сети возможность соединяться с другими через Интернет (более или менее напрямую). Это не требуется для простого просмотра web страниц, поскольку предварительно настроенного squid будет вполне достаточно, но для множества других приложений (таких как ftp-клиенты, IM, email-клиенты или файлообменные программы) требуется прямое соединение. Давайте вспомним проект нашей сети:
__________ _____________ ______________ __________ | | | | | | | | | internet |=====| cable modem |===(R) gentoo box (G)===| intranet | |__________| |_____________| |______________| |__________| Интерфейс R (или Red) : eth0, 123.1.1.1. Интерфейс G (или Green): eth1, 192.168.0.1.
На данный момент, все в нашей сети (192.168.0.*) могут спокойно перемещаться по Интернет. Но Веб - это не только www. К примеру 192.168.0.15 (назовём его foo) захочет установить ftp-соединение ftp.cdrom.com, то у него ничего не выйдет, потому что:
- foo не знает через что ему подключаться (не установлен шлюз по умолчанию)
- сервер ему ничего не "скажет" (не работает маршрутизация)
- foo не имеет доступа к dns серверу (нужно установить dnsmasq)
[править] Что такое IP Маскарадинг?
IP маскарадинг является одним из видов преобразования сетевых адресов и поддерживается большинством маршрутизаторов. Смысл в том, что пользователи Linux могут использовать технологию IP маскарадинга, разработанную под Linux, и получать функции дорогостоящих маршрутизаторов абсолютно бесплатно.
IP маскарадинг позволяет использовать компьютер, подключённый к Интернет и имеющий реальный IP адрес, в качестве шлюза, для неподключённых к Интернет машин благодаря подмене IP адресов. Т.е. компьютер с реальным адресом обрабатывает пакеты, идущие из локальной сети в Интернет, а приходящие на них ответы перенаправляет обратно в локальную сеть.
Добавьте следующие правила (для маскарадинга): (взято из http://tldp.org/HOWTO/Masquerading-Simple-HOWTO/)
## первая строка сбрасывает наши правила # iptables -F; iptables -t nat -F; iptables -t mangle -F # iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE # echo 1 > /proc/sys/net/ipv4/conf/all/forwarding # iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # iptables -A INPUT -m state --state NEW -i ! eth0 -j ACCEPT # iptables -A INPUT -p icmp -j ACCEPT # iptables -P INPUT DROP
[править] Если вы используете pppoe с маскарадингом
Для пользователей, подключённых через pppoe, значение MTU для ppp0 интерфейса может быть установлено меньше чем 1500. Это может привести к проблемам доступа с компьютеров локальной сети.
Это только в случае, если вы хотите разделить подключение к Интернет вашей сети напрямую, без установки прокси (прокси в этой конфигурации может быть установлен и по другим причинам)
Симптомы:
- вы получаете нормальный доступ с сервера/маршрутизатора
- вы получаете доступ только к определенным сайтам из локальной сети (те на которые вы не можете зайти, выглядят как подключённые только не загружаются. В браузере вы видите "Waiting for <website>..." и на этом всё зависает)
- вы можете соединиться только определёнными IMs и иногда частично (т.е., в случае Yahoo! Messenger, вы подключаетесь, но контакт-лист не загружается.)
Это говорит о том, что некоторые провайдеры или серверы блокируют фрагментированные ICMP пакеты (смотри "man iptables", секция TCPMSS, для более подробной информации).
Решением является использование правила для TCPMSS из iptables, для контроля максимального размера этих пакетов.
Чтобы сделать это, добавьте следующую команду к правилам iptables:
# iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
или:
# iptables -I FORWARD -o ppp0 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
[править] "The Gentoo Way": загрузка правил файрволла/маскарадинга
В iptables-1.2.9 (именно эту версию я и использую), iptables ebuild устанавливает также интересные сценарии инициализации, для запуска файрволла во время загрузки, также как и других демонов (dhcpd, ftpd или apache).
Конфигурационный файл этого сценария инициализации /etc/conf.d/iptables. Так он должен вышлядеть:
| Файл: /etc/conf.d/iptables |
# /etc/conf.d/iptables # Location in which iptables initscript will save set rules on # service shutdown IPTABLES_SAVE="/var/lib/iptables/rules-save" # Options to pass to iptables-save and iptables-restore SAVE_RESTORE_OPTIONS="-c" # Save state on stopping iptables SAVE_ON_STOP="yes" |
Переменная IPTABLES_SAVE предназначена для установки правил файрволла при его загрузке.
| Файл: /etc/sysctl.conf |
# Disables packet forwarding #net.ipv4.ip_forward = 0 |
Вы должны раскомментировать строку net.ipv4.ip_forward = 0 code> и заменить её значение на 1. Тогда команда echo 1 > /proc/sys/net/ipv4/ip_forward code> будет выполняться за вас.
Для сохранения нашей конфигурации:
# /etc/init.d/iptables save
Теперь запуск:
# /etc/init.d/iptables start
Используйте эту команду для добавления iptables в список загрузки:
# rc-update add iptables default
Теперь всё должно работать, а также настраиваться автоматически при загрузке.
| Примечание: Если вы установили/используете другой файрволл (т.е., если вы выбрали опцию firewalling в pppoe-setup), то возможны проблемы при загрузке/сохранении правил iptables. |
Вы можете найти дополнительные сведения здесь: Настройка_iptables_для_начинающих
[править] Рекомендуемые пакеты
Если вы собираетесь использовать систему gentoo без монитора и клавиатуры, то я настоятельно рекомендую установить OpenSSH, что позволит управлять вашей машиной удалённо.
[править] OpenSSH
Смотри Index:OpenSSH Примечание: установки SSH по умолчанию вполне работоспособны. Автозагрузка при запуске:
- /etc/init.d/sshd start
- rc-update add sshd default
Для пущей безопастности можно изменить конфиг:
| Файл: /etc/ssh/sshd_config |
Protocol 2 LoginGraceTime 45 ##позволенный для регистрации промежуток времени## PermitRootLogin no ##запрет на вход в систему как root## StrictModes yes MaxAuthTries 2 ##количество позволенных попыток регистрации## PasswordAuthentication no UsePAM yes X11Forwarding yes Subsystem sftp /usr/lib/misc/sftp-server AllowUsers user ##пользователи которые могут использовать доступ## |
Добавляем пользователя с правом стать root`ом.
# useradd --groups wheel user
перезапускаем
# /etc/init.d/sshd restart
Теперь имеется достаточно надежная конфигурация ssh.
Авторизация проходит так:
login as: user Using keyboard-interactive authentication. Password: Last login: Wed Jan 30 17:42:23 2008 from 192.168.1.2 user@work ~ $ su Пароль: work user #
[править] DHCP
Теперь пришло время сделать наш сервер более комфортабельным с помощью dhcp. Вы можете спросить, что же хорошего в том, что dhcp-сервер будет работать для назначения IP адресов всего лишь 2-3 компьютеров? Что ж, если вы иногда меняете структуру вашей сети, т.е. к вам приходят друзья со своими ноутбуками или, в конце концов, целыми компьютерами порубиться с вами в какую-нибудь сетевую игру, то было бы весьма удобно, если IP адреса, диапазоны сети, шлюзы и dns устанавливались автоматически. К тому же, настроить всё это очень легко!
У вас есть выбор между ISC DHCPd и dnsmasq. Пакет dnsmasq является альтернативой использования более традиционного демона dhcpd. Он делает то же, что и dhcpd, но ко всему прочему обладает функциональностью локального DNS сервера! Теперь вы можете избежать преждевременного старения и выпадения волос, которое происходит при использовании BIND в качестве небольшого DNS сервера в вашей сети.
[править] ISC DHCP
# emerge net-misc/dhcp
Вот настройки, требуемые в /etc/dhcp/dhcpd.conf (скопируйте вначале пример) :
| Файл: /etc/dhcp/dhcpd.conf |
default-lease-time 3600;
max-lease-time 7200;
authorative;
log-facility local7;
ddns-update-style ad-hoc;
subnet 192.168.0.0 netmask 255.255.255.0 {
range 192.168.0.100 192.168.0.250;
option subnet-mask 255.255.255.0;
option netbios-name-servers 192.168.0.1;
option broadcast-address 192.168.0.255;
option routers 192.168.0.1;
option domain-name-servers 192.168.0.1;
host VeroMars
{
hardware ethernet 00:50:8D:6C:AA:BB;
fixed-address 192.168.0.50;
}
}
|
Секция, начинающаяся с host VeroMars, отвечает за то, что машина с MAC-адресом 00:50:8D:6C:AA:BB всегда получит определённый заранее адрес. Убедитесь, что отдельно назначенный IP не входит в диапазон динамических адресов (иначе, уверяю, вы потеряете покой!).
Перед запуском демона dhcp, мы должны изменить интерфейс, на котором будут приниматься dhcp запросы. Откройте /etc/conf.d/dhcp и измените IFACE="eth0" на IFACE="eth1".
Так, теперь мы запустим демон dhcp, и затем изменим настройки на всех клиентских ПК на получение IP адресов через dhcp.
# rc-update add dhcpd default # /etc/init.d/dhcpd start
[править] DNSMASQ
Одна небольшая оговорка - если вы решили использовать dnsmasq, то для полной функциональности файл /etc/resolv.conf должен содержать правильные "родительские" DNS сервера.
Чтобы установить dnsmasq, просто выполните emerge для пакета:
emerge dnsmasq
dnsmasq имеет множество настроек, но мы остановимся на дублировании функциональности dhcpd и установке небольшого DNS сервера. Откройте файл /etc/dnsmasq.conf, и найдите следующую секцию:
| Файл: /etc/dnsmasq.conf |
# Uncomment this to enable the integrated DHCP server, you need # to supply the range of addresses available for lease and optionally # a lease time. If you have more than one network, you will need to # repeat this for each network on which you want to supply DHCP # service. dhcp-range=192.168.0.50,192.168.0.150 |
Заметьте, что я раскомментировал строку, начинающуюся с dhcp-range=... - именно эта строчка отвечает за выделение динамических IP, причем всё намного проще чем в dhcpd! Если вам нужно, можете изменить диапазон IP адресов.
Мы также хотим назначить заранее определённые IP адреса некоторым машинам, основываясь на их MAC адресах. Найдите ниже следующий блок:
# Always allocate the host with ethernet address 11:22:33:44:55:66 # The IP address 192.168.0.60 dhcp-host=11:22:33:44:55:66,192.168.0.60
Как и в предыдущем примере, я раскомментировал строку, начинающуюся с dhcp-host=... Вы можете повторять эту строку столько, сколько вам нужно, с соответствующей комбинацией MAC/IP.
Также имеет смысл установить интерфейс, прослушиваемый dnsmasq. Здесь я установил обслуживание только тех клиентов, которые подключены к eth1.
# If you want dnsmasq to listen for requests only on specified interfaces # (and the loopback) give the name of the interface (eg eth0) here. # Repeat the line for more than one interface. interface=eth1
[править] Необязательные пакеты
Для работы простого маршрутизатора вам не понадобятся эти пакеты. Но они могут расширить функциональность или повысить безопасность вашей сети и/или маршрутизатора. Запомните, что каждый дополнительный сервис создаёт потенциальную угрозу безопасности. Здесь описаны только базовые сервисы маршрутизатора. Остальные упоминаются (например Apache2) на соответствующих страницах wiki.
[править] Squid
Squid является продвинутым proxy, который позволяет ограничивать, фильтровать или кэшировать web-страницы.
Squid прост в настройке, не пугайтесь его 110Кб squid.conf-sample, большинство настроек, находящихся в нём, легко понять из комментариев. Вот что я изменил в squid.conf.sample (все мои настройки здесь, используйте grep -v ^# /etc/squid/squid.conf | grep -v ^$, чтобы увидеть только изменения):
... http_port 192.168.0.1:3128 icp_port 0 cache_mem 20 MB cache_dir ufs /usr/tmp/squid 256 16 256 # change this path to somewhere you have enough diskspace acl all src 0.0.0.0/0.0.0.0 acl manager proto cache_object acl allowed_hosts src 192.168.0.0/255.255.255.0 #http_access allow purge localhost #http_access deny purge #http_access deny !Safe_ports #http_access deny CONNECT !SSL_ports acl our_networks src 192.168.0.0/24 http_access allow our_networks icp_access allow allowed_hosts icp_access deny all miss_access allow allowed_hosts miss_access deny all
To use squid as a transparent proxy add also the following: httpd_accel_host virtual httpd_accel_port 80 httpd_accel_with_proxy on httpd_accel_uses_host_header on For 2.6 version add: http_port 3128 transparent
С этим squid.conf, ваш прокси может быть доступен только из вашей сети и имеет 256 Мб для хранения своих временных файлов.
Теперь создадим служебные каталоги для Squid, добавим его в список загрузки и запустим.
# squid -z # rc-update add squid default # /etc/init.d/squid start
И наконец нужно настроить использование прокси у клиентов, т.е. установить прокси в настройках браузера. Или, если вы хотите прозрачный прокси, вы должны перенаправлять трафик через него.
Если ваш сервер является маршрутизатором/файрволлом, нужно добавить правило в iptables (подразумевается, что eth0 связан с локальной сетью):
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128
Если вы хотите, чтобы squid выключался быстрее, обратите внимание на опцию shutdown_lifetime (значение по умолчанию - 30 секунд, которое годится для большинства случаев, но иногда оно является слишком завышеным)
[править] Apache 2
Смотри Index:Apache2
[править] ProFTPd
Смотри HOWTO ProFTPD
[править] Настройка динамического dns
Поскольку не каждый наделён отменной памятью на числа, а запомнить динамический IP вообще не представляется возможным, то имеет смысл зайти на www.dyndns.org и зарегистрировать динамический домен, к тому же это достаточно легко и бесплатно.
Вы можете обновлять свой динамический домен при помощи ddclient
Note: Если вы используете ADSL модем через pppd, то переместите /etc/ddclient/sample-etc_ppp_ip-up.local в /etc/ppp/ip-up.local. Благодаря этому, pppd будет запускать ddclient (с опциями, указанными в /etc/ddclient/ddclient.conf) при каждом соединении.
Также, если вы используете nsswitch.ldap, то убедитесь в наличии этой строки:
protocols: files ldap
[править] DNS
Поскольку намного удобней запоминать имена, а не числа, то многие предпочитают установливать внутренний DNS сервер. Таким образом появляется возможность создания алиасов в вашей сети.
Замечание для локального Top-Level Domain (TLD) и ZeroConf (Apple Rendezvouz/Bonjour): В принципе, вы можете использовать любой локальный TLD, отличающийся от тех, которые уже используются в интернет. (TLD является последней или крайней правой частью имени домена. Вот примеры TLD, используемых в интернет: .de, .com, .net, .jp или .uk). В примере ниже используется .lan, что намного лучше чем, .yourname или что нибудь из этой серии. Но, если вы используете несколько компьютеров Apple Macintosh или устройства, использующие Zeroconf-Standard [1] (Также известный пользователям Macintosh как Rendezvous или Bonjour [2] ) подключённые к вашей локальной сети, то настоятельно рекомендуется использовать .local в качестве локального TLD, поскольку Zeroconf использует .local в качестве локального TLD по умолчанию для всех устройств, зарегистрированных через Zeroconf. Если вы так сделаете, то сможете добавить не-Zeroconf устройства через ваш DNS-сервер (BIND к примеру), и все ваши компьютеры и все устройства будут в одном TLD. Если же вы решите использовать два TLD в своей локальной сети, то это будет не лучшей идеей, поскольку вам придеться помнить, какой TLD соответствует какому устройству.
[править] ISC BIND
Прежде всего, BIND является высокотехнологичным DNS сервером. Его непросто настроить, поэтому головная боль вам обеспечена. Начнем с установки bind.
# emerge bind bind-tools
Bind-tools является пакетом, который позволит вам использовать dig, nslookup и host. Давайте отредактируем главный конфигурационный файл bind, расположенный в /etc/bind/named.conf.
| Файл: /etc/bind/named.conf |
options {
directory "/var/bind";
listen-on-v6 { none; };
listen-on {
127.0.0.1;
192.168.0.1;
};
allow-query {
127.0.0.1;
192.168.0.0/16;
};
forwarders {
195.130.130.132;
195.130.131.9;
};
pid-file "/var/run/named/named.pid";
};
zone "." IN {
type hint;
file "named.ca";
};
zone "localhost" IN {
type master;
file "pri/localhost.zone";
allow-update { none; };
notify no;
};
zone "127.in-addr.arpa" IN {
type master;
file "pri/127.zone";
allow-update { none; };
notify no;
};
zone "mars.lan" IN {
type master;
file "pri/mars.lan.zone";
allow-update { none; };
notify no;
};
zone "0.168.192.in-addr.arpa" IN {
type master;
file "pri/0.168.192.zone";
allow-update { none; };
notify no;
};
|
Эта конфигурация требует некоторых пояснений. listen-on и allow-query опредяляют на каком ip-адресе bind слушает и на каком подтверждаем DNS запросы. forwarders определяет куда перенаправлять DNS запросы, если BIND не может на них ответить. Укажите там DNS сервера вашего провайдера. Секция zone 'mars.lan' определяет зону 'mars.lan'. Конфигурационный файл для этой зоны располагается в: /var/bind/pri/mars.lan.zone. Файл обратной DNS зоны называется 0.168.192.zone. Он также располагается в /var/bind/pri.
| Файл: /var/bind/pri/mars.lan.zone |
$TTL 86400
@ IN SOA boxname.mars.lan dnsadmin@mars.lan (
2005101003 ;serial
10800 ;refresh
7200 ;retry
36000000 ;expire
86400) ;default minimum ttl
IN NS boxname.mars.lan.
smoothwall IN A 192.168.0.10
anlaug IN A 192.168.0.11
printserver IN A 192.168.0.20
3com4300 IN A 192.168.0.30
h4x0r IN A 192.168.0.50
areabitchslap IN A 192.168.1.2
ntp IN CNAME anlaug
proxy IN CNAME anlaug
sw IN CNAME smoothwall
it IN CNAME anlaug
ps IN CNAME printserver
3com IN CNAME 3com4300
switch IN CNAME 3com4300
abs IN CNAME areabitchslap
www IN CNAME areabitchslap
|
Небольшое пояснение: этот конфигурационный файл говорит о том, что smoothwall.mars.lan эквивалентно 192.168.0.10. А sw.mars.lan является алиасом для определённого IP-адреса.
| Файл: /var/bind/pri/0.168.192.zone |
$ORIGIN 0.168.192.in-addr.arpa.
$TTL 86400
@ IN SOA boxname.mars.lan dnsadmin@mars.lan (
2005101003 ;serial
10800 ;refresh
7200 ;retry
36000000 ;expire
86400) ;default minimum ttl
IN NS boxname.mars.lan.
10 IN PTR smoothwall.mars.lan.
11 IN PTR anlaug.mars.lan.
30 IN PTR 3com4300.mars.lan.
20 IN PTR printserver.mars.lan.
50 IN PTR h4x0r.mars.lan.
|
Внесите нужные изменения в файлы и сохраните их. Теперь добавим BIND в загрузку и запустим его.
# rc-update add named default # /etc/init.d/named start
[править] DNSMASQ
[править] Статический /etc/hosts файл
Если на машине с запущенным dnsmasq есть заполненный /etc/hosts файл, то другие компьютеры смогут его использовать, таким образом отпадает надобность в хранении копии этого файла на каждой машине - т.е. своеобразная централизация.
Вот мой файл hosts:
127.0.0.1 localhost 192.168.0.1 tux.homenetwork tux 192.168.0.2 idontcare.homenetwork idontcare 192.168.0.3 goblin.homenetwork goblin 192.168.0.100 gateway.homenetwork gateway 192.168.0.10 ultra.homenetwork ultra 192.168.0.11 sparc20.homenetwork sparc20
Так что я могу зайти на tux, пропинговать ultra и dnsmasq выдаст правильный IP адрес!
[править] Динамичность через опцию -l
Поскольку dnsmasq работает и как DHCP сервер, почему бы не использовать имена хостов клиентов, приходящих как часть их DHCP запросов?
1. Измените /etc/dnsmasq.conf, чтобы мы знали где будет находиться lease файл
| Файл: /etc/dnsmasq.conf |
# The DHCP server needs somewhere on disk to keep its lease database. # This defaults to a sane location, but if you want to change it, use # the line below. dhcp-leasefile=/var/lib/misc/dnsmasq.leases |
2. Измените /etc/conf.d/dnsmasq
| Файл: /etc/conf.d/dnsmasq |
DNSMASQ_OPTS="-l /var/lib/misc/dnsmasq.leases" |
Опция '-l' сообщает dnsmasq обращаться за именами хостов в lease файл. Теперь можете не беспокоиться о статическом файле hosts.
[править] Запуск dnsmasq
Теперь, можете запустить dnsmasq и добавить его в загрузку:
# /etc/init.d/dnsmasq start # rc-update add dnsmasq default
[править] Основное ПО
В зависимости от того, как вы устанавливали Gentoo, у вас могли появится устаревшие пакеты после установки. Перед тем как продолжить, выполните emerge --sync и emerge -NuavD world, чтобы быть уверенным, что ваша система не содержит устаревших пакетов.
[править] Список ПО
- rcs - контроль за версиями конфигурационных файлов
- snort - пакетный сниффер, логгер, легковесный IDS
- AIDE - Advanced Intrusion Detection Environment
- rrdtool - используется ntop для хранения графиков
- ntop- получение статистики по вашему траффику.
- iptables - сама суть нашей затеи
- logsentry - анализ логов.
- ntp - контроль времени.
- openssh
- sSMTP - предельно простой почтовый сервер
- Squid - кеширующий web прокси
[править] Установка
Мы не будем пересобирать всё ПО и убеждаться в обновлённости наших пакетов:
emerge -uav rcs snort aide rrdtool ntop iptables logsentry ntp openssh squid.
[править] sSMTP
sSSMTP должен быть скомпилирован с флагом mailwrapper, чтобы работали некоторые вещи. Так что выполните это echo "mail-mta/ssmtp mailwrapper" >> /etc/portage/package.use и затем соберите его.
- cd /etc/ssmtp
- mkdir RCS
- ci -l ssmtp.conf
- $EDITOR ssmtp.conf
- update /etc/ssmtp/revaliases
- update /etc/passwd
- Send a test mail: echo "Is this working?" | mail -s "Test" myaunt@spamcity.world
смените имя администратора с 'root' для большей эстетичности.
| Файл: /etc/passwd |
From: root:x:0:0:root:/root:/bin/bash To: root:x:0:0:Benjamin Sisko:/root:/bin/bash |
Для настройки sSMTP вы можете использовать команду ssmtp-config. Запустите её и ответьте на заданные вопросы.
или обновите; 'mailhub' и 'hostname', 'rewriteDomain' в
| Файл: /etc/ssmtp/ssmtp.conf |
#
# /etc/ssmtp.conf -- a config file for sSMTP sendmail.
#
# The person who gets all mail for userids < 10
root=postmaster
# The place where the mail goes. The actual machine name is required
# no MX records are consulted. Commonly mailhosts are named mail.domain.com
# The example will fit if you are in domain.com and you mailhub is so named.
mailhub=mail.bar.baz
# Where will the mail seem to come from?
rewriteDomain=bar.baz
# The full hostname
hostname=foo.bar.baz
# Set this to never rewrite the "From:" line (unless not given) and to
# use that address in the "from line" of the envelope.
#FromLineOverride=YES
|
Если 'rewriteDomain=bar.baz' разкомментирован, ssmtp всегда переписывает поле 'From' и имя домена в строке 'From:' устанавливается в bar.baz.
| Файл: /etc/ssmtp/revaliases |
# sSMTP aliases
#
# Format: local_account:outgoing_address:mailhub
#
# Example: root:your_login@your.domain:mailhub.your.domain:[port]
# where [port] is an optional port number that defaults to 25.
root:bens@bar.baz:mail.bar.baz
|
[править] Ссылки по теме
[править] Logsentry
- cd /etc/cron.hourly
- mkdir RCS
- ci -l logsentry.cron
- Пояснение: logsentry работает каждый час.
- $EDITOR logsentry.cron
- удалите '#' из строк
Учтите, что это для vixie-cron.
[править] AIDE
- cd /etc/aide/
- mkdir RCS
- ci -l aide.conf
- $EDITOR aide.conf
- /usr/bin/aide -i
- Это займет минут 10.
- mv aide.db.new aide.db
- /usr/bin/aide -C
- cd /etc/cron.daily
- mkdir RCS
- $EDITOR aide.cron
| Файл: /etc/aide/aide.conf |
#
# AIDE 0.10
#
# Base configuration taken from the Gentoo security handbook.
# $Id: aide.conf,v 1.3 2005/09/02 04:40:17 root Exp root $
verbose=20
#p: permissions
#i: inode
#n: number of links
#u: user
#g: group
#s: size
#b: block count
#m: mtime
#a: atime
#c: ctime
#S: check for growing size
#md5: md5 checksum
#sha1: sha1 checksum
#rmd160: rmd160 checksum
#tiger: tiger checksum
#R: p+i+n+u+g+s+m+c+md5
#L: p+i+n+u+g
#E: Empty group
#>: Growing logfile p+u+g+i+n+S
#The following are available if you have mhash support enabled.
#haval: haval checksum
#gost: gost checksum
#crc32: crc32 checksum
# define the Top directory.
@@ifndef TOPDIR
@@define TOPDIR /
@@endif
# define where aide specific stuff is storred.
@@ifndef AIDEDIR
@@define AIDEDIR /etc/aide
@@endif
# Not used here.
@@ifhost smbserv
@@define smbactive
@@endif
# The location of the database to be read.
database=file:@@{AIDEDIR}/aide.db
# The location of the database to be written.
database_out=file:@@{AIDEDIR}/aide.db.new
# Don't know what the verbosity level means.
verbose=20
# Where to send the output.
report_url=stdout
# warn about dead symlinks.
warn_dead_symlinks=true
# Rule definition
All=R+a+sha1+rmd160
Norm=s+n+b+md5+sha1+rmd160
# Do include everything.
@@{TOPDIR} Norm
# Dont barf about the new db file. Perhaps this should be removed
# once the system is stable ?
!@@{TOPDIR}etc/aide/*.new
# directories not to include.
!@@{TOPDIR}dev
!@@{TOPDIR}proc
!@@{TOPDIR}root
!@@{TOPDIR}tmp
!@@{TOPDIR}var/log
!@@{TOPDIR}var/run
# This one might be interesting once we have a stable box.
!@@{TOPDIR}usr/portage
# the rrd db is continously being updated.
!@@{TOPDIR}var/lib/ntop/rrd
!@@{TOPDIR}var/lib/ntop/addressQueue.db
!@@{TOPDIR}var/lib/ntop/dnsCache.db
# I'm not sure if this is a good idea but I get lot of errors in that dir.
!@@{TOPDIR}sys
# NTP writes to this.
!@@{TOPDIR}etc/adjtime
# I dont know what this does, since we are starting at / this should be included.
=@@{TOPDIR}home Norm
|
| Файл: /etc/cron.daily/aide.cron |
#!/bin/sh # # $Id:$ # # script concept from /etc/logcheck/logcheck.sh SYSADMIN=odo@spamcity.world MAIL=mail # Shouldn't need to touch these... HOSTNAME=`hostname` DATE=`date +%m/%d/%y:%H.%M` # Set the flag variables FOUND=0 ATTACK=0 szOutPut=`/usr/bin/aide --update` # here must be some grep stuff to identify the state of security. echo "$szOutPut" | $MAIL -s "$HOSTNAME $DATE file system check" $SYSADMIN # remove the new df if it is identical except for the date generated. |
[править] Дополнение
Если ваш aide.conf неверен, то aide вызовет segfault. Так что используйте RCS для отслеживания своих изменений.
[править] NTOP
- cd /etc/conf.d
- mkdir RCS
- ci -l -m "Configuration file for ntop." ntop
- $EDITOR /etc/conf.d/ntop
- add: NTOP_OPTS="--http-server 3000 --https-server 0 --interface eth0,eth1"
- /usr/bin/ntop --http-server 3000 --https-server 0 --interface eth0,eth1
- both NICs have to be configured for ntop to run.
- Enter password: Please enter the password for the admin user:
- /etc/init.d/ntop start
- rc-update add ntop default
[править] NTP
Смотри HOWTO NTP
[править] Snort
- http://www.gentoo.org/doc/en/security/security-handbook.xml?part=1&chap=13
- http://www.snort.org/docs/
[править] Если в LAN несколько Gentoo-машин
[править] Локальное зеркало RSYNC
Если у вас в сети несколько компьютеров с Gentoo, то вы можете сделать доброе дело, установив локальное зеркало RSYNC. Это означает то, что только одной машине потребуется доступ к главным зеркалам RSYNC, а все остальные смогут использовать локальное зеркало. Синхронизация внутренних клиентов будет происходить со скоростью сети!
Смотри : HOWTO: Локальный сервер RSYNC.
[править] Доступ к /usr/portage через NFS
Если безопасность вашей сети не является критичной, вы можете открыть доступ к каталогу /usr/portage с помощью NFS. Всё что нужно - выполнить emerge --sync на одной машине и расшарить дерево портежей на всю сеть. Сами дистрибутивы также скачиваются один раз (т.е. /usr/portage/distfiles также становится открытым).
Смотри HOWTO: Using a shared portage via NFS
[править] DistCC - сборочный комбинат
Большинство компьютеров в сети редко занимаются чем-нибудь трудоёмким, так почему же не установить distcc и использовать ресурсы всех компьютеров для компиляции?
Смотри The official gentoo distcc guide
[править] Если в LAN компьютеры Apple Macintosh
[править] NetATalk
(подразумевается версия Netatalk 2.0.3-r2 ebuild)
NetATalk обеспечивает Apple File Protocol (AFP) который используется системами Mac OS и Mac OS X Systems, и позволит избежать многих проблем, возникающих при использовании SMB/Samba в Mac OS. Устанавливая NetATalk, вы встроите ваш Gentoo-сервер в Mac OS (X) в качестве Network Attached Storage (файл-сервера).
- emerge:
- emerge -v netatalk
- Add AFP-Volumes to /etc/netatalk/AppleVolumes.default :
- cd /etc/netatalk
- vi AppleVolumes.default
Добавьте каждый том, который вы хотите расшарить через AFP в конец AppleVolumes.default. Шаблон выглядит так::
<local path> <volume name> allow:<user1>[,<user2>,...]
Вот пример:
/home/foo/ Foo allow:foo
Это представит каталог /home/foo на вашем сервере в качестве AFP-тома Foo и позволит пользователю foo использовать его. Вы можете добавить больше пользователей, разделяя их запятыми.
| Примечание: Имена пользователей, перечисляемые после allow, являются пользователями Mac OS, а не вашего gentoo-сервера |
После представления домашних каталогов пользователей foo, bar and john в качестве одноименных томов, доступ к которым осуществляется только владельцем, а каталога /home/share в качестве тома Shared Space, доступного всем трём, файл AppleVolumes.default будет выглядеть так (добавленные строки находятся в конце):
| Файл: /etc/netatalk/AppleVolumes.default |
# This file looks empty when viewed with "vi". In fact, there is one # '~', so users with no AppleVolumes file in their home directory get # their home directory by default. # # volume format: # :DEFAULT: [all of the default options except volume name] # path [name] [casefold:x] [options:z,l,j] \ # [allow:a,@b,c,d] [deny:a,@b,c,d] [dbpath:path] [password:p] \ # [rwlist:a,@b,c,d] [rolist:a,@b,c,d] [limitsize:value in bytes]\ # [preexec:cmd] [root_preexec:cmd] [postexec:cmd] [root_postexec:cmd] # # # name: volume name. it can't include the ':' character and is limited # to 27 characters in length. # # variable substitutions: # you can use variables for both <path> and <name> now. here are the # rules: # 1) if you specify an unknown variable, it will not get converted. # 2) if you specify a known variable, but that variable doesn't have # a value, it will get ignored. # # the variables: # $b -> basename of path # $c -> client's ip or appletalk address # $d -> volume pathname on server # $f -> full name (whatever's in the gecos field) # $g -> group # $h -> hostname # $i -> client ip without tcp port or appletalk network # $s -> server name (can be the hostname) # $u -> username (if guest, it's whatever user guest is running as) # $v -> volume name (either ADEID_NAME or basename of path) # $z -> zone (may not exist) # $$ -> $ # # casefold options [syntax: casefold:option]: # tolower -> lowercases names in both directions # toupper -> uppercases names in both directions # xlatelower -> client sees lowercase, server sees uppercase # xlateupper -> client sees uppercase, server sees lowercase # # allow/deny/rwlist/rolist format [syntax: allow:user1,@group]: # user1,@group,user2 -> allows/denies access from listed users/groups # rwlist/rolist control whether or not the # volume is ro for those users. # preexec -> command to be run when the volume is mounted, # ignore for user defined volumes # root_preexec -> command to be run as root when the volume is mounted, # ignore for user defined volumes # postexec -> command to be run when the volume is closed, # ignore for user defined volumes # root_postexec -> command to be run as root when the volume is closed, # ignore for user defined volumes # # codepage options [syntax: options:charsetname] # volcharset -> specifies the charset to be used as the volume codepage # e.g. "UTF8", "UTF8-MAC", "ISO-8859-15" # maccharset -> specifies the charset to be used as the mac client codepage # e.g. "MAC_ROMAN", "MAC_CYRILLIC" # # miscellaneous options [syntax: options:option1,option2]: # prodos -> make compatible with appleII clients. # crlf -> enable crlf translation for TEXT files. # noadouble -> don't create .AppleDouble unless a resource # fork needs to be created. # ro -> mount the volume as read-only. # mswindows -> enforce filename restrictions imposed by MS # Windows. this will also invoke a default # codepage (iso8859-1) if one isn't already # specified. # nohex -> don't do :hex translations for anything # except dot files. specify usedots as well if # you want that turned off. note: this option # makes the / character illegal. # usedots -> don't do :hex translation for dot files. note: when # this option gets set, certain file names # become illegal. these are .Parent and # anything that starts with .Apple. also, dot # files created on the unix side are marked # invisible. # limitsize -> limit disk size reporting to 2GB. this is # here for older macintoshes using newer # appleshare clients. yucko. # nofileid -> don't advertise createfileid, resolveid, deleteid # calls # root_preexec_close -> a non-zero return code from root_preexec close the # volume being mounted. # preexec_close -> a non-zero return code from preexec close the # volume being mounted. # nostat -> don't stat volume path when enumerating volumes list # upriv -> use unix privilege. # # # dbpath:path -> store the database stuff in the following path. # password:password -> set a volume password (8 characters max) # cnidscheme:scheme -> set the cnid scheme for the volume, default is [cdb] # available schemes: [cdb dbd last] # # The "~" below indicates that Home directories are visible by default. # If you do not wish to have people accessing their Home directories, # please put a pound sign in front of the tilde or delete it. ~ /home/foo Foo allow:foo /home/bar Bar allow:bar /home/john John allow:john /home/shared "Shared Space" allow:foo,bar,john |
[править] Сервер Zeroconf (Bonjour/Rendezvous)
[править] Avahi
- USE="-qt3 -qt4" emerge --pretend avahi
- Вы только увидите список пакетов.
- Флаги -qt3/4 применяются в связи с тем, что на нашем сервере отсутствует X
- Уберите '--pretend' чтобы начать установку.
- Чтобы при следующей компиляции не забыть про флаги qt3/4, выполните "echo net-dns/avahi -qt3 -qt4 >> etc/portage/package.use"
