Первая лабораторная подготовка шлюза
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
!!! в лабораторной будет две виртуальной машины !!! домен d0.zor.inc 0. Информация о шлюзе hostname: c0.d0.zor.inc eth0 -> isp 10.0.0.23/24 eth1 -> lan 192.168.200.1/24 GW 10.0.0.1 DNS 192.168.200.1 (127.0.0.1) 1. Изменяем имена интерфейсов в файле /etc/udev/rules.d/70-persistent-net.rules 1.1 Или можно создать свое правило sudo nano /etc/udev/rules.d/1-user-network.rules KERNEL=="enp0s3", ,ATTR{address}=="08:00:27:47:d2:4e", NAME="eth0" 2. Информация о клиенте hostname: ubuntu ip dhcp 3. редактируем hosts на шлюзе nano /etc/hosts --------------- 127.0.0.1 localhost 10.0.0.23 c0.d0.zor.inc c0 192.168.200.1 intgate -------------- 4. Удаляем resolv.conf на шлюзе, что-бы убить символическую ссылку на файл генерации rm /etc/resolv.conf 5. Создаем файл resolv.conf на шлюзе nano /etc/resolv.conf --------------------- domain d0.zor.inc nameserver 10.0.0.1 --------------------- 6. Редактируем файл interfaces на шлюзе !!! Ubuntu в файле ifupdown просит установить пакет ifupdown, для управления сетью !!! sudo apt install ifupdown - устанавливаем пакет ifupdown !!! В ubuntu авто конфигурация сетевых интерфейсов демон netplan !!! netplan apply - применить изменения nano /etc/netplan/50-cloud-init.yaml - редактируем файл ------------------------------------ #network: # ethernets: # enp1s0: # dhcp4: true # version: 2 network: {config: disabled} ------------------------------------ nano /etc/network/interfaces - редактируем файл interfaces ----------------------------- auto lo iface lo inet loopback auto isp iface isp inet static address 10.0.0.23 netmask 255.255.255.0 gateway 10.0.0.1 dns-search CORP.NAME.local dns-domain CORP.NAME.local dns-nameservers 192.168.15.1 dns-nameservers 8.8.8.8 auto lan iface lan inet static address 192.168.200.1 netmask 255.255.255.0 ----------------------------- 7. Перезагружаем шлюз reboot |
Памятка по файлу /etc/network/interfaces
1 2 3 4 5 6 7 8 9 10 |
auto lo iface lo inet loopback auto ens3 iface ens3 inet static address 10.0.0.216 netmask 255.255.255.0 gateway 10.0.0.1 dns-nameservers 8.8.8.8 8.8.4.4 dns-search YOUR-DOME.pro |
Установка программ из исходников на примере браузера links
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
http://links.twibright.com/user_en.html - главная страница links http://links.twibright.com/download.php - страница загрузки cd /tmp - переходим в каталог временных файлов wget http://links.twibright.com/download/links-2.21.tar.gz - загружаем исходник src tar -xf links-2.21.tar.gz - распаковываем cd links-2.21 - переходим в каталог links-2.21 less README - читаем less INSTALL - читаем ./configure - подготовка к сборке программы (создается файл Makefile) ./configure --help - посмотреть дополнительные опции для сборки ./configure --without-ipv6 - соберем без ipv6 CFLAGS="-march=native -pipe -O2" ./configure --without-ipv6 - соберем без ipv6, native - родной, для нашей архитектуры apt install build-essential - пакет необходимый для сборки приложений в ubuntu ( make, gcc, cc и т.д.) CFLAGS="-march=native -pipe -O2" ./configure --without-ipv6 --without-gpm - соберем без ipv6, без gpm, native - родной, для нашей архитектуры make -j2 - компиляция и сборка программы make install - установка программы make clean - очистка подготовленных файлов для установки make remove - удаление программы hash -r - встроенная программа помогает сбросить хэш шела (помогает лечить проблему с путями к программам) links ya.ru - открыть страницу ya.ru links -dump ya.ru - links умеет делать дамп страницы |
Лабораторная вторая скрипты, программирование
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 |
!!! apt install fping !!! for x in `seq 0 14`; do fping 10.0.0.$((200+$x)); done - пример с fping !!! пробел в shell разделитель !!! script - сценарий При запуске программы проверяются условия: - право на исполнение - является ли файл бинарным исполняемым файлом - если это текстовый файл, есть ли в первой строке путь к интерпретатору При использовании bash первая строка shell script должна быть такой: #! /bin/bash !!! Переменные в shell script: - не типизированы - область видимости переменных – весь код программы - при обращении к неопределенной переменной не выдаются ошибки Пример использования переменной: PERM=value echo $PERM В shell все переменные строковые, string name=vasya - задали переменной name значение vasya echo $name - вывели на экран значение переменной name env - показывает значение переменных env | grep name - показать значение переменной name (ха-ха - мы ее там не увидим, что-бы её увидеть нужно её экспортировать) !!! shell дочерним процессам не передает переменные без экспорта export name - экспортировать переменную name, теперь мы ее увидим в глобальных переменных env | grep name - показать значение переменной name - вот теперь значение переменной name появилось после export set | less - показать все переменные заданные shell name=vasya surname=loshkin echo $name $surname #fullname=$name $surname - так как пробел является разделителем, то shell задаст переменную fullname=$name, а $surname попытается выполнить как команду !!! Еще есть особенность при такой записи fullname=$name $surname переменная выполняется и не изменяется, хороший пример с командой date и переменной LANG ниже date LANG= date fullname=$name\ $surname - экранируем пробел так как пробел в шелл является спец символом -разделителем echo $name $surname fullname="$name $surname" - кавычки заставляют шелл не интерпретировать спец символ пробел echo $name $surname fullname='$name $surname' - апострофы(одинарные кавычки), заставляют шелл игнорировать все echo $name $surname !!! обратные апострофы - выполнение команды a=`date` echo $a a=`date;date;date` echo $a cmd=date a=`cmd` echo $a !!! Три способа определения массивов: MASS[0]=value MASS=([0]=value1 [5]=value2) MASS=(value1 value2) Получение значения элемента массива: ${MASS[0]} Получение значений всех элементов массива: ${MASS[*]} или ${MASS[@]} !!! Подстановочные переменные В подстановке используется то, что программа будет выводить на стандартный вывод. Два варианта записи подстановки: `program` $(program) !!! В shell script используется ограниченный набор арифметических операций: + - * / и круглые скобки. Для подстановки значения арифметических выражений используется: $(( выражение )) Если значение переменной, используемой в арифметическом выражении, не является целым числом, то её значение считается равным 0. Значения могут быть только целочисленными, дробная часть отбрасывается echo $((87/100 * 100000)) echo $((10 - 3)) echo $((48*50)) echo $((500/234)) echo $(((900+200*49-10000)/2)) !!! Условный оператор if if условие then список операторов [else список операторов ] [elif условие список операторов ] fi !!! Проверка условий при помощи программы test test [опции] условия ... Программа test предназначена для проверки следующих типов условий: - сравнение различных значений, - проверка типов и наличия файлов, - проверка логических условий !!! Использование встроенных операторов && и || && ― логическое И. || ― логическое ИЛИ. !!! Оператор case case строка in шаблон) список операторов ;; [ шаблон) список операторов [;;] ] esac Оператор case поочередно сравнивает строку с шаблонами. Если шаблон совпадает, то выполняется группа операторов, находящихся между шаблоном и специальными символами ;;. После выполнения всех строк управление передается операторам, находящимся за ключевым словом esac. !!! Оператор for for переменная [ in список ] do список операторов done При каждой итерации в операторе for, переменной присваивается следующее значение из списка и выполняются все операторы, находящиеся между do и done. Оператор работает до тех пор, пока не будет обработан весь список или в теле цикла не встретится оператор break. #!/bin/bash # Пример for for I in 1 2 3 4 5 6 7 8 9 10 do echo "--> $I <--" done !!! Оператор while while условие do набор операторов done В цикле while выполняются строки, расположенные между do и done, до тех пор, пока условие истинно или пока не встретится оператор break или exit. s4 - пример скрипта пинговалики ----------------------------- #!/bin/sh #seq - генерирует числа от до #fping - пингует хост for x in `seq 1 254` do #fping 10.10.104.$((200+$x)) #fping -a -c1 192.168.15.$((0+$x)) fping 192.168.15.$((0+$x)) done ------------------------------ s4 - показываем что не пингуется ------------------------------ #!/bin/sh #seq - генерирует числа от до #fping - пингует хост for x in `seq 1 254` do fping -q 192.168.15.$((0+$x)) 2> /dev/null if [ $? -ne 0 ] then echo ACHTUNG! ip 192.168.15.$x is unreacheable. fi done ------------------------------ !!! Оператор select select переменная in список do набор операторов done !!! Специальные переменные $0 $1 ... $9 ― позиционные переменные. $* и $@ ― все параметры командной строки. $# ― количество параметров командной строки. $? ― код возврата программы. $! ― PID программы, запущенной в background режиме. $$ ― PID процесса shell. $? — код возврата последней выполненной программы. $! — PID последней программы, запущенной в background режиме. $$ — PID процесса shell, исполняющего данный shell script. Пример использования специальных переменных: ------------------ #!/bin/sh #$0 - имя программы как она была вызвана #$$ - PID процесса скрипта echo PID of $0: $$ ------------------ !!! - Значения переменных живут в своих процессах (если только специально не переданы) s1 ------------------ #!/bin/sh echo PID of $0: $$ a=1 echo a in $0: $a ./s2 echo a in $0: $a ----------------- s2 ----------------- #!/bin/sh echo PID of $0: $$ a=2 echo a in $0: $a ----------------- s2 !!! если значение переменной не присвоено, то оно будет пустой строкой ----------------- #!/bin/sh echo PID of $0: $$ echo a in $0 \(before\): $a a=2 echo a in $0 \(after\): $a ------------------ !!! экспорт переменных, если всё-таки требуется передать значение переменной s1 ------------------ #!/bin/sh echo PID of $0: $$ export a=1 # экспортируем значение переменной echo a in $0: $a ./s2 echo a in $0: $a ----------------- !!! А если всё-таки переменную из s2 надо будет использовать в s1? !!! Все просто нужно что бы скрипты s1 и s2 были одним процессом, для этого просто скрипт s2 запустим в процессе s1 s1 ------------------ #!/bin/sh echo PID of $0: $$ a=1 #экспорт нам не нужен, так как это будет один процесс echo a in $0: $a . ./s2 #вот таким не хитрым способом поставив точку echo a in $0: $a ----------------- !!! Использование $? - код возврата программы --------------------- fping ya.ru - fping -q ya.ru echo $? 0 - ноль все хорошо fping -q ya.ry echo $? 2 - все значения кроме нуля какая-то ошибка --------------------- !!! Пример скрипта s6 читаем файл echo 1 2 3 4 > hosts_to_check - создаем файл hosts_to_check с цифрами 1,2,3,4 s6 ------------------- #!/bin/sh for x in `cat hosts_to_check` # значения x берем из файла hosts_to_check do fping -q 192.168.15.$((0+$x)) 2> /dev/null if [ $? -ne 0 ] # если ответ fping не равен нулю то выводим следующие then echo ACHTUNG! ip 192.168.15.$x is unreacheable. fi done --------------------- !!! Пример скрипта s7 !!! Если не указывать значение аргумента arg, то шелл будет брать значения аргумента командной строки !!! Т.е. ./s7 без параметров шелл не выведет ничего, а если указать параметры ./s7 1 f 2 42 s7 -------- #!/bin/sh for arg do echo $arg done --------- s8 --------- #!/bin/sh :>x1 for arg do echo $arg >> x1 done sort -r x1 --------- |
Лабораторная третья, время, NTP, сервер NTPD
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
RTC - на плате вместе с BIOS, запитанные от батарейки, System Clock - unix epoch UTC - всемирное координированное время - Coordinated Universal Time GMT - Greenwich Mean Time - Среднее время по Гринвичу UTC=GMT NTP использует порт 123 UDP В пакет входит следующее: ntpq для запроса серверов NTP ntpd поддерживает точность локальных часов и (опционально) обеспечивает клиентам службу NTP ntptrace прослеживает цепь сервера NTP к исходному серверу ntpdate — одноразовая программа обновления часов Онлайн список общедоступных серверов NTP http://support.ntp.org/bin/view/Servers/WebHome apt instsall ntp - установим ntp apt install ntpdate - установим пакет ntpdate /etc/init.d/ntp stop - остановим демон ntp date - показать время date -s 16:00 - установить время 16:00 file /etc/localtime - файл временной зоны, обычно линкуют с правильным файлом из /usr/share/zoneinfo, по умолчанию это /usr/share/zoneinfo/Etc/UTC cp /usr/share/zoneinfo/Europe/Stockholm /etc/localtime - вот так можно сменить временную зону например на Stockholm cp /usr/share/zoneinfo/Europe/Helsinki /etc/localtime - вот так можно сменить временную зону например на Helsinki cp /usr/share/zoneinfo/Europe/London /etc/localtime - вот так можно сменить временную зону например на London cp /usr/share/zoneinfo/Europe/Moscow /etc/localtime - вот так можно сменить временную зону например на Moscow ntpdate ru.pool.ntp.org - установим время используя пул ru.pool.ntp.org Для автоматической синхронизации можно настроить планировщик crontab crontab –e 0 * * * * /usr/sbin/ntpdate [серверы NTP] 0 * * * * /usr/sbin/ntpdate ntpdate ru.pool.ntp.org Сервер точного времени ntpd GPS NMEA-0183 /etc/init.d/ntp start - запускаем демон ntp pgrep -l ntp - убеждаемся что он запустился и работает nano /etc/ntp.conf - файл конфигурации ------------------ server ntp.ubuntu.com server time.nist.gov server europe.pool.ntp.org Разрешение доступа из локальной сети: По умолчанию ваш сервер NTP будет доступен всем хостам в Интернет. Параметр restrict в файле /etc/ntp.conf позволяет вам контролировать, какие машины могут обращаться к вашему серверу. Если вы хотите запретить всем машинам обращаться к вашему серверу NTP, добавьте следующую строку в файл /etc/ntp.conf: restrict default ignore Если вы хотите разрешить синхронизировать свои часы с вашим сервером только машинам в вашей сети, но запретить им настраивать сервер или быть равноправными участниками синхронизации времени, то вместо указанной добавьте строчку restrict 10.0.0.0 mask 255.0.0.0 nomodify notrap /etc/ntp.conf может содержать несколько директив restrict restrict 10.0.0.0 mask 255.0.0.0 noquery ------------------ Логи сервера: /var/log/ntpstats/ Проверка запросов: ntpq –p |
Лабораторная четвертая, FTP, демон ftpd
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
!!! ftp порт 21 !!! ss -tpln | grep ftp FTP отличается от других приложений тем, что он использует два TCP соединения для передачи файла. 1.Управляющее соединение устанавливается как обычное соединение клиент-сервер. Сервер осуществляет пассивное открытие на заранее известный порт FTP (21) и ожидает запроса на соединение от клиента. Клиент осуществляет активное открытие на TCP порт 21, чтобы установить управляющее соединение. Управляющее соединение существует все время, пока клиент общается с сервером. Это соединение используется для передачи команд от клиента к серверу и для передачи откликов от сервера. 2.Соединение данных открывается каждый раз, когда осуществляется передача файла между клиентом и сервером. (Оно также открывается и в другие моменты, как мы увидим позже.) Тип сервиса IP для соединения данных должен быть "максимальная пропускная способность", так как это соединение используется для передачи файлов. FTP-сервер поддерживает 2 режима передачи данных: ascii и binary, что определяется переданными ему командами. Команды FTP ----------- help получить список команд поддерживаемых ftp-сервером ls или dir список файлов или директорий pwd показать текущую директорию cd перейти к указанной директории mkdir создать директорию rmdir удалить директорию, если она не пустая [m]get получить файл[ы] с сервера [m]put отправить файл[ы] на сервер TYPE {binary | ascii} указать режим передачи данных quit или exit завершить работу с сервером ----------- apt-get install proftpd openssl ftp-ssl whois - установка, с этого момента proftpd установился и работает но без шифрования ftp localhost - подключаема и проверяем работу proftpd Проверяем работу ftp IP_адрес После подключения создаем на сервере директорию MyDir командой: mkdir MyDir Для использования TLS нам необходимо создать SSL сертификат в каталоге /etc/proftpd/ssl mkdir /etc/proftpd/ssl - cоздаем каталог /etc/proftpd/ssl openssl req -new -x509 -days 365 -nodes -out /etc/proftpd/ssl/proftpd.cert.pem -keyout /etc/proftpd/ssl/proftpd.key.pem - генерируем SSL сертификат (на все вопросы просто прощелкаем Enter, так как сертификат само подписанный и проверять его некто не будет) nano /etc/proftpd/proftpd.conf - редактируем строки в конфиге proftpd, убираем комментарии строк ------------------------------ DefaultRoot ~ #Изолировать пользователя в домашнем каталоге, найти убрать комментарий IdentLookups off #найти убрать комментарий Include /etc/proftpd/tls.conf #Включаем TLS, найти убрать комментарий ServerIdent on "FTP Server ready." #Приветсвие сервера при подключении, добавляем в конец файла ------------------------------ cp /etc/proftpd/tls.conf /etc/proftpd/tls.conf.back - делаем копию файла /etc/proftpd/tls.conf :> /etc/proftpd/tls.conf - уничтожаем содержимое файла /etc/proftpd/tls.conf nano /etc/proftpd/tls.conf - редактируем файл /etc/proftpd/tls.conf -------------------------- TLSEngine on TLSLog /var/log/proftpd/tls.log TLSProtocol SSLv23 TLSOptions NoCertRequest TLSRSACertificateFile /etc/proftpd/ssl/proftpd.cert.pem TLSRSACertificateKeyFile /etc/proftpd/ssl/proftpd.key.pem TLSVerifyClient off TLSRequired on -------------------------- Если у вас TLSRequired on, тогда только пользователи с включенным TLS получат доступ к вашему FTP серверу (могут возникнуть проблемы у пользователей использующих старые FTP клиенты не поддерживающие TLS). Для того чтобы все пользователи могли соединиться с FTP закомментируйте строку TLSRequired on, либо измените значение на Off В случае возникновения проблем с TLS смотрите логи /var/log/proftpd/tls.log Проверяем работу ftp-ssl IP_адрес После подключения создаем на сервере директорию MyDir командой: mkdir MyDir |
DNS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
DNS to ip - прямое преобразование ip to DNS - обратное преобразование - PTR ping -c1 ya.ru - прямое преобразование RESOLVER DNS Library /etc/hosts - специальный файл, прямое преобразование, обратное преобразование, DNS, resolver проверяет в первую очередь /etc/resolv.conf - файл списка DNS серверов для resolver !!! Например полное имя нашего хоста h1, DNS Suffix у нас class.inc !!! FQDN - полное имя у нас будет h1.class.inc. FQDN - полностью квалифицированного доменного имени. Обратите внимание на точку в конце имени — это явное указание корневого домена. Наиболее распространенная ошибка при создании файла описания зоны — это отсутствие точки в конце FQDN. /etc/host.conf - специальный файл, задает поведения обращения к ресурсам в сети DNS (старый файл) /etc/nsswitch.conf - (Name Service Switch) специальный файл, задает поведения обращения к ресурсам в сети (DNS, password, etc...) Записи о ресурсах Формат записи можно представить следующим образом: [имя_компьютера|имя_домена] [ttl] [класс] тип параметры Первое – это имя машины или домена. Что именно писать в этом поле, зависит от типа записи. Если это поле оставить пустым, то его значение берется из предыдущей записи. Если вы не указываете первое поле, то в начале строки обязательно должен присутствовать либо символ пробела, либо табуляции. Второе поле – время жизни записи в кэш DNS сервера. Значение поля устанавливается в секундах. Если поле не определено, его значение берется из значения по умолчанию для данной зоны. Третье поле – класс сети. Можно использовать следующие классы сетей: IN – Internet (значение по умолчанию) CH – ChaosNet. В настоящее время не используется. HS – Hesoid – информационная служба, являющаяся надстройкой пакета BIND. Используется крайне редко Тип записи – это зарезервированное слово. SOA Определение параметров зоны DNS. Обязательная запись NS Определение DNS серверов, авторитетных для зоны. Делегирование полномочий под доменам. Обязательная запись. А Преобразование имени в IP адрес AAAA Преобразование имени в адрес IPv6 А6 Преобразование имени в адрес IPv6 PTR Преобразование IP адреса в имя MX Применяется для указание почтового сервера, отвечающего за почту домена KEY Открытый ключ шифрования для DNS имени CNAME Дополнительное имя машины (псевдоним) SRV Определение служб в пределах домена Пример формата записи SOA: unix.domenname.ru. IN SOA master.unix.domenname.ru. ( artur.unix.domenname.ru. ; e-mail 2008072501 ; серийный номер записи 18H ; время обновления 20M ; интервал между попытками 2W ; интервал устаревания 1D ) ; TTL host host ya.ru 8.8.8.8 host -v ya.ru 8.8.8.8 host -t mx gmail.com host -la ya.ru 8.8.8.8 nslookup dig |
Сервер DNS — bind9
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
!!! Используются порты udp/tcp 53 и tcp 953 !!! ps auxwww | grep bind - проверяем от кого работает bind, должен работать от пользователя bind !!! Low (Privileged) Ports < 1024 UID == 0 !!! Privilege Drop !!! id bind - проверяем UID пользователя 0. Устанавливаем Bind9 apt-get install bind9 - устанавливаем Bind9 pgrep named - проверяем запуск демона named (он же bind9) /etc/bind/named.conf - главный конфиг файл (в дистрибутивах debian в нем ссылки(include) на другие файлы) 1. Редактируем файл /etc/bind/named.conf.options nano /etc/bind/named.conf.options - редактируем, убираем комментарии, комментируем не нужное --------------------------------- forwarders { 192.168.15.1; - внешний сервер DNS }; //dnssec-validation auto; - эту строку мы закомментируем (поставим //), в некоторых дистрибутивах этот параметр работает не правильно //dnssec-enable yes; - были проблемы с bind после обновления, не резолвились внешние адреса, после добавления заработало //dnssec-validation yes; - были проблемы с bind после обновления, не резолвились внешние адреса, после добавления заработало listen-on-v6 { none; }; - отключаем прослушивания ipv6 DNS на интерфейсах (вместо any прописали none) --------------------------------- /etc/init.d/bind9 restart - перезапускаем демон bind9 host ya.ru 127.0.0.1 - проверяем работу нашего DNS сервера (демона bind9) 2. Редактируем файл /etc/resolv.conf после успешной проверки nano /etc/resolv.conf - редактируем --------------------- domain d0.zor.inc nameserver 127.0.0.1 - меняем строку nameserver указав ip 127.0.0.1 вместо ip внешнего сервера --------------------- 3. Редактируем файл etc/bind/named.conf.local создаем свою зону DNS "d0.zor.inc" Типы зон: зона master принадлежит нам, зона slave о своем существовании узнает от мастера, зона hint для домена точки со списком корневых серверов, nano /etc/bind/named.conf.local - редактируем файл ------------------------------- zone "d0.zor.inc" { type master; - тип зоны file "/etc/bind/d0.zor.inc.zone"; - файл с описание хостов зоны }; ------------------------------- !!! Всегда проверяйте изменения конфига с помощью named-checkconf named-checkconf - проверка конфиг файлов (по умолчанию проверяет только синтаксис, например файла d9.zor.inc.zone еще нет, а проверка молчит ) named-checkconf -z - при использовании параметра "-z" производит проверку файлов которых не хватает. 4. Редактируем файл описания нашей зоны d0.zor.inc.zone nano /etc/bind/d0.zor.inc.zone - редактируем файл ------------------------------ $TTL 30 $ORIGIN d0.zor.inc. @ SOA c0 root 2021011300 1h 10m 1d 30 NS c0 MX 10 c0 c0 A 192.168.200.1 c1 A 192.168.200.2 router A 10.0.0.1 printer A 192.168.15.10 internet A 10.0.0.23 ------------------------------ named-checkconf -z - проверка конфигурации на ошибки !!! Да для того что-бы настройки вступили в силу можно перезагрузить сервер, перезапустить демон, !!! но это скорее не правильное действие, лучше использовать специальную программу rndc !!! rndc - специальная программа для управления bind !!! Внимание rndc reload - перечитать все конфигурационные файлы и файлы описания зон rndc reconfig - перечитать конфигурационный файл и загрузить только новые зоны |
Пример скрипта проверки хостов № 1
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#! /bin/sh while : do clear for x in `seq 1 10` do /bin/echo -ne "$x:\t" host c$x.d0.zor.inc. 192.168.200.$((0 + $x)) | grep zor /bin/echo -ne "$x:\t" host c0x.d$.zor.inc. 192.168.200.$((0 + $x)) | grep zor done sleep 2 done |
Пример скрипта проверки хостов № 2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#! /bin/sh while : do /bin/echo -ne "\t" host router.d0.zor.inc 192.168.200.1 | grep zor /bin/echo -ne "\t" host c0.d0.zor.inc 192.168.200.1 | grep zor /bin/echo -ne "\t" host c1.d0.zor.inc 192.168.200.1 | grep zor /bin/echo -ne "\t" host printer.d0.zor.inc 192.168.200.1 | grep zor /bin/echo -ne "\t" host internet.d0.zor.inc 192.168.200.1 | grep zor sleep 5 clear done |
Пример скрипта проверки хостов № 3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#! /bin/sh while : do for x in `seq 1 5` do /bin/echo -ne "test $x:\t\n\t" host router.d0.zor.inc 192.168.200.1 | grep zor /bin/echo -ne "\t" host c0.d0.zor.inc 192.168.200.1 | grep zor /bin/echo -ne "\t" host c1.d0.zor.inc 192.168.200.1 | grep zor /bin/echo -ne "\t" host printer.d0.zor.inc 192.168.200.1 | grep zor /bin/echo -ne "\t" host internet.d0.zor.inc 192.168.200.1 | grep zor sleep 5 clear done done |
Сервер DNS — bind9 — добавление slave зоны
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
1. Редактируем файл и добавим slave зону d1.zor.inc nano /etc/bind/named.conf.local ------------------------------- zone "d0.zor.inc" { type master; file "/etc/bind/d0.zor.inc.zone"; }; zone "d1.zor.inc" { type slave; master {10.0.0.27;}; file "d1.zor.inc.zone"; # !!! Внимание: без этой строки кэша не будет, путь относительный, файл описания зоны, файл кэш с мастера на d0 искать тут /var/cache/bind/d1.zor.inc.zone }; ------------------------------- 2. Проверяем на ошибки named-checkconf - проверка конфигурации на ошибки 3. Применяем изменения rndc reconfig - перечитать конфигурационный файл и загрузить только новые зоны 4. Проверяем, c1 - ПК в домене d1.zor.inc. host c1.d1.zor.inc. |
Сервер DNS — bind9 — добавление зоны обратного преобразования (ptr запись)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
!!! Домен in-addr.arpa !!! .in-addr.arpa. - Это специальный домен, предназначенный для обратного преобразования. !!! FQDN будет выглядеть следующим образом: 192.168.200.1.in-addr.arpa !!! Все примеры, которые мы до сих пор рассматривали, относились к прямому преобразованию, когда имя машины преобразовывалось в IP адрес. !!! DNS сервера позволяют осуществлять и обратное преобразование — IP адрес в имя машины. !!! 10.in-addr.arpa. 10/8 10.0.0/8 !!! 10.10.in-addr.arpa. 10.10/16 10.10.0/16 !!! 10.10.10.in-addr.arpa. 10.10.10/24 10.0.0.0/24 !!! у меня в примере три сети 192.168.200/24, 192.168.15/24, 10.0.0/24 поэтому три файла !!! Внимание на забывайте ставить точку в имени FQDN (c0.d0.zor.inc.) , ( 200.168.192.in-addr.arpa.) 0. Редактируем файл /etc/bind/named.conf.local, добавим ptr зону 10.0.0.in-addr.arpa nano /etc/bind/named.conf.local ------------------------------- zone "d0.zor.inc" { type master; file "/etc/bind/d0.zor.inc.zone"; }; zone "0.0.10.in-addr.arpa" { type master; file "/etc/bind/0.0.10.in-addr.arpa.zone"; }; zone "15.168.192.in-addr.arpa" { type master; file "/etc/bind/15.168.192.in-addr.arpa.zone"; }; zone "200.168.192.in-addr.arpa" { type master; file "/etc/bind/200.168.192.in-addr.arpa.zone"; }; ------------------------------- 1. редактируем файл /etc/bind/0.0.10.in-addr.arpa.zone nano /etc/bind/0.0.10.in-addr.arpa.zone ---------------------------------- $TTL 30 $ORIGIN 0.0.10.in-addr.arpa. @ SOA c0.d0.zor.inc. root.d0.zor.inc. ( 2021011300 1h 10m 1d 30) NS c0.d0.zor.inc. 23 PTR internet.d0.zor.inc. 1 PTR router.d0.zor.inc. ---------------------------------- 2. редактируем файл /etc/bind/200.168.192.in-addr.arpa.zone nano /etc/bind/200.168.192.in-addr.arpa.zone ---------------------------------- $TTL 30 $ORIGIN 200.168.192.in-addr.arpa. @ SOA c0.d0.zor.inc. root.d0.zor.inc. ( 2021011300 1h 10m 1d 30) NS c0.d0.zor.inc. #$GENERATE 0-254 ${0} PTR c$.d0.zor.inc. - удали нафиг это пример #$GENERATE 0-54 ${200} PTR c$.d0.zor.inc. - удали нафиг это пример $GENERATE 0-5 ${1} PTR c$.d0.zor.inc. ---------------------------------- 3. редактируем файл /etc/bind/15.168.192.in-addr.arpa.zone nano /etc/bind/15.168.192.in-addr.arpa.zone ---------------------------------- $TTL 30 $ORIGIN 15.168.192.in-addr.arpa. @ SOA c0.d0.zor.inc. root.d0.zor.inc. ( 2021011300 1h 10m 1d 30) NS c0.d0.zor.inc. 10 PTR printer.d0.zor.inc. ---------------------------------- 4. Применяем изменения named-checkconf -z - проверяем конфиг файлы bind Если с конфигурационными файлами все в порядке, применяем изменения с помощью rndc rndc reconfig - перечитать конфигурационный файл и загрузить только новые зоны !!! Внимание rndc reload - перечитать все конфигурационные файлы и файлы описания зон rndc reload 15.168.192.in-addr.arpa. - перезапустить зону 15.168.192.in-addr.arpa. 5. Проверяем host 192.168.15.1 host 192.168.200.1 host 192.168.200.2 host 10.0.0.1 host 10.0.0.23 Если все хорошо, в ответ мы получим ИП_АДРЕС.in-addr.arpa domain name pointer ИМЯ.d0.zor.inc. |
bind очистка кэша:
1 2 3 4 5 6 7 8 9 10 11 |
rndc dumpdb -all - сохранить кэш в файл named_dump.db (обычно тут /var/bind/named_dump.db) rndc flushname mx.example.ru. - удаляем mx.example.ru из кэша rndc flush - очистить кэш Пример: rndc flushname mx.example.ru. - удаляем mx.example.ru из кэша rm /var/bind/named_dump.db - удаляем дамп кэша DNS rndc dumpdb -all - сохраняем дамп кэша DNS grep mx.example.ru /var/bind/named_dump.db - проверяем если запись |
DHCP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
!!! порты UDP, сервер 67, клиент 68 !!! ipv4 - DHCP - определена в RFC 2131 !!! ipv6 - DHCPv6 и определена в RFC 3315 Передача данных производится при помощи протокола UDP, при этом сервер принимает сообщения от клиентов на порт 67 и отправляет сообщения клиентам на порт 68. Запрос IP клиентом DHCPDISCOVER: Он отправляет сообщение типа DHCPDISCOVER, при этом в качестве IP-адреса источника указывается 0.0.0.0 (так как компьютер ещё не имеет собственного IP-адреса), а в качестве адреса назначения — широковещательный адрес 255.255.255.255. В сообщении клиент заполняет несколько полей начальными значениями: уникальный идентификатор транзакции, который позволяет отличать данный процесс получения IP-адреса от других, протекающих в то же время; аппаратный адрес (MAC-адрес) клиента; последний известный клиенту IP-адрес, а в данном примере это 192.168.1.100; Это необязательно и может быть проигнорировано сервером. Сервер DHCP предлагает IP адрес клиенту DHCPOFFER: Это сообщение DHCP-сервер рассылает широковещательно. Клиент может получить несколько различных предложений DHCP от разных серверов; из них он должен выбрать то, которое его «устраивает». Клиент выбирает конфигурацию предложенную DHCP-серверами DHCPREQUEST: Выбрав одну из конфигураций, предложенных DHCP-серверами, клиент отправляет запрос DHCP (DHCPREQUEST). Он рассылается широковещательно; при этом к опциям, указанным клиентом в сообщении DHCPDISCOVER, добавляется специальная опция — идентификатор сервера — указывающая адрес DHCP-сервера, выбранного клиентом. Подтверждение DHCP Сервер подтверждает запрос и направляет это подтверждение (DHCPACK) клиенту. После этого клиент должен настроить свой сетевой интерфейс, используя предоставленные опции. |
DHCP установка сервера (isc-dhcp-server)
1 2 3 4 5 |
apt-cache -n search dhcp - ищем пакет с именем (параметр -n) dhcp apt-cache search -n dhcp - ищем пакет с именем (параметр -n) dhcp apt-cache search -n dhcp | grep server - ищем пакет с именем (параметр -n) dhcp apt install isc-dhcp-server - устанавливаем DHCP сервер |
DHCP настройка сервера (isc-dhcp-server)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
0. редактируем файл /etc/default/isc-dhcp-server nano /etc/default/isc-dhcp-server --------------------------------- INTERFACESv4="lan" --------------------------------- 1. Перейдем в каталог /etc/dhcp cd /etc/dhcp тут два файла dhclient.conf - настройки dhcp клиента dhcpd.conf - настройки сервера 1. редактируем файл /etc/dhcp/dhcpd.conf > dhcpd.conf - очистим файл nano dhcpd.conf - редактируем файл --------------- # Глобальные настройки option domain-name "d0.zor.inc"; # наша зона DNS option domain-name-servers 192.168.200.1; # наш DNS сервер option routers 192.168.200.1; # Маршрут по умолчанию default-lease-time 600; # время аренды ip десять минут max-lease-time 86400; # время ожидания доступности dhcp сервера один день (через день клиент получит адрес APIPA 169.$ ddns-update-style none; # отключаем отправку нашему dns серверу о новых клиентах authoritative; # говорим всем что самый главный dhcp сервер (у клиента не будет задержи при получения ip) # Настройки для сети 192.168.200.0/24 subnet 192.168.200.0 netmask 255.255.255.0 { #option netbios-name-servers 192.168.200.1; # в 2021 году net-bios зачем?, можно удалить #option domain-name-servers 192.168.200.1; # можно удалить, указали в глобальных настройках #option domain-name "d0.zor.inc"; # можно удалить, указали в глобальных настройках #option routers 192.168.200.1; # можно указать в глобальных настройках, тем более если сеть одна. #option broadcast-address 192.168.200.255; # можно удалить range 192.168.200.50 192.168.200.250; } --------------- 2. Итоговый файл /etc/dhcp/dhcpd.conf nano dhcpd.conf - редактируем файл --------------- option domain-name "d0.zor.inc"; option domain-name-servers 192.168.200.1; option routers 192.168.200.1; default-lease-time 600; max-lease-time 86400; ddns-update-style none; authoritative; subnet 192.168.200.0 netmask 255.255.255.0 { range 192.168.200.50 192.168.200.250; } --------------- 3. Проверяем конфиги dhcp сервера dhcpd -t - команда проверки конфигов dchp сервера 4. если все хорошо то перезапускаем dhcp сервер /etc/init.d/isc-dhcp-server restart - перезапускаем dhcp сервер |
Включение IP Forward
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
!!! По умолчанию ip forward выключен !!! Если forward выключен то не будет работать маршрутизация между интерфейсами cat /proc/sys/net/ipv4/ip_forward - проверяем текущие состояние ip_forward echo 1 > /proc/sys/net/ipv4/ip_forward - так мы можем включить IP forward !!! Для постоянного включения необходимо отредактировать файл /etc/sysctl.conf, найти строку net.ipv4.ip_forward=1 и убрать комментарий с неё nano /etc/sysctl.conf --------------------- # Uncomment the next line to enable packet forwarding for IPv4 net.ipv4.ip_forward=1 --------------------- sysctl -p - выполняем для применения изменений без перезагрузки sysctl -f - выполняем для применения изменений без перезагрузки |
NAT
1 2 3 4 5 6 7 8 9 10 11 |
!!! В организация NAT не должно быть в принципе. Доступ к интернету должен осуществляется через proxy сервер !!! eth0 = isp NAT: iptables -t nat -A POSTROUTING -o isp -j MASQUERADE iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE forward port: iptables -t nat -A PREROUTING -p tcp -d 192.168.3.124 --dport 3389 -j DNAT --to 10.70.70.105:3389 iptables -t nat -A PREROUTING -p tcp -d 192.168.3.124 --dport 5090 -j DNAT --to 10.70.70.101:5090 |
DHCP настроим имя для хоста + IP address
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
!!! Хотим чтобы компьютерам по их имени добавлялись IP 0. Перейдем в каталог bind cd /etc/bind 1. Cпомощью echo добавим запись A для компьютера winxp с IP 192.168.200.13 в зону d0.zor.inc.zone echo winxp A 192.168.200.13 >> d0.zor.inc.zone 2. Проверим конфиг демона bind named-checkconf -z 3. Применим настройки для зоны d0.zor.inc.zone rndc reload d0.zor.inc.zone - перезапустить зону d0.zor.inc.zone 4. Теперь требуется настроить DHCP сервер что бы он выдавал IP адреса cat /var/lib/dhcp/dhcpd.leases - показать все арендованные IP адреса и MAC less /var/lib/dhcp/dhcpd.leases- показать все арендованные IP адреса и MAC 5. Вариант вставки MAC в /etc/dhcpd.conf cat >> dhcpd.conf hardware ethernet 52:54:00:af:d3:b7; Ctrl+d Ну или отредактируем файл редактором /etc/dhcp/dhcpd.conf nano /etc/dhcp/dhcpd.conf - редактируем файл ------------------------- option domain-name "d0.zor.inc"; option domain-name-servers 192.168.200.1; option routers 192.168.200.1; default-lease-time 600; max-lease-time 86400; ddns-update-style none; authoritative; subnet 192.168.200.0 netmask 255.255.255.0 { range 192.168.200.50 192.168.200.250; } host winxp { hardware ethernet 52:54:00:af:d3:b7; fixed-address winxp.d0.zor.inc; } ------------------------- 6. Проверяем конфиг DHCP и перезапускаем демон DHCP dhcpd -t /etc/init.d/isc-dhcp-server restart arping -I lan winxp - пинг по протоколу ARP (-I интерфейс, lan - имя интерфейса, winxp - имя ПК\IP) |
Bind дополнительные настройки
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
directory Определяет директорию, в которой сервер BIND будет искать файлы описания зон и создавать различные дополнительные файлы. Обычно этот параметр ссылается на директорию /var/named. Пример: directory «/var/named» notify yes|no Если параметр notify равен yes, то при изменении описания зоны будут посланы уведомления всем slave DNS серверам. Значение по умолчанию — yes. Пример: notify no also-notify address При помощи этого параметра определяются DNS сервера, которые необходимо уведомить при изменении зоны. Slave DNS сервера в этом списке указывать не надо. Значение по умолчанию не определено. Пример: also-notify { 193.12.20.1; 193.12.38.200; }; recursion yes|no Параметр определяет, будет ли сервер BIND рекурсивным сервером. Значение по умолчанию — yes. Пример: recursion yes allow-recursion address Этот параметр определяет адреса машин или сетей, для которых сервер BIND будет выступать в роли рекурсивного сервера. Значение по умолчанию неопределенно. Пример: allow-recursion { 193.12.13.240; 194.12.34/24; }; listen-on port порт list Параметр позволяет определить, на каком интерфейсе и порту будет слушать запросы сервер. Значение по умолчанию: все интерфейсы, порт 53. Пример: listen-on { 5.6.7.8; }; listen-on port 1234 { ! 1.2.3.4; 1.2/16; }; allow-query адреса Параметр определяет, с каких адресов можно посылать запросы нашему серверу. Значение по умолчанию: разрешены все адреса. Пример: allow-query { 1.2.3.4; 10.10.100/24; }; allow-transfer адреса Параметр определяет, на какие сервера разрешены зонные пересылки. Значение по умолчанию: пересылки разрешены всем серверам. Пример: allow-transfer { 1.2.3.4; 10.10.100/24; }; blackhole адреса Параметр определяет адреса серверов, запросы от которых будут всегда игнорироваться. Сервер не будет посылать им свои запросы. Значение по умолчанию: список не определен. Пример: blackhole { 1.2.3.4; 2.3.4.5; }; |
Электронная почта
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
# https://help.ubuntu.ru/wiki/postfix - подробное руководство # https://help.ubuntu.com/community/PostfixCompleteVirtualMailSystemHowto - подробное руководство apt-get install postfix dovecot-imapd dovecot-pop3d - установка dpkg-reconfigure postfix - пере конфигурация Выбираем следующие: internet-site - настройки c0.d0.zor.inc - имя FQDN почтового сервера Пользовательский агент (ПА) Транспортный агент (ТА) Агент подачи почты (АП) Агент доставки почты (АДП) Агент доступа (АД) Для работы почты требуется MX запись Для борьбы со спамом SPF-запись, PTR-запись !!! OPEN RELAY - режим работы сервера, пересылка почты, передаст, грозит попаданием в черные списки как спамер, практически единственная возможность выбраться смена внешнего IP адреса !!! Старые клиенты pine alpine pico /etc/postfix/main.cf - файл конфигурации postfix /etc/dovecot/dovecot.conf - файл конфигурации dovecot |
Пример отправки почты (SMTP):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
0. Используем программу netcat(nc), подключаемся к почтовому серверу c0, порт 25 nc c0 25 сервер нам ответил что все ок, и ждет дальнейших указаний 220 c0.d0.zor.inc ESMTP Postfix (Ubuntu) 1. Приветствуем почтовый сервер helo localhost Получаем ответ 250 c0.d0.zor.inc 2. Представляемся кто мы mail from: <b_gates@microsoft.com> Сервер отвечает 250 2.1.0 Ok 3. Сообщаем серверу что хотим отправить student@localhost сообщение rcpt to: <student@localhost> Почтовый сервер разрешает отправку 250 2.1.5 Ok 4. Запрашиваем передачу данных data Почтовый сервер разрешает передачу и просит в конце письма указать строку с одной точкой 354 End data with <CR><LF>.<CR><LF> 5. Пишем письмо hello student! bye-bye . Почтовый сервер сообщает что письмо получено и ИД у письма A6E68A11B7 250 2.0.0 Ok: queued as A6E68A11B7 6. Отключаемся от почтового сервера quit Почтовый сервер прощается 221 2.0.0 Bye 7. По умолчание письмо будет положено в файл /var/mail/student /var/mail - каталог почты пользователей cat /var/mail/student - проверяем содержимое файла 8. Лог получения письма /var/log/ - каталог с логами grep A6E68A11B7 /var/log/mail.log - смотрим лог получения письма, A6E68A11B7 - ID письма --------------------------------- Jan 27 07:06:38 c0 postfix/smtpd[10135]: A6E68A11B7: client=c0.d0.zor.inc[10.0.0.23] Jan 27 07:07:18 c0 postfix/cleanup[10296]: A6E68A11B7: message-id=<20210127070638.A6E68A11B7@c0.d0.zor.inc> Jan 27 07:07:18 c0 postfix/qmgr[5913]: A6E68A11B7: from=<b_gates@microsoft.com>, size=328, nrcpt=1 (queue active) Jan 27 07:07:18 c0 postfix/local[10297]: A6E68A11B7: to=<student@localhost>, relay=local, delay=121, delays=121/0.01/0/0.01, dsn=2.0.0, status=sent (delivered to mailbox) Jan 27 07:07:18 c0 postfix/qmgr[5913]: A6E68A11B7: removed --------------------------------- |
Протоколы получения / хранения почты клиентом (АД):
1 2 3 4 5 6 7 8 9 |
POP3 - Клиент (ПА) подключается к серверу, получает почту на ПК (загружаем ее с сервера) IMAP - Клиент (ПА) подключается к серверу, почта хранится на сервере, клиент (ПА) её просматривает. MBOX - формат хранения почты по умолчанию (самый простой), вся почта сыпется в один файл, разделить пробел и строчка from, используется с POP3 (демон popa3d, dovecot-pop3d), не подходит для IMAP MailDir - формат хранения почты в виде иерархии каталогов и файлов, подходит для IPMAP и POP3 (пакеты dovecot-imapd и dovecot-pop3d) https://postfix.ru - рецепты готовки почтового сервера на все случаи жизни |
Настройка postfix / виртуальные хосты
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
0. Редактируем файл /etc/postfix/main.cf nano /etc/postfix/main.cf ------------------------- smtpd_banner = $myhostname ESMTP $mail_name biff = no append_dot_mydomain = no myhostname = localhost home_mailbox = Maildir/ virtual_mailbox_domains = /etc/postfix/vhosts virtual_mailbox_base = /home/vmail virtual_mailbox_maps = hash:/etc/postfix/vmaps virtual_minimum_uid = 1000 virtual_uid_maps = static:5000 virtual_gid_maps = static:5000 alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases myorigin = $myhostname mynetworks = 127.0.0.0/8 192.168.0.0/24 mailbox_size_limit = 0 recipient_delimiter = + inet_interfaces = all smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination ------------------------- !!! /etc/init.d/postfix restart - перезапустим postfix для применения настроек 1. Создадим пользователя и группу vmail для наших будущих виртуальных ящиков groupadd -g 5000 vmail - создаем группу vmail с GUID равный 5000 useradd -m -u 5000 -g vmail -s /bin/bash vmail - создаем пользователя vmail, UID 5000, добавляем его в группу vmail, шелл указываем ему bash 2. Создадим файлы vhosts и vmaps в каталоге /etc/postfix cd /etc/postfix - перешли в каталог /etc/postfix touch vhosts vmaps - создали файлы vhosts vmaps 3. Добавим записи в файл /etc/postfix/vhosts !!! vhosts это файл наших доменов которые мы обслуживаем cd /etc/postfix - перешли в каталог /etc/postfix echo b14esh.com >> vhosts echo d0.zor.inc >> vhosts 4. Добавим записи в файл /etc/postfix/vmaps !!! vmaps - это файл указывающий на место расположения виртуальных почтовых адресов nano /etc/postfix/vmaps ----------------------- zaec@b14esh.com b14esh.com/zaec/ yo@d0.zor.inc d0.zor.inc/yo/ ----------------------- 5. Конвертируем файл /etc/postfix/vmaps в хэш файл !!! ОБЕЗАТЕЛЬНО postmap /etc/postfix/vmaps 6. Проверка, пошлем письмо командой mail # Используя любой почтовый клиент, например mutt, ну или mail, отправим письмо mutt zaec@b14esh.com mutt yo@d0.zor.inc В каталоге /home/vmail/ должны появится каталоги с доменами. Новые тестовые письма упадут в каталог new. tree . ├── b14esh.com │ └── zaec │ ├── cur │ ├── new │ │ └── 1612244173.Vfc02Ie29eaM119102.c0 │ └── tmp └── d0.zor.inc └── yo ├── cur ├── new │ └── 1612244308.Vfc02Ie29f0M317344.c0 └── tmp Содержимое писем можно посмотреть так: cat /home/vmail/b14esh.com/zaec/new/1612244173.Vfc02Ie29eaM119102.c0 cat /home/vmail/d0.zor.inc/yo/new/1612244308.Vfc02Ie29f0M317344.c0 |
Настройка dovecot
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
0. Редактируем файл /etc/dovecot/dovecot.conf nano /etc/dovecot/dovecot.conf ------------------------------ #base_dir = /var/run/dovecot #listen = *, :: #enable ipv6 listen = * protocols = imap pop3 disable_plaintext_auth = no shutdown_clients = yes log_path = /var/log/dovecot info_log_path = /var/log/dovecot.info log_timestamp = "%Y-%m-%d %H:%M:%S " ssl_disable = yes login_dir = /var/run/dovecot/login login_chroot = yes login_user = dovecot login_greeting = Dovecot ready. mail_location = maildir:/home/vmail/%d/%n mmap_disable = no valid_chroot_dirs = /var/spool/vmail protocol imap { login_executable = /usr/lib/dovecot/imap-login mail_executable = /usr/lib/dovecot/imap } protocol pop3 { login_executable = /usr/lib/dovecot/pop3-login mail_executable = /usr/lib/dovecot/pop3 pop3_uidl_format = %08Xu%08Xv } #auth_executable = /usr/lib/dovecot/dovecot-auth auth_verbose = yes auth default { mechanisms = plain digest-md5 passdb passwd-file { args = /etc/dovecot/passwd } userdb passwd-file { args = /etc/dovecot/users } user = root } ------------------------------ 1. Перезапускаем демон dovecot /etc/init.d/dovecot restart |
Создадим скрипты создания пользователей для dovecot, скрипты adddovecotuser и mkdovecotpasswd
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
0. adddovecotuser nano adddovecotuser ------------------- echo "$1" > /tmp/user user=`cat /tmp/user | cut -f1 -d "@"` domain=`cat /tmp/user | cut -f2 -d "@"` echo "$user@$domain::5000:5000::/home/vmail/$domain/:/bin/false" >> /etc/dovecot/users /usr/bin/maildirmake.dovecot /home/vmail/$domain/$user 5000:5000 echo $1 $domain/$user/ >> /etc/postfix/vmaps postmap /etc/postfix/vmaps postfix reload ------------------- 1. mkdovecotpasswd nano mkdovecotpasswd -------------------- mkpasswd --hash=md5 $2 > /tmp/hash echo "$1:`cat /tmp/hash`" >> /etc/dovecot/passwd -------------------- 2. Скопируем их в папку /usr/local/sbin/ cp adddovecotuser mkdovecotpasswd /usr/local/sbin/ 3. Добавляем бит исполнения для adddovecotuser и mkdovecotpasswd chmod u+x /usr/local/sbin/adddovecotuser chmod u+x /usr/local/sbin/mkdovecotpasswd |
Создание учетных записей для devcot используя скрипты adddovecotuser и mkdovecotpasswd
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
0. используем скрипты adddovecotuser adddovecotuser user_name - создает пользователя user_name и mkdovecotpasswd mkdovecotpasswd user_name password123 - задает пользователю user_name с паролям password123 adddovecotuser zaec@b14esh.com mkdovecotpasswd zaec@b14esh.com pass1 adddovecotuser yo@d0.zor.inc mkdovecotpasswd yo@d0.zor.inc pass2 1. Защитите файл пароля: chmod 640 /etc/dovecot/passwd 2. Перезапустим dovecot и postfix /etc/init.d/postfix restart /etc/init.d/dovecot restart |
Тестирование почты \ проверка приема и отправки
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
0. Используем программу nc, тестируем на самом сервере nc localhost 25 - подключаемся к серверу --------------- 220 localhost ESMTP Postfix - ответ сервера helo localhost - представляемся 250 localhost - ответ сервера mail from: <root@localhost> - пишем письмо от пользователю root@localhost 250 2.1.0 Ok - ответ сервера rcpt to:<zaec@b14esh.com> - пишем письмо пользователю zaec@b14esh.com 250 2.1.5 Ok - ответ сервера data - начинаем передачу данных 354 End data with <CR><LF>.<CR><LF> - ответ сервера, в конце данных просит указать пустую строку с точкой helo helolllo 1234 !!!! - наши данные . 250 2.0.0 Ok: queued as EEAE8A0F90 - ответ сервера, письмо принято в очереди у него ID: EEAE8A0F90 quit - отключаемся от сервера 221 2.0.0 Bye - ответ сервера, сервер с нами прощается ---------------- 1. Проверка работы dovecot ss -tpln | grep dovecot pgrep dovecot lsof -i tcp:143 lsof -i tcp:110 tail /var/log/dovecot tail /var/log/dovecot.info 2. Перезапуск /etc/init.d/dovecot restart 3. Проверяем pop3 nc localhost 110 - подключаемся для проверки ----------------- +OK Dovecot ready. user ggg@b14esh.com +OK pass pass1 +OK Logged in. list +OK 1 messages: 1 389 . retr 1 +OK 389 octets Return-Path: <zaza@rrrru.ru> X-Original-To: ggg@b14esh.com Delivered-To: ggg@b14esh.com Received: from localhost (localhost [127.0.0.1]) by localhost (Postfix) with SMTP id CBDCAA06A4 for <ggg@b14esh.com>; Tue, 9 Feb 2021 11:17:20 +0000 (UTC) Message-Id: <20210209111738.CBDCAA06A4@localhost> Date: Tue, 9 Feb 2021 11:17:20 +0000 (UTC) From: zaza@rrrru.ru helo men!!!123 . dele 1 +OK Marked to be deleted. quit +OK Logging out, messages deleted. ----------------- |
Частичная расшифровки конфига /etc/posfix/main.cf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
smtpd_banner = Microsoft(R) Exchange(TM) 2017 Platinum Edition # как наш сервер представляется biff = no #извещение что письмо пришло append_dot_mydomain = no # авто дополнение имени домена для пользователя myhostname = localhost home_mailbox = Maildir/ # для пользователи у которого почта не virtual_mailbox, будет хранится в домашнем каталоге virtual_mailbox_domains = /etc/postfix/vhosts # для каких доменов мы принимаем почту virtual_mailbox_base = /home/vmail virtual_mailbox_maps = hash:/etc/postfix/vmaps # карта где мы храним почту, создается файл vmaps.db, после изменения необходимо выполнять postmap vmaps. virtual_minimum_uid = 1000 virtual_uid_maps = static:5000 virtual_gid_maps = static:5000 alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases myorigin = $myhostname mynetworks = 127.0.0.0/8 192.168.15.0/24 10.0.0.0/24 192.168.200.0/24 # разрешенные сети mailbox_size_limit = 0 # ограничение размера ящика recipient_delimiter = + inet_interfaces = all # интерфейсы которые мы слушаем smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination |
Перечитать alias, vmaps
1 2 3 4 |
postmap vmaps postalias /etc/aliases newaliases |
Почтовые псевдонимы \ алиасы \ alias
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
0. По умолчанию /etc/aliases cat /etc/aliase --------------- # See man 5 aliases for format postmaster: root -------------- 1. Пример использования /etc/aliase cat /etc/aliase --------------- # See man 5 aliases for format postmaster: root #Почта для postmaster пересылается root root: vasya,petya # почта для root пересылается vasya и petya vasya: vasya,petya # почта для vasya приходит vasya и пересылается petya tolya: /home/tolya/mbox,petya,vasya@yandex.ru,|/usr/local/bin/messenger # почта для tolya кладется в файл mbox, пересылается petya и на внешнею почту vasya@yandex.ru, далее передать на программу "|/usr/local/bin/messenger" -------------- !!! Обычно все ТА при использовании alias не будут пересылать одно и тоже письмо несколько раз. |
Почтовый антивирус \ clamav
1 2 3 4 5 6 7 8 9 10 11 12 13 |
0. Ознакомимся с инструкцией ищем в google > site:ubuntu.com postfix clamav https://help.ubuntu.com/community/PostfixVirtualMailBoxClamSmtpHowto 1. Ставим пакет clamsmtp apt-get install clamsmtp 2. Запускаем обновление freshclam !!! в последних версиях ubuntu freshclam запускается сам после установки freshclam - запуск обновления базы данных !!! Антивирусная защита работает следующим образом, postfix отдает письма на проверку clamsmtp, письмо проверяется, clamsmtp в случае вируса сообщает о вирусе postfix, postfix такое письмо удаляет у пользователя. |
Proxy и NAT
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Сосед попросил вас позвонить в газовую службу. Вы - прокси для соседа. Несколько соседей попросили позвонить вас в газовую службу. Вы позвонили по первой просьбе, а на другие ответили, что уже звонили. Вы - кеширующая прокси для соседей. Сосед взял ваш телефон и позвонил в газовую службу с вашего номера. Вы - NAT для соседа. А прозрачный прокси? Сосед думает, что звонит в газовую службу, но вы обрезали его телефонную линию, с коммутировали на своём телефоне и притворяетесь работником газовой службы. |
Прокси сервер \ SQUID
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
!!! [c] <=========> [p] <--------->[s] !!! [browser] <=====HTTP====> [webserver] !!! [request] header, body - запрос клиента !!! [response] header, body - ответ сервера nc ya.ru 80 ----------- HEAD / HTTP/1.0 ----------- MIME base64 - картинки ASCII apt-get install squid - установим squid, прокси сервер apt-get install apache2 - установим apache2, веб сервер lsof -i tcp:3128 lsof -i tcp:80 lsof -i tcp:443 !!! ВНИМАНИЕ PROXY SERVER SQUID в Ubuntu будет по умолчанию запущен на всех интерфейсах squid -k c - проверяем конфиг (squid должен работать) squid -k p - проверяем конфиг (возможен запуск проверки при остановленном squid) squid -k r - проверяем конфиг и применяем изменения /etc/squid/squid.conf - конфигурационный файл squid nano /etc/squid/squid.conf - конфигурируем -------------------------- #http_port 3128 - находим и изменяем, светим на всех интерфейсах http_port 192.168.200.1:3128 localhost:3128 # !!! Ищем эту строку: # INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS # после нее создаем правила http_access # далее подымаемся вверх pageup(несколько раз) и создаем правила acl # ACL - описание условия # acl aclname acltype "/file/file" # acl aclname acltype string # acl localnet src XXX.XXX.XXX.XXX - убираем \ комментируем лишние сети (группа localnet) acl myhost src 192.168.200.1 - добавляем хост с которого можно на прокси (группа myhost) acl mynet src 192.168.200.0/24 - добавляем нашу сеть с именем mynet (группа mynet) acl wt time 10:00-17:00 - задаем время в которое можно выходить в интернет (группа wt) acl rambler dstdomain .rambler.ru (группа rambler) # http_access - директива, которая разрешает или запрещает выполнение условия # !!! Правила терминирующие выполняются сверху вниз # комментируем не нужную сети \ или удаляем http_access allow myhost - разрешаем доступ в интернет через прокси группе myhost http_access deny rambler - запрещаем доступ в интернет через прокси группе rambler http_access allow mynet wt - разрешаем доступ в интернет через прокси группе mynet # And finally deny all other access to this proxy # !!! обязательное правило http_access deny all - запрещаем остальные обращения через прокси --------------------------- squid -k c - проверяем конфиг squid -k r - применяем изменения !!! Проверяем links -http-proxy localhost -dump ya.ru (для проверки с localhost параметр "http_port" в конфиге должен быть таким "http_port 3128", что бы squid слушал все интерфейсы) |
Squid настройка аутентификации
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
!!! /etc/squid/squid.conf - конфигурационный файл squid auth_param схема параметр [опции] !!! Прокси-сервер squid позволяет осуществлять аутентификацию пользователей, причем сам squid не проверяет правильность аутентификации, он только запрашивает логин и пароль у пользователя. !!! Для проверки полученной от пользователя информации он использует сторонние программы, которые будут ее осуществлять. !!! Параметр «схема» определяет схему аутентификации: ntlm, digest или basic. !!! После включения или выключения поддержки новой схемы proxy сервер рекомендуется остановить и запустить. !!! Простой варианта basic аутентификации с использованием программы ncsa_auth !!! Для работы программы ncsa_auth необходимо создать файл с перечислением пользователей и их паролей. !!! Файл /etc/squid/passwd следует создавать и редактировать при помощи программы htpasswd(Эта программа поставляется с WEB сервером Apache) !!! Создаем пользователей htpasswd -c /etc/squid/passwd user - добавляем пользователя user (опцию -с следует указывать, только если файл /etc/squid/passwd еще не существует) Пример включения авторизации: ------- auth_param basic program /usr/lib/squid/ncsa_auth /etc/squid/passwd auth_param basic children 5 auth_param basic realm Squid proxy-caching web server auth_param basic credentialsttl 2 hours acl passwd proxy_auth REQUIRED acl any_auth proxy_auth anna bell thom ------- !!! dpkg -L squid | grep ncsa_auth - команда поможет найти как теперь называется пакет ncsa_auth, и мы увидим что в ubuntu20.+ он лежит "/usr/lib/squid/basic_ncsa_auth" Разрешим заходить на "ya.ru" только по паролю. Редактируем файл /etc/squid/squid.conf nano /etc/squid/squid.conf -------------------------- auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/passwd auth_param basic children 5 auth_param basic realm Squid proxy-caching web server auth_param basic credentialsttl 2 hours acl passwd proxy_auth REQUIRED acl ya dstdomain .ya.ru .yandex.ru acl myhost src 192.168.200.1 acl mynet src 192.168.200.0/24 acl wt time 10:00-17:00 acl rambler dstdomain .rambler.ru http_access allow ya passwd http_access deny ya http_access allow localhost http_access allow myhost http_access deny rambler http_access allow mynet wt http_access deny all --------------------------- Проверка: links -http-proxy localhost ya.ru (для проверки с localhost параметр "http_port" в конфиге должен быть таким "http_port 3128", что бы squid слушал все интерфейсы) /etc/init.d/squid force-reload |
SQUID ограничение ширины канала
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
delay_pools delay_class delay_parameters delay_access В первую очередь при помощи параметра delay_pools определяется количество емкостей. Например, чтобы определить две емкости, необходимо написать так: delay_pools 2 Ёмкости бывают трех классов: Первого класса, предназначены для ограничения трафика всем acl, подключенным к емкости. Второго класса, определяют ограничения для сети класса С и отдельно для каждого acl. Третьего класса, определяют ограничения для сети класса В, затем отдельные ограничения для подсетей класса С и еще одно ограничение для каждого пользователя. Для определения, к какому классу принадлежит емкость, используют параметр delay_class. Первое число определяет номер емкости, второе — ее класс. delay_class 1 1 delay_class 2 1 После определения количества и класса емкостей, необходимо задать параметры ограничения. Количество опций параметра delay_parameters зависит от класса емкости: Первого класса — один параметр. Второго класса — два параметра. Третьего класса — три параметра. Если вместо 800/64000 написать 800/800 — общая скорость скачивания будет 800 бит в секунду. Число -1 означает, что нет никаких ограничений. Например, необходимо ограничить скорость скачивания для объектов размером от 64 Килобайт до 800 бит в секунду. Следует использовать следующую пару значений: 800/64000. В случае определения ограничения для емкости первого класса delay_parameters 1 800/64000 Если определяются параметры для емкости 2-го класса, указываются две пары значений: для сети и для каждой машины. delay_parameters 1 64000/64000 4000/4000 Например, нам необходимо ограничить скорость скачивания мультимедийных файлов до 400 Килобит в секунду. Сначала определяем acl, описывающий все типы мультимедийных файлов: acl media urlpath_regex -i \.mpg$ \.avi$ \.mp3$ Затем определяем емкость задержки. delay_pools 1 delay_class 1 1 delay_parameters 1 400/400 delay_access 1 allow media delay_access 1 deny all При определении параметра delay_access обязательно указывается номер емкости, к которой подключаются acl. И еще пример: Ограничить скорость скачивания материалов с сайта odnoklassniki.ru до 40 бит в секунду. 1. Откройте на редактирование файл squid.conf. 2.В конце файла добавьте: acl odnoklassniki dstdomain .odnoklassniki.ru delay_pools 1 delay_class 1 1 delay_parameters 1 40/40 delay_access 1 allow odnoklassniki delay_access 1 deny all 3. Проверьте и заставьте прокси-сервер перечитать свой конфигурационный файл: squid -k c squid -k r # /etc/init.d/squid force-reload egrep -v "^#|^$" /etc/squid/squid.conf - показать конфиг, исключить из вывода строки начинающиеся на #, и пустые строки 4. Протестируйте links -http-proxy localhost odnoklassniki.ru |
SQUID ограничение ширины канала пример
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
acl ok dstdomain .odnoklassniki.ru acl vk dstdomain .vk.com acl tube dstdom_regex -i tube delay_pools 2 # количество пулов delay_class 1 2 # определяем для первого пула класс 2 delay_class 2 2 # определяем для второго пула класс 2 delay_parameters 1 -1/-1 1000/1000 # для первого пула не ограничиваем групповую полосу пропускная(-1), для одиночек ограничиваем в 1000бит delay_parameters 2 10000/1000 1000/1000 # для второго пула ограничиваем групповую полосу пропускания в 10000бит (по итогу будет ровно на всех делится), для одиночек ограничиваем в 1000бит delay_access 1 allow ok # включаем очередь для ok, используем первый пулл delay_access 1 allow vk # включаем очередь для vk, используем второй пулл delay_access 1 deny all # обязательное правило, для всех остальных не используем первый пулл delay_access 2 allow tube # используем пулл два для tube delay_access 2 deny all # для остальных не используем |
squid анализ логов
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
apt-get install sarg dpkg -L sarg | grep conf при ошибке не найден лог squid \ создать символьную ссылку ------------------ cd /var/log ln -s squid3 squid ------------------- при ошибки SARG: Unknown option resolve_ip nano /etc/sarg/sarg.conf - собственно настроим параметр resolve_ip ------------------------ resolve_ip yes ------------------------- sarg - запускаем и если все ок то sarg отработает молча grep -i output /etc/sarg/sarg.conf - ищем в конфиге куда он там складывает логи, и видим что кладет он сюда /var/lib/sarg grep -i documentroot /etc/apache2/* -R - ищем где там у нас apache2 сайты держит собственно создаем еще одну символьную ссылку для sarg теперь в каталоге apache2 ----------------------------- cd /var/www/html/ ln -s /var/lib/sarg/ sarg ----------------------------- добавим в планировщик в sarg crontab -e ---------- 0 5 * * * /usr/bin/sarg ---------- |
Сетевой фильтр \ firewall
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 |
https://wiki.nftables.org/wiki-nftables/index.php/Port_knocking_example OSI ------------------- 4. транспортный TCP UDP ICMP 3. сетевой IP AF: inet inet6 -> firewall живет тут NetFilter 2. канальный \ Ethernet AF: Link \ ARP 1. физика \ провода ------------------- iptables - программа управления netfilter - файрволл в ядре Цепочки: 1. PREROUTING 2. FORWARD 3. POSTROUTING 4. INPUT 5. OUTPUT Таблицы: filter nat mangle filter: (DROP, LOG, ACCEPT, REJECT) -FORWARD - цепочка используется для фильтрацию пакетов, идущих транзитом через брандмауэр. -INPUT - через эту цепочку проходят пакеты, которые предназначены локальным приложениям(брандмауэр). -OUTPUT - используются для фильтрации исходящих пакетов, сгенерированных приложениями на самом брандмауэре. nat: (DNAT,SNAT) -PREROUTING - используется для внесения изменений на ходе брандмауэра. (dnat) -OUTPUT - предназначена для преобразования пакетов, созданных приложениями внутри брандмауэра, перед принятием решения о маршрутизации. -POSTROUTING - применяется для преобразования пакетов перед выдачей их во вне. (snat) mangle: (MARK,TOS,TTL) -PREROUTING - используется для внесения изменений в пакеты на входе брандмауэра. -POSTROUTING - применяется для изменения в пакеты перед выдачей их во вне. -INPUT - через эту цепочку проходят пакеты, которые предназначены локальным приложениям(брандмауэру). -FORWARD - используется для модификации заголовков пакетов, идущих транзитом через брандмауэр. -OUTPUT - для внесения изменений в заголовок пакетов, поступающих от приложений внутри брандмауэра. Порядок прохождения транзитных пакетов: mangle PREROUTING nat PREEOUTING mangle FORWARD filter FORWARD mangle POSTROUTING nat POSTROUTING Порядок прохождения пакетов предназначенных для приложения компьютера: mangle PREPOUTING nat PREROUTING mangle INPUT filter INPUT Порядок прохождения пакетов отправленные приложениями компьютера: mangle OUTPUT nat OUTPUT filter OUTPUT mangle POSTROUTING nat POSTROUTING iptables [-t table] command [match] [target/jump] command: -A - добавить правило в конец цепочки (APPEND) -D - удалить правило из цепочки (DELETE) -R - заменить одно правило другим (REPLACE) -I - вставить правило в указанное место в цепочке (INSERT) (по умолчанию вставляет в начало) -L - показать список правил (LIST) -F - очистить цепочку или таблицу (FLUSH) -Z - обнулить счетчики (ZERO) -N - создать цепочку пользователя (NEW) -X - удалить цепочку пользователя -P - установить политику по умолчанию !!! таблица по умолчанию filter (iptables -t filter) iptables -A INPUT -s 10.0.0.0/24 -j ACCEPT - в таблице filter из цепочки INPUT хостам из c ip 10.0.0.0/24 разрешаем доступ iptables -D INPUT 1 - в таблице filter, цепочка INPUT, удаляем правило номер 1 iptables -D -p tcp --dport 80 -j DROP - в таблице filter, цепочка INPUT, удаляем правило с протоколом tcp, портом 80 iptables -R INPUT 1 -s 192.168.0.1 -J ACCEPT - в таблице filter, цепочка INPUT, заменить первое правило на -s 192.168.0.1 -J ACCEPT iptables -I INPUT 1 -p tcp --sport 80 -j ACCEPT - в таблице фильтр, цепочка INPUT, вставить правило -p tcp --sport 80 -j ACCEPT, все номера следующих правил будут увеличены на еденицу пример iptables --------------- iptables -A INPUT -s 10.0.0.130 -j ACCEPT - Разрешаем любой трафик на input с хоста 10.0.0.130 iptables -A INPUT -m state --state INVALID -j DROP - Отбрасываем трафик INVALID iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT - Разрешаем трафик RELATED, ESTABILISHED iptables -A INPUT -j DROP - Отбрасываем все --------------- пример ip6tables все дропаем для ipv6 во всех цепочках ----------------------------- ip6tables -A INPUT -j DROP ip6tables -A FORWARD -j DROP ip6tables -A OUTPUT -j DROP ----------------------------- iptables -L INPUT iptables -t nat iptables -t mangle iptables -I INPUT -s 192.168.15.0/24 -j ACCEPT iptables -I INPUT -s 10.0.0.0/24 -j ACCEPT iptables -L -n - показать правила и показывать цифры iptables -L -n -v - показать правила, использовать цифры, подробная информация iptables -L -n -v -x - показывать правила, использовать цифры, подробная информация, не преобразовывать значения(аналог df -h) iptables -L -n -v -x --line-numbers - показывать правила, использовать цифры, подробная информация, не преобразовывать значения(аналог df -h), показывать номера правил iptables -F INPUT - очистим таблицу filter, цепочка INPUT iptables -F - очистим таблицу filter и все ее цепочки (FORWARD, INPUT, OUTPUT) iptables -N tcp_filter - добавить в таблицу filter пользовательскую цепочку tcp_filter iptables -N udp_filter - добавить в таблицу filter пользовательскую цепочку tcp_filter iptables -N icmp_filter - добавить в таблицу filter пользовательскую цепочку tcp_filter iptables -P INPUT -p tcp -j tcp_filter - вот так мы заставляем пакеты tcp перенаправить в пользовательскую цепочку tcp_filter iptables -D INPUT 1 - удаляем правило под номером 1 (тут пользовательская цепочка у нас ) iptables -F tcp_filter - очистить все правила цепочки tcp_filter iptables -X tcp_filter - удалить пользовательскую цепочку tcp_filter iptabless -P INPUT DROP - устанавливаем политику по умолчанию DROP (настраивать firewall на удаленной машине к дальней дороге) iptabless -P INPUT ACCEPT - устанавливаем политику по умолчанию ACCEPT Общие критерии match -p - протокол (-p tcp) -s - определяет IP-адрес источника (-s 10.0.0.1) -d - определяет IP-адрес назначения -i - определяет входящий интерфейс -o - определяет исходящий интерфейс (o eth0) -f - определяет фрагментыm фрагментированного пакета (!-f) !!! Символ "!" инвертирует значение параметра. TCP критерии: --sport - порт источника --dport - порт назначения (--dport 1024:65535) --tcp-flags - определение TCP-флагов --syn - запрос на соединение UDP критерии: --sport - порт источника --dport - порт назначения ICMP критерии: --icmp-type - определяет тип ICMP пакета (--icmp-type echo-request) iptables -p tcp --help - показать все возможные значения для протокола tcp iptables -p icmp --help - показать все возможные значения для протокола icmp iptables -p udp --help - показать все возможные значения для протокола udp Явные критерии: limit - количество срабатываний правила (--limit-burst(отсечки) по умолчанию равны 5, N\t, N - кол-во срабатываний за единицу времени, t единица времени s,m,h,d) mac - позволяет указать MAC-адрес устройства multiport - позволяет указать список портов state - определяет состояние пакетов (NEW, ESTABLISHED, RELATED, INVALID) iptables -A INPUT -p icmp --icmp-type echo-request -m limnit --limit 1/s --limit-burst 1 -J ACCEPT (не более одного пакета в секунда по протоколу ICMP) iptables -A INPUT -m mac --mac-source XX:XX:XX:XX:XX:XX -j ACCEPT iptables -A IMPUT -p tcp -m multiport --source-port 21,53 -j ACCEPT iptables -A INPUT -m state --state INVALID -j DPORT Действия(-j): ACCEPT - принять пакеты DROP - сбросить пакет REJECT - сбросить пакет с сообщение об ошибке RETURN - возвращает из цепочки LOG - помещает информацию в системный журнал iptables -A INPUT -m state --state INVALID -j LOG --log-prefix "Strange:" NAT - NETWORK ADDRESS TRANSLATION RFC-1918 - документ по не маршрутизированным адресам SNAT - замена IP-адреса или порта источника (Например настройка доступа к интернету для ПК из локальной сети через маршрутизатор) DNAT - замена IP-адреса или порта назначения (Например доступ из интернета на ПК в локальной сети) MASQUERADE - разбирается сам что куда подменять (используется когда у вас нет постоянного внешнего IP, или получаете его по DHCP) REDIRECT - выполняет перенаправление пакетов и потоков на другой порт той же самой машины iptables -t nat -A POSTROUTING -o isp -j MASQUERADE iptables -t nat -A POSTROUTING -o isp -j SNAT --to-source 10.0.0.23 iptables -t nat -A PREROUTING -i eth1 -j DNAT --to-destination 192.168.1.25 iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 1 -j ACCEPT iptables -A INPUT -p icmp --icmp type echo-request -j DROP Разбираемся с limit: ------------------------------ iptables -F - удаляем правила из таблицы filter iptables -Z - обнуляем счетчики iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 1 -j ACCEPT ping -f -c 100000 localhost - посылаем 100000 пакетов и проверяем iptables -Z - обнуляем счетчики iptables -A INPUT -p icmp --icmp-type echo-request -j DROP ping -f -c 500 localhost ------------------------------ Сохранение \ восстановление настроек iptables --------------------------------------------- iptables-save - выведет на экран текущие настройки iptables iptables-restore - восстановит из файла настройки iptables iptables-save > iptables-rules - сохранить настройки в файл iptables-rules iptables-restore < iptables-rules - восстановить настройки из файла iptables-rules --------------------------------------------- Для авто восстановления iptables можно добавить в файл сетевых настроек запуск iptables-restore nano /etc/network/interfaces ---------------------------- auto lo (рекомендуется добавлять после lo интерфейса) iface lo inet loopback (интерфейс loopback) post-up iptables-restore < /путь_до_файла/iptables-rules (например можно создать папку iptables и в нее положить iptables-rules ) ---------------------------- http_port 3128 transparent - прозрачный прокси (в этом режиме работает только не шифрованный трафик http) iptables -t nat -I PREROUTING -p tcp --dport 80 -i lan -j DNAT --to 192.168.200.1:3128 #iptables -t nat -A PREROUTING -i eth0 -d ! 192.168.2.0/24 -p tcp -m multiport --dport 80,8080 -j DNAT --to 192.168.2.1:3128 iptables -t nat -F - очистить таблицу nat Для работы pptp iptables -A INPUT -p gre -j ACCEPT - разрешаем протокол GRE для всех iptables -A INPUT -p tcp --dport 1723 -j ACCEPT - разрешаем соединение с PPTP-сервером для всех |
PPTP / VPN / сервер / PPTD / PPPD
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
PoPToP - является одной из популярных реализаций PPTP dpkg -L pptpd | grep conf - позволяет посмотреть какие файлы входят в пакет 1. apt-get install pptpd - установка nano /etc/pptpd.conf - дописываем в конец следующие строки --------------------- localip 172.16.1.1 - IP-адрес PPTP-сервера remoteip 172.16.1.2-254 - # Диапазон адресов для клиентов PPTP-сервера --------------------- 2. nano /etc/ppp/pptpd-options - нужно добавить строку auth и строка require-mppe-128 должна быть раскомментированна --------------------------- ############################################################################### auth # требуем авторизацию у клиентов # Authentication require-mppe-128 # Используем шифрование ----------------------------- 3. nano /etc/ppp/chap-secrets -------------------------- user1 pptpd 1234 "*" - # Если пользователь должен динамически получать IP-адрес из диапазона remoteip в pptpd.conf: user2 pptpd 1234 "172.16.1.101" - # Если мы хотим привязать определённый IP к логину -------------------------- 4. /etc/init.d/pptpd restart - после этого перезапускаем pptpd 5. Скорее всего на сервере стоит файрволл. iptables -A INPUT -p gre -j ACCEPT - разрешаем протокол GRE для всех; iptables -A INPUT -p tcp --dport 1723 -j ACCEP - разрешаем соединение с PPTP-сервером для всех; 6. Сами себе провайдер iptables -t nat -I POSTROUTING -o isp -s 172.16.1/24 -j MASQUERADE |
PPTP / VPN / клиент
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
0. установка apt-get install pptp-linux 1. Редактируем /etc/ppp/peers/vpn0 nano /etc/ppp/peers/vpn0 ------------------------ pty "pptp 192.168.2.1 --nolaunchpppd" name user1 file /etc/ppp/options.pptp remotename PPTP ipparam vpn0 ------------------------ 2. Редактируем /etc/ppp/options.pptp nano /etc/ppp/options.pptp - раскомментируем в файле следующую строчку -------------------------- require-mppe-128 -------------------------- 3. Редактируем /etc/ppp/chap-secrets nano /etc/ppp/chap-secrets - добавляем строку --------------------------- user1 PPTP 1234 "192.168.2.1" --------------------------- 4. Проверяем pon vpn0 В системе должен появиться новый ppp-интерфейс. Проверить это можно командой: ifconfig | grep ppp Если же соединения не происходит, то можно попытаться выполнить команду: pon vpn0 debug dump logfd 2 nodetach И посмотреть какие ошибки будут выданы на экран. 5. Если нужно чтобы соединение выполнялось автоматически при загрузке компьютера, то нужно добавить в файл /etc/network/interfaces строки: auto tunnel iface tunnel inet ppp provider vpn0 |
NFS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
NFS использует протокол UDP apt-cache search nfs | grep server apt-get install nfs-kernel-server nano /etc/export - открываем доступ по nfs на каталог /usr/share/man для сети 10.0.0.0/24 --------------- /usr/share/man 10.0.0.0/24 /usr/share/man 192.168.1.0/24 --------------- /etc/init.d/nfs-kernel-server restart - перезапуск для принятия новых настроек showmount -e - показать какие шары NFS доступны mount c0:/usr/share/man /mnt/ - вот так можно примонтировать шару NFS на другом ПК (с0 - ПК на котором NFS, шара /usr/share/man, /mnt/ точка монтирования ) ---------------------------------------------------------------------------------------- mount 10.0.0.23:/usr/share/man j: - вот так можно примонтировать NFS шару на windows ПК ---------------------------------------------------------------------------------------- |
Apache2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
ip-based и Name-based nginx \ lighttpd apt-get install apache2 ServerRoot - Параметр определяет вершину дерева каталогов WEB сервера. Этот каталог не предназначен для хранения html файлов. PidFile - Определяет путь к файлу, в котором WEB сервер после запуска помещает свой PID. KeepAlive - Если параметр имеет значение On — WEB сервер позволяет за одно подключение передавать сразу несколько ресурсов. MaxKeepAliveRequests - Параметр определяет максимальное количество запросов в одном соединении. KeepAliveTimeout - Параметр определяет время в секундах. Если в течении этого времени клиент не запросит следующий ресурс, сервер разорвет соединение. IfModule - Директива проверяет — загружен ли соответствующий модуль и, если он загружен, позволяет использовать специфичные для этого модуля параметры. StartServers - Количество дочерних серверов, создаваемых при запуске WEB сервера. MinSpareServers - Минимальное количество экземпляров WEB сервера. MaxSpareServers - Максимальное количество экземпляров WEB сервера. MaxClients Определяет - количество запросов, обрабатываемых сервером. MaxRequestsPerChild - Определяет максимальное количество запросов, которое может обработать один процесс. Listen - Определяет IP адрес и порт, на которых WEB сервер слушает запросы. Если IP адрес не указан — сервер слушает запросы на всех сетевых интерфейсах. LoadModule - Параметр связывает имя модуля и файл, в котором он находится. Include - Директива подключает внешние конфигурационные файлы. Port - Определяет порт на котором будет слушать запросы WEB сервер. User - Определяет пользователя, с правами которого будет работать WEB сервер. Group - Определяет группу, с правами которой будет работать WEB сервер. ServerAdmin - Определяет Email администратора сервера. DocumentRoot - Определяет директорию, в которой находятся html файлы. Контейнеры В Apache можно использовать различные контейнеры, которые позволяют определять параметры для объектов: Directory — директорий DirectoryMatch — то же, что и предыдущий контейнер, но в качестве параметра используется регулярное выражение Files — файлов FilesMatch — то же, что и предыдущий контейнер, но в качестве параметра используется регулярное выражении Опции Внутри контейнеров Directory можно использовать параметр Options, при помощи которого определяются различные опции. All - Все опции. ExecCGI - Разрешает выполнение сценариев CGI. FollowSymLinks - Сервер следует по символьным ссылкам. Includes - Разрешается выполнение команд SSI (Server Side Includes). IncludesNoExec - При использовании SSI запрещается использовать команды #exec и #include. Indexes - Если в запросе не указывается конкретный файл, а только директория, и для даной директории не определен параметр DirectoryIndex - или не найден файл по умолчанию, сервер выдает список файловой директорий, находящихся в запрашиваемой директории. SymLinksIfOwnerMatch - Сервер следует по символьной ссылке только в том случае, если объект, на кото- рый указывает ссылка, принадлежит тому же пользователю, что и сама символьная ссылка. MultiViews - Позволяет выводить документ согласно языка клиента. AllowOverride Параметр AllowOverride используют внутри контейнера Directory. Параметр определяет, какие параметры, объявленные в файле .htaccess (или любом другом, заданном AccessFileName), могут быть переопределены пользователями. AuthConfig - Разрешает использование параметров аутентификации и управления доступом. FileInfo - Разрешает использование параметров, управляющих типами документов. Indexes - Разрешает использование параметров, управляющих индексами директорий. Limit - Разрешает использовать параметры, управляющие доступом. Options - Разрешает использовать параметры, управляющие свойствами директорий. None - Запрещает использовать любые параметры. All - Разрешает использовать все параметры. Контроль доступа к ресурсам осуществляется при помощи параметров: Allow from — разрешает доступ Deny from — запрещает доступ Order — определяет порядок рассмотрения параметров Allow и Deny Эти параметры можно использовать только в контейнерах или файлах .htaccess. Виртуальный хостинг NameVirtualHost *:80 <VirtualHost *:80> ServerAdmin webmaster@any.com DocumentRoot /home/any/public_html ServerName www.any.com ErrorLog /home/any/err/error_log CustomLog /home/any/err/access_log common </VirtualHost> --------------- nc ya.ru 80 HEAD / HTTP/1.1 Host: ya.ru --------------- apache2ctl configteset - проверка конфигурации apache2ctl graceful - принять настройки без перезагрузки |