Рубрики
Конспект

Конспект: linux ubuntu часть 2

Первая лабораторная подготовка шлюза

!!! в лабораторной будет две виртуальной машины
!!! домен  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

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

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 умеет делать дамп страницы 

Лабораторная вторая скрипты, программирование


!!! 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

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

!!! 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

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

!!! Используются порты 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

#! /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

#! /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

#! /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. Редактируем файл и добавим 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 запись)

!!! Домен 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 очистка кэша:

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

!!! порты 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)

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)

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

!!! По умолчанию 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

!!! В организация 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

Bind дополнительные настройки

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; };

Электронная почта

# 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):

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: 

Сервер отвечает
250 2.1.0 Ok

3. Сообщаем серверу что хотим отправить student@localhost сообщение
rcpt to: 

Почтовый сервер разрешает отправку
250 2.1.5 Ok

4. Запрашиваем передачу данных
data

Почтовый сервер разрешает передачу и просит в конце  письма указать строку с одной точкой
354 End data with .

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=, size=328, nrcpt=1 (queue active)
Jan 27 07:07:18 c0 postfix/local[10297]: A6E68A11B7: to=, 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
---------------------------------

Протоколы получения / хранения почты клиентом (АД):

POP3 - Клиент (ПА) подключается к серверу,  получает почту на ПК (загружаем ее с сервера)
IMAP - Клиент (ПА) подключается к серверу, почта хранится на сервере, клиент (ПА) её просматривает. 

MBOX - формат хранения почты по умолчанию (самый простой), вся почта сыпется в один файл, разделить пробел и строчка from, используется с POP3 (демон popa3d, dovecot-pop3d), не подходит для IMAP

MailDir - формат хранения почты в виде иерархии каталогов и файлов, подходит для IPMAP и POP3 (пакеты dovecot-imapd и dovecot-pop3d)


https://postfix.ru - рецепты готовки почтового сервера на все случаи жизни

Настройка postfix / виртуальные хосты

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

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


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

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

Тестирование почты \ проверка приема и отправки

0. Используем программу nc, тестируем на самом сервере
nc localhost 25 - подключаемся к серверу
---------------
220 localhost ESMTP Postfix - ответ сервера
helo localhost - представляемся
250 localhost - ответ сервера
mail from:  - пишем письмо от пользователю root@localhost
250 2.1.0 Ok - ответ сервера
rcpt to: - пишем письмо пользователю zaec@b14esh.com
250 2.1.5 Ok - ответ сервера
data - начинаем передачу данных
354 End data with . - ответ сервера, в конце данных просит указать пустую строку с точкой
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: 
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 ; 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

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

postmap vmaps

postalias /etc/aliases
newaliases

Почтовые псевдонимы \ алиасы \ alias

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

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

Сосед попросил вас позвонить в газовую службу. 
Вы - прокси для соседа.

Несколько соседей попросили позвонить вас в газовую службу. 
Вы позвонили по первой просьбе, а на другие ответили, что уже звонили. 
Вы - кеширующая прокси для соседей.

Сосед взял ваш телефон и позвонил в газовую службу с вашего номера. 
Вы - NAT для соседа.

А прозрачный прокси?
Сосед думает, что звонит в газовую службу, но вы обрезали его телефонную линию, 
с коммутировали на своём телефоне и притворяетесь работником газовой службы.

Прокси сервер \ SQUID

!!! [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 настройка аутентификации

!!! /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 ограничение ширины канала


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 ограничение ширины канала пример

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 анализ логов

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

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

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 / клиент

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

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

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

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


---------------
nc ya.ru 80
HEAD / HTTP/1.1
Host: ya.ru
---------------

apache2ctl configteset - проверка конфигурации
apache2ctl graceful - принять настройки без перезагрузки