Linux-сервер для Интернет-кафе
Эта статья описывает мой собственный опыт построения Linux-сервера для
Интернет-кафе. Статья ориентирована как на новичков в мире Linux, так и
на знакомых с Linux людей, но не имеющих опыта использования его в сети,
которым в сжатые сроки понадобилось установить Linux-сервер. Я постарался
описать лишь основные моменты установки, большей частью что относительно
стандартной конфигурации было изменено. Все примеры файлов конфигураций,
приведенные здесь, не претендуют на "идеологическую верность". Они получены
опытным путем, путем чтения документаций и FAQ. Они могут быть даже неверны,
тем не менее они работают :)
В мою задачу входило установить Linux-сервер для Интернет-кафе. Интернет-кафе
- это место, куда люди, не имеющие компьютера (или интернета) приходят
полазить по страничкам, почитать почту, потрепаться в аське.
В качестве дистрибутива мной был выбран Mandrake 6.0, который постепенно
перерос в Mandrake 7.0.
Имеется один реальный интернет-адрес (будем использовать 123.123.123.123)
и две внутренние подсети - 192.168.1.0 и 192.168.2.0. В сервере имеется
три сетевые карты - две 10-мегабитные и одна 100-мегабитная.
После прописывания их в linuxconf появилось три интерфейса - eth0, идущий
к провайдеру, и eth1, eth2 - внутренние.
squid
Я использовал прокси-сервер squid для предоставления www и ftp пользователям.
Нужно ограничить доступ к прокси только локальной сетью. У нашего провайдера
есть тестовый dial-up вход, с которого доступен наш сервер. Если открыть
squid наружу, то, соединившись по тестовому входу и указав в настройках
прокси наш
адрес, можно было бы иметь бесплатныe сервисы, работающие через squid.
Фрагменты файла конфигурации squid (squid.conf):
прописываем хосты, откуда можно получать доступ:
acl allowed_hosts src 192.168.0.0/255.255.0.0
acl localhost src 127.0.0.1/255.255.255.255
разрешенные SSL порты:
acl SSL_ports port 443 563 5190 15100 15101
порт 5190 используется новыми ICQ для соединения по HTTPS, т.е. можно
и ICQ пустить через squid, а 15100 и 15101 - я использовал для одной банковской
программы.
запретим метод CONNECT для всех портов, кроме указанных в acl SSL_ports:
http_access deny CONNECT !SSL_ports
и запретим доступ всем, кроме тех, кому можно:
http_access allow localhost
http_access allow allowed_hosts
http_access allow SSL_ports
http_access deny all
можно сделать авторизацию по имени и паролю:
authenticate_program /usr/local/squid/bin/ncsa_auth /usr/local/squid/bin/passwd
в бинарный rpm squid от Mandrake программа ncsa_auth не входит (по крайней
мере, не входила), так что, возможно, ее придется собрать из исходников.
И пропишем пользователей, которым разрешено пользоваться squid:
acl allowed_users proxy_auth username
Если у вас мало свободного места в разделе, где находится каталог /var/spool,
то вы можете разместить кэш на другом разделе:
cache_dir /mnt/disk1/var/spool/squid 1000 16 256
Анализ работы squid можно сделать при помощи программы sqmgrlog. Она
показывает достаточно много интересной информации, в том числе и трафик,
проходящий через squid для каждого пользователя.
URL: http://www.ineparnet.com.br/orso/index.html
sendmail
Установленный sendmail был почти готов к работе. Нужно было настроить
сервер так, чтобы из интернета принимались только письма, адресованные
нам (ourdomain.ru). Пропишем в access:
192.168 RELAY
127.0.0.1 RELAY
Учтите, что sendmail читает информацию не из файла access, а из бинарного
файла access.db. Используйте makemap для создания файла access.db.
На других машинах я использую postfix (он проще в настройке).
Доступ пользователей к почте осуществляется через web-интерфейс w3mail.
URL: http://www.tbcc.cc.or.us/~spencer/w3mail/
apache
Установленный бинарный rpm apache от Mandrake был готов к работе и почти
не нуждался в дополнительных настройках.
Виртуальные хосты прописываются в файле Vhosts.conf:
<VirtualHost 123.123.123.123>
ServerAdmin webmaster@ourdomain.ru
DocumentRoot /home/clients/client/public_html
ServerPath /~client
ServerName client.ourdomain.ru
ErrorLog logs/error_log
TransferLog logs/access_log
</VirtualHost>
Обратите внимание, что адрес client.outdomain.ru должен быть прописан
в DNS (см. ниже).
Директория с нашим веб-интерфейсом должна быть доступна только из локальной
сети, прописываем в httpd.conf:
<Directory /home/httpd/mail>
order deny,allow
deny from all
allow from localhost
allow from 192.168
allow from 123.123.123.123
Options ExecCGI
</Directory>
А в секции Vhosts.conf, где прописан виртуальный хост - почтовый веб-интерфейс,
прописываем:
<VirtualHost 123.123.123.123>
ServerAdmin webmaster@ourdomain.ru
DocumentRoot /home/httpd/mail
ServerPath /mail
ServerName mail.ourdomain.ru
ErrorLog logs/error_log
TransferLog logs/access_log
ErrorDocument 403 http://www.ourdomain.ru/messages/insideonly.html
</VirtualHost>
insideonly.html - сообщение о том, что веб-интерфейс доступен только
из локальной сети.
Некоторые пользователи используют Netscape Roaming Access. Эта функция
позволяет хранить на сервере настройки, историю, сертификаты и т.п. браузера
Netscape. Пользователь набирает свой логин и пароль и браузер загружает
необходимые файлы, а после завершения сессии обновляет их на сервере. Это
удобно, когда пользователь, пришедший поработать в интернете, пользуется
постоянно разными компьютерами. Для создания roaming access я использовал
модуль mod_roaming в apache.
URL: http://www.klomp.org/mod_roaming/
Если вы будете использовать mod_roaming, обратите внимание на то, что
доступ к roaming access серверу должен быть прямым, не через прокси, иначе
могут возникнуть проблемы с закачкой файлов на сервер.
Красиво анализировать работу apache можно с помошью программы webalizer.
URL: http://www.mrunix.net/webalizer/
Не забудьте указать Incremental yes в webalizer.conf, для того, чтобы
правильно обрабатывались логи apache.
named
bind использует файл начальной загрузки /etc/named.conf, в котором прописываем:
options {
directory "/var/named";
};
zone "." {
type hint;
file "named.ca";
};
zone "ourdomain.ru"{
type master;
file "ourdomain";
notify yes;
};
zone "0.0.127.IN-ADDR.ARPA"{
type master;
file "named.local";
};
zone "123.123.123.IN-ADDR.ARPA"{
type master;
file "123.123.123";
notify yes;
};
dns сервер является авторитетным для нашей зоны (ourdomain.ru) и кэширует
остальное.
В файле /var/named/named.ca содержится список корневых серверов, этот
файл можно создать командой dig.
Фрагменты файла /var/named/ourdomain - файла зоны ourdomain.ru:
начало зоны:
@
IN SOA ourdomain.ru.
admin.ourdomain.ru
Обратите внимание, что e-mail администратора должен содержать точку,
а не @.
сервера имен - первичный - у нас, вторичный - у провайдера:
@
IN NS ns
@
IN NS ns.ourprovider.ru.
Запись для виртуального хоста apache - client.ourdomain.ru:
client
IN A
123.123.123.123
Файлы named.local и 123.123.123 содержат зоны обратного преобразования
- преобразования ip - адресов в имена.
Фрагмент файла 123.123.123, прописаны вначале сервера имен, потом указатель,
обозначающий, что машина с адресом 123.123.123.123 имеет имя ns.ourdomain.ru:
@
IN NS ns.ourdomain.ru.
@
IN NS ns.ourprovider.ru.
123
IN PTR ns.ourdomain.ru.
socks
Если вы не используете ip-masquerading, то вам понадобится socks-сервер
для работы некоторых клиентов ICQ, IRC и т.п. Я использовал dante-socks.
Фрагменты sockd.conf:
internal: 192.168.1.1 port = 1080
наш настоящий адрес:
external: 123.123.123.123
кто может пользоваться прокси:
client pass {
from: 192.168.0.0/16
to: 0.0.0.0/0
}
и кто может отвечать клиентам:
pass {
from: 0.0.0.0/0 to:
192.168.0.0/16
command: bindreply udpreply
log: connect error
}
ftp
BeroFTPD не потребовал никакой дополнительной настройки. Могу разве
что порекомендовать установить версию посвежее. Старые версии были, если
не ошибаюсь, с какой-то серьезной security hole.
samba
Samba используется для файлового общения между win-машинами и unix.
Привожу мой файл конфигурации samba почти полностью:
[global]
workgroup = workgroup
netbios name = ourdomain
server string = Samba
Server
security = SHARE
encrypt passwords =
Yes
log file = /var/log/samba/log.%m
max log size = 50
socket options = TCP_NODELAY
SO_RCVBUF=8192 SO_SNDBUF=8192
dns proxy = no
wins support = yes
domain master = yes
interfaces = 192.168.1.1/24
192.168.2.1/24
client code page = 866
character set = koi8-r
[samba]
comment = Public
path = /mnt/disk1/samba
read only = No
guest ok = Yes
[admin]
comment = admin's dir
path = /home/admin
valid users = admin
root
read only = no
Обратите внимание на опцию encrypt passwords, если ее не указать, то
машины с win98 (возможно, и не только они) не смогут подключиться. wins
support - поддержка wins. При помощи wins машины "быстрее находятся" в
сетевом окружении, т.к. клиенту не придется делать широковещательный запрос
всем, а нужно будет только спросить у wins. Использование wins обязательно,
если имеется больше одной подсети, иначе машины в разных подсетях не увидят
друг друга. Укажите интерфейсы, на которые будет работать samba. И для
предотвращения проблем с русских - client code page и character set. Далее
идут описания расшареных ресурсов.
firewall
Несколько слов о применениях ipchains.
Маршрутизация между подсетями 192.168.1.0 и 192.168.2.0:
ipchains -P forward DENY
ipchains -A forward -s 192.168.1.0/24 -d 192.168.2.0/24 -j ACCEPT
ipchains -A forward -s 192.168.2.0/24 -d 192.168.1.0/24 -j ACCEPT
Создадим цепочку, через которую пойдет весь трафик от провайдера:
ipchains -N prov
ipchains -A input -i eth0 -j prov
Можно запретить ip-spoofing:
ipchains -A prov -s 192.168.1.1/16 -l -j DENY
ipchains -A prov -s 127.0.0.1/8 -l -j DENY
(не знаю, нужна ли вторая строчка)
Опция -l позволяет вести лог ip-spoofed пакетов, соответствующие сообщения
появляются в /var/log/messages. (И появляются они чаще, чем можно было
предположить :)
На всякий случай запретим телнет снаружи:
ipchains -A prov -p tcp --destination-port 23 -j REJECT
Если хотите, чтобы samba не светилась наружу, запретите порты 137-139
ipchains -A prov -p tcp --destination-port 137 -j REJECT
ipchains -A prov -p udp --destination-port 137 -j REJECT
то же с портами 138, 129
Подсчет трафика я веду с помощью bandmin.
URL: http://www.mrunix.net/webalizer/
Пришлось немного подкорректировать файл Acct.pm, чтобы он считал трафик
по моим правилам.
Создаем цепочку для подсчета трафика:
ipchains -N trafin
ipchains -I input -i eth0 -s ! 123.123.123.0/24 -p all -j trafin
ipchains -A trafin -d 123.123.123.123
То есть считаем трафик на наш адрес отовсюду, кроме подсети 123.123.123.0,
за трафик с которой мы не платим провайдеру.
И в файле Acct.pm (там, где раздел про ipchains) прописываем вместо
acctboth цепочку trafin.
Ali Albakov, 6-Dec-2000
Вопросы, комментарии и критика приветствуются: guldur at transit.samara.ru