Unix Куфарче
Този документ е колекция от Unix/Linux/BSD команди и задачи, които са полезни за ИТ работа или напреднали потребитлеи. Това е практически гайд, съдържащ обяснения, които да указват на читателя/ката какво прави.

Unix Куфарче ревизия 11
Последната версия на този документ може да бъде намерена на http://cb.vu/unixtoolbox.xhtml. Заменете .xhtml във връзката с .pdf за PDF версията и с .book.pdf за книжната версия. На дуплекс принтер книжката ще създаде малка книга готова за обвързване. Тази XHTML страница може да бъде конвертирана в хубав PDF документ с CSS3 съвместимо приложение (виж скрипт примера).
Съобщения за грешки и коментари са добре дошли - c@cb.vu Colin Barschel.
Фон: Бял Черен

Система

Хардуер | Стастики | Потребители | Граници | Нива на работа | root парола | Компилиране на ядрото

Зареждане на ядрото и информация за системата
# uname -a                           # Дава версията на ядрото (и BSD версията)
# cat /etc/SuSE-release              # Дава версията на SuSE
# cat /etc/debian_version            # Дава Debian версията
Използвай /etc/DISTR-release с DISTR= lsb (Ubuntu), redhat, gentoo, mandrake, sun (Solaris), и т.н.
# uptime                             # Показва колко време системата е работила + зареждане
# hostname                           # име на хоста на системата
# hostname -i                        # Показва IP адреса на системата.
# man hier                           # Описание на йерархията на файловата система
# last reboot                        # Показва история на рестартиранията на системата

Информация за хардуера

Хардуер открит от ядрото
# dmesg                              # Открит хардуер и съобщения при буут
# lsdev                              # информация за инсталиран хардуер
# dd if=/dev/mem bs=1k skip=768 count=256 2>/dev/null | strings -n 8 # Чете BIOS

Линукс

# cat /proc/cpuinfo                  # Модел на процесора
# cat /proc/meminfo                  # Хардуерна памет
# grep MemTotal /proc/meminfo        # Показва физическата памет
# watch -n1 'cat /proc/interrupts'   # Следи постоянно за променливи прекъсвания
# free -m                            # Използвана и свободна памет (-m за MB)
# cat /proc/devices                  # Конфигурирани устройства
# lspci -tv                          # Показва PCI устройства
# lsusb -tv                          # Показва USB устройства
# lshal                              # Показва списък от всички устройства и техните настройки
# dmidecode                          # Показва DMI/SMBIOS: хардуер информация от BIOS

FreeBSD

# sysctl hw.model                    # Модел на процесора
# sysctl hw                          # Дава пълна информация за хардуера
# sysctl vm                          # Използвана памет
# dmesg | grep "real mem"            # Хардуерна памет
# sysctl -a | grep mem               # Памет на настройките на ядрото и информация
# sysctl dev                         # Конфигурирани устройства
# pciconf -l -cv                     # Показва PCI устройства
# usbdevs -v                         # Показва USB устройства
# atacontrol list                    # Показва ATA устройства

Зареждане, статистики и съобщения

Следващите команди са полезни за да откриете какво се случва в системата.
# top                                # Показва и обновява топ процесите на процесора
# mpstat 1                           # Показва статистики свързани с процесори
# vmstat 2                           # Показва статистики на виртуалната памет
# iostat 2                           # Показва I/O статистики (2-секундни интервали)
# systat -vmstat 1                   # BSD обобщение на системните статистики (1-секунден интервал)
# systat -tcp 1                      # BSD tcp връзки (пробрай също -ip)
# systat -netstat 1                  # BSD активни мрежови връзки
# systat -ifstat 1                   # BSD мрежови трафик през активни интерфейси
# systat -iostat 1                   # BSD CPU and and disk throughput
# tail -n 500 /var/log/messages      # Последните 500 съобщения на ядро/сислог
# tail /var/log/warn                 # Системни предупрежения виж syslog.conf

Потребители

# id                                 # Показва активното потребителско id с име и група
# last                               # Показва последните влизания в системата
# who                                # Показва кой е влязъл в системта
# groupadd admin                     # Добавя група "admin" и потребител colin (Linux/Solaris)
# useradd -c "Colin Barschel" -g admin -m colin
# userdel colin                      # Изтрива потребител colin (Linux/Solaris)
# adduser joe                        # FreeBSD добавя потребител joe (interactive)
# rmuser joe                         # FreeBSD изтрива потебител joe (interactive)
# pw groupadd admin                  # Използва pw в FreeBSD
# pw groupmod admin -m newmember     # Добавя нов член в група
# pw useradd colin -c "Colin Barschel" -g admin -m -s /bin/tcsh 
# pw userdel colin; pw groupdel admin
Криптирани пароли са записани в /etc/shadow за Linux и Solaris и /etc/master.passwd за FreeBSD. Ако master.passwd е променен ръчно (да речем заради изтриване на парола), стартирайте # pwd_mkdb -p master.passwd за пренареждане на базата данни.

За да изключите временно влизането в цялата система (за всички потребител без root) използвайте nologin. Съобещението ще бъде показано в nologin.
# echo "Sorry no login now" > /etc/nologin       # (Linux)
# echo "Sorry no login now" > /var/run/nologin   # (FreeBSD)

Граници

Някои приложения изискват по-високи граници за отваряне на файлове и гнезда (като прокси уеб сървър, база данни). Границите по подразбиране обикновено са твърде ниски.

Линукс

На шел/скрипт

Границите на шела се управляват от ulimit. Статуса се проверява с ulimit -a. На пример, за да промените границата за отваряне на файлове от 1024 до 10240 изпълнете:
# ulimit -n 10240                    # Това е валидно само в шела
ulimit командата може да се използва в скрипт, за да промени границите само за скрипта.

На потребител/процес

Влезли потребители и програми могат да бъдат конфигурирани в /etc/security/limits.conf. На пример:
# cat /etc/security/limits.conf
*   hard    nproc   250              # Ограничава потребителските процеси
asterisk hard nofile 409600          # Ограничава програмите в отварянето на файлове

За цялата система

Ограничения на ядрото се слагат със sysctl. Постоянни ограничения са записани в /etc/sysctl.conf.
# sysctl -a                          # Показва всички системни ограниченияView all system limits
# sysctl fs.file-max                 # Показва максималното ограничение за отваряне на файлове
# sysctl fs.file-max=102400          # Променя максималното ограничение за отваряне на фйалове
# cat /etc/sysctl.conf
fs.file-max=102400                   # Постоянен запис в sysctl.conf
# cat /proc/sys/fs/file-nr           # Колко описания на файлове се използват

FreeBSD

На шел/скрипт

Използвайте командата limits в csh или tcsh, или както в Linux, изполвайте ulimit в sh или bash шел.

На потребител/процес

Ограниченията по подразбиране при влизане са записани в /etc/login.conf. Неограничената стойност е все още ограничена от системната максимална стойност.

За цялата система

Ограниченията на ядрото също се слагат със sysctl. Постоянни връзки са записани в /etc/sysctl.conf или /boot/loader.conf. Синтаксисът е същият като при Linux но ключовете са различни.
# sysctl -a                          # Показва всички системни ограничения
# sysctl kern.maxfiles=XXXX          # Максимален брой на файловите описания
kern.ipc.nmbclusters=32768           # Постоянна връзка в /etc/sysctl.conf
kern.maxfiles=65536                  # Типични стойности за Squid
kern.maxfilesperproc=32768
kern.ipc.somaxconn=8192              # TCP опашка. По-добре за apache/sendmail
# sysctl kern.openfiles              # Колко файлови описания се използват
# sysctl kern.ipc.numopensockets     # Колко отворени гнезда се използват
Виж FreeBSD handbook Chapter 11 за подробности.

Solaris

Следващите стойности в /etc/system ще увеличат максималните файлови описания на процес:
set rlim_fd_max = 4096               # Твърда граница на файлово описания за един процес
set rlim_fd_cur = 1024               # Мека граница на файлово описания за един процес

Нива на работа

Linux

Веднъж заредено, ядрото стартира init, който после стартира rc, който пък стартира всички скриптове принадлежащи към нивото на работа. Скриптовете са записани в /etc/init.d и имат връзки в /etc/rc.d/rcN.d с N номера на нивото на работа.
Нивото на зареждане по подразбиране е конфигурирано в /etc/inittab. Обикновено е 3 или 5:
# grep default: /etc/inittab                                         
id:3:initdefault:
Актуалното ниво на зареждане (списъкът е показан отдолу) може да бъде променен с init. На пример, за да го промените от 3 на 5:
# init 5                             # Въвежда ниво на работа 5
Използвайте chkconfig, за да конфигурирате програми, които стартират при зареждане в ниво на работа.
# chkconfig --list                   # Покажи всички init скриптове
# chkconfig --list sshd              # Рапортира статуса на sshd
# chkconfig sshd --level 35 on       # Конфигурира sshd за нива 3 и 5
# chkconfig sshd off                 # Забрани sshd за всички нива на работа
Дебиан и дебиан-базираните дистрибуции като Убунту и Кнопикс използват командата update-rc.d за да контролират скриптовете за нива на работа. По подразбиране е да започне в 2,3,4 и 5 и да изключи в 0,1 и 6.
# update-rc.d sshd defaults          # Активира sshd със стандартните нива на работа
# update-rc.d sshd start 20 2 3 4 5 . stop 20 0 1 6 .  # С определени аргументи
# update-rc.d -f sshd remove         # Забранява sshd за всички нива на зареждане
# shutdown -h now (or # poweroff)    # Изключва и задържа системата

FreeBSD

BSD обръщенията при пускане са различават от SysV, там няма нива на работа. Последното положение при пускане (отделен потребител, с или без X) е конфигурирано в/etc/ttys. Всички ОС скриптове се намират в /etc/rc.d/ и в /usr/local/etc/rc.d/ за трети приложения. Активирането на услуга е конфигурирано в /etc/rc.conf и /etc/rc.conf.local. Поведението по подразбиране е конфигурирано в /etc/defaults/rc.conf. Скриптовете отгоравят поне на старт|стоп|статус.
# /etc/rc.d/sshd status
sshd is running as pid 552.
# shutdown now                       # Премини в потребителски режим
# exit                               # Премини в многопотребителски режим
# shutdown -p now                    # Изключи и задръж системата
# shutdown -r now                    # Рестартирай
Процесът init може също да бъде достигнат от следните нива. Например # init 6 за рестарт.

Промени root паролата

Linux метод 1

При зареждането на системата (lilo или grub), въведете следната опция на стартиране:
init=/bin/sh
Ядрото ще прикачи root дяла и init ще стартира борн-шела вместо rc в нивото на зареждане. Използвайте командата passwd в конзолата, за да промените паролата и после рестартирайте. Забравете потребителския режим, защото паролата ви трябва тук.
Ако след рестарт, root дяла е прикачен само за четене, го прикачете отново rw:
# mount -o remount,rw /
# passwd                             # или изтрийте root паролата (/etc/shadow)
# sync; mount -o remount,ro /        # синхронизира преди повторно прикачване само за четене
# reboot

FreeBSD и Linux метод 2

FreeBSD няма да ви позовли да се измъкнете само с прост init трик. Решението е да прикачите root дяла от друга ОС (като спасителното CD) и да промените паролата на диска.
# mount -o rw /dev/ad4s3a /mnt
# chroot /mnt                        # chroot в /mnt
# passwd
# reboot
Като алтернатива във FreeBSD, стартирайте потребителски режим, монтирайте отново / rw и използвайте passwd.
# mount -u /; mount -a               # ще прикачи / rw
# passwd
# reboot

Модули на ядрото

Linux

# lsmod                              # Показва всички модули заредени в ядрото
# modprobe isdn                      # За зареждане на модул (тук isdn)

FreeBSD

# kldstat                            # Показва всички модули заредени в ядрото
# kldload crypto                     # За зареждане на модул (тук crypto)

Компилиране на ядрото

Linux

# cd /usr/src/linux
# make mrproper                      # Изкчиства всичко, включително конфигурационни файлове
# make oldconfig                     # Създава нов конфигурационен файл от настоящото ядро
# make menuconfig                    # или xconfig (Qt), или gconfig (GTK)
# make                               # Създава компресирана снимка на ядрото
# make modules                       # Компилира модулите
# make modules_install               # Инсталира модулите
# make install                       # Инсталира ядрото
# reboot

FreeBSD

За да модифицирате и препостроите ядрото копирайте общия конфигурационен файл с ново име и го редактирайте при нужда. Всъщност е възможно и да промените файла GENERIC директно.
# cd /usr/src/sys/i386/conf/
# cp GENERIC MYKERNEL
# cd /usr/src
# make buildkernel KERNCONF=MYKERNEL
# make installkernel KERNCONF=MYKERNEL
За да построите отново цялата ОС:
# make buildworld                    # Построява цялата ОС, но без ядрото
# make buildkernel                   # Използва KERNCONF както горе ако е подходящо
# make installkernel
# reboot
# mergemaster -p                     # Сравнява само файлове познати като крайно необходими
# make installworld
# mergemaster                        # Подновява цялата конфигурация и други файлове
# reboot
За малки промени в изхода, понякога е достатъчна и кратката версия:
# make kernel world                  # Компилира и инсталира и двете - ядро и ОС
# mergemaster
# reboot

Процеси

Показване | Приоритет | Фон/преден план | Топ | Kill

Показване на ПОУ (PID = Обозначаващ указател за процес)

Всеки процес има уникален номер, ПОУ-то. Списък на всички работещи процеси се изкарва с ps.
# ps -auxefw                         # Extensive list of all running process
Обаче по-типично е използването с pipe или с pgrep:
# ps axww | grep cron
  586  ??  Is     0:01.48 /usr/sbin/cron -s
# pgrep -l sshd                      # Намира ПОУ на процес по (част от) име
# fuser -va 22/tcp                   # Показва процесите, ползващи порт 22
# fuser -va /home                    # Показва процеси използващи достъп до /home дяла
# strace df                          # Проследява системни обаждания и сигнали
# truss df                           # Същото като горното на FreeBSD/Solaris/Unixware
# history | tail -50                 # Показва последните 50 използвани команди

Приоритет

Променя приоритета на работещ процес с renice. Негативни числа имат по-висок приоритет, най-малкото е -20 и "nice" има позитивни стойности.
# renice -5 586                      # По-силен приоритет
586: old priority 0, new priority -5
Стартиране на процес с различен приоритет с nice. Позитивно е "nice" или слабо, негативно е силно засенчващ приоритет. Уверете се, дали се изполва /usr/bin/nice или вградения в шела (проверка с # which nice).
# nice -n -5 top                     # Силен приоритет (/usr/bin/nice)
# nice -n 5 top                      # Слаб приеоритет (/usr/bin/nice)
# nice +5 top                        # tcsh вграден nice (същото като горе!)

Фон/Преден План

Когато процес е стартиран от шела, той може да бъде преместен на задел план или обратно на преден план със [Ctrl]-[Z] (^Z), bg и fg. На пример стартирайте два процеса във фона, покажете ги с jobs и ги преместете на преден план.
# ping cb.vu > ping.log
^Z                                   # е прекъсната (спряна) с [Ctrl]-[Z] 
# bg                                 # слага във фона и продължава работа
# jobs -l                            # Показва процесите на заден план
[1]  - 36232 Running                       ping cb.vu > ping.log
[2]  + 36233 Suspended (tty output)        top
# fg %2                              # Премества процес 2 на преден план
Използвайте nohup за стартиране на процес, който продължава да работи, когато шел-а бъде затворен (имунитет против прекъсвания).
# nohup ping -i 60 > ping.log &

Топ

Програмата top показва работеща информация за процеси.
# top
Докато top работи натиснете клавиша h за помощ. Полезни ключове са:

Сигнали/Kill

Прекъсване или изпращане на сигнал с kill или killall.
# ping -i 60 cb.vu > ping.log &
[1] 4712
# kill -s TERM 4712                  # същото като kill -15 4712
# killall -1 httpd                   # Прекъсва(убува) HUP процеси по точно име
# pkill -9 http                      # Прекъсва TERM процеси по (част от) име
# pkill -TERM -u www                 # Прекъсва TERM процеси принаглежащи на www
# fuser -k -TERM -m /home            # Прекъсва вески процес с достъп до /home (до стойност)
Важни сиганли са:

Файлова система

Информация за диска | Зареждане | Използване на диска | Отворени файлове | Прикачване/Преприкачване | Прикачване на SMB | Прикачване на image | Запис на ISO | Създай image | Диск памет | Производителност на диска

Ограничения

Промяна на ограничения и собственост с chmod и chown. Umask по подразбиране може да бъде променен за всички потребители в /etc/profile за Linux или /etc/login.conf за FreeBSD. umask по подразбиране обикновено е 022. umsak е извадена от 777, така umask 022 се променя в ограничение 755.
1 --x execute                        # Режим 764 = exec/read/write | read/write | read
2 -w- write                          # За:       |--  Owner  --|   |- Group-|   |Oth|
4 r-- read
  ugo=a                              u=потребител, g=група, o=други, a=всеки
# chmod [OPTION] MODE[,MODE] FILE    # MODE е във формата [ugoa]*([-+=]([rwxXst]))
# chmod 640 /var/log/maillog         # Ограничава лог-а на -rw-r-----
# chmod u=rw,g=r,o= /var/log/maillog # Същото като горе
# chmod -R o-r /home/*               # Рекурсивно премахва четенето за всички потребители
# chmod u+s /path/to/prog            # Слага SUID бит на изпълними (трябва да знаете какво правите!)
# find / -perm -u+s -print           # Открива всички програми със SUID бит
# chown user:group /path/to/file     # Променя потребителската и груповата собственост над файл
# chgrp group /path/to/file          # Променя собствеността на файл за групата

Информация за диск

# diskinfo -v /dev/ad2               # Информация за диск (сектор/размер) FreeBSD
# hdparm -I /dev/sda                 # Информация за IDE/ATA диск (Linux)
# fdisk /dev/ad2                     # Показва и манипулира таблицата на дяла (partition table)
# smartctl -a /dev/ad2               # Показва SMART информацията на диска

Зареждане

FreeBSD

За да заредите старо ядро, ако новото не се зарежда, спрете зареждането по време на отброяването.
# unload
# load kernel.old
# boot

Системни точки на прикачване/Използване на диска

# mount | column -t                  # Показва прикаченитеите файлови системи в системата
# df                                 # показва свободното място на диска и прикачените устройства
# cat /proc/partitions               # Показва всички регистрирани дялове (Linux)

Използване на диска

# du -sh *                           # Размер на директориите като списък
# du -csh                            # Общ размер на директорията за настоящата директория (тази, в която се намирате)
# du -ks * | sort -n -r              # Сортира всичко по размер в килобайти
# ls -lSr                            # Показва файлове, най-големия последен

Кой кои файлове е отворил

Това е полезно за откриване на това - кой файл блокира дял, която трябва да бъде откачен и дава типична грешка за:
# umount /home/
umount: unmount of /home             # umount е невъзможен, защото файл заключва home
   failed: Device busy

FreeBSD и повечето Unixes

# fstat -f /home                     # за точка на прикачане
# fstat -p PID                       # за приложение с PID
# fstat -u user                      # за потребителско име
Открива отворен лог-файл (или отворени файлове), да речем за Xorg:
# ps ax | grep Xorg | awk '{print $1}'
1252
# fstat -p 1252
USER     CMD          PID   FD MOUNT      INUM MODE         SZ|DV R/W
root     Xorg        1252 root /             2 drwxr-xr-x     512  r
root     Xorg        1252 text /usr     216016 -rws--x--x  1679848 r
root     Xorg        1252    0 /var     212042 -rw-r--r--   56987  w
Файлът с 212042 е единственият файл във /var:
# find -x /var -inum 212042
/var/log/Xorg.0.log

Linux

Открива отворени файлове в точка на прикачване с fuser или lsof:
# fuser -m /home                     # Показва процеси с достъп до /home
# lsof /home
COMMAND   PID    USER   FD   TYPE DEVICE    SIZE     NODE NAME
tcsh    29029 eedcoba  cwd    DIR   0,18   12288  1048587 /home/eedcoba (guam:/home)
lsof    29140 eedcoba  cwd    DIR   0,18   12288  1048587 /home/eedcoba (guam:/home)
Относно приложение:
ps ax | grep Xorg | awk '{print $1}'
3324
# lsof -p 3324
COMMAND   PID    USER   FD   TYPE DEVICE    SIZE    NODE NAME
Xorg    3324 root    0w   REG        8,6   56296      12492 /var/log/Xorg.0.log
Относно единичен файл:
# lsof /var/log/Xorg.0.log
COMMAND  PID USER   FD   TYPE DEVICE  SIZE  NODE NAME
Xorg    3324 root    0w   REG    8,6 56296 12492 /var/log/Xorg.0.log

Прикачване/преприкачване на файлова система

На пример cdrom. Ако е в списъка /etc/fstab:
# mount /cdrom
Или намира устройство в /dev/ или с dmesg

FreeBSD

# mount -v -t cd9660 /dev/cd0c /mnt  # cd-устройство
# mount_cd9660 /dev/wcd0c /cdrom     # друг метод
# mount -v -t msdos /dev/fd0c /mnt   # флопи
Декларирано в /etc/fstab:
# Device                Mountpoint      FStype  Options         Dump    Pass#
/dev/acd0               /cdrom          cd9660  ro,noauto       0       0
За да позволите на потребителите да го правят:
# sysctl vfs.usermount=1  # Или добавете реда "vfs.usermount=1" в /etc/sysctl.conf

Linux

# mount -t auto /dev/cdrom /mnt/cdrom   # типична команда за прикачване на cdrom
# mount /dev/hdc -t iso9660 -r /cdrom   # типично IDE
# mount /dev/sdc0 -t iso9660 -r /cdrom  # типично SCSI
Декларирано в /etc/fstab:
/dev/cdrom   /media/cdrom  subfs noauto,fs=cdfss,ro,procuid,nosuid,nodev,exec 0 0

Прикачване на FreeBSD дял с Linux

Намерете номера на дяла съдържан във fdisk, това обикновено е root дяла, но може също да бъде и на друг BSD дял. Ако FreeBSD има много дялове, това са онези недекларирани във fdisk таблицата, но видими в /dev/sda* или /dev/hda*.
# fdisk /dev/sda                     # Намира FreeBSD дяла
/dev/sda3   *        5357        7905    20474842+  a5  FreeBSD
# mount -t ufs -o ufstype=ufs2,ro /dev/sda3 /mnt
/dev/sda10 = /tmp; /dev/sda11 /usr   # Другите дялове

Преприкачане

Преприкачване на устройство без да бъде откачвано. необходимо за fsck например:
# mount -o remount,ro /              # Linux
# mount -o ro /                      # FreeBSD
Копиране на сурови (неформатирани/необработени) данни от компакт диск в iso дисков образ:
# dd if=/dev/cd0c of=file.iso

Прикачване на SMB споделена част

Да предположим, че искаме достъп до споделен SMB дял myshare на компютър или smb-сървър, адресът, както е въведен до Windows компютъра е \\smbserver\myshare\. Ние прикачваме в /mnt/smbshare. Забележка> cifs изисква IP или DNS име, не Windows име.

Linux

# smbclient -U user -I 192.168.16.229 -L //smbshare/    # Показва споделените дялове
# mount -t smbfs -o username=winuser //smbserver/myshare /mnt/smbshare
# mount -t cifs -o username=winuser,password=winpwd //192.168.16.229/myshare /mnt/share
Допълнително с пакета mount.cifs е възможно да запишем акредитивите във файл, на пример /home/user/.smb:
username=winuser
password=winpwd
Добавяне на прикачване както следва:
# mount -t cifs -o credentials=/home/user/.smb //192.168.16.229/myshare /mnt/smbshare

FreeBSD

Използвайте -I, за да зададете IP (или DNS име); smbserver е Windows името.
# smbutil view -I 192.168.16.229 //winuser@smbserver    # Показва споделените дялове
# mount_smbfs -I 192.168.16.229 //winuser@smbserver/myshare /mnt/smbshare

Прикачване на дисков образ

Linux loop-back

# mount -t iso9660 -o loop file.iso /mnt                # Прикачване на CD образ
# mount -t ext3 -o loop file.img /mnt                   # Прикачване на образ с ext3 fs

FreeBSD

С памет-устройство (изпълнете # kldload md.ko ако е необходимо):
# mdconfig -a -t vnode -f file.iso -u 0
# mount -t cd9660 /dev/md0 /mnt
# umount /mnt; mdconfig -d -u 0                         # Изчиства md устройството
Или с виртуален възел:
# vnconfig /dev/vn0c file.iso; mount -t cd9660 /dev/vn0c /mnt
# umount /mnt; vnconfig -u /dev/vn0c                    # Изчиства vn устройството

Solaris и FreeBSD

с loop-back файлов интерфейс или lofi:
# lofiadm -a file.iso
# mount -F hsfs -o ro /dev/lofi/1 /mnt
# umount /mnt; lofiadm -d /dev/lofi/1                   # Изчиства lofi устройство

Създаване и записване на ISO образ

Това ще копира компакт диск или DVD сектор по сектор. Без conv=notrunc, образът ще бъде по-малък ако има по-малко съдържание на диска. Виж по-долу и dd примерите.
# dd if=/dev/hdc of=/tmp/mycd.iso bs=2048 conv=notrunc
Използвайте mkisofs за създаване на CD/DVD образ от файлове в директория. За да преодолеете ограниченията за имена на файловете: -r разрешава Rock Ridge разширения обичайни за UNIX системи, -J разрешава Joliet разширения използвани от Майкрософтски системи. -L разрешава ISO9660 имена на файловете да започват с период.
# mkisofs -J -L -r -V TITLE -o imagefile.iso /path/to/dir
На FreeBSD, mkisofs е открит в портовете в sysutils/cdrtools.

Записване на CD/DVD ISO образ

FreeBSD

FreeBSD не разрешава DMA на ATAPI устройства по подразбиране. DMA е разрешен с командата sysctl и аргументите по-долу, или с /boot/loader.conf със следните въвеждания:
hw.ata.ata_dma="1"
hw.ata.atapi_dma="1"
Използвайте burncd с ATAPI устройство (burncd е част от основната система) и cdrecord (в sysutils/cdrtools) със SCSI устройство.
# burncd -f /dev/acd0 data imagefile.iso fixate      # За ATAPI устройство
# cdrecord -scanbus                  # За откриване на записващото устройство (като 1,0,0)
# cdrecord dev=1,0,0 imagefile.iso

Linux

Също използвайте cdrecord на Linux както е описано по-горе. Допълнително е възможно да използвате чистия ATAPI интерфейс, който се намира с:
# cdrecord dev=ATAPI -scanbus
И записване на CD/DVD както по-горе.

Конвертиране на Nero .nrg файл в .iso

Nero просто добавя 300Kb header към нормалния iso образ. Това може да бъде уредено с dd.
# dd bs=1k if=imagefile.nrg of=imagefile.iso skip=300

Конвертиране на bin/cue образ в .iso

Малката bchunk програмаhttp://freshmeat.net/projects/bchunk/ може да направи това. Тя е във FreeBSD портовете в sysutils/bchunk.
# bchunk imagefile.bin imagefile.cue imagefile.iso

Създаване ан файлов-базиран образ

На пример дял от 1GB използвайки файла /usr/vdisk.img.

FreeBSD

# dd if=/dev/random of=/usr/vdisk.img bs=1K count=1M
# mdconfig -a -t vnode -f /usr/vdisk.img -u 1         # Създава устройство /dev/md1
# bsdlabel -w /dev/md1
# newfs /dev/md1c
# mount /dev/md1c /mnt
# umount /mnt; mdconfig -d -u 1; rm /usr/vdisk.img    # Почиства md устройството

Linux

# dd if=/dev/zero of=/usr/vdisk.img bs=1024k count=1024
# mkfs.ext3 /usr/vdisk.img
# mount -o loop /usr/vdisk.img /mnt
# umount /mnt; rm /usr/vdisk.img                      # Почистване

Linux с losetup

/dev/zero е много по-бърз от urandom, но по-малко сигурен за криптиране.
# dd if=/dev/urandom of=/usr/vdisk.img bs=1024k count=1024
# losetup /dev/loop0 /usr/vdisk.img                   # Създава и асоциира /dev/loop0
# mkfs.ext3 /dev/loop0
# mount /dev/loop0 /mnt
# losetup -a                                          # Проверява използваните серии (loops)
# umount /mnt
# losetup -d /dev/loop0                               # Отделяне
# rm /usr/vdisk.img

Създаване на memory файлова система

Memory-базирана файлова система е много бърза за тежки IO програми. Как да създадете 64 MB дял прикачен към /memdisk:

FreeBSD

# mount_mfs -o rw -s 64M md /memdisk
# umount /memdisk; mdconfig -d -u 0                   # Почиства md устройството
md     /memdisk     mfs     rw,-s64M    0   0         # /etc/fstab въвеждане

Linux

# mount -t tmpfs -osize=64m tmpfs /memdisk

Диск производителностDisk performance

Четене и записване на 1 GB файл на дял ad4s3c (/home)
# time dd if=/dev/ad4s3c of=/dev/null bs=1024k count=1000
# time dd if=/dev/zero bs=1024k count=1000 of=/home/1Gb.file
# hdparm -tT /dev/hda      # Само за Linux

Мрежа

Рутиране | Допълнително IP | Промяна на MAC | Портове | Firewall | IP Препращане | NAT | DNS | DHCP | Трафик | QoS | NIS

Откриване на проблеми(Виж също Анализ на трафика)

# mii-diag eth0             # Покажи статуса на връзката(Linux)
# ifconfig fxp0             # Проверка на "media" полето в FreeBSD
# arp -a                    # Проверка на рутер (или хост) ARP записа (вс. OS)
# ping cb.vu                # Първото нещо дето пробваме...
# traceroute cb.vu          # Покажи пътя на рутиране до дестинациата
# mii-diag -F 100baseTx-FD eth0  # Форсиране на 100Mbit Full duplex (Linux)
# ifconfig fxp0 media 100baseTX mediaopt full-duplex  # Същото за FreeBSD
# netstat -s                # Системна статистика за всички мрежови протоколи

Рутиране

Показване на рутинг таблицата

# route -n                 # Linux
# netstat -rn              # Linux, BSD и UNIX
# route print              # Windows

Добавяне и изтриване на рутиране

FreeBSD

# route add 212.117.0.0/16 192.168.1.1
# route delete 212.117.0.0/16
# route add default 192.168.1.1
Добавяне на перманентно рутиране в /etc/rc.conf
static_routes="myroute"
route_myroute="-net 212.117.0.0/16 192.168.1.1"

Linux

# route add -net 192.168.20.0 netmask 255.255.255.0 gw 192.168.16.254
# ip route add 192.168.20.0/24 via 192.168.16.254       # същото с ip рутиране
# route add -net 192.168.20.0 netmask 255.255.255.0 dev eth0
# route add default gw 192.168.51.254
# ip route add default via 192.168.51.254               # същото с ip рутиране
# route delete -net 192.168.20.0 netmask 255.255.255.0

Windows

# Route add 192.168.50.0 mask 255.255.255.0 192.168.51.253
# Route add 0.0.0.0 mask 0.0.0.0 192.168.51.254
Използвай add -p за перманентно рутиране.

Конфигурация на втори IP адрес

Linux

# ifconfig eth0 192.168.50.254 netmask 255.255.255.0       # Първи IP
# ifconfig eth0:0 192.168.51.254 netmask 255.255.255.0     # Втори IP

FreeBSD

# ifconfig fxp0 inet 192.168.50.254/24                     # Първи IP
# ifconfig fxp0 alias 192.168.51.254 netmask 255.255.255.0 # Втори IP
Перманентно добавяне в /etc/rc.conf
ifconfig_fxp0="inet 192.168.50.254  netmask 255.255.255.0"
ifconfig_fxp0_alias0="192.168.51.254 netmask 255.255.255.0"

Промяна на MAC адрес

# ifconfig eth0 hw ether 00:01:02:03:04:05      # Linux
# ifconfig fxp0 link 00:01:02:03:04:05          # FreeBSD

Използвани портове

Отворени портове за слушане:
# netstat -an | grep LISTEN
# lsof -i                  # Linux списък на всички интернет връзки
# socklist                 # Linux списък на всички отворени гнезда/сокети
# sockstat -4              # FreeBSD списък на приложенията
# netstat -anp --udp --tcp | grep LISTEN        # Linux
# netstat -tup             # Списък на активните връзки от/към системата (Linux)
# netstat -tupl            # Списък на слушащите портове (Linux)
# netstat -ano             # Windows

Защитна стена

Проверка за работеща защитна стена (само за типична конфигурация):

Linux

# iptables -L -n -v                  # Статус
Отваране на iptables защитна стена
# iptables -Z                        # Нулиране на пакетите и байтовите броячи във всички правила
# iptables -F                        # Нулиране на всички правила
# iptables -X                        # Изтриване на всички правила
# iptables -P INPUT       ACCEPT     # Отваряне на всичко
# iptables -P FORWARD     ACCEPT
# iptables -P OUTPUT      ACCEPT

FreeBSD

# ipfw show                          # Статус
# ipfw list 65535                    # ако отговора е "65535 deny ip from any to any" защитната стена е изключена
# sysctl net.inet.ip.fw.enable=0     # Изключване
# sysctl net.inet.ip.fw.enable=1     # Включване

IP Препращане за рутиране

Linux

Проверка и включване на IP препращане с:
# cat /proc/sys/net/ipv4/ip_forward  # Проверка на IP препращане 0=изключено, 1=включено
# echo 1 > /proc/sys/net/ipv4/ip_forward
or edit /etc/sysctl.conf with:
net.ipv4.ip_forward = 1

FreeBSD

Проверка и включване с:
# sysctl net.inet.ip.forwarding      # Проверка на IP препращане 0=изключено, 1=включено
# sysctl net.inet.ip.forwarding=1
# sysctl net.inet.ip.fastforwarding=1	# За посветен рутер или защитна стена
Перманентно добавяне в /etc/rc.conf:
gateway_enable="YES"                 # Поставяне на YES ако хоста ще е gateway.

NAT - Транслация на мрежови адреси

Linux

# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE	# за активиране на NAT
# iptables -t nat -A PREROUTING -p tcp -d 78.31.70.238 --dport 20022 -j DNAT \
--to 192.168.16.44:22           # Препращане на порт 20022 към вътрешен IP порт на ssh
# iptables -t nat -A PREROUTING -p tcp -d 78.31.70.238 --dport 993:995 -j DNAT \
--to 192.168.16.254:993:995     # Препращане на портове в обхвата 993-995
# ip route flush cache
# iptables -L -t nat            # Проверка на NAT статуса
Изтриване на препращането с -D вместо -A.

FreeBSD

# natd -s -m -u -dynamic -f /etc/natd.conf -n fxp0
Or edit /etc/rc.conf with:
firewall_enable="YES"           # Поставяме YES за включване на защитната стена
firewall_type="open"            # Тип защитна стена (виж /etc/rc.firewall)
natd_enable="YES"               # Включване на natd (ако firewall_enable == YES).
natd_interface="tun0"           # Публичен интерфейс или IP адрес за използване.
natd_flags="-s -m -u -dynamic -f /etc/natd.conf"
Препращане на портове:
# cat /etc/natd.conf 
same_ports yes
use_sockets yes
unregistered_only
# redirect_port tcp insideIP:2300-2399 3300-3399  # обхват на портовете
redirect_port udp 192.168.51.103:7777 7777

DNS

В Unix DNS записите са валидни за всички интерфейси и се описват в /etc/resolv.conf. Домейнът, в който хостът трябва да се намира също се описва в този файл. Минималната конфигурация е:
nameserver 78.31.70.238
search sleepyowl.net intern.lab
domain sleepyowl.net
Проверка на името на домейна с:
# hostname -d                        # Същото като dnsdomainname

Windows

Във Windows DNS се конфигурира за интерфейс. За показване конфигурацията на DNS и изтриване на DNS кеша:
# ipconfig /?                        # Помощ
# ipconfig /all                      # Цялата информация вкл. DNS
# ipconfig /flushdns                 # Изтриване на DNS кеша

Препращане на заявки

dig е вашия инструмент за проверка на DNS настройките. Например публичен DNS сървър 213.133.105.2 ns.second-ns.de може да се използва за тест. Вижте от кой сървър клиента получава отговор (упростен отговор).
# dig sleepyowl.net
sleepyowl.net.          600     IN      A       78.31.70.238
;; SERVER: 192.168.51.254#53(192.168.51.254)
Рутерът 192.168.51.254 отговоря и отговорът е A запис. Всеки запис може да бъде извикан и DNS сървърът може да се избере с @:
# dig MX google.com
# dig @127.0.0.1 NS sun.com          # За тест на локалния сървър
# dig @204.97.212.10 NS MX heise.de  # Заявка към външен сървър
# dig AXFR @ns1.xname.org cb.vu      # Получаване на цялата зона(трансфер на зона)
Програмата host също е мощна.
# host -t MX cb.vu                   # Получаване на пощенските MX записи
# host -t NS -T sun.com              # получаване на NS запис през TCP връзка
# host -a sleepyowl.net              # Получаване на всичко

Обратни заявки

Намиране на име по IP адрес (in-addr.arpa.). Може да бъде направено с dig, host и nslookup:
# dig -x 78.31.70.238
# host 78.31.70.238
# nslookup 78.31.70.238

/etc/hosts

Единични хостове могат да се конфигурират в /etc/hosts вместо стартиране на named локално за разрешаване на заявките по имена. Форматът е прост, например:
78.31.70.238   sleepyowl.net   sleepyowl
Приоритетът между hosts и dns заявка, т.е. редът на резолюцията по име, може да се конфигурира в /etc/nsswitch.conf * И * /etc/host.conf. Файлът съществува и във Windows, обикновено в:
C:\WINDOWS\SYSTEM32\DRIVERS\ETC

DHCP

Linux

Някой дистрибуции (SuSE) използват dhcpcd като клиент. Интерфайса по подразбиране е eth0.
# dhcpcd -n eth0           # Предизвиква обновяване
# dhcpcd -k eth0           # освобождаване и изключване
Обхвата с пълната информация се намира в:
/var/lib/dhcpcd/dhcpcd-eth0.info

FreeBSD

FreeBSD (и Debian) използват dhclient. За конфигурация на интерфейс (например bge0) стартирайте:
# dhclient bge0
Обхвата с пълната информация се намира в:
/var/db/dhclient.leases.bge0
Използвайте
/etc/dhclient.conf
за настройка на опциите или поставяне на други опции:
# cat /etc/dhclient.conf
interface "rl0" {
    prepend domain-name-servers 127.0.0.1;
    default domain-name "sleepyowl.net";
    supersede domain-name "sleepyowl.net";
}

Windows

dhcp обхвата може да бъде обновен с ipconfig:
# ipconfig /renew          # обновяване на всички адаптери
# ipconfig /renew LAN      # обновяване на адаптера "LAN"
# ipconfig /release WLAN   # освобождаване на адаптера "WLAN"
Да, добра идея е да си именувате адаптера с просто име!

Анализ на трафика

Bmonhttp://people.suug.ch/~tgr/bmon/ е малък конзолен монитор на лентата и може да показва потока през различните интерфейси.

Сниф/подслушване с tcpdump

# tcpdump -nl -i bge0 not port ssh and src \(192.168.16.121 or 192.168.16.54\)
# tcpdump -l > dump && tail -f dump               # Буфериран изход
# tcpdump -i rl0 -w traffic.rl0                   # Записване на трафика в бинарен файл
# tcpdump -r traffic.rl0                          # Четене от файл (също за ethereal
# tcpdump port 80                                 # Две класически команди
# tcpdump host google.com
# tcpdump -i eth0 -X port \(110 or 143\)          # Проверка дали pop или imap са сигурни
# tcpdump -n -i eth0 icmp                         # Записване само на ping
# tcpdump -i eth0 -s 0 -A port 80 | grep GET      # -s 0 за пълен пакет -A за ASCII
Още важни опции: Във Windows използвайте windump от www.winpcap.org. Използвайте windump -D за списък на интерфейсите.

Сканиране с nmap

Nmaphttp://insecure.org/nmap/ е порт скенер с OS детекция, обикновено е инсталиран в повечето дистрибуции и е достъпен и за Windows. Ако вие не сканирате вашите сървъри, хакерите го правят за вас...
# nmap cb.vu               # сканира всички резервирани TCP портове на хоста
# nmap -sP 192.168.16.0/24 # Показва кой IP е използван от кой хост в 0/24
# nmap -sS -sV -O cb.vu    # Прави невидимо SYN сканиране със версия и OS детекция
PORT      STATE  SERVICE             VERSION
22/tcp    open   ssh                 OpenSSH 3.8.1p1 FreeBSD-20060930 (protocol 2.0)
25/tcp    open   smtp                Sendmail smtpd 8.13.6/8.13.6
80/tcp    open   http                Apache httpd 2.0.59 ((FreeBSD) DAV/2 PHP/4.
[...]
Running: FreeBSD 5.X
Uptime 33.120 days (since Fri Aug 31 11:41:04 2007)

Контрол на трафика (QoS)

Контрола на трафика управлява заявките, политиките, разпределението и други параметри на трафика в мрежа. Следващите примери са за прости практически приложения на Linux и FreeBSD възможностите за по-добро използване на достъпната лента.

Ограничаване на ъплоуда

DSL или кабелните модеми имат дълга опашка за подобрение на производителността на ъплоуд. Обаче запълването на опашката от бързо устройство ( мрежова карта ) драстично ще намали интерактивността. Следователно е полезно да се намали нивото на ъплоуд на устройството, за да се напасне с това на модема, това би подобрило много интерактивността. Настройте на около 90% от максималната модемна (кабелна) скорост.

Linux

За 512 Kbit ъплоуд модем.
# tc qdisc add dev eth0 root tbf rate 480kbit latency 50ms burst 1540
# tc -s qdisc ls dev eth0                         # Статус
# tc qdisc del dev eth0 root                      # Изтриване на опашката
# tc qdisc change dev eth0 root tbf rate 220kbit latency 50ms burst 1540

FreeBSD

FreeBSD използва dummynet трафик оформител, който се конфигурира с ipfw. Използват се потоци за натройка на лимитите на лентата в [K|M]{bit/s|Byte/s}, 0 означава неограничена лента. Използването на същия номер поток ще преконфигурира съществуващия. Например ограничаване на ъплоуд лентата до 500 Kbit.
# kldload dummynet                                # зареждане на модула ако е необходимо
# ipfw pipe 1 config bw 500Kbit/s                 # създаване на поток с ограничена лента
# ipfw add pipe 1 ip from me to any               # отклоняване на пълния ъплоуд към потока

QoS/Качество на услугата

Linux

Приоритезиране на опашката с tc за оптимизация на VoIP. Пълния пример може да се види на voip-info.org или www.howtoforge.com. Предполага се, че VoIP използва udp на портове 10000:11024 и устройство eth0 (може да бъде и ppp0 или so). Следващите команди дефинират QoS в три опашки и принуждават VoIP трафика в опашка 1 с QoS 0x1e (всички битове са вдигнати). Трафика по подразбиране тече в опашка 3 и QoS Minimize-Delay тече в опашка 2.
# tc qdisc add dev eth0 root handle 1: prio priomap 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 0
# tc qdisc add dev eth0 parent 1:1 handle 10: sfq
# tc qdisc add dev eth0 parent 1:2 handle 20: sfq
# tc qdisc add dev eth0 parent 1:3 handle 30: sfq
# tc filter add dev eth0 protocol ip parent 1: prio 1 u32 \
  match ip dport 10000 0x3C00 flowid 1:1          # използва сървърния обхват портове
  match ip dst 123.23.0.1 flowid 1:1              # или/и използва сървърния IP
Статус и премахване с
# tc -s qdisc ls dev eth0                         # статус на опашката
# tc qdisc del dev eth0 root                      # изтриване на всички QoS

Калкулиране на обхвата портове и маска

tc филтъра дефинира обхват портове с порт и маска, които трябва да изчислите. Намерете 2^N края на набора портове, намалете с набора и конвертирайте в HEX. Това е маската. Пример за 10000 -> 11024, набора е 1024.
# 2^13 (8192) < 10000 < 2^14 (16384)              # краят е 2^14 = 16384
# echo "obase=16;(2^14)-1024" | bc                # маската е 0x3C00

FreeBSD

Максималната лента на връзката е 500Kbit/s и дефинираме три опашки с приоритети 100:10:1 за VoIP:ssh:всичко останало.
# ipfw pipe 1 config bw 500Kbit/s 
# ipfw queue 1 config pipe 1 weight 100
# ipfw queue 2 config pipe 1 weight 10
# ipfw queue 3 config pipe 1 weight 1
# ipfw add 10 queue 1 proto udp dst-port 10000-11024
# ipfw add 11 queue 1 proto udp dst-ip 123.23.0.1 # или/и използване на сървърен IP
# ipfw add 20 queue 2 dsp-port ssh
# ipfw add 30 queue 3 from me to any              # всичко останало
Статус и изтриване с
# ipfw list                                       # статус на правилата
# ipfw pipe list                                  # статус на потока
# ipfw flush                                      # изтриване на всички правила освен по подразбиране

NIS Дебъгване

Някой команди които биха работили на добре конфигуриран NIS клиент:
# ypwhich                  # показва името на NIS към който има връзка
# domainname               # NIS домейн името по конфигурация
# ypcat group              # показва групата от NIS сървъра
# cd /var/yp && make       # Построява наново yp базата данни
Работи ли ypbind?
# ps auxww | grep ypbind
/usr/sbin/ypbind -s -m -S servername1,servername2	# FreeBSD
/usr/sbin/ypbind           # Linux
# yppoll passwd.byname
Map passwd.byname has order number 1190635041. Mon Sep 24 13:57:21 2007
The master server is servername.domain.net.

Linux

# cat /etc/yp.conf
ypserver servername
domain domain.net broadcast

SSH SCP

Публичен ключ | Отпечатък | SCP | Тунелиране

Разпознаване чрез публичен ключ

Свързване с хост без парола с използване на публичен ключ. Идеята е да се дабави вашия публичен ключ към authorized_keys2 файла на отдалечения хост. За примера нека свържемхост-клиента към хост-сървъра, ключа е генериран на клиента.
# ssh-keygen -t dsa -N ''
# cat ~/.ssh/id_dsa.pub | ssh you@host-server "cat - >> ~/.ssh/authorized_keys2"

Използване на Windows клиент от ssh.com

Некомерсиална версия на ssh.com клиент може да бъде свлена от главния ftp сайт: ftp.ssh.com/pub/ssh/. Ключовете генерирани от ssh.com клиента трябва да бъдат конвертирани за OpenSSH сървър. Това може да бъде направено с ssh-keygen команда. Забележка: Използваме DSA ключ, RSA също е възможен. Ключа няма парола за защита.

Използване на putty за Windows

Puttyhttp://www.chiark.greenend.org.uk/~sgtatham/putty/download.html е прост и с отворен код ssh клиент за Windows.

Проверка на оптечатък

При първи логин, ssh ще пита дали непознат хост чрез неговия отпечатък да бъде записан към познатите хостове. За избягване човек-по-средата (man-in-the-middle) атака администратора на сървъра мое да ви изпрати отпечатъка на сървъра, който да сравните при първи логин. Използвайте ssh-keygen -l да получите отпечатък (на сървъра):
# ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key.pub      # За RSA ключ
2048 61:33:be:9b:ae:6c:36:31:fd:83:98:b7:99:2d:9f:cd /etc/ssh/ssh_host_rsa_key.pub
# ssh-keygen -l -f /etc/ssh/ssh_host_dsa_key.pub      # За DSA ключ (подразбиране)
2048 14:4a:aa:d9:73:25:46:6d:0a:48:35:c7:f4:16:d4:ee /etc/ssh/ssh_host_dsa_key.pub
Сега клиента свързващ се към този сървър може да провери че се свързва към правилния сървър:
# ssh linda
The authenticity of host 'linda (192.168.16.54)' can't be established.
DSA key fingerprint is 14:4a:aa:d9:73:25:46:6d:0a:48:35:c7:f4:16:d4:ee.
Are you sure you want to continue connecting (yes/no)? yes

Сигурен трансфер на файлове

Някой прости команди:
# scp file.txt host-two:/tmp
# scp joe@host-two:/www/*.html /www/tmp
# scp -r joe@host-two:/www /www/tmp
В Konqueror или Midnight Commander е възможно да се достигне отдалечена файлова система с адрес fish://user@gate. Обаче скоростта е много ниска.
Освен това е възможно да се монтира отдалечена дирекория със sshfs, клиент за файлова система, базиран на SCP. Вижте fuse sshfshttp://fuse.sourceforge.net/sshfs.html.

Тунелиране

SSH тунелирането позволява да изпратим или реверсивно изпратим порт през SSH връзка, по този начин защитавайки трафика и достъпвайки портове, блокирани иначе. Това работи само под TCP. Основния начин за изпращане и реверс е (виж същоssh и NAT пример):
# ssh -L localport:desthost:destport user@gate  # хост-дестинация видян от гейта
# ssh -R destport:desthost:localport user@gate  # изпраща вашия локален порт към дестинация
# ssh -X user@gate   # Форсиране на X изпращане
Това ще се свърже към гейта и ще изпрати локален порт към хоста desthost:destport. Забележете desthost е хоста дестинация видян откъм гейта, така че ако връзката е към гейта, то desthost е localhost. Може да се изпрати повече от един порт.

Директно изпращане към гейта

Да кажем искаме достъп до CVS (port 2401) и http (port 80) работещи на гейта. Това е най-прост пример, desthost е следователно localhost, и използваме порт 8080 локално вместо 80 така че няма нужда да сме root. След като ssh сесията е отворена, и двете услуги са достъпни на локалните портове.
# ssh -L 2401:localhost:2401 -L 8080:localhost:80 user@gate

Netbios и отдалечен десктоп изпращане към втори сървър

Да кажем Windows smb сървър е зад гейт и няма ssh. Трабва да имаме достъп до smb споделяне и отдалечен десктоп до сървъра.
# ssh -L 139:smbserver:139 -L 3388:smbserver:3389 user@gate
smb споделянето сега може да бъде достъпено с \\127.0.0.1\, но само ако локалното споделяне е изключено, защотолокалното споделяне слуша на порт 139.
Възможно е да имаме също и локално сподеялне, за това трябва да създадем ново виртуално устройство с нов IP адрес за тунела, smb споделянето ще бъде свързано през този адрес. Нататък локалния RDP (отдалечен десктоп) вече слуша на порт 3389, така че избираме 3388. За примера да използваме виртуален IP 10.1.1.1.
Сега създаваме обратен интерфейс със 10.1.1.1: ТРЯБВАШЕ да рестартирам за да заработи. Сега се свързваме към smb споделянето с \\10.1.1.1 и отдалечен десктоп към 10.1.1.1:3388.

Debug

Ако не работи:

Свързване на два клиента зад NAT

Да допуснем два клиента са зад NAT гейт и клиента cliadmin трябва да се свърже с клиента cliuser (дестинация), и двата могат да влизат в гейта с ssh и работят с Linux със sshd. Нямате нужда от root достъп никъде, докато портовете на гейта са над номер 1024. Използваме 2022 на гейта. След като гейта е използван локално, опцията GatewayPorts не е необходима.
На клиента cliuser (от посока към гейта):
# ssh -R 2022:localhost:22 user@gate            # изпраща клиент 22 към гейта:2022
На клиента cliadmin (от хоста към гейта):
# ssh -L 3022:localhost:2022 admin@gate         # изпраща клиент 3022 към гейта:2022
Сега администратора може да се свърже директно към клиента cliuser със:
# ssh -p 3022 admin@localhost                   # локален:3022 -> гейт:2022 -> клиент:22

Свързване към VNC зад NAT

Да предположим Windows клиент със VNC слушащ на порт 5900 трябва да бъде достъпен зад NAT. На клиента cliwin към гейта:
# ssh -R 15900:localhost:5900 user@gate
На клиента cliadmin (от хоста към гейта):
# ssh -L 5900:localhost:15900 admin@gate
Сега администратора може да се свърже директно към клиентския VNC със:
# vncconnect -display :0 localhost

VPN със SSH

От версия 4.3, OpenSSH може да ползва tun/tap устройство за криптиране на тунел. Това е много подобно на други TLS базирани VPN решения като OpenVPN. Едно предимство на SSH e, че не е необходимо да се инсталира и конфигурира допълнителен софтуер. Допълнително тунелът използва SSH разпознаване, например споделени ключове. Недостатък е капсулирането през TCP, което може да доведе до проблеми при бавна връзка. Също така тунелът разчита на единична ("крехка") TCP връзка. Тази техника е много практична за бързо IP базирано VPN решение. Няма ограничение като при единично TCP порт препращане, всички протоколи слой 3/4 като ICMP, TCP/UDP, и т.н. са препратени през VPN. Във всеки случай са нужни следните опции в sshd_conf файла:
PermitRootLogin yes
PermitTunnel yes

Единична P2P връзка

Тук свързваме два хоста, hclient и hserver със peer to peer тунел. Връзката стартира от hclient към hserver и е под потребител root. Крайните точки на тунела са 10.0.1.1 (сървър) и 10.0.1.2 (клиент) и създаваме устройство tun5 (или друг номер). Процедурата е проста:

Връзка към сървъра

Връзката се стартира на клиента и командите се изпълняват на сървъра.

Сървърът е на Linux

cli># ssh -w5:5 root@hserver
srv># ifconfig tun5 10.0.1.1 netmask 255.255.255.252   # Изпълнено в сървърен шел

Сървърът е на FreeBSD

cli># ssh -w5:5 root@hserver
srv># ifconfig tun5 10.0.1.1 10.0.1.2                  # Изпълнено в сървърен шел

Конфигуриране на клиента

Команди изпълнени на клиента:
cli># ifconfig tun5 10.0.1.2 netmask 255.255.255.252   # Клиента е на Linux
cli># ifconfig tun5 10.0.1.2 10.0.1.1                  # Клиента е на FreeBSD
Двата хоста сега са свързани и могат прозрачно да комуникират със всеки протокол от 3/4 слой, използвайки тунелни IP адреси.

Свързване на две мрежи

В допълнение на p2p настройката по-горе, е много полезно свързването на две частни мрежи с SSH VPN с използване на два гейта. Да допуснем имаме мрежаA 192.168.51.0/24 и мрежаB 192.168.16.0/24. Процедурата е подобна на горната, единствено добавяме рутиране. NAT трябва да е активирано на частен интерфейс само ако гейтовете не са гейтовете по подразбиране за техните мрежи.
192.168.51.0/24 (мрежаA)|гейтA <-> гейтB|192.168.16.0/24 (мрежаB)
Конфигурацията се стартира от гейтА във мрежаА.

Връзка от гейтА до гейтВ

Връзката е започната от гейтА, командите се изпълняват на гейтВ.

гейтB е на Linux

gateA># ssh -w5:5 root@gateB
gateB># ifconfig tun5 10.0.1.1 netmask 255.255.255.252 # Изпълнено в шел-а на гейтB
gateB># route add -net 192.168.51.0 netmask 255.255.255.0 dev tun5
gateB># echo 1 > /proc/sys/net/ipv4/ip_forward        # Само ако гейта не е дефолт
gateB># iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

гейтB е на FreeBSD

gateA># ssh -w5:5 root@gateB                          # Създава tun5 устройство
gateB># ifconfig tun5 10.0.1.1 10.0.1.2               # Изпълнено в шел-а на гейтB
gateB># route add 192.168.51.0/24 10.0.1.2
gateB># sysctl net.inet.ip.forwarding=1               # Само ако гейта не е дефолт
gateB># natd -s -m -u -dynamic -n fxp0                # виж NAT
gateA># sysctl net.inet.ip.fw.enable=1

Конфигуриране на гейтA

Команди, изпълнени на гейтA:

гейтA е на Linux

gateA># ifconfig tun5 10.0.1.2 netmask 255.255.255.252
gateA># route add -net 192.168.16.0 netmask 255.255.255.0 dev tun5
gateA># echo 1 > /proc/sys/net/ipv4/ip_forward
gateA># iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

гейтA е на FreeBSD

gateA># ifconfig tun5 10.0.1.2 10.0.1.1
gateA># route add 192.168.16.0/24 10.0.1.2
gateA># sysctl net.inet.ip.forwarding=1
gateA># natd -s -m -u -dynamic -n fxp0                # виж NAT
gateA># sysctl net.inet.ip.fw.enable=1
Двете частни мрежи сега са прозрачно свързани през SSH VPN. IP препращането и NAT насторйките са необходими само ако гейтовете не са по подразбиране (дефолт). В този случай клиентите не биха знали къде да препратят заявка, заради което трябва да се активира NAT.

RSYNC

Rsync може почти напълно да замени cp и scp, допълнително прекъснатите трансфери ще бъдат ефективно рестартирани. Последната наклонена (/) (и нейното отсъствие) имат различно действие, man страницата е добра... Някой примери:
Копиране на директории със съдържание:
# rsync -a /home/colin/ /backup/colin/
# rsync -a /var/ /var_bak/
# rsync -aR --delete-during /home/user/ /backup/      # използване на относителност (виж надолу)
Като предишното, но по мрежа и с компресия. Rsync използва SSH за транспорт по подразбиране и ще ползва ssh ключ ако има. Използвайте ":" като с SCP. Типично отдалечено копиране:
# rsync -axSRzv /home/user/ user@server:/backup/user/
Изключване на всяка директория tmp във /home/user/ и съхраняване на иерархията на директориите, т.е. отдалечената директория ще има структура /backup/home/user/. Типично се използва за бекъп.
# rsync -azR --exclude /tmp/ /home/user/ user@server:/backup/
Използване на порт 20022 за ssh връзка:
# rsync -az -e 'ssh -p 20022' /home/colin/ user@server:/backup/colin/
Използване на rsync daemon (със "::") е много по-бързо, но не е криптирано с ssh. Мястото на /backup е дефинирано от конфигурацията в /etc/rsyncd.conf. Променливата RSYNC_PASSWORD може да бъде дефинирана за избягване ръчното и въвеждане.
# rsync -axSRz /home/ ruser@hostname::rmodule/backup/
# rsync -axSRz ruser@hostname::rmodule/backup/ /home/    # Копиране назад
Важни опции:

Rsync на Windows

Rsync е достъпен за Windows през cygwin или като самостоятелен пакет от cwrsynchttp://sourceforge.net/projects/sereds. Много е удобно за автоматичен бекъп. Инсталирайте един от двата (не и двата) и добавете пътя до системните променливи на Windows: # Control Panel -> System -> табът Advanced, бутон Environment Variables. Редактирайте "Path" променливата и добавете пълния път до инсталирания rsync, т.е. C:\Program Files\cwRsync\bin или C:\cygwin\bin. По този начинкомандите rsync и ssh ще са достъпни в Windows команден шел.

Идентификация с публичен ключ

Rsync автоматично се тунелира в SSH и следователно използва SSH идентификация на сървъра. Автоматичните бекъпи трябва да избягнат намесата на потребителя, за това SSH идентификация по публичен ключ може да се използва и rsync командата ще работи без парола.
Всички следващи команди се изпълняват във Windows конзола. В конзолата (Start -> Run -> cmd) създайте и изпратете ключа както е описано в SSH, променете "user" и "server" със необходимите стойности. Ако файла authorized_keys2 още не съществува, просто копирайте id_dsa.pub в authorized_keys2 и го изпратете.
# ssh-keygen -t dsa -N ''                   # Създава пбличен и частен ключ
# rsync user@server:.ssh/authorized_keys2 . # Копирайте файла локално от сървъра
# cat id_dsa.pub >> authorized_keys2        # Или използвайте редактор за добавяне на ключа
# rsync authorized_keys2 user@server:.ssh/  # Копиране файловете обратно на сървъра
# del authorized_keys2                      # Изтриване на локалното копие
Сега тест (на един ред):
rsync -rv "/cygdrive/c/Documents and Settings/%USERNAME%/My Documents/" \
'user@server:My\ Documents/'

Автоматичен бекъп

Използвайте batch файл за автоматизиране на бекъпа и го добавете към разсточените задачи (Programs -> Accessories -> System Tools -> Scheduled Tasks). За пример създайте файла backup.bat и заменете user@server.
@ECHO OFF
REM rsync the directory My Documents
SETLOCAL
SET CWRSYNCHOME=C:\PROGRAM FILES\CWRSYNC
SET CYGWIN=nontsec
SET CWOLDPATH=%PATH%
REM uncomment the next line when using cygwin
SET PATH=%CWRSYNCHOME%\BIN;%PATH%
echo Press Control-C to abort
rsync -av "/cygdrive/c/Documents and Settings/%USERNAME%/My Documents/" \
'user@server:My\ Documents/'
pause

SUDO

Sudo е стандартен начин, да дадете на потребителите някои администраторски права, без да издава администраторската парола. Sudo е много полезен в многопотребителска среда с микс от сървър и работни станции. Просто извикайте команда със sudo:
# sudo /etc/init.d/dhcpd restart            # Изпълнява rc скрипта като root
# sudo -u sysadmin whoami                   # Изпълнява cmd като друг потребител user

Конфигурация

Sudo е конфигуриран в /etc/sudoers може да бъде променен само с visudo. Основния синтаксис е (списъците са разделени със запетая):
user hosts = (runas) commands          # В /etc/sudoers
Допълнително тези ключови думи могат да бъдат дефинирани като название (alias), те са наречени User_Alias, Host_Alias, Runas_Alias и Cmnd_Alias. Това е полезно при по-големи конфигурации. Ето един sudoers пример:
# cat /etc/sudoers
# Хост наимернования са subnets или hostnames.
Host_Alias   DMZ     = 212.118.81.40/28
Host_Alias   DESKTOP = work1, work2

# Потребителски наименования са списък от потребители, които могат да имат еднакви права
User_Alias   ADMINS  = colin, luca, admin
User_Alias   DEVEL   = joe, jack, julia
Runas_Alias  DBA     = oracle,pgsql

# Команда наименование дефинира пълния път до списък с команди
Cmnd_Alias   SYSTEM  = /sbin/reboot,/usr/bin/kill,/sbin/halt,/sbin/shutdown,/etc/init.d/
Cmnd_Alias   PW      = /usr/bin/passwd [A-z]*, !/usr/bin/passwd root # Not root pwd!
Cmnd_Alias   DEBUG   = /usr/sbin/tcpdump,/usr/bin/wireshark,/usr/bin/nmap
# Актуалните права
root,ADMINS  ALL     = (ALL) NOPASSWD: ALL    # ADMINS могат да правят всичко с/без парола.
DEVEL        DESKTOP = (ALL) NOPASSWD: ALL    # Разработчици има пълни права на десктопи
DEVEL        DMZ     = (ALL) NOPASSWD: DEBUG  # Разработчици могат да дебъгват DMZ сървърите.

# Потребител sysadmin (системен администратор) може да се бърка в DMZ сървърите с някои команди.
sysadmin     DMZ     = (ALL) NOPASSWD: SYSTEM,PW,DEBUG
sysadmin     ALL,!DMZ = (ALL) NOPASSWD: ALL   # Може да прави всичко извън DMZ.
%dba         ALL     = (DBA) ALL              # Група dba може да стартира като потребител на базата данни.

# Всеки може да прикачва/откача cd-устройство на десктоп машини
ALL          DESKTOP = NOPASSWD: /sbin/mount /cdrom,/sbin/umount /cdrom

Криптиране на файлове

Отделен файл

Криптиране и декриптиране:
# openssl des -salt -in file -out file.des
# openssl des -d -salt -in file.des -out file
Забележете, че файла разбира се може да бъде и tar архив.

tar и критпиране на цяла директория

# tar -cf - directory | openssl des -salt -out directory.tar.des      # Криптира
# openssl des -d -salt -in directory.tar.des | tar -x                 # Декриптира

tar zip и криптиране на цяла директория

# tar -zcf - directory | openssl des -salt -out directory.tar.gz.des  # Криптира
# openssl des -d -salt -in directory.tar.gz.des | tar -xz             # Декриптира

Криптиране на дялове

Linux с LUKS | Linux само dm-crypt | FreeBSD GELI | FBSD само pwd

Има (много) други алтернативни методи за криптиране на дискове, аз показвам само методите, които знам и използвам. Имайте предвид, че сигурността е само тогава добра, когато операционната система не е калена с това. Нарушител може лесно да запише паролата от клавиатурните събития. Още повече данните са свободно достъпни когато дялът е прикрепена и на този етап няма да откаже достъп до нея на нарушител.

Linux

Тези инструкции използват dm-crypt в Linux (device-mapper) удобства налични в 2.6 ядро. В този пример нека криптираме дяла /dev/sdc1, това може да бъде и всеки друг дял от диска или USB, или файлово базиран дял, създаден с losetup. В този случай ще използваме /dev/loop0. Виж файл снимка на дял. Картографът на устройствата използва етикети за идентифициране на дял. Ние използваме sdc1 в този пример, но това може да бъде всеки стринг.

dm-crypt с LUKS

LUKS с dm-crypt има по-добро криптиране и прави възможно да имаме няколко пароли за един и същи дял или лесно да промениме паролата. За да проверил дали LUKS е достъпен, просто напишете # cryptsetup --help, ако не се появи нищо относно LUKS, използвайте следните инструкции Без LUKS. Първо създайте дял ако е необходим: fdisk /dev/sdc.

Създаване на криптиран дял

# dd if=/dev/urandom of=/dev/sdc1          # Незадължително. Само за параноиди (отнема дни)
# cryptsetup -y luksFormat /dev/sdc1       # Това унищожава всякакви данни на sdc1
# cryptsetup luksOpen /dev/sdc1 sdc1
# mkfs.ext3 /dev/mapper/sdc1               # създава ext3 файлова система
# mount -t ext3 /dev/mapper/sdc1 /mnt
# umount /mnt
# cryptsetup luksClose sdc1                # Откача криптирания дял

Прикачване

# cryptsetup luksOpen /dev/sdc1 sdc1
# mount -t ext3 /dev/mapper/sdc1 /mnt

Откачане

# umount /mnt
# cryptsetup luksClose sdc1

dm-crypt без LUKS

# cryptsetup -y create sdc1 /dev/sdc1      # или всеки друг дял като /dev/loop0
# dmsetup ls                               # проверете, ще покаже: sdc1 (254, 0)
# mkfs.ext3 /dev/mapper/sdc1               # Това се прави само първият път!
# mount -t ext3 /dev/mapper/sdc1 /mnt
# umount /mnt/
# cryptsetup remove sdc1                   # Откача криптираният дял
Направете абсолютно същото (без mkfs частта!) за да пре-прикачите дяла. Ако паролата е грешна, mount командата няма да бъде изпълнена. В този случай просто премахнете sdc1 (cryptsetup remove sdc1) и го създайте пак.

FreeBSD

Двата популярни FreeBSD модула за криптиране на дискове са gbde и geli. Аз използвам geli, защото е по-бърз и освен това използва crypto устройства за хардуерно ускорение. Вижe FreeBSD handbook Chapter 18.6http://www.freebsd.org/handbook/disks-encrypting.html за всички детайли. geli модулът трябва да бъде зареден или компилиран в ядрото:
options GEOM_ELI
device crypto                                       # или като module:
# echo 'geom_eli_load="YES"' >> /boot/loader.conf   # или изпълнете: kldload geom_eli

Използване на парола и ключ

Аз използвам тези настройки за типично криптиране на диск, използва парола И ключ за криптиране на главния ключ. Това е, тябват ви двете - паролата и генерирания ключ /root/ad1.key, за да прикачите дялът. Главният ключ е записан в дяла и не е достъпен. Виж по-долу за типично USB или файлово базирана снимка.

Създаване на криптиран дял

# dd if=/dev/random of=/root/ad1.key bs=64 count=1  # този ключ криптира главният ключ
# geli init -s 4096 -K /root/ad1.key /dev/ad1       # -s 8192 също е добре за дискове
# geli attach -k /root/ad1.key /dev/ad1             # ДА направете бекъп на /root/ad1.key
# dd if=/dev/random of=/dev/ad1.eli bs=1m           # Незадължително и отнема повече време
# newfs /dev/ad1.eli                                # Създава файлова система
# mount /dev/ad1.eli /mnt

Прикачване

# geli attach -k /root/ad1.key /dev/ad1
# fsck -ny -t ffs /dev/ad1.eli                      # При съмнение проверете файловата система
# mount /dev/ad1.eli /mnt

Откачане

Процедурата за откачване става автоматично при изключване.
# umount /mnt
# geli detach /dev/ad1.eli

/etc/fstab

Криптираният дял може да бъде конфигуриран, за да бъде прикачен с /etc/fstab. Паролата ще бъде поискане при зареждане. За този пример са необходими следните настройки:
# grep geli /etc/rc.conf
geli_devices="ad1"
geli_ad1_flags="-k /root/ad1.key"
# grep geli /etc/fstab
/dev/ad1.eli         /home/private              ufs             rw      0       0

Използване само на парола

По подходящо е да криптиране USB памет или файлово базирана снимка с парола и без ключ. В този случай не е нобходимо да носите допълнителен файл с ключ наоколо. Процедурата е почти същата като по-горе, просто без ключовия файл. Нека криптираме файлово базирана снимка /cryptedfile от 1 GB.
# dd if=/dev/zero of=/cryptedfile bs=1M count=1000  # 1 GB file
# mdconfig -at vnode -f /cryptedfile
# geli init /dev/md0                                # криптира само с парола
# geli attach /dev/md0
# newfs -U -m 0 /dev/md0.eli
# mount /dev/md0.eli /mnt
# umount /dev/md0.eli
# geli detach md0.eli
Сега е възможно да прикачите тази снимка на друга файлова система само с паролата.
# mdconfig -at vnode -f /cryptedfile
# geli attach /dev/md0
# mount /dev/md0.eli /mnt

SSL Сертификати

Тъй наречените SSL/TLS сертификати са криптографични публични ключове сертификати и се състоят от публичен и личен ключ. Сертификатите се използва за удостоверяване на крайни точки и криптиране на данни. Използват се например на уеб-сър