Развёртывание домашнего сервера

Материал из 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 и заменить её значение на 1. Тогда команда echo 1 > /proc/sys/net/ipv4/ip_forward будет выполняться за вас.

Для сохранения нашей конфигурации:

# /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 по умолчанию вполне работоспособны. Автозагрузка при запуске:

  1. /etc/init.d/sshd start
  2. 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 и затем соберите его.

  1. cd /etc/ssmtp
  2. mkdir RCS
  3. ci -l ssmtp.conf
  4. $EDITOR ssmtp.conf
  5. update /etc/ssmtp/revaliases
  6. update /etc/passwd
  7. 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

  1. cd /etc/cron.hourly
  2. mkdir RCS
  3. ci -l logsentry.cron
    • Пояснение: logsentry работает каждый час.
  4. $EDITOR logsentry.cron
    • удалите '#' из строк

Учтите, что это для vixie-cron.

[править] AIDE

  1. cd /etc/aide/
  2. mkdir RCS
  3. ci -l aide.conf
  4. $EDITOR aide.conf
  5. /usr/bin/aide -i
    • Это займет минут 10.
  6. mv aide.db.new aide.db
  7. /usr/bin/aide -C
  8. cd /etc/cron.daily
  9. mkdir RCS
  10. $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

  1. cd /etc/conf.d
  2. mkdir RCS
  3. ci -l -m "Configuration file for ntop." ntop
  4. $EDITOR /etc/conf.d/ntop
    • add: NTOP_OPTS="--http-server 3000 --https-server 0 --interface eth0,eth1"
  5. /usr/bin/ntop --http-server 3000 --https-server 0 --interface eth0,eth1
    • both NICs have to be configured for ntop to run.
  6. Enter password: Please enter the password for the admin user:
  7. /etc/init.d/ntop start
  8. rc-update add ntop default

[править] NTP

Смотри HOWTO NTP

[править] Snort

[править] Если в 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

  1. USE="-qt3 -qt4" emerge --pretend avahi
    • Вы только увидите список пакетов.
    • Флаги -qt3/4 применяются в связи с тем, что на нашем сервере отсутствует X
    • Уберите '--pretend' чтобы начать установку.
    • Чтобы при следующей компиляции не забыть про флаги qt3/4, выполните "echo net-dns/avahi -qt3 -qt4 >> etc/portage/package.use"

[править] Ссылки

[править] Руководства