Использование Linux (CentOS, Fedora core) на сервере в небольшой организации

Продолжение...

Теперь необходимо настроить защиту. Предполагаем, что защищаться мы будет только от "внешних врагов". Исходящие разрешены, входящие запрещены...пока. Создаём файл с таким содержанием:

#!/bin/sh 
echo "1" > /proc/sys/net/ipv4/ip_forward

/sbin/iptables -F
/sbin/iptables -t nat -F

/sbin/iptables -P INPUT DROP
/sbin/iptables -P OUTPUT DROP
/sbin/iptables -P FORWARD DROP

/sbin/iptables -A INPUT -i lo -j ACCEPT
/sbin/iptables -A OUTPUT -o lo -j ACCEPT

/sbin/iptables -A INPUT -i eth0 -j ACCEPT

/sbin/iptables -A OUTPUT -o eth0 -j ACCEPT

/sbin/iptables -A INPUT -i eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT

###/sbin/iptables -A INPUT -p tcp --dport 22 -j ACCEPT
### open ssh


###/sbin/iptables -A INPUT -s XXX.XXX.XXX.XXX -j DROP
#### drop IP

###/sbin/iptables -A INPUT -p tcp --dport 80 -j ACCEPT
### open http


/sbin/iptables -A OUTPUT -o eth1 -j ACCEPT


### открыть в NAT
#/sbin/iptables -A FORWARD -d 192.168.0.0/24 -i eth1 -j ACCEPT

#/sbin/iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
#/sbin/iptables -A FORWARD -s 192.168.0.62 -o eth1 -j ACCEPT
# даем доступ в интернет компьютеру с адресом 192.168.0.62
# иногда требуется например для активации Photoshop.
сохраняем, назвав его например start_iptables. Делаем его исполняемым. Можно в mc "F9" -> "Файл" -> "Права (расширенные)". И добавляем его на запуск в файл /etc/rc.d/rc.local. Файл "положить" можно в тот же каталог. (для удобства)
Или запустить один раз срипт, затем выполнить такую команду:
iptables-save > /etc/sysconfig/iptables
Теперь после перезагрузки сервера, iptables будет восстанавливать правила.

Если нужно чтобы сервер раздавал интернет клиентам без разбора, то надо изменить правила iptables
### открыть в NAT

/sbin/iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth1 -j MASQUERADE
/sbin/iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
Перегрузим компьютер, чтобы убедиться, что сетевые карты работают и защита включена:
[root@server /]# /sbin/iptables -L
Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     0    --  anywhere             anywhere
ACCEPT     0    --  anywhere             anywhere
ACCEPT     0    --  anywhere             anywhere            state RELATED,ESTABLISHED 

Chain FORWARD (policy DROP)
target     prot opt source               destination

Chain OUTPUT (policy DROP)
target     prot opt source               destination
ACCEPT     0    --  anywhere             anywhere
ACCEPT     0    --  anywhere             anywhere
ACCEPT     0    --  anywhere             anywhere
Теперь можно и попробовать работу интернета. Предполагается, что модем настроен. После его включения попробовать ping www.mail.ru
Если все настроено правильно, то должно "пинговаться"

Дальше будем запускать и настраивать службы DNS и DHCP. Сделаем так, чтобы при получении динамического адреса компьютером, он заносился в таблицу DNS. Проверяем файл /etc/sysconfig/network. Там должно быть две строчки - NETWORKING=yes и HOSTNAME=имя сервера. Допустим имя нашего сервера - server.corp . corp - как бы наш домен. Сначала настроим DNS. Предполагается, что пакет bind установлен. Обязательно проверить права доступа на каталог /var/named и его содержимое! "владелец" - named. Сначала сгенерируем ключ, чтобы обеспечить возможность обновление зон.

dnssec-keygen  -a HMAC-MD5 -b 128 -n USER rndckey
Получим файл примерно с таким содержимым:
rndckey. IN KEY 0 3 157 vox+MkM0yztMEHMqIw1mXe==
Ключ vox+MkM0yztMEHMqIw1mXe== надо внести в named.conf и dhcp.conf.
Редактируем /var/named/chroot/etc/named.conf
options {
forwarders { 84.XXX.XXX.XX1; 84.XXX.XXX.XX2; 192.168.0.1; 127.0.0.1; }; # 84.XXX - адреса DNS-серверов нашего провайдера
forward first;
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
listen-on {192.168.0.1; localhost;};
allow-transfer { 192.168.0.113; }; # это вторичный DNS; или { none; }, если его нет
};

key rndckey {
    algorithm HMAC-MD5.SIG-ALG.REG.INT;
    secret "vox+MkM0yztMEHMqIw1mXe==";
};

#Добавляем прямую и обратную зоны
zone "corp" {
type master;
file "corp.zone";		# файл описания прямой зоны (преобразование имя -> IP-адрес)
allow-update { key rndckey; };
};

zone "168.192.in-addr.arpa" {
type master;
file "corp.local";		# файл описания обратной зоны (преобразование IP-адрес -> имя)
allow-update { key rndckey; };
};
Затем создаем эти два файла corp.zone и corp.local в каталоге /var/named/chroot/var/named. Возможно потребуется создать ссылки на них в каталоге /var/named (зависит от версии bind).
corp.zone
$ORIGIN .
$TTL 86400	; 1 day
corp			IN SOA	server.corp. root.server.corp. (
		2012020221 ; serial
		600        ; refresh (10 minutes)
		60         ; retry (1 minute)
		7200       ; expire (2 hours)
		3600       ; minimum (1 hour)
		)
	    NS	server.corp.
	    NS	server2.corp.		# наш второй DNS - сервер
	    MX	10 server.corp.		# наш почтовый сервер
$ORIGIN corp.

$TTL 86400	; 1 day
server		A	192.168.0.1
server2		A	192.168.0.113
electron	A	192.168.0.2	# наш пользователь который должен иметь постоянный IP
prog		A	192.168.0.3	# тоже самое

corp.local
$ORIGIN .
$TTL 86400	; 1 day
168.192.in-addr.arpa	IN SOA	server.corp. root.server.corp. (
		2012020238 ; serial
		600        ; refresh (10 minutes)
		60         ; retry (1 minute)
		7200       ; expire (2 hours)
		3600       ; minimum (1 hour)
		)
		NS	server.corp.
		NS	server2.corp.
$ORIGIN 0.168.192.in-addr.arpa.
1		PTR	server.corp.	# точка в конце обязательна!
113		PTR	server2.corp.
2		PTR	electron.corp.
3		PTR	prog.corp.
Если в сети должен функционировать домен на основе AD Windows 2000, 2003, 2008 (например имя сервера Win-serv-2008 (192.168.0.50), имя домена corp), нужно добавить еще несколько зон:
zone "corp" {
type master;
file "corp.zone";
allow-update { Win-serv-2008; key rndckey; }; // сюда добавляем возможность обновлять зоны AD
};

zone "168.192.in-addr.arpa" {
type master;
file "corp.local";
allow-update { Win-serv-2008; key rndckey; }; // сюда добавляем возможность обновлять зоны AD
};

### for AD 2008
acl "Win-serv-2008" {
        192.168.0.50;	// адрес сервера AD (нужно также внести записи A и PTR в corp.local и corp.zone)
};

zone "_msdcs.corp" {
        type master;
        allow-update {Win-serv-2008;};
        check-names ignore;
        notify yes;
        file "_msdcs.corp";
};

zone "_sites.corp" {
        type master;
        allow-update {Win-serv-2008;};
        check-names ignore;
        notify yes;
        file "_sites.corp";
};

zone "_tcp.corp" {
        type master;
        allow-update {Win-serv-2008;};
        check-names ignore;
        notify yes;
        file "_tcp.corp";
};

zone "_udp.corp" {
        type master;
        allow-update {Win-serv-2008;};
        check-names ignore;
        notify yes;
        file "_udp.corp";
};

zone "DomainDnsZones.corp" {
        type master;
        allow-update {Win-serv-2008;};
        check-names ignore;
        notify yes;
        file "DomainDnsZones.corp";
};

zone "ForestDnsZones.corp" {
        type master;
        allow-update {Win-serv-2008;};
        check-names ignore;
        notify yes;
        file "ForestDnsZones.corp";
};
Создаем файлы зон:
DomainDnsZones.corp
$ORIGIN .
$TTL 86400      ; 1 day
DomainDnsZones.corp    IN SOA  server.corp. root.corp. (
                                2012020200  ; serial
                                28800      ; refresh (8 hours)
                                7200       ; retry (2 hours)
                                2419200    ; expire (4 weeks)
                                86400      ; minimum (1 day)
                                )
                        NS      server.corp.
$ORIGIN DomainDnsZones.corp.
ForestDnsZones.corp
$ORIGIN .
$TTL 86400      ; 1 day
ForestDnsZones.corp    IN SOA  server.corp. root.corp. (
                                2012020200  ; serial
                                28800      ; refresh (8 hours)
                                7200       ; retry (2 hours)
                                2419200    ; expire (4 weeks)
                                86400      ; minimum (1 day)
                                )
                        NS      server.corp.
$ORIGIN ForestDnsZones.corp.
_msdcs.corp
$ORIGIN .
$TTL 86400      ; 1 day
_msdcs.corp     IN SOA  server.corp. root.corp. (
                                2012020210 ; serial
                                28800      ; refresh (8 hours)
                                7200       ; retry (2 hours)
                                2419200    ; expire (4 weeks)
                                86400      ; minimum (1 day)
                                )
                        NS      server.corp.
$ORIGIN _msdcs.corp.
_sites.corp
$ORIGIN .
$TTL 86400      ; 1 day
_sites.corp     IN SOA  server.corp. root.corp. (
                                2012020204 ; serial
                                28800      ; refresh (8 hours)
                                7200       ; retry (2 hours)
                                2419200    ; expire (4 weeks)
                                86400      ; minimum (1 day)
                                )
                        NS      server.corp.
$ORIGIN _tcp.Default-First-Site-Name._sites.corp.
_tcp.corp
$ORIGIN .
$TTL 86400      ; 1 day
_tcp.corp       IN SOA  server.corp. root.corp. (
                                2012020204 ; serial
                                28800      ; refresh (8 hours)
                                7200       ; retry (2 hours)
                                2419200    ; expire (4 weeks)
                                86400      ; minimum (1 day)
                                )
                        NS      server.corp.
$ORIGIN _tcp.corp.
_udp.corp
$ORIGIN .
$TTL 86400      ; 1 day
_udp.corp       IN SOA  server.corp. root.corp. (
                                2012020201 ; serial
                                28800      ; refresh (8 hours)
                                7200       ; retry (2 hours)
                                2419200    ; expire (4 weeks)
                                86400      ; minimum (1 day)
                                )
                        NS      server.corp.
$ORIGIN _udp.corp.

Далее настроим DHCP, для этого редактируем /etc/dhcpd.conf, внося наши данные о сети

ddns-update-style interim;
authoritative;
option netbios-scope "";
ignore client-updates;
option subnet-mask		255.255.255.0;
option domain-name		"corp";
option domain-name-servers	192.168.0.1, 192.168.0.113;	# имена DNS-серверов
option time-offset		-18000;	# Eastern Standard Time
option netbios-name-servers	192.168.0.1;			# для windows машин
option netbios-node-type 8;
option ntp-servers		192.168.0.1;			# сервер точного времени (если развернем)
key rndckey {
    algorithm HMAC-MD5;
    secret vox+MkM0yztMEHMqIw1mXe==;
}
zone 168.192.in-addr.arpa.  {
    primary 192.168.0.1 ;
    key "rndckey" ; }
zone corp. {
    primary 192.168.0.1 ;
    key "rndckey" ; }
subnet 192.168.0.0 netmask 255.255.255.0 {			
    range 192.168.0.2 192.168.0.110;				# Выделяем диапазон адресов
    range 192.168.0.114 192.168.0.240;
    ddns-updates on;
    ddns-domainname "corp";
    ddns-rev-domainname "in-addr.arpa";
    default-lease-time 7200;
    max-lease-time 10800;
    use-host-decl-names true;
    host electron.corp {					# Эти компьютеры будут получать фиксированные адреса
	hardware ethernet 00:AD:C9:3A:B0:C9;			# по MAC-адресу сетевой карты
	fixed-address 192.168.0.2;
    }
    host prog.corp {
	hardware ethernet 00:AD:C8:4A:B0:A9;
	fixed-address 192.168.0.3;
    }
}

После старта этих служб можно опробовать их работу. В windows машине установить: получение динамического адреса. На значке сетевого соединения должна появиться надпись "Получение сетевого адреса" и затем "Получено". В терминальном окне попробовать : ping server.corp . Пингование будет говорить о успешной работе DNS. Также опробовать работу DNS можно командой nslookup. Например nslookup server.corp. Работает эта команда и в Windows и в Linux. Она выдаёт IP адреса хоста.
В файлах corp.zone и corp.local должны появится записи -

corp.zone:
comp1		A	192.168.0.35
	    TXT	"31f46044ffe806bcfa2f798b5bf55e53f9"
corp.local:
35			PTR	comp1.corp.
Значит связка DNS и DHCP работают.
Обязательно заглядывать в /var/log/messages! Особенно, если что-то не работает. У меня так и не получилось одно: компьютеры, имеющие фиксированные адреса, получившие с помощью DHCP, не заносятся в DNS. Пришлось заносить вручную

Теперь настроим раздачу интернета с помощбю Squid:

Правим squid.conf
http_port 8888				# порт прокси сервера, его вбивать в браузере клиента
hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?

no_cache deny QUERY
cache_mem 512 MB
cache_dir ufs /var/spool/squid 600 16 256
cache_access_log /var/log/squid/access.log
cache_log /var/log/squid/cache.log
cache_store_log /var/log/squid/store.log

auth_param basic children 5
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours

refresh_pattern ^ftp:		1440	20%	10080
refresh_pattern ^gopher:	1440	0%	1440
refresh_pattern .		0	20%	4320

acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255

acl electronik src 192.168.0.2/255.255.255.255		# описываем пользователя, который имеет доступ в интернет
acl programmer src 192.168.0.3/255.255.255.255

acl to_localhost dst 127.0.0.0/8
acl SSL_ports port 443 563
acl Safe_ports port 80		# http
acl Safe_ports port 21		# ftp
acl Safe_ports port 443 563	# https, snews
acl Safe_ports port 70		# gopher
acl Safe_ports port 210		# wais
acl Safe_ports port 1025-65535	# unregistered ports
acl Safe_ports port 280		# http-mgmt
acl Safe_ports port 488		# gss-http
acl Safe_ports port 591		# filemaker
acl Safe_ports port 777		# multiling http
acl CONNECT method CONNECT
acl piktime time MTWHF 8:00-16:55			# описываем время работы в интернете
acl badfiles urlpath_regex "/etc/squid/badfiles.txt"	# здесь перечисляем, какие файлы нельзя закачивать (по расширению)
acl porn url_regex "/etc/squid/sites.txt"		# в этом файле нехорошие сайты

##################
acl nobanners src 0/0
acl banners url_regex "/etc/squid/ba"			# в этом файле перечисленны возможные баннеры (для их резки)
deny_info http://server.corp/squid/empty.gif banners	# если у нас будет веб-сервер, на него выложить empty.gif, чтобы
##################					# заменять баннеры на страницах.

#deny_info ERR_NO_PORNO porn				# если пользователь захочет попасть на нехороший сайт, он увидит стандартную запрещающую страницу
deny_info http://server.corp/index1.html porn		# или заготовленную нами страницу
#deny_info http://maksim992.narod.ru/links2.html porn	# или переведём его на нужную страницу в интернете

http_access deny electronik porn			# применяем к пользователю фильтр porn (нехорошие сайты)
http_access deny electronik badfiles			# фильтр закачки файлов

http_access deny programmer porn
#http_access deny programmer badfiles			# программист может закачивать все файлы.


###############################
http_access deny nobanners banners
###############################


http_access allow electronik piktime			# разрешаем работу в интернете и ограничиваем пользователя рабочим временем
http_access allow programmer				# разрешаем работу в интернете

http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost
http_access deny all
http_reply_access allow all

icp_access allow all
ftp_user anonymous@mail.ru
cache_mgr root@server.corp
visible_hostname server
coredump_dir /var/spool/squid
Даём команду:
squid -z
Это мы создали дисковый кэш (необходимо при первом пуске!). Запускаем службу squid:
service squid start
У пользователя прописываем в браузере адрес прокси и порт. Примеры файлов ba и badfiles.txt можно скачать тут ba, и тут badfiles.txt
Назад . . .
Продолжение
На главную...