Самостоятельная работа
Тема: Протоколы сетевого взаимодействия в GNU/Linux: DNS, SSH, FTP, NFS, SMB, iSCSI
Блок теории
1. DNS (Domain Name System)
DNS — это распределённая система, отвечающая за преобразование доменных имён (например, example.com
) в IP-адреса (например, 93.184.216.34
) и наоборот. В GNU/Linux процесс разрешения имён (name resolution) осуществляется с участием нескольких компонентов: резолвера, библиотеки libc
, файлов конфигурации и, при необходимости, локального кэширующего DNS-сервера (например, systemd-resolved
, dnsmasq
).
Как работает резолвер в Linux
Резолвер — это программный компонент, реализованный в библиотеке glibc
, который отвечает за выполнение DNS-запросов. При вызове функций, таких как getaddrinfo()
или gethostbyname()
, резолвер:
- Определяет, откуда брать информацию о преобразовании имён, используя механизм Name Service Switch (NSS).
- Обращается к DNS-серверам, указанным в файле
/etc/resolv.conf
. - Выполняет рекурсивные или кэшированные запросы к DNS-серверам.
- Возвращает IP-адрес приложению.
Файл /etc/resolv.conf
Этот файл содержит список DNS-серверов, используемых системой:
nameserver 8.8.8.8
nameserver 1.1.1.1
search example.com
nameserver
— IP-адрес DNS-сервера.search
— домены, которые добавляются к коротким именам (например,ping server
→server.example.com
).options
— дополнительные параметры (например,timeout
,attempts
).
⚠️ В современных системах (с
systemd-networkd
илиNetworkManager
)/etc/resolv.conf
часто является симлинком на/run/systemd/resolve/stub-resolv.conf
или управляется автоматически.
Name Service Switch (/etc/nsswitch.conf
)
Файл /etc/nsswitch.conf
определяет порядок и источники, из которых система получает информацию о хостах, пользователях, группах и т.д.
Для DNS особенно важна строка:
hosts: files dns myhostname
files
— сначала проверяется/etc/hosts
.dns
— если в/etc/hosts
нет записи, запускается DNS-запрос.myhostname
— разрешение имени локальной машины (важно дляlocalhost
, FQDN и т.п.).
Таким образом, при обращении к google.com
система:
- Проверяет
/etc/hosts
. - Если не найдено — запрашивает DNS через резолвер.
Кэширование и ускорение
Для повышения производительности можно использовать локальные DNS-кэши:
systemd-resolved
— интегрирован вsystemd
, кэширует ответы и может работать как stub resolver.dnsmasq
— легковесный DNS-прокси с кэшированием.unbound
— полноценный рекурсивный DNS-сервер.
2. SSH (Secure Shell)
SSH — это криптографический сетевой протокол для безопасного удалённого доступа к системам. В GNU/Linux основной реализацией является OpenSSH (openssh-server
, openssh-client
).
Основные возможности SSH
- Удалённое выполнение команд через
ssh user@host
. - Безопасная передача файлов через
scp
,sftp
. - Аутентификация по паролю или по ключам (SSH keys).
- Шифрование всех передаваемых данных (с использованием TLS-подобных алгоритмов).
Конфигурационные файлы
/etc/ssh/sshd_config
— настройки сервера SSH.~/.ssh/config
— пользовательские настройки клиента.~/.ssh/authorized_keys
— ключи для аутентификации по ключу.~/.ssh/known_hosts
— список известных хостов и их отпечатков.
SSH-ключи
Генерация ключей:
ssh-keygen -t ed25519 -C "user@host"
Публичный ключ копируется на сервер:
ssh-copy-id user@remote_host
SSH-туннелирование (Port Forwarding)
SSH позволяет создавать безопасные туннели для перенаправления трафика. Это особенно полезно для обхода фаерволов, шифрования незащищённых протоколов или доступа к внутренним сервисам.
1. Локальное проброс портов (Local Port Forwarding)
Перенаправляет порт с локальной машины на удалённый сервер через SSH-туннель.
Пример: доступ к веб-интерфейсу на remote_host:8080
через localhost:9000
:
ssh -L 9000:localhost:8080 user@remote_host
Теперь запросы к http://localhost:9000
будут перенаправлены на remote_host:8080
.
Примечание:
localhost
в8080
— это с точки зренияremote_host
.
2. Удалённое проброс портов (Remote Port Forwarding)
Открывает порт на удалённом сервере, который перенаправляет трафик обратно на локальную машину.
Пример: предоставить доступ к локальному веб-серверу (на localhost:3000
) через порт 8080
на удалённом сервере:
ssh -R 8080:localhost:3000 user@remote_host
Теперь пользователи на remote_host
могут зайти на http://localhost:8080
и попасть на ваш локальный сервер.
Требует настройки
GatewayPorts yes
в/etc/ssh/sshd_config
, если нужно, чтобы туннель был доступен не только сlocalhost
.
3. Динамическое проброс портов (SOCKS Proxy)
Создаёт локальный SOCKS-прокси, через который можно направлять любой трафик.
ssh -D 1080 user@remote_host
После этого можно настроить браузер или систему на использование SOCKS5-прокси localhost:1080
, и весь трафик будет шифроваться и проходить через SSH-туннель.
Применение туннелирования
- Безопасный доступ к базам данных (например, MySQL на
3306
). - Работа с веб-интерфейсами внутренних сервисов.
- Обход цензуры или фаерволов.
- Защита незашифрованных протоколов (HTTP, FTP и т.д.).
3. FTP (File Transfer Protocol)
FTP — старый протокол для передачи файлов. Имеет две версии:
- Active FTP: сервер инициирует соединение к клиенту (проблемы с NAT/фаерволами).
- Passive FTP: клиент инициирует все соединения (более совместим с NAT).
В GNU/Linux FTP-клиенты: ftp
, lftp
, wget
, curl
.
FTP-серверы: vsftpd
, proftpd
, pure-ftpd
.
FTP передаёт данные и пароли в открытом виде — небезопасен. Для безопасной передачи файлов рекомендуется использовать SFTP (через SSH) или FTPS (FTP over SSL/TLS).
Практические задания по FTP опущены.
4. NFS (Network File System)
NFS — протокол, разработанный Sun Microsystems, для монтирования удалённых файловых систем в Unix-подобных системах. Наиболее распространённая версия — NFSv4.
В GNU/Linux:
- Сервер: пакет
nfs-kernel-server
, конфигурация —/etc/exports
. - Клиент:
nfs-common
, монтирование черезmount -t nfs
.
NFS использует RPC (Remote Procedure Call) и требует запуска демонов (rpcbind
, nfsd
).
Особенности:
- Прозрачное монтирование.
- Поддержка прав доступа (UID/GID).
- NFSv4 добавляет поддержку Kerberos и работает через один порт (2049).
Практические задания по NFS опущены.
5. SMB (Server Message Block)
SMB — протокол для доступа к файлам, принтерам и другим ресурсам в сетях. Используется в Windows, но в GNU/Linux реализуется через Samba.
Samba позволяет:
- Предоставлять общие папки Linux для Windows.
- Подключаться к Windows-шарам с Linux.
- Интегрироваться в домены Active Directory.
Клиентские утилиты: smbclient
, mount.cifs
.
Конфигурация сервера — /etc/samba/smb.conf
.
Практические задания по SMB опущены.
6. iSCSI (Internet Small Computer System Interface)
iSCSI — протокол, позволяющий передавать команды SCSI по IP-сети. Используется для построения SAN (Storage Area Network).
В GNU/Linux:
- Initiator (клиент):
open-iscsi
, утилитыiscsiadm
. - Target (сервер):
targetcli
,tgtd
.
iSCSI позволяет монтировать удалённые диски как локальные блочные устройства (/dev/sdX
). После подключения диск можно форматировать, размечать, использовать как обычный HDD.
Пример подключения:
iscsiadm -m discovery -t st -p 192.168.1.100
iscsiadm -m node -l
Практические задания по iSCSI опущены.
Вывод
DNS, SSH, FTP, NFS, SMB и iSCSI — ключевые протоколы сетевого взаимодействия в GNU/Linux. Каждый из них решает свою задачу: от разрешения имён до удалённого доступа и передачи данных.
Особое внимание в современных системах уделяется безопасности:
- DNS защищается через DNSSEC и DoT/DoH (не рассмотрено, но актуально).
- SSH обеспечивает шифрование и мощные механизмы туннелирования.
- FTP постепенно заменяется SFTP/SCP.
- NFS и SMB требуют правильной настройки политик доступа.
- iSCSI используется в защищённых средах с аутентификацией CHAP.
Понимание работы этих протоколов, особенно на уровне конфигурации Linux (nsswitch.conf
, /etc/resolv.conf
, SSH-ключи, туннели), необходимо для администрирования сетевых систем.
Протокол smb
Используя консоль
Создаем папку, которая будет общей; назначаем ей права
mkdir /home/docstore; chmod 777 /home/docstore
Делаем бэкап конфигурационного файла самбы
mv /etc/samba/smb.conf /etc/samba/smb.conf.old
Папка без пароля
Прописываем в /etc/samba/smb.conf
следующие параметры
[global]
dos charset = CP866
unix charset = utf8
#имя рабочей группы
workgroup = WORKGROUP
#имя сервера
server string = Filestore
#группа пользователей
security = USER
map to guest = Bad User
#имя ресурса
[Public]
#путь к папке
path = /home/docstore
guest ok = Yes
browseable = yes
writable = yes
create mask = 0777
directory mask = 0777
Создаем служебный каталог:
mkdir -p /var/lib/samba/private
Перезапускаем сервис SMB:
systemctl restart smb.service nmb.service
Включаем автозапуск:
systemctl enable smb.service nmb.service
Добавление второй папки без пароля
Делаем так же как и в первом шаге, только добавляем раздел с описанием второго ресурса ниже первого.
В первом примере у нас Public и папка docstore. Во втором будет Share и files.
Создаем папку
mkdir /home/files;chmod 777 /home/files
Прописываем в /etc/samba/smb.conf
следующие параметры
[Share]
path = /home/files
read only = Yes
guest ok = Yes
browseable = yes
writable = yes
create mask = 0777
directory mask = 0777
Перезапускаем сервис SMB:
systemctl restart smb.service nmb.service
Папка с паролем
Создадим пользователя в системе, имя пользователя share, его пароль 1q@W3e, при создании сделаем каталог пользователя (ключ -m
) и зададим пароль (ключ -p
).
useradd -m share -p 1q@W3e
Назначим нового владельца, пользователя share, и несколько изменим разрешения:
mkdir /home/kadry;chmod 777 /home/kadry
chown -R share:users /home/kadry
chmod -R ugo+rwx /home/kadry
Примечание: Утилита smbpasswd находится в пакете samba-client
Добавляем пользователя в Samba (вводим пароль 1q@W3e):
smbpasswd -a share
Добавим в smb.conf
следующее:
[Kadry]
comment = Кадры
path = /home/kadry
read only = no
guest ok = no
browseable = yes
writable = yes
create mask = 0777
directory mask = 0777
force user = share
force group = users
Папка будет доступна пользователю share с паролем 1q@W3e.
Перезапускаем сервис SMB:
systemctl restart smb.service nmb.service
Используя графический интерфейс
systemctl enable --now smb
systemctl enable --now nmb
Создаем папку в удобной директории. Нажимаем по ней ПКМ - Опции публикации
Настраиваем по своему желанию и нажимаем Создать публикацию.
Протокол nfs
Сервер NFS
Настройка сервера NFS
Синтаксис /etc/exports
Все настройки NFS-сервера хранятся в файле /etc/exports
.
Файл /etc/exports
определяет, какие файловые системы экспортируются на удаленные узлы, и определяет параметры. Для этого файла действуют следующие синтаксические правила:
- пустые строки игнорируются;
- комментарии начинаются с символа решётки (#);
- для продолжения записи на новой строке можно использовать символ обратной косой черты ();
- каждая экспортируемая ФС должна находиться на отдельной строке;
- списки авторизованных узлов, размещаемые после экспортированной файловой системы, должны быть разделены пробелами;
- параметры для каждого из узлов должны быть помещены в скобки непосредственно после идентификатора узла, без пробелов, разделяющих узел и первую скобку;
- если название экспортируемого каталога содержит пробелы, его следует заключить в двойные кавычки.
Каждая запись экспортированной файловой системы имеет следующую структуру:
export host(options)
Где:
- export — путь к экспортируемому каталогу;
- host — узел или сеть, в которую передается экспорт;
- options — параметры, которые будут использоваться для узла.
Можно указать несколько узлов, а также конкретные параметры для каждого узла. Для этого следует перечислить их в одной строке в виде списка, разделённого пробелами, где за каждым именем узла следуют соответствующие параметры (в скобках), например:
/mysharedir 192.168.0.100/24(no_subtree_check,rw) 192.168.10.0/24(no_subtree_check,ro)
Некоторые опции:
rw/ro
— установка разрешения доступа к ресурсу (чтение запись/только чтение);no_subtree_check/subtree_check
— если экспортируется подкаталог файловой системы, но не вся файловая система, то с опциейsubtree_check
сервер, проверяет, находится ли запрошенный файл в экспортированном подкаталоге. Если экспортируется вся файловая система, запрет проверки подкаталогов (no_subtree_check
) может увеличить скорость передачи;sync/async
— синхронный/асинхронный режим доступа. Опцияsync
указывает, что сервер должен отвечать на запросы только после записи на диск изменений, выполненных этими запросами. Опцияasync
указывает серверу не ждать записи информации на диск, что повышает производительность, но понижает надежность;wdelay/no_wdelay
— установка задержки записи на диск (установка задержки/отключение задержки, этот параметр не действует при включенной опции async);hide/nohide
— не отображать/отображать нелокальные ресурсы (например, примонтированые с помощьюmount --bind
);all_squash/no_all_squash
— подмена запросов от ВСЕХ пользователей на анонимного uid/gid (либо на пользователя, заданного в параметреanonuid/anongid
) запрет подмены uid/gid;anonuid=UID
иanongid=GID
— (явная) установка UID/GID для анонимного пользователя (может быть полезно, если какой либо каталог экспортируется для конкретного пользователя, заведенного в системе).
Примечание: Единственный параметр, который следует обязательно указать — это
no_subtree_check
или ``subtree_check`.
Имя узла (узлов) может задаваться в следующей форме:
- один узел — FQDN-имя (которое сможет разрешить сервер), имя узла (которое сможет разрешить сервер) или IP-адрес;
- IP-сеть — используется запись вида a.b.c.d/z, где a.b.c.d — адрес сети, а z — префикс. Также допускается формат a.b.c.d/netmask, где a.b.c.d — сеть, а netmask — маска сети (например, 192.168.100.8/255.255.255.0);
- набор узлов — узлы определяются знаками подстановки (символ * или ?) или могут содержать списки классов символов в [квадратных скобках]. Знаки подстановки не должны использоваться в IP-адресах;
- сетевые группы — задаются в виде @group-name, где group-name — имя сетевой группы NIS;
- анонимный узел — задается одним символом * и будет соответствовать всем клиентам.
Для применения изменений, внесённых в файл /etc/exports
необходимо выполнить команду:
exportfs -ra
или перезапустить NFS-сервер:
systemctl restart nfs
Запуск NFS под systemd
Запустить NFS-сервер и включить его по умолчанию:
systemctl enable --now nfs.service
systemctl status nfs.service
Если все команды прошли успешно и не выдавали ошибок, то сервер можно считать работающим. Дополнительно можно запустить команду exportfs
, которая выведет текущие настройки на данный момент. В случае нормальной работы она должна вывести на экран записи из файла /etc/exports
:
exportfs
/home 192.168.0.0/24
/exports 192.168.0.0/24
Использование NFS
Подключение к NFS-серверу можно производить вручную, а можно настроить автоматическое подключение при загрузке.
Монтирование NFS-ресурса
Команда монтирования:
mount -t nfs -o <опции> <сервер>:/remote/export /local/directory
Где:
- <опции> — разделённый запятыми список опций;
- <сервер> — IP-адрес или имя NFS-сервера;
/remote/export
— каталог, экспортируемый с сервера (каталог, который будет примонтирован); /local/directory — локальный каталог (каталог, в который будет примонтирован каталог, экспортируемый с сервера).
Список доступных ресурсов можно проверить, выполнив команду:
showmount -e 192.168.0.199
Примечание: При запуске данной команды можно получить ошибку:
showmount -e 192.168.0.199
clnt_create: RPC: Unable to receive
Это может происходить потому что по умолчанию rpcbind
слушает только локальные запросы:
ss -tnlup | grep rpcbind
# udp UNCONN 0 0 127.0.0.1:111 0.0.0.0:* users:(("rpcbind",pid=4248,fd=6))
# udp UNCONN 0 0 [::1]:111 [::]:* users:(("rpcbind",pid=4248,fd=8))
# tcp LISTEN 0 4096 127.0.0.1:111 0.0.0.0:* users:(("rpcbind",pid=4248,fd=7))
# tcp LISTEN 0 4096 [::1]:111 [::]:* users:(("rpcbind",pid=4248,fd=9))
Разрешить rpcbind
прослушивать входящие соединения из сети:
control rpcbind server
systemctl restart rpcbind.service
ss -tnlup | grep rpcbind
# udp UNCONN 0 0 0.0.0.0:111 0.0.0.0:* users:(("rpcbind",pid=4130,fd=6))
# udp UNCONN 0 0 [::]:111 [::]:* users:(("rpcbind",pid=4130,fd=8))
# tcp LISTEN 0 4096 0.0.0.0:111 0.0.0.0:* users:(("rpcbind",pid=4130,fd=7))
# tcp LISTEN 0 4096 [::]:111 [::]:* users:(("rpcbind",pid=4130,fd=9))
Пример команды монтирования (каталог /mnt/nf должен существовать:
mount -t nfs -o nfsvers=4 192.168.0.199:/home /mnt/nfs
Для проверки успешности монтирования можно использовать команду:
mount | grep nfs
# ...
# 192.168.0.199:/home on /mnt/nfs type nfs4 (rw,relatime,vers=4.2,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.0.177,local_lock=none,addr=192.168.0.199)
Команда выдаст строку (строки) с информацией о примонтированном ресурсе (ресурсах).
Монтирование с записью в fstab
Для автоматического монтирования к NFS-серверу при загрузке необходимо добавить следующую строку в файл /etc/fstab
:
192.168.0.199:/home /mnt/nfs nfs intr,soft,nolock,_netdev,x-systemd.automount 0 0
где:
- intr — позволяет прервать процесс при необходимости;
- soft — предотвращает от зависания в случае недоступности удалённой машины.
Кроме того, стоит убедиться, что сервис netfs
запускается при старте системы.
Прежде чем изменять /etc/fstab
, попробуйте смонтировать вручную и убедитесь, что всё работает.
Протокол ftp
Настройка FTP
- Установить пакеты:
- vsftpd
- anonftp
- Сделать изменения в файле
/etc/xinetd.d/vsftpd
disable = no #включает сервис
- Проверить глобальные настройки
xinetd
в файле/etc/xinetd.conf
, обратить внимание - необходимо написать либо сеть, либо адреса, у которых будет доступ к серверу:
only_from = 192.168.0.0
- Перезапустить сервис
systemctl enable --now xinetd
- Проверить, что нужное приложение (в данном случае xinetd) слушает порт:
ss -tlpn | grep "LISTEN.*:21"
Настройка межсетевого экрана для FTP, правила iptables
:
$IPTABLES -A INPUT -p tcp --dport 21 -j ACCEPT
$IPTABLES -A INPUT --match state --state RELATED,ESTABLISHED -j ACCEPT
Облегчающий жизнь модуль ядра (разрешает RELATED): Прописывается в /etc/net/ifaces/default/fw/iptables/modules
modprobe ip_conntrack_ftp
Протокол iSCSI
https://www.opennet.ru/base/sys/iscsi_fedora.txt.html
Для тестов используем две машины: vm01, которая будет экспортировать раздел /dev/xvda5
, и vm02, на которой настроим инициатор.
Настройка iSCSI Target
Для начала устанавливаем пакет scsi-target-utils
и запускаем демон tgtd
:
apt-get install scsi-target-utils
systemctl enable --now service tgt
Теперь создаем наше целевое устройство. В качестве имени я выбрал share.server:disk1
tgtadm --lld iscsi --op new --mode target --tid 1 -T share.server:disk1
В моем случае я добавляю к целевому устройству новый раздел /dev/xvda5
:
tgtadm --lld iscsi --op new --mode logicalunit --tid 1 --lun 1 -b /dev/xvda5
Теперь разрешим доступ хосту vm02 с IP-адресом 192.168.0.109:
tgtadm --lld iscsi --op bind --mode target --tid 1 -I 192.168.0.109
Проверяем:
tgtadm --lld iscsi --op show --mode target
Под конец не забудьте прорубить "дырку" в брандмауэре для порта 3260/tcp, который используется по умолчанию.
Настройка iSCSI Initiator
Устанавливаем пакет iscsi-initiator-utils
и запускаем демон iscsi
:
apt-get install iscsi-initiator-utils
systemctl enable --now iscsi
systemctl status iscsi
При запуске мы получаем совершенно справедливое сообщение, что не сконфигурирована ни одна из целей. Запускаем процесс обзора для поиска целей на хосте vm01 c IP-адресом 192.168.0.100:
iscsiadm -m discovery -t sendtargets -p 192.168.0.100:3260
В итоге будут созданы две поддиректории с информацией о цели и хосте:
ls /var/lib/iscsi/nodes/
# share.server:disk1
ls /var/lib/iscsi/send_targets/
# 192.168.0.100,3260
Просмотреть информацию можно командой:
iscsiadm -m node -T share.server:disk1 -p 192.168.0.100:3260
# node.name = share.server:disk1
# node.tpgt = 1
# ...
Теперь, используя содержимое /var/lib/iscsi/nodes/
и /var/lib/iscsi/send_targets/
, демон iscsi
при каждом перезапуске будет подключать наши ранее обнаруженные цели.
Также процессом подключения/отключения можно управлять при помощи утилиты iscsiadm
:
iscsiadm -m node -T share.server:disk1 -p 192.168.0.100:3260 -l
# Login session [iface: default, target: share.server:disk1, portal: 192.168.0.100,3260]
Теперь команда fdisk
покажет наш раздел /dev/sda
, экспортированный с vm01:
fdisk -l
# Disk /dev/xvda: 17.1 GB, 17179869184 bytes
# 255 heads, 63 sectors/track, 2088 cylinders
# Units = cylinders of 16065 * 512 = 8225280 bytes
# ...
# Disk /dev/sda: 1011 MB, 1011677184 bytes
# 32 heads, 61 sectors/track, 1012 cylinders
# Units = cylinders of 1952 * 512 = 999424 bytes
# Disk /dev/sda doesn't contain a valid partition table
После команды
iscsiadm -m node -T share.server:disk1 -p 192.168.0.100:3260 -u
# Logout session [sid: 2, target: share.server:disk1, portal: 192.168.0.100,3260]
в выводе fdisk
мы увидим только /dev/xvda
. Однако, после рестарта демона iscsi
, цель снова появиться в списке устройств. Для удаления всей информации о цели воспользуйтесь командой:
iscsiadm -m node -T share.server:disk1 -p 192.168.0.100:3260 -o delete
ls /var/lib/iscsi/nodes/
Если у вас несколько целей, то вы не можете заранее знать, под каким именем после следующей перезагрузки/рестарта сервиса будет доступна конкретная цель. Для того, чтобы каждая цель всегда была доступна под одним и тем же именем устройства, вы можете написать соответствующее правило udev или воспользоваться монтированием по метке и UUID файловой системы. При монтировании файловых систем не забывайте использовать опцию netdev
.
Конечно! Ниже представлены практические задания по темам DNS и SSH в контексте GNU/Linux. Задания ориентированы на реальные сценарии администрирования и включают работу с конфигурационными файлами, утилитами командной строки и безопасностью.
Практические задания по DNS и SSH в GNU/Linux
Часть 1: Практика по DNS
Цель: Научиться настраивать и диагностировать разрешение имён в Linux, понимать работу резолвера, NSS и DNS-запросов.
Задание 1.1: Анализ текущей конфигурации DNS
- Выведите содержимое файла
/etc/resolv.conf
:bashcat /etc/resolv.conf
- Определите, какие DNS-серверы используются системой.
- Проверьте, является ли файл симлинком:bash
ls -la /etc/resolv.conf
- Если используется
systemd-resolved
, выведите статус DNS:bashили (в новых версиях):systemd-resolve --status
bashresolvectl status
❓ Вопрос: Какой DNS-сервер используется по умолчанию? Откуда он берётся (DHCP, статическая настройка, NetworkManager)?
Задание 1.2: Работа с nslookup
, dig
и host
- Установите
dnsutils
(если не установлен):bashsudo apt install dnsutils # Debian/Ubuntu sudo dnf install bind-utils # Fedora/CentOS
- Выполните запрос к домену
google.com
с помощью:bashnslookup google.com dig google.com host google.com
- Найдите A-запись и AAAA-запись для
yandex.ru
. - Определите MX-записи для
gmail.com
:bashdig gmail.com MX
❓ Вопрос: Какой из инструментов предоставляет наиболее подробную информацию? Что означает поле
ANSWER SECTION
в выводеdig
?
Задание 1.3: Локальное разрешение имён через /etc/hosts
- Добавьте в файл
/etc/hosts
запись:bash192.168.1.100 myserver.local
- Проверьте, как система разрешает имя:bash
ping myserver.local -c 3 getent hosts myserver.local
- Удалите строку после проверки.
❓ Вопрос: Почему
getent hosts
— более правильный способ проверки, чемping
?
Задание 1.4: Настройка nsswitch.conf
- Откройте файл
/etc/nsswitch.conf
:bashcat /etc/nsswitch.conf | grep hosts
- Убедитесь, что строка выглядит так:conf
hosts: files dns myhostname
- Измените порядок: поставьте
dns
передfiles
:confhosts: dns files myhostname
- Проверьте, как это повлияло (добавьте конфликтующую запись в
/etc/hosts
и проверьтеping
). - Верните обратно.
❓ Вопрос: Что произойдёт, если
files
будет послеdns
? Когда это может быть полезно?
Задание 1.5: Настройка локального DNS-кэша (systemd-resolved)
- Включите и запустите
systemd-resolved
:bashsudo systemctl enable systemd-resolved sudo systemctl start systemd-resolved
- Убедитесь, что
/etc/resolv.conf
указывает на127.0.0.53
:bashcat /etc/resolv.conf
- Настройте использование DNS-серверов, например, Cloudflare: Отредактируйте
/etc/systemd/resolved.conf
:ini[Resolve] DNS=1.1.1.1 8.8.8.8 FallbackDNS=9.9.9.9 Domains=~.
- Перезапустите службу:bash
sudo systemctl restart systemd-resolved
- Проверьте работу:bash
resolvectl query google.com
❓ Вопрос: Как
systemd-resolved
помогает ускорить разрешение имён?
Часть 2: Практика по SSH и туннелированию
Цель: Освоить безопасное подключение по SSH, аутентификацию по ключам и настройку SSH-туннелей.
Задание 2.1: Установка и настройка SSH-сервера
- Установите OpenSSH-сервер:bash
sudo apt install openssh-server # Debian/Ubuntu sudo dnf install openssh-server # Fedora
- Запустите и включите службу:bash
sudo systemctl enable ssh sudo systemctl start ssh
- Проверьте статус:bash
sudo systemctl status ssh
- Убедитесь, что сервер слушает порт 22:bash
ss -tuln | grep :22
❓ Вопрос: Какой процесс отвечает за SSH? Как проверить, открыт ли порт извне?
Задание 2.2: Подключение по SSH и аутентификация по ключу
- Сгенерируйте SSH-ключ на клиенте:bash
ssh-keygen -t ed25519 -C "student@lab"
- Скопируйте публичный ключ на удалённый сервер:bash
ssh-copy-id user@remote_host_ip
- Подключитесь без пароля:bash
ssh user@remote_host_ip
- Убедитесь, что вход происходит без запроса пароля.
❓ Вопрос: Где хранится публичный ключ на сервере? Почему приватный ключ нельзя передавать?
Задание 2.3: Локальное проброс портов (Local Port Forwarding)
Сценарий: На удалённом сервере запущен веб-сервер на порту 8080
. Вы хотите получить к нему доступ через localhost:9000
.
- Установите
nginx
на сервер и настройте его слушать8080
:bashsudo apt install nginx sudo systemctl start nginx # Настройте nginx на порт 8080 (в конфиге /etc/nginx/sites-available/default)
- Создайте SSH-туннель:bash
ssh -L 9000:localhost:8080 user@remote_host_ip
- Откройте в браузере:
http://localhost:9000
- Убедитесь, что видите страницу сервера.
❓ Вопрос: Что означает
localhost:8080
в контексте удалённого сервера? Что будет, если указать127.0.0.1
вместоlocalhost
?
Задание 2.4: Удалённое проброс портов (Remote Port Forwarding)
Сценарий: На локальной машине запущен веб-сервер (например, Python http.server
), и вы хотите, чтобы коллега на удалённом сервере мог к нему подключиться.
- Запустите локальный сервер:bash
python3 -m http.server 8000
- Создайте удалённый туннель:bash
ssh -R 8888:localhost:8000 user@remote_host_ip
- На удалённом сервере выполните:bash
curl http://localhost:8888
- Убедитесь, что получен ответ от вашего локального сервера.
⚠️ Если не работает: проверьте
GatewayPorts yes
в/etc/ssh/sshd_config
и перезапустите SSH.
❓ Вопрос: Почему по умолчанию удалённые туннели доступны только с
localhost
на сервере?
Задание 2.5: Динамическое проброс портов (SOCKS-прокси)
Сценарий: Вы хотите безопасно просматривать веб-страницы через удалённый сервер, шифруя весь трафик.
- Создайте SOCKS-прокси:bash
ssh -D 1080 user@remote_host_ip
- Настройте браузер (Firefox / Chrome) на использование SOCKS5-прокси:
- Адрес:
127.0.0.1
- Порт:
1080
- Адрес:
- Перейдите на
https://iplocation.net
— убедитесь, что IP-адрес совпадает с IP удалённого сервера. - Отключите прокси и проверьте снова.
❓ Вопрос: В чём разница между
-L
,-R
и-D
? Когда уместно использовать SOCKS-прокси?
Задание 2.6 (дополнительное): Автоматизация SSH через ~/.ssh/config
- Создайте или отредактируйте файл
~/.ssh/config
:confHost myserver HostName 192.168.1.100 User admin Port 22 IdentityFile ~/.ssh/id_ed25519_lab LocalForward 9000 localhost:8080
- Подключитесь сокращённой командой:bash
ssh myserver
- Убедитесь, что туннель поднимается автоматически.
❓ Вопрос: Какие ещё полезные опции можно задать в
~/.ssh/config
? (Например,ServerAliveInterval
,Compression
)
Контрольные вопросы (для самопроверки)
- Как работает NSS при разрешении имён?
- Чем отличается
dig
отnslookup
? - Зачем нужен
systemd-resolved
? - Как работает SSH-туннель? Почему он безопасен?
- В чём разница между локальным и удалённым пробросом портов?
- Почему SSH-ключи безопаснее паролей?
✅ Выполните все задания и ответьте на вопросы.
После завершения вы сможете уверенно настраивать DNS и использовать SSH для безопасного доступа и туннелирования в GNU/Linux.
Готово! Этот блок можно использовать как лабораторную работу или самостоятельную практику для студентов/администраторов.