Size: 202
Comment:
|
Size: 2820
Comment:
|
Deletions are marked like this. | Additions are marked like this. |
Line 1: | Line 1: |
Задания, помеченные <!>, делать не обязательно (хотя и интересно). | == Решение домашних задания для сдачи экзамена == Если вы не большой знаток Linux, редактировать конфигурационные файлы можно с помощью команды `mcedit /путь/до/файла`. Если вы знакомы с двухпанельными файловыми менеджерами типа «синенькое» (Far Manager, Total Commander и т. п.), можете воспользоваться `mc`. Символ `#` в начале строки конфигурационного файла начинаеткомментарий. Обе машины — и «сервер», и «клиент» — имеют по два сетевых интерфейса, из которых один смотрит в «интернет» `10.0.2.0/24` (что это за интернет — об этом после), а второй — в невидимую ниоткуда, кроме виртуальных машин, внутреннюю сеть virtualbox `10.30.50.0/24` (очень удобно: внутренних сетей можно наделать сколько хочешь и моделировать любую топологию сети). Различаются только настройки: сервер по умолчанию ходит в интернет через интерфейс с интернетом, а клиент — через внутреннюю сеть посредством сервера. Сам virtualbox может раздавать сетевые настройки при помощи DHCP, но этим пользуется только сервер (для «интенрентого» интерфейса). Внутренний интерфейс `10.30.50.1/24` в сервере настроен вручную, и по внутренней сети уже сам сервер раздаёт DHCP, а клиент — получает. Адрес `10.0.2.10/24` на «интернетном» интерфейса клиент настраивает вручную. Разумеется, при такой конфигурации клиент тоже может работать маршрутизатором для сервера! Если в примере встречаются команды и клиента, и сервера, я включаю в него приглашение командной строки с именем машины. /!\ TODO — подпись и отправка журнала Задания, помеченные <!> , делать не обязательно (хотя и интересно). |
Решение домашних задания для сдачи экзамена
Если вы не большой знаток Linux, редактировать конфигурационные файлы можно с помощью команды mcedit /путь/до/файла. Если вы знакомы с двухпанельными файловыми менеджерами типа «синенькое» (Far Manager, Total Commander и т. п.), можете воспользоваться mc. Символ # в начале строки конфигурационного файла начинаеткомментарий.
Обе машины — и «сервер», и «клиент» — имеют по два сетевых интерфейса, из которых один смотрит в «интернет» 10.0.2.0/24 (что это за интернет — об этом после), а второй — в невидимую ниоткуда, кроме виртуальных машин, внутреннюю сеть virtualbox 10.30.50.0/24 (очень удобно: внутренних сетей можно наделать сколько хочешь и моделировать любую топологию сети). Различаются только настройки: сервер по умолчанию ходит в интернет через интерфейс с интернетом, а клиент — через внутреннюю сеть посредством сервера.
Сам virtualbox может раздавать сетевые настройки при помощи DHCP, но этим пользуется только сервер (для «интенрентого» интерфейса). Внутренний интерфейс 10.30.50.1/24 в сервере настроен вручную, и по внутренней сети уже сам сервер раздаёт DHCP, а клиент — получает. Адрес 10.0.2.10/24 на «интернетном» интерфейса клиент настраивает вручную.
Разумеется, при такой конфигурации клиент тоже может работать маршрутизатором для сервера!
Если в примере встречаются команды и клиента, и сервера, я включаю в него приглашение командной строки с именем машины.
TODO — подпись и отправка журнала
Задания, помеченные , делать не обязательно (хотя и интересно).
Импорт виртуальных машин
Установить VirtualBox.
Удалить старые виртуальные машины «nano» и «naniclient» (если были)
Скачать архив с образами виртуальных машин, распаковать и импортировать их. Импорт из командной строки: VBoxManage import Nano.ovf или в GUI: «Файл → Импорт конфигураций → Nano.ovf»; то же самое для «клиентской» машины NanoClient.ovf.
- ЗУН
- Знать принципы организации стека протоколов TCP/IP и базовую терминологию
Ethernet: свойства носителя
Интерпретировать выдачу такой команды (enp0s3 — это название устройства, подключённого к среде ПД):
[root@uneex ~]# ethtool enp0s3
Последовательный порт
- Интерпретировать результаты работы команды
[root@uneex ~]# stty -a < /dev/ttyS0
Посмотреть в документации и обратить внимание на значение полей baud, cstopb, parenb, parodd и csN:
[root@uneex ~]# man stty | egrep -C1 'baud|cstopb|parenb|parodd|csN'
(Часть задания выполняется на хост-системе, в журнал не входит). Посмотреть на скорость передачи можно так: настроить ВМ таким образом, чтобы COM1 перенаправлялся в создаваемый при старте сокет («настройки ВМ → COM-порты» «Порт1 → хост-канал» + «создать канал» + какое-нибудь имя, например, nano)
[root@uneex ~]# stty 300 < /dev/ttyS0 [root@uneex ~]# cal > /dev/ttyS0
И на хост-системе поглядеть в этот сокет:$ socat UNIX-CONNECT:nano1 -
- ЗУН
- Знать принципы работы в командной строке shell; иметь представление о кодировании и передаче информации; владеть первичными навыками работы в командной строке
Ethernet
С помощью ip link узнать имена сетевых интерфейсов
- Сколько их?
С помощью ethtool посмотреть параметры Ethernet-интерфейсов. обратить внимание на различие скорости
[root@uneex ~]# ethtool enp0s3 | grep 100 [root@uneex ~]# ethtool enp0s8 | grep 100
С помощью ifdown enp0s8 «опустить» интерфейс. Что изменилось?
[root@uneex ~]# ip l show dev enp0s8 [root@uneex ~]# ifdown enp0s8 [root@uneex ~]# ip l show dev enp0s8
ifdown — это сценарий. Какой командой «опускается» интерфейс?
- заглянуть внутрь трафика:
(NB: вы можете использовать несколько консолей для работы, они переключаются по ALT-F1, ALT-F2 и т. д; также можно несколько раз подключиться по ssh)
# socat TUN:192.168.255.1/24,up,tun-type=tap - | hexdump -C
- Посмотреть с другой консоли на созданный виртуальный сетевой интерфейс:
[root@uneex ~]# ip l show dev tap0
- Посмотреть с другой консоли на созданный виртуальный сетевой интерфейс:
# ping 192.168.255.2 (также с другой консоли)
(трудно отчитаться) Наблюсти в выдаче MAC-адрес интерфейса tap0, широковещательный адрес ff ff ff ff ff ff и IP-адрес
- Это какого уровня трафик?
- ЗУН
Знать основную терминологию протоколов канального уровня, принципы работы протокола ethernet, иметь представление о формате фрейма, особенностям WiFi; иметь базовый навык в использовании команд ip link и ethtool; уметь находить сетевые интерфейсы Linux и изучать их параметры.
IP: адресация и маршрутизация
Какие адреса выдаёт команда ip a?
Что умеет ip addr (краткий список: ip a help)
Как устроена таблица маршрутизации (ip r)?
Каков адрес маршрутизатора по умолчанию?
Какой интерфейс ведёт в интернет?
Что можно узнать из команды whois 158.250.10.1?
в частности — номер автономной системы (ASномер). Что выдаёт команда whois этот_номер?
ARP
Сколько машин показывает ip n?
[root@uneex ~]# ip n [root@uneex ~]# ip n | wc -l
Добиться, чтобы выдача ip n менялась после ping чего-нибудь
- Сеанс работы протокола ARP
убедиться, что в ip n на клиенте пропал адрес сервера
- Выполнить
[root@uneex ~]# tcpdump -v -n -i enp0s8 arp
[root@uneexclient ~]# ping -c1 srv
- пронаблюдать сеанс заполнения ARP-таблицы в выдаче tcpdump
ICMP
Сеанс работы traceroute
- запустить
[root@uneex ~]# tcpdump -v -i enp0s3 host www.ru or icmp
[root@uneexclient ~]# traceroute -q1 -w1 www.ru
пронаблюдать работу traceroute. Обратить внимание на увеличивающиеся значения ttl
- запустить
Настройка сети
- Настройки сети на сервере:
ip r, ip a
ls /etc/net, ls /etc/net/ifaces
find /etc/net/ifaces/[el]* -type f -print (эта команда рекурсивно просматривает соответствующие каталоги и находит в них файлы)
find /etc/net/ifaces/[el]* -type f -print -exec cat {} \; (эта командавыводит не только имена файлов, но и их содержимое)
(вариант предыдущей команды, в которой find только выдаёт имена файлов, а выводом занимается sh): find /etc/net/ifaces/[el]* -type f -print | while read f; do echo " ====== $f"; cat $f; done
каких привычных настроек сети не задано явно в текущей конфигурации etcnet и почему?
- Настройка DHCP:
- Настройки сервера:
[root@uneex ~]# cat /etc/dhcp/dhcpd.conf
- Посмотреть сеанс настройки клиента по DHCP:
[root@uneex ~]# tcpdump -v -n -i enp0s8 port bootps or port bootpc
- Перезапустить сеть на клиенте, чтобы этот сеанс произошёл:
[root@uneexclient ~]# service network restart
- Настройки сервера:
- Настройки сети на клиенте
- См. настройки на сервере.
ip rule (обратить внимание на пока пустую нестандартную таблицу "back")
cat /etc/iproute2/rt_tables
В файле /etc/net/ifaces/enp0s3/ipv4route расскомментировать по одной строчке (остальные должны быть закомментированы), посмотреть, что изменится после service network restart
В частности, выполнить команды ip r и ip route get 217.76.32.61
Обратите внимание на то, что записей вида default в таблице может быть несколько; если не заданы приоритеты, побеждает первая (она же последняя добавленная)
Целевая маршрутизация
- Настройка и работа Policy routing
На клиенте раскомментировать в enp0s3/ipv4route только строку default via 10.0.2.2 table back (она заполняет таблицу "back"), перезапустить сеть
ip route list table back
ip r get from 10.30.50.1 iif enp0s8 217.76.32.61
- что делает эта команда?
чем её результат отличается от ip r get 217.76.32.61 и почему?
- Пронаблюдать процесс целевой маршрутизации:
Выяснить ip-адрес клиента в сети 10.30.50.0/24:
[root@uneexclient ~]# ip a
[root@uneexclient ~]# tcpdump -ni enp0s3 port 80
[root@uneex ~]# ip r add 217.76.32.61/32 via ip-адрес-клиента
[root@uneex ~]# ip r get 217.76.32.61; ip r get 217.76.32.60
[root@uneex ~]# echo -e "QQ\n\n" | netcat 217.76.32.61 80
Закомментировать обратно все строки в enp0s3/ipv4route на клиенте и на сервере, а то работать будет не так, как надо
TCP
- Посмотреть TCP-трафик
На сервере запустит tcpdump:
[root@uneex ~]# tcpdump -KlSnni enp0s3 tcp and port 80
- на клиенте — сходить куда-нибудь по 80-му порту, например:
[root@uneexclient ~]# date | netcat linux.org.ru 80
Наблюсти TCP-сеанс. Обратить внимание на флаги [S] (syn) [P] (payload) и [F] (fin), возникающие в сеансе, а также на использование двух нарастающих seq (туда и обратно)
Наблюсти тот же сеанс, убрав S и nn из ключей tcpdump
UDP и ICMP
- На сервере посмотреть трафик по 53-му и 123-му портам и протоколу ICMP
[root@uneex ~]# tcpdump -Klvnni enp0s3 port domain or port ntp or icmp
- На клиенте:
пингануть что-нибудь (например ping -c3 linux.org.ru)
обновить время (ntpdate ru.pool.ntp.org)
выполнить traceroute (traceroute -N1 -q1 -n linux.org.ru)
- Наблюсти на сервере
- DNS-трафик (от ping, ntpdate и т. п.). Где в нём DNS Query ID?
ICMP-трафик (для ping — id. для traceroute — увеличивающиеся ttl, UDP и ICMP)
- NTP-трафик (Transmit Timestamp и Originator Timestamp в ответе)
FTP и его непростой выбор портов
На сервере запустить tcpdump -i enp0s8
- На клиенте выполнить
[root@uneexclient ~]# ftp 10.30.50.1 … Name (10.30.50.1:root): ftp … ftp> ls … ftp> passive … ftp> ls … ftp> exit
- Найти:
- в passive режиме (по умолчанию):
в выводе FTP: предложение сервера подключиться для передачи данных к случайному порту (представлен в побайтно-десятичном виде сразу после адреса, например 234.12 — это 234*256+12 = 59916
подключение к этому порту (в tcpdump) с клиента на сервер
в active режиме (после команды passive)
в выводе FTP: предложение клиента подключиться для передачи данных к случайному порту
подключение к этому порту (в tcpdump) с сервера на клиент
- в passive режиме (по умолчанию):
Запуск сетевых служб
- Посмотреть список зарегистрированных служб:
# chkconfig --list
Обратите внимание на то, что команда chkconfig управляет и запуском служб посредством sysvinit, и метадемоном xinetd
Остановить службу dhcpd и посмотреть, что изменилось (можно также проверить с клиента, что DHCP недоступен):
# netlist > full # service dhcpd status … # service dhcpd stop … # netlist > no_dhcp # diff -u full no_dhcp … # service dhcpd start …
Что делает утилита netlist?
Посмотреть выдачу утилиты rpcinfo без параметров, с ключом -s и с ключом -p. Что эти команды делают?
Метадемон xinetd
Посмотреть настройки xinetd на сервере:
# cat /etc/xinetd.conf … # ls /etc/xinetd.d/ … # cat /etc/xinetd.d/bftpd-tcp … # grep disable /etc/xinetd.d/* …
Обратите внимание, как выключаются зарегистрированные inetd-фильтры
(пример уже воспроизведён). Воспроизвести пример «Обслуживание прикладного уровня в Linux» из учебника (подключаться с клиентской машины с помощью netcat вместо telnet)
- Посмотреть самодельный xinetd-файл и проверить его работу:
[root@uneex ~]# chkconfig --list calendar
[root@uneex ~]# cat /etc/xinetd.d/calendar
[root@uneexclient ~]# netcat srv 26000
DNS
Посмотреть настройку сети: [root@uneex ~]# cat /etc/net/ifaces/enp0s3/options
Что лежит в /etc/resolv.conf на сервере и на клиенте?
- Создать DNS-запрос на клиенте и посмотреть, как его разрешает сервер (напоминаю, что подсказка в начале показывает, на какой машине давать команды):
[root@uneex ~]# tcpdump -i enp0s3 port 53 … [root@uneexclient ~]# dig cmc.msu.ru … [root@uneex ~]# tcpdump -i enp0s8 port 53 … [root@uneexclient ~]# hostinfo 10.30.50.13 … [root@uneexclient ~]# hostinfo host17 …
- Заглянуть в настройки BIND на сервере:
прямую и обратную зоны: /var/lib/bind/zone/* (в т. ч. для localhost)
настройки: /var/lib/bind/etc/options.conf (обратите внимание на поле forwarders) и /var/lib/bind/etc/local.conf
NFS
- посмотреть работу NFS:
[root@uneex ~]# tcpdump -i enp0s8 not port 53 … [root@uneexclient ~]# showmount -e srv … [root@uneexclient ~]# mount srv:/home /mnt [root@uneexclient ~]# find /mnt … [root@uneexclient ~]# umount /mnt
- Обратите внимание на premission denied. Отчего это?
Посмотреть DNS-трафик при ls /mnt/net/home с клиента (используются анонсированные через DNS службы)
Zeroconf
- Работа Avahi:
# avahi-browse -at
- Посмотреть анонсирующую настройку:
[root@uneex ~]# cat /etc/avahi/services/nfs-home.service …
- посмотреть трафик работы zeroconf:
[root@uneexclient ~]# tcpdump -i enp0s8 … [root@uneex ~]# ping uneexclient.local … [root@uneex ~]# tcpdump -i enp0s8 … [root@uneexclient ~]# ls /mnt/net/Homes …
Открытая передача учётных записей в старых протоколах
- Убедиться в небезопасности FTP (login: "user", password: "user"):
[root@uneex ~]# dsniff -i enp0s8 … [root@uneexclient ~]# ftp srv … Name (srv:root): user … Password: user …
SSL-сертификаты
- создание самоподписанного сертификата
короткая команда: [root@uneex ~]# cert-sh generate lighttpd (это просто небольшой сценарий)
- посмотреть, какими командами генерируется самоподписанный сертификат:
[root@uneex ~]# rm -rf tmp/test; mkdir -p tmp/test/{private,certs} [root@uneex ~]# SSLDIR=tmp/test sh -x cert-sh generate lighttpd 2>&1 | egrep '^[+] (openssl|cat|ln)'
должно быть четыре стадии: создание ключа, создание запроса на подпись этим ключом, подпись самим собой и склеивание подписи с ключом перезагрузить http-сервер: [root@uneex ~]# service lighttpd restart
- проверка разных сертификатов:
[root@uneexclient ~]# openssl s_client -verify on -connect srv:443 < /dev/null
[root@uneexclient ~]# LC_ALL=C lynx https://www.uneex.org
[root@uneexclient ~]# LC_ALL=C lynx https://uneex.ru
[root@uneexclient ~]# LC_ALL=C lynx https://srv
Netcat
Поговорить с самим собой с помощью netcat:
[root@uneex ~]# nc -l 12345 … [root@uneexclient ~]# nc srv 12345 …
- Для того, чтобы закрыть поток В/В, достаточно нажать "Ctrl+D"
Secure shell
Зайти с клиента на сервер по ssh, почитать отладочную диагностику и обнаружить там имена файлов с ключами:
[root@uneexclient ~]# ssh -v root@srv
- Сгенерировать ключ (защищённый кодовой фразой "123456"):
[root@uneexclient ~]# rm -rf /root/.ssh/id_dsa && ssh-keygen -P123456 -t dsa -f /root/.ssh/id_dsa
Повторять эту команду до тех пор, пока ASCII-арт отпечатка не покажется красивым
удалить файл .ssh/known_hosts и снова зайти на сервер. Увидеть диалогThe authenticity of host 'srv (10.30.50.1)' can't be established и в нём отпечаток (обращаю внимание, что отвечать надо yes, а не y). В отладочной информации увидеть, что предложенный ключ был отвергнут
- Скопировать открытый ключ на сервер (надо будет ввести кодовую фразу):
[root@uneexclient ~]# ssh-copy-id srv
ssh-copy-id — это простой сценарий, запустить sh -x ssh-copy-id srv и посмотреть, какими командами что копируется
- Ещё раз зайти на сервер (теперь вместо пароля надо будет вводить кодовую фразу)
Запустить ssh-агент (обратите внимание, что команда ssh-agent генерирует все остальные команды, их просто надо скопировать, и числа там будут другие)
[root@uneexclient ~]# ssh-agent SSH_AUTH_SOCK=/root/tmp/ssh-XIglJWV12040/agent.12040; export SSH_AUTH_SOCK; SSH_AGENT_PID=12041; export SSH_AGENT_PID; [root@uneexclient ~]# SSH_AUTH_SOCK=/root/tmp/ssh-XIglJWV12040/agent.12040; export SSH_AUTH_SOCK; [root@uneexclient ~]# SSH_AGENT_PID=12041; export SSH_AGENT_PID;
- Вместо всего этого можно было выполнять такую команду:
[root@uneexclient ~]# eval `ssh-agent`
- Добавить в него ключ, посмотреть на ключ и зайти наконец-то без пароля!
[root@uneexclient ~]# ssh-add -l The agent has no identities. [root@uneexclient ~]# ssh-add Enter passphrase for /root/.ssh/id_dsa: Identity added: /root/.ssh/id_dsa (/root/.ssh/id_dsa) [root@uneexclient ~]# ssh-add -l 1024 5c:5f:59:eb:97:ec:e0:fc:f7:18:1f:10:89:dd:f4:90 /root/.ssh/id_dsa (DSA) [root@uneexclient ~]# ssh srv Last login: Fri Nov 29 14:16:39 2013 from host13.class.altlinux.org
- Пробросить подключение с клиента на uneex.ru:80 на порт сервера 8001:
[root@uneexclient ~]# ssh srv -R8001:www.ru:80 Last login: Fri Nov 29 14:25:26 2013 from host13.class.altlinux.org [root@uneex ~]# netlist | grep 8001 root 14358 sshd 8 tcp 127.0.0.1:8001 0.0.0.0:0 LISTEN [root@uneex ~]# links http://localhost:8001 …
С помощью tcpdump убедиться, что трафик идёт так: сервер(localhost):8001 → клиент(ssh-тоннель):22 → www.ru:80
GnuPG
- Импортировать открытый GPG-ключ и проверить его отпечаток:
[root@uneex ~]# rm -rf $HOME/.gnupg [root@uneex ~]# gpg --list-keys [root@uneex ~]# gpg --recv-keys 7C10D900 [root@uneex ~]# gpg --fingerprint /root/.gnupg/pubring.gpg ------------------------ pub 1024D/7C10D900 2003-10-17 Key fingerprint = D01B B410 C69D AE98 8EB0 16F0 E1F0 3D6E 7C10 D900
Проверить подпись этого файла:
[root@uneex ~]# curl 'https://uneex.ru/LecturesCMC/LinuxNetwork2013/09-SecurityAndTools?action=AttachFile&do=get&target=signed.txt' > signed.txt [root@uneex ~]# gpg --verify signed.txt
- Обратите внимание, что ключ хотя и проверен, но вы лично не подписывали его, так что причин доверять ему нету.
Сгенерировать учёбный ключ (ВНИМАНИЕ!. Учётные данные в этом ключе менять не надо, они исползуются для формирования отчёта. Вы можете нагенерировать ещё ключей, но этот надо оставить).
[root@uneex ~]# echo " Key-Type: DSA Key-Length: 1024 Name-Real: Joe Tester Name-Comment: with stupid passphrase Name-Email: joe@foo.bar Expire-Date: 0 %commit " | gpg --batch --gen-key -
При появлении надписи (если вдруг) "Not enough random bytes available." придётся зайти в соседнюю консоль и нажимать на все подряд клавиши клавиатуры. В VirtualBox с энтропией плоховато.
- Подписать ключ 7C10D900 и снова проверить подпись
[root@uneex ~]# gpg --sign-key 7C10D900 … [root@uneex ~]# gpg --verify signed.txt …
Межсетевые экраны
(задание по МЭ в отчёт можно не включать) Следующая команда выдаёт ошибку. Почему?
[root@uneex ~]# iptables -A POSTROUTING -d 217.76.32.61 -j REJECT iptables: No chain/target/match by that name.
(задание по МЭ в отчёт можно не включать) В следующих примерах для проверки связности запускать команду
# echo -e "GET / HTTP/1.0\nHost: linux.org.ru\n" | netcat linux.org.ru 80
с клиента и с сервера и просматривать сами правила с помощью[root@uneex ~]# iptables-save
- Добавить фильтрующее правило:
[root@uneex ~]# iptables -A FORWARD -d 217.76.32.61 -j REJECT
- Удалить фильтрующее правило:
[root@uneex ~]# iptables -D FORWARD -d 217.76.32.61 -j REJECT
- Добавить фильтрующее правило:
[root@uneex ~]# iptables -A OUTPUT -d 217.76.32.61 -j REJECT
- Удалить фильтрующее правило
- Посмотреть на соединения, обслуживаемые conntrack:
[root@uneex ~]# cat /proc/net/nf_conntrack
- Добавить фильтрующее правило: