Решение домашних задания для сдачи экзамена

Если вы не большой знаток 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) с сервера на клиент

Запуск сетевых служб

  • Посмотреть список зарегистрированных служб:
    # 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