Настройка FreeBSD


Содержание

Сетевые настройки
Дополнительные настройки
Энергопотребление
Поддержка русского языка в консоли
Настройка ppp для выхода в интернет
Настройка mpd для выхода в интернет
SSH
NTP
FTP
SAMBA
Межсетевой экран pf
Межсетевой экран ipfw
DHCP
Apache HTTP Server и PHP5
MySQL50 и PHP5
Монтирование внешних накопителей пользователем
Запись CD/DVD-дисков
Bluetooth
Почтовый клиент Mutt
Настройки приёма и передачи почты MAIL.RU с шифрованием
X
ICEWM
Обновление портов, исходных текстов ядра и мира
Обновление установленного ПО
Создание и установка ядра и мира
Установка ОС на жёсткий диск с рабочего ПК
Служебные задачи
Литература
Полезные скрипты

Сетевые настройки

  • для настройки имени компьютера в сети (FQDN) добавить в /etc/rc.conf строку (имя_компьютера - имя компьютера, например, mic)

    hostname=имя_компьютера.dummy.ru

    для настройки сетевого интерфейса со статическим или динамическим ip-адресом добавить в /etc/rc.conf строку (имя_устройства - имя устройства для подключения к сети, например, igb0)

    ifconfig_имя_устройства="inet 192.168.1.2 netmask 255.255.255.0"

    или

    ifconfig_имя_устройства="SYNCDHCP"

    при использовании динамического ip-адреса добавить в /etc/dhclient.conf строки (отключение получения dhcp-клиентом адресов DNS-серверов)

    interface "igb0" {
     send host-name "server";
     # this set the expiration time, the renewal (T1) and rebind (T2) times are
     # calculated by the client (1/2 and 7/8 of the lease time)
     supersede dhcp-lease-time 300;
     # don't request option domain-name-servers
     request subnet-mask;
    }
  • если в компьютере несколько сетевых интерфейсов, то каждый из них должен быть настроен и диапазон IP-адресов не пересекался (с учётом маски подсети). Если необходимо пересылать пакеты с одного интерфейса на другой, добавить в /etc/rc.conf строку

    gateway_enable="YES"
  • добавить соответствие IP-адреса имени компьютера в файл /etc/hosts

    ::1                    localhost имя_компьютера.dummy.ru
    127.0.0.1              localhost имя_компьютера.dummy.ru
    192.168.1.2            localhost имя_компьютера.dummy.ru
  • в файл /etc/resolv.conf добавить строки (адреса DNS-серверов)

    search ""
    nameserver 8.8.8.8 #PRIDNS GOOGLE
    nameserver 8.8.4.4 #SECDNS GOOGLE
  • если на сервере используется динамический реальный IP-адрес, для сопоставления текущего IP-адреса сервера заданному DNS-имени создать и настроить на сайте, предоставляющем услугу Dynamic DNS (например, https://www.noip.com), учётную запись, установить порт dns/inadyn, добавить в /etc/rc.conf строку

    inadyn_enable="YES"

    добавить в /usr/local/etc/inadyn.conf строки (имя_пользователя - имя пользователя при регистрации на сайте, пароль - пароль, имя_хоста - имя хоста)

    iface = ng0
    provider no-ip.com {
     username = имя_пользователя
     password = пароль
     hostname = имя_хоста
    }

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

Добавить в /etc/rc.conf

  • для очистки /tmp при запуске

    clear_tmp_enable="YES"
  • для автоматической проверки файловых систем при запуске

    fsck_y_enable="YES"
    background_fsck="NO"
  • для отключения sendmail

    sendmail_enable="NO"
    sendmail_submit_enable="NO"
    sendmail_outbound_enable="NO"
    sendmail_msp_queue_enable="NO"
  • для включения безопасного режима syslogd

    syslogd_flags="-ss"

Для автоматического обновления микрокода процессора при загрузке ПК, установить порты sysutils/x86info и sysutils/devcpu-data (для их работы нужен модуль ядра cpuctl), добавить в файл /boot/loader.conf строки

cpuctl_load="YES"
cpu_microcode_load="YES"
cpu_microcode_name="/boot/firmware/intel-ucode.bin"

Текущую версию микрокода процессора можно определить с помощью команды x86info -a | grep Microcode\ version

Для работы виртуальных терминалов в текстовом режиме вместо графического добавить в файл /boot/loader.conf строку

hw.vga.textmode=1

Для перемещения core-файлов в нужное место, добавить в /etc/sysctl.conf

kern.corefile="/var/tmp/%U.%N.core"

Энергопотребление

Для экономии энергопотребления выполнить

  • включить автозапуск утилиты powerd. Добавить в /etc/rc.conf

    powerd_enable="YES"
  • уменьшить частоту переключения процессов в ядре с 1000 Гц до 100 Гц (если не используется поллинг для сетевых карт). Добавить в /boot/loader.conf

    kern.hz=100

Для мониторинга температуры процессора Intel Core добавить в /boot/loader.conf (нужен модуль ядра coretemp)

coretemp_load="YES"

Температуры всех ядер можно просмотреть командой sysctl -a | grep dev\.cpu\..\.temperature

Поддержка русского языка в консоли

  1. включить в файл /etc/login.conf описание класса пользователей с поддержкой русского языка

    russian|Russian Users Accounts:\
            :hushlogin:\
            :charset=UTF-8:\
            :lang=ru_RU.UTF-8:\
            :tc=default:
  2. выполнить команду cap_mkdb /etc/login.conf

  3. с помощью команды vipw присвоить пользователям описанный класс. Или можно воспользоваться командой pw user mod имя пользователя -L russian. Или можно воспользоваться командой chsh имя пользователя

  4. в файл /etc/rc.conf добавить строки

    keymap="ru.win"

    Теперь нужно выполнить перезагрузку и войти под пользователем, которому присвоен класс russian. Русский язык должен поддерживаться. Переключение языков осуществляется комбинацией клавиш Ctrl+Shift

Подсказка

Для того, чтобы перед запросом имени пользователя и пароля экран очищался, необходимо переопределить класс терминала в файле /etc/gettytab (добавить последовательность очистки экрана)

P|Pc|Pc console:\
        :ht:np:sp#115200:cl=\ec:

Подсказка

Для того, чтобы после входа пользователя не появлялся текст "А знаете ли Вы...", нужно закомментировать строку

[ -x /usr/games/fortune ] && /usr/games/fortune freebsd-tips

в файлах ~/.login и ~/.profile

Настройка ppp для выхода в интернет

  1. если пользоваться USB-модемом GPRS, добавить в файл /boot/loader.conf строку (нужен модуль ядра usb/umodem и необходимый для него usb/ucom)

    umodem_load="YES"

    Если пользоваться USB-модемом CDMA, добавить в файл /boot/loader.conf строку (нужен модуль ядра usb/u3g и необходимый для него usb/ucom)

    u3g_load="YES"

    Тогда после подключения USB-модема будет появляться устройство /dev/cuaU0.0

    Для соединения с USB-модемом сотового телефона (например, для выполнения AT-команд) использовать команду

    cu -l /dev/cuaU0.0
    
  2. создать в каталоге /etc/ppp файлы

    • ppp.conf (имя_устройства - имя устройства, используемого для подключения, например, xl0, имя_пользователя - имя пользователя, пароль - пароль)

      default:
       set log Async CBCP CCP Chat Command Connect Debug DNS Filter HDLC ID0 IPCP LCP LQM Phase Physical Radius Sync TCP/IP Timer TUN Warning Error Alert
       ident user-ppp VERSION (build COMPILATIONDATE)
       
      pppoe_client:
       enable lqr echo
       set lqrperiod 10
       set echoperiod 10
      
       set device PPPoE:имя_устройства:*
       set authname имя_пользователя
       set authkey  пароль
       set dial
       set login
       set ifaddr 0 0
      
      gprs_mts:
       set device /dev/cuaU0.0
       set phone *99***1\#
       set authname mts
       set authkey mts
       set dial "ABORT BUSY ABORT NO\\sCARRIER TIMEOUT 5 \
                  \"\" AT OK-AT-OK ATE1Q0 OK \
                  AT+CGDCONT=1,\\\"IP\\\",\\\"internet.mts.ru\\\" OK \
                  \\dATDT\\T TIMEOUT 60 CONNECT"
       set login
       set ifaddr 0 10.10.10.10
       add! default HISADDR
      
      gprs_bwc:
       set device /dev/cuaU0.0
       set phone *99***1\#
       set authname bwc
       set authkey bwc
       set dial "ABORT BUSY ABORT NO\\sCARRIER TIMEOUT 5 \
                  \"\" AT OK-AT-OK ATE1Q0 OK \
                  AT+CGDCONT=1,\\\"IP\\\",\\\"inet.bwc.ru\\\" OK \
                  \\dATDT\\T TIMEOUT 60 CONNECT"
       set login
       set ifaddr 0 10.6.6.6
       add! default HISADDR
      
      cdma_bwc:
       set device /dev/cuaU0.0
       set phone \#777
       set cd off
       set authname mobile
       set authkey mobile
       set dial "ABORT BUSY ABORT NO\\sCARRIER TIMEOUT 5 \
      	    \"\" AT OK-AT-OK ATZ OK ATE1Q0 OK ATX1 OK \
      	    \\dATDT\\T TIMEOUT 40 CONNECT"
       set login
       set ifaddr 0 0
       add! default HISADDR
    • ppp.linkup

      pppoe_client:
       add! default HISADDR
       !bg /etc/ppp/kommandSoed.sh
    • kommandSoed.sh

      #!/bin/sh
    • ppp.linkdown

      pppoe_client:
       !bg /etc/ppp/kommandOtsoed.sh
    • kommandOtsoed.sh

      #!/bin/sh

    Выполнить для созданных файлов команды

    chmod 600 ppp.conf ppp.linkup ppp.linkdown
    chmod 700 kommandOtsoed.sh kommandSoed.sh
    
  3. добавить строки в файл /etc/rc.conf для автоматического подключения компьютера к интернет при загрузке

    ppp_enable="YES"
    ppp_mode="ddial"
    ppp_profile="pppoe_client"
    ppp_nat="NO"
  4. если подключение к интернет должен выполнять сам пользователь, включить его в группу network

  5. проверить, чтобы файл конфигурации ядра содержал следующие строки

    options         NETGRAPH
    options         NETGRAPH_ETHER
    options         NETGRAPH_PPPOE
    options         NETGRAPH_SOCKET
  6. настроить межсетевой экран с учётом того, что ppp создаёт сетевой интерфейс tun

Настройка mpd для выхода в интернет

  1. установить mpd из порта net/mpd5

  2. создать в каталоге /usr/local/etc/syslog.d файл mpd.conf

    !mpd
    *.* /var/log/mpd.log

    выполнить команды

    touch /var/log/mpd.log
    chmod 644 /var/log/mpd.log
    

    перезапустить syslog одной из команд (в зависимости от используемой оболочки)

    kill -HUP $(cat /var/run/syslog.pid)
    kill -HUP `cat /var/run/syslog.pid`
    

    создать в каталоге /usr/local/etc/newsyslog.conf.d файл mpd.conf

    /var/log/mpd.log 644 7 100 * JC
  3. создать в каталоге /usr/local/etc/mpd5 файлы

    • mpd.conf

      startup:
              set console close
              set web close
      
              set global disable one-shot tcp-wrapper
              log +auth +bund +ccp +chat +console +echo +ecp +frame +fsm +iface +ipcp +ipv6cp +lcp +link +phys +radius +rep
      
      default:
              load pppoe_client
      
      pppoe_client:
              create bundle static B1
              set iface up-script "/usr/local/etc/mpd5/pppoe_out_linkup"
              set iface down-script "/usr/local/etc/mpd5/pppoe_out_linkdown"
              set iface enable tcpmssfix
      
              set ipcp ranges 0.0.0.0/0 0.0.0.0/0
              create link static L1 pppoe
              set link action bundle B1
              set auth authname имя_пользователя
              set auth password пароль
              set link max-redial 0
              set link mtu 1460
              set link keep-alive 10 60
              set pppoe iface имя_устройства
              set pppoe service ""
              open
      
      gprs_bwc:
      	create bundle static B1
      	set iface route default
      	set iface enable tcpmssfix
      	
      	set ipcp ranges 0.0.0.0/0 10.6.6.6
      	create link static L1 modem
      	set link action bundle B1
      	set auth authname bwc
      	set auth password bwc
      	set modem device /dev/cuaU0.0
      	set modem watch -cd
      	set modem script WirelessModemDial
      	set modem var $PHN *99***1#
      	set modem var $APN inet.bwc.ru
      	open
      
      cdma_bwc:
              create bundle static B1
              set iface route default
              set iface enable tcpmssfix
      
              set ipcp ranges 0.0.0.0/0 0.0.0.0/0
              create link static L1 modem
              set link action bundle B1
              set auth authname mobile
              set auth password mobile
              set modem device /dev/cuaU0.0
              set modem watch -cd
              set modem script WirelessModemDial
              set modem var $PHN #777
              set modem var $APN ""
              open
    • mpd.script

      WirelessModemDial:
      	set $ConnectionSpeed ""
      	if $ConnectTimeout == "" set $ConnectTimeout 45
      	if $APN == "" goto InitNOAPN
      	print "AT+CGDCONT=1,\"IP\",\""
      	print $APN
      	print "\"\r\n"
      	match "ERR" InitERR
      	match "OK" InitOK
      	wait 5
      	log "Timeout setting for the APN."
      	failure
      InitERR:
      	log "APN could not be set."
      	failure
      InitNOAPN:
      	log "No APN."
      InitOK:
      	print "ATDT"
      	print $PHN
      	print "\r\n"
      	match "NO CARRIER" DialAbortNoCar
      	match "NO DIAL" DialAbortNoDial
      	match "BUSY" DialAbortBusy
      	match "ERR" DialErrorInit
      	regex "CONNECT *([0-9]*).*$" DialConnect
      	wait $ConnectTimeout
      	log "No response from the modem after dialing."
      	failure
      DialAbortNoCar:
      	log "The remote modem did not answer."
      	failure
      DialAbortNoDial:
      	log "No dialtone."
      	failure
      DialAbortBusy:
      	log "The line was busy."
      	failure
      DialErrorInit:
      	log "Invalid dial init string."
      	failure
      DialConnect:
      	log "Connect."
      	success
      
    • pppoe_out_linkup

      #!/bin/sh
      
      # $0 - script name
      # $1 - if name (ng0...)
      # $2 - proto
      # $3 - local-ip
      # $4 - remote-ip
      # $5 - authname
      # $6 - [ dns1 server-ip ]
      # $7 - [ dns2 server-ip ]
      # $8 - peer-address
      
      # сохранить шлюз по умолчанию в файл
      def_gw=`netstat -rn | awk '$1=="default"{print $2}'`
      echo $def_gw > /tmp/mpd_def_gw
      
      /sbin/route -q delete $4
      /sbin/route -q delete default
      /sbin/route -q add default $4
      
      # для вызова inadyn (смотреть о ppp)
      /etc/ppp/kommandSoed.sh &
      
      exit 0
      
    • pppoe_out_linkdown

      #!/bin/sh
      
      # $0 - script name
      # $1 - if name (ng0...)
      # $2 - proto
      # $3 - local-ip
      # $4 - remote-ip
      # $5 - authname
      # $6 - peer-address
      
      /sbin/route -q delete $4
      /sbin/route -q delete default
      
      # восстановить маршруты по умолчанию и шлюз
      # из rc.conf[.local]
      /etc/rc.d/routing static inet start
      
      # из файла
      def_gw=`cat /tmp/mpd_def_gw`
      rm -f /tmp/mpd_def_gw
      /sbin/route -q add default $def_gw
      
      /etc/ppp/kommandOtsoed.sh &
      
      exit 0
      

    Выполнить для созданных файлов команды

    chmod 600 mpd.conf mpd.script
    chmod 700 pppoe_out_linkdown pppoe_out_linkup
    
  4. добавить в файл /etc/rc.conf

    mpd_enable="YES"
  5. проверить, чтобы файл конфигурации ядра содержал следующие строки

    options         NETGRAPH
    options         NETGRAPH_ETHER
    options         NETGRAPH_IFACE
    options         NETGRAPH_MPPC_ENCRYPTION
    options         NETGRAPH_PPP
    options         NETGRAPH_PPPOE
    options         NETGRAPH_SOCKET
    options         NETGRAPH_TCPMSS
    options         NETGRAPH_TEE
    # для USB-модемов GPRS и CDMA
    options         NETGRAPH_ASYNC
    options         NETGRAPH_TTY
    options         NETGRAPH_VJC

    или были скомпилированы модули ядра netgraph/netgraph, netgraph/ether, netgraph/iface, rc4, netgraph/mppc, netgraph/ppp, netgraph/pppoe, netgraph/socket, netgraph/tcpmss, netgraph/tee

  6. настроить межсетевой экран с учётом того, что mpd создаёт сетевой интерфейс ng (а не tun как ppp)

SSH

Предположим, что сервер и клиент используют FreeBSD. Пользователь клиента cuser подключается к серверу под именем suser. Подключение к серверу разрешено только под именем suser и только со всех IP-адресов вида xxx.xxx.xxx.xx[0-9] и yyy.yyy.yyy.yyy

На клиенте зайти под пользователем cuser и выполнить (нужно ввести парольную фразу для защиты закрытого ключа)

ssh-keygen -t rsa -b 2048

В каталоге ~/.ssh появятся 2 файла - id_rsa (закрытый ключ) и id_rsa.pub (открытый ключ). Файл с открытым ключом id_rsa.pub переместить на сервер в домашний каталог пользователя suser

На сервере выполнить

  1. добавить в файл /etc/rc.conf строки

    sshd_enable="YES"
  2. установить следующие параметры в /etc/ssh/sshd_config

    Port 443
    AllowUsers suser@xxx.xxx.xxx.xx? suser@yyy.yyy.yyy.yyy

    Для отключения неиспользуемых сессий SSH через 45 секунд (если, по умолчанию, ClientAliveCountMax равен 3) задать

    ClientAliveInterval 15

    Для авторизации по ключам должны присутствовать строки

    PubkeyAuthentication yes
    AuthorizedKeysFile .ssh/authorized_keys

    Остальные типы аутентификации (host-based, password, challenge-response) нужно отключить

    HostbasedAuthentication no
    PasswordAuthentication no
    ChallengeResponseAuthentication no

    Для включения возможности привязки к заданному сетевому интерфейсу при обратном перенаправлении TCP-порта (при вызове putty с параметром -R) задать

    GatewayPorts clientspecified
  3. зайти под пользователем suser и выполнить (в файле ~/.ssh/authorized_keys каждый открытый ключ обязательно должен быть размещён в отдельной строке)

    cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
    rm ~/id_rsa.pub
    chmod 600 ~/.ssh/authorized_keys
    

Теперь на клиенте в домашнем каталоге пользователя cuser в файле ~/.ssh/id_rsa хранится закрытый ключ, а на сервере в домашнем каталоге пользователя suser в файле ~/.ssh/authorized_keys - открытый ключ. Для подключения к серверу нужно на клиенте зайти под пользователем cuser и выполнить команду (имя_сервера - имя или IP-адрес сервера)

ssh -p 443 suser@имя_сервера

Когда клиент использует для подключения приложение putty, нужно сконвертировать закрытый ключ id_rsa для использования совместно с putty (запустить утилиту puttygen, выбрать команду "Import key", выбрать файл id_rsa, затем выбрать команду "Save private key" для сохранения файла закрытого ключа). ssh-keygen генерирует закрытый ключ, который не совместим с putty

Подсказка

Для того, чтобы изменения конфигурации SSH-сервера вступили в силу без перезагрузки компьютера, выполнить

/etc/rc.d/sshd reload

Подсказка

Для прерывания ssh-сессий без остановки выполнения команд можно использовать порт sysutils/screen (для отключения от сессии использовать Ctrl+a, затем d, для подключения к существующей сессии использовать команду screen -r, для просмотра списка сессий - команду screen -list, для закрытия сессии нужно подключиться к ней, затем нажать Ctrl+d)

Подсказка

команда для подключения по SSH с помощью putty

putty.exe -ssh -2 -P 443 -C -i файл_ключа -l имя_пользователя имя_сервера

команда для перенаправления соединений к TCP-порту 3340 на локальном хосте на TCP-порт 3389 удалённого хоста с адресом 192.168.2.2 (хост должен быть доступен с сервера). После выполнения команды возможно подключение по RDP с локального хоста на удалённый хост. При подключении с локального хоста нужно указать адрес localhost:3340

putty.exe -ssh -2 -P 443 -N -C -T -i файл_ключа -l имя_пользователя -L 0.0.0.0:3340:192.168.2.2:3389 имя_сервера

команда для перенаправления соединений к TCP-порту 3340 на удалённом хосте (адрес 192.168.2.1 является адресом второго, смотрящего в локальную сеть, интерфейса на сервере) на TCP-порт 3389 локального хоста. После выполнения команды возможно подключение по RDP с удалённого хоста на локальный хост. При подключении с удалённого хоста нужно указать адрес 192.168.2.1:3340

putty.exe -ssh -2 -P 443 -N -C -T -i файл_ключа -l имя_пользователя -R 192.168.2.1:3340:localhost:3389 имя_сервера

команда для копирования файла по SSH с локального хоста на удалённый хост

pscp.exe -P 443 -i файл_ключа полный_путь_к_файлу_на_локальном_хосте имя_пользователя@имя_сервера:полный_путь_ к_ файлу_на_удалённом_хосте

Если "рабочий ПК" сервер, "удалённый ПК" клиент, клиент и сервер связаны через сервер-посредник SSH, то для установки удалённого подключения сервера (рабочий ПК с ОС Windows) к серверу SSH с помощью планировщика заданий нужно

  1. настроить на клиентском ПК задание в планировщике заданий, запускающее командный файл remoteconn.cmd

    rem выполнение задания с правами пользователя "система" (идентификатор "S-1-5-18"), триггер "при запуске"
    rem в свойствах задания нужно отключить:
    rem флаг "запускать только при питании от электросети" на вкладке "условия"
    rem флаг "останавливать задачу, выполняемую дольше" на вкладке "параметры"
    rem
    rem для импорта ветки реестра с настройками соединения putty с именем "RemoteConn" выполнить под пользователем "система" команду regedit /s "файл с расширением reg"
    rem в настройках соединения putty указать:
    rem Session - Host Name
    rem Session - Port ("443")
    rem Connection - Data - Auto-login username (указать имя пользователя)
    rem Connection - Proxy - Proxy type ("HTTP")
    rem Connection - Proxy - Proxy hostname ("localhost")
    rem Connection - Proxy - Port ("3129")
    rem Connection - Proxy - Port - Do DNS name lookup at proxy end ("No")
    rem Connection - SSH - Don't start a shell or command at all
    rem Connection - SSH - Enable compression
    rem Connection - SSH - Auth - Private key file for authentication (указать путь к файлу с закрытым ключом)
    rem Connection - SSH - TTY - Don't allocate a pseudo-terminal
    rem Connection - SSH - Tunnels (добавить тоннель с нужными параметрами)
    rem пример: "L0.0.0.0:3340 192.168.2.2:3389", "R192.168.2.1:3340 localhost:3389"
    rem пример: "Llocalhost:3345 0.0.0.0:3344", "R0.0.0.0:3343 localhost:3389"
    rem
    rem внимание! при первом запуске plink нужно получить hostkey удалённого сервера.
    rem для чего нужно вызвать plink.exe с флагом -v и в выводе команды найти значение параметра "Host key fingerprint is:"
    rem
    @echo off
    
    set log_fajl=%~dp0remoteconn.log
    
    echo %date% %time% > %log_fajl%
    
    rem ждём 5 минут, запускается winfoom
    ping localhost -n 301 > nul
    
    rem запускаем цикл подключения к ssh-серверу
    :BEG
    echo %date% %time% Starting plink >> %log_fajl%
    rem "c:\program files (x86)\putty\plink.exe" -v -batch -hostkey "52:95:7c:aa:1a:b5:84:d1:9c:df:a4:95:ee:b2:d1:e2" RemoteConn
    "c:\program files (x86)\putty\plink.exe" -v -batch -hostkey "32:e7:d1:67:22:39:22:94:33:9c:af:7f:ba:62:e2:65" RemoteConnVDS
    echo %date% %time% Ended with %errorlevel% errorlevel >> %log_fajl%
    
    ping localhost -n 301 > nul
    goto BEG
    
  2. если выход в Интернет с клиентского ПК осуществляется через прокси-сервер типа HTTP и прокси-сервер не поддерживает метод аутентификации basic (а поддерживает методы аутентификации ntlm или kerberos), настроить на клиентском ПК задание в планировщике заданий, запускающее командный файл LaunchWinFoom_user.cmd

    rem выполнение задания с правами пользователя, триггер "при входе в систему"
    rem задание запускает winfoom, программно нажимает кнопку "Start" в окне winfoom, блокирует рабочую станцию
    rem дополнительно необходимо настроить автоматический вход на ПК при включении ПК по статье
    rem https://support.microsoft.com/en-us/help/324737/how-to-turn-on-automatic-logon-in-windows
    rem
    rem putty поддерживает на прокси-сервере типа HTTP метод аутентификации basic
    rem если прокси-сервер использует методы аутентификации ntlm или kerberos, необходимо использовать инструмент winfoom
    rem https://github.com/ecovaci/winfoom
    rem скачать дистрибутив, запустить launchGui.bat, указать:
    rem proxy type (HTTP)
    rem proxy host (DNS-имя прокси-сервера)
    rem proxy port (номер порта для соединения с прокси-сервером)
    rem local proxy port (оставить значение "3129")
    rem use system credentials (установить checkbox)
    rem в меню settings выбрать autostart
    rem затем нажать кнопку "Start", параметры winfoom будут сохранены, при следующем запуске winfoom их не нужно будет указывать
    rem
    rem в настройках соединения putty указать:
    rem Connection - Proxy - Proxy type ("HTTP")
    rem Connection - Proxy - Proxy hostname ("localhost")
    rem Connection - Proxy - Port ("3129")
    rem Connection - Proxy - Port - Do DNS name lookup at proxy end ("No")
    rem
    @echo off
    setlocal enableextensions
    
    set log_fajl=%~dp0launchwinfoom.log
    
    echo %date% %time%>%log_fajl%
    
    set _ScriptDir=%~dp0
    set _ScriptDir=%_ScriptDir:~0,-1%
    
    echo Starting launch>>%log_fajl%
    start "" /D "%_ScriptDir%\winfoom" "launchGui.bat"
    echo Ended with %errorlevel% errorlevel>>%log_fajl%
    
    rem ожидаем завершения запуска ПО перед блокировкой экрана
    ping localhost -n 21 > nul
    rundll32.exe user32.dll,LockWorkStation
    
  3. настроить на клиентском ПК задание в планировщике заданий, запускающее командный файл monitortunnel.cmd

    rem выполнение задания с правами пользователя "система" (идентификатор "S-1-5-18"), триггер "при запуске"
    rem в свойствах задания нужно отключить:
    rem флаг "запускать только при питании от электросети" на вкладке "условия"
    rem флаг "останавливать задачу, выполняемую дольше" на вкладке "параметры"
    rem 
    rem для импорта ветки реестра с настройками соединения putty с именем "MonitorTunnel" выполнить под пользователем "система" команду regedit /s "файл с расширением reg"
    rem в настройках соединения putty указать:
    rem Session - Host Name
    rem Session - Port ("443")
    rem Connection - Data - Auto-login username (указать имя пользователя)
    rem Connection - Proxy - Proxy type ("HTTP")
    rem Connection - Proxy - Proxy hostname ("localhost")
    rem Connection - Proxy - Port ("3129")
    rem Connection - Proxy - Port - Do DNS name lookup at proxy end ("No")
    rem Connection - SSH - Enable compression
    rem Connection - SSH - Auth - Private key file for authentication (указать путь к файлу с закрытым ключом)
    rem Connection - SSH - TTY - Don't allocate a pseudo-terminal
    rem 
    @echo off
    set log_fajl=%~dp0monitortunnel.log
    set stat_fajl=%~dp0monitortunnel.stat
    
    echo %date% %time% > %log_fajl%
    
    rem запускаем цикл проверки существования тоннеля на ssh-сервере
    :LABEL_BEG
    echo %date% %time% Starting plink >> %log_fajl%
    "c:\program files (x86)\putty\plink.exe" -batch -hostkey "32:e7:d1:67:22:39:22:94:33:9c:af:7f:ba:62:e2:65" MonitorTunnel "ss -ltn | grep ""0\.0\.0\.0:3343"" | wc -l" > %stat_fajl%
    echo %date% %time% Ended with %errorlevel% errorlevel >> %log_fajl%
    
    if %errorlevel%==0 (
     goto LABEL_SUCCESS
    ) else (
     goto LABEL_FAILURE
    )
    
    :LABEL_SUCCESS
    echo success >> %log_fajl%
    set /p count=<%stat_fajl%
    echo tunnel count: %count% >> %log_fajl%
    if %count% gtr 0 (
     goto LABEL_TUNNEL_FOUND
    ) else (
     goto LABEL_TUNNEL_NOTFOUND
    )
    
    :LABEL_TUNNEL_FOUND
    echo tunnel found, no action >> %log_fajl%
    goto LABEL_SUCCESS_END
    
    :LABEL_TUNNEL_NOTFOUND
    echo tunnel not found, do action >> %log_fajl%
    powershell.exe -executionpolicy bypass -noprofile -command "(get-wmiobject win32_process -filter \"name='plink.exe' and commandline like '%%RemoteConnVDS%%'\").Terminate()"
    goto LABEL_SUCCESS_END
    
    :LABEL_SUCCESS_END
    goto LABEL_END
    
    :LABEL_FAILURE
    echo failure >> %log_fajl%
    goto LABEL_END
    
    :LABEL_END
    ping localhost -n 1801 > nul
    goto LABEL_BEG
    

Если "рабочий ПК" сервер, "удалённый ПК" клиент, клиент и сервер связаны через сервер-посредник SSH, то для установки удалённого подключения сервера или клиента к серверу SSH вручную (то есть, не с помощью планировщика заданий) нужно использовать командный файл remoteMANUALconn.cmd

rem для подключения с клиента к серверу указываем в клиенте RDP localhost:3342
rem для подключения с сервера к клиенту указываем в клиенте RDP localhost:3345

rem на стороне клиента выполняем
start     "" "c:\program files (x86)\putty\putty.exe" -ssh -2 -P 443 -N -C -T -i файл_с_закрытым_ключом -l имя_пользователя -L localhost:3342:0.0.0.0:3343 -R 0.0.0.0:3344:localhost:3389 адрес_сервера_ssh

rem на стороне сервера выполняем
rem start "" "c:\program files (x86)\putty\putty.exe" -ssh -2 -P 443 -N -C -T -i файл_с_закрытым_ключом -l имя_пользователя -L localhost:3345:0.0.0.0:3344 -R 0.0.0.0:3343:localhost:3389 адрес_сервера_ssh

NTP

  1. создать в каталоге /etc/syslog.d файл ntpd.conf

    !ntpd
    *.* /var/log/ntp.log

    выполнить команды и перезапустить syslog

    touch /var/log/ntp.log
    chmod 644 /var/log/ntp.log
    

    создать в каталоге /etc/newsyslog.conf.d файл ntpd.conf

    /var/log/ntp.log 644 7 100 * JC
  2. использовать файл конфигурации /etc/ntp.conf по умолчанию, необходимо наличие модуля ядра mac_ntpd, пользователя:группы ntpd:ntpd (123:123)

  3. добавить в /etc/rc.conf строки

    ntpd_enable="YES"
    ntpd_sync_on_start="YES"

Для диагностики состояния NTP-сервера использовать команду ntpq -p. Она выводит таблицу, например, следующего вида

remote           refid           st t when poll reach   delay   offset  jitter
==============================================================================
+93.185.187.89   62.149.0.30      2 u  645 1024  337   44.937   -3.099   3.926 

Строки в таблице соответствуют NTP-серверам, указанным в файле /etc/ntp.log. Описания столбцов

  • remote содержит маркер и FQDN или IP-адрес NTP-сервера. Некоторые полезные значения маркера

    • '*' - сервер, с которым выполняется синхронизация

    • '+' - сервер добавлен в список серверов, отобранных для синхронизации

    • '-' - сервер отвергнут группирующим алгоритмом

    • ' ' - сервер не годится для синхронизации

  • refid - IP-адрес сервера, с которым в настоящий момент выполняется синхронизация сервера из столбца remote

  • st - stratum сервера

  • t - режим работы сервера (local, unicast, multicast, broadcast)

  • when - время, прошедшее с момента последнего ответа сервера в секундах ('-' - если сервер ещё ни разу не ответил)

  • poll - интервал опроса сервера в секундах (с течением времени увеличивается)

  • reach - состояние восьми последних попыток запроса времени у сервера в восьмеричном представлении (в случае успешной попытки устанавливается соответствующий бит)

  • delay - задержка ответа сервера в миллисекундах

  • offset - различие локального времени и времени на сервере в миллисекундах (с течением времени уменьшается)

  • jitter - дисперсия, дрожанием фазы в миллисекундах (меньшее значение даёт более точную синхронизацию)

FTP

Рассмотрим пример организации анонимного FTP-сервера. В каталоге /usr/gamma/ftp/pub хранятся файлы для чтения, в каталог /usr/gamma/ftp/upload - записываются

На сервере выполнить

  1. создать группу и пользователя ftp (без пароля)

    pw group add -n ftp
    pw user add -n ftp -c "FTP anonimnij pol'zovatel" -d /usr/gamma/ftp -g ftp -s /sbin/nologin
    
  2. выполнить

    cd /usr/gamma/ftp
    mkdir etc
    mkdir pub
    mkdir upload
    

    в каталог pub скопировать каталоги и файлы, к которым будет открыт доступ по ftp. Имена файлов должны быть в кодировке UTF-8

  3. выполнить

    cd /usr/gamma
    
    chown root ftp
    chmod 555 ftp
    
    chown root ftp/etc
    chmod 555 ftp/etc
    
    chown -R root ftp/pub
    chmod -R 444 ftp/pub
    chmod -R +X ftp/pub
    
    chown ftp ftp/upload
    chmod 755 ftp/upload
    

    файлы в каталоге etc и pub должны иметь режим доступа 444

  4. создать файл /var/log/ftpd

    touch /var/log/ftpd
    
  5. добавить в файл /etc/rc.conf строки (анонимный ftp, поддерживает режим кодировки UTF-8, протоколирует все ftp-сессии в /var/log/xferlog и анонимные загрузки файлов в /var/log/ftpd)

    ftpd_enable="YES"
    # не путать с lukemftpd
    ftpd_program="/usr/libexec/ftpd"
    ftpd_flags="-A -8 -l -S"
  6. для работы FTP-сервера в пассивном режиме на сервере требуется открыть входящий tcp-порт 21 и диапазон входящих tcp-портов от 49152 до 65535 включительно

Примечание

Для анонимного FTP-сервера с возможностью записи есть опасность переполнения диска

SAMBA

На сервере 192.168.2.1 организовать доступ из локальной Windows-сети 192.168.2.x (маска подсети 255.255.255.0) к каталогу obmen (чтение и запись), каталогу distr (чтение и запись), а также stuff (только чтение). Каталог obmen находится в домашнем каталоге пользователя имя_пользователя (то есть его владельцем является пользователь имя_пользователя), каталог distr - в каталоге /usr/gamma/smb_rw, каталог stuff - в каталоге /usr/gamma/smb_ro (пользователь имя_пользователя имеет право на чтение содержимого каталога). Имена файлов представлены в кодировке utf-8

На компьютере-сервере выполнить

  1. установить порт net/samba413

  2. создать файл конфигурации /usr/local/etc/smb4.conf

    [global]
       security = user
       map to guest = bad user
       guest account = имя_пользователя
    
       interfaces = em0 lo
       bind interfaces only = yes
       hosts allow = 192.168.2.
    
       log file = /var/log/samba4/log.%m
       max log size = 50
    
       unix charset = utf8
       dos charset = cp866
       
       create mask = 0644
       directory mask = 0755
    
       printcap name = /dev/null
       printing = bsd
       load printers = no
    
       # disable NetBIOS
       disable netbios = yes
       smb ports = 445
    
       # disable SMBv1
       server min protocol = SMB2
    
    [obmen]
       comment = Read And Write
       path = /usr/home/имя_пользователя/obmen
       guest ok = yes
       only guest = yes
       writable = yes
       printable = no
    
    [stuff]
       comment = Read Only
       path = /usr/gamma/smb_ro
       guest ok = yes
       only guest = yes
       writable = no
       printable = no
    
    [distr]
       comment = Read And Write
       path = /usr/gamma/smb_rw
       guest ok = yes
       only guest = yes
       writable = yes
       printable = no
  3. для проверки конфигурационного файла smb.conf выполнить команду

    testparm
    
  4. добавить в /etc/rc.conf строку

    samba_server_enable="YES"
    nmbd_enable="NO"
    winbindd_enable="NO"
  5. на компьютере-сервере разрешить входящие соединения из локальной сети по порту 445/tcp. При использовании "NetBIOS over TCP/IP" необходимо разрешить входящие соединения по портам 139/tcp (session services), 137/udp (name services) и 138/udp (datagram services), а также входящие широковещательные соединения по портам 137/udp и 138/udp

Межсетевой экран pf

Для работы межсетевого экрана pf проверить наличие следующих опций в файле конфигурации ядра

device          pf
device          pflog
device          pfsync

Для работы altq проверить наличие следующих опций в файле конфигурации ядра

options         ALTQ
options         ALTQ_CBQ        # Class Bases Queuing (CBQ)
options         ALTQ_RED        # Random Early Detection (RED)
options         ALTQ_RIO        # RED In/Out
options         ALTQ_HFSC       # Hierarchical Packet Scheduler (HFSC)
options         ALTQ_PRIQ       # Priority Queuing (PRIQ)
options         ALTQ_NOPCC      # Required for SMP build

Нужно помнить, что pf

  • использует последнее подходящее правило, если не указано слово quick

  • преобразование сетевых адресов всегда выполняется до фильтрации (анализа правил). Для всех сетевых интерфейсов и для любого пакета (как входящего, так и исходящего)

  • использует сетевой интерфейс pflog0 для ведения логов

  • не использует преимущества многопроцессорных систем

Рассмотрим пример простой сети, где шлюз имеет сетевые интерфейсы

  • em0 - adsl-модем в режиме моста

  • em1 (IP-адрес 192.168.56.2, маска подсети 255.255.255.0) - компьютеры локальной сети

Задача

  • обеспечить доступ в Интернет с компьютеров локальной сети по следующим портам tcp/udp

    • tcp 80, 443 - просмотр Web-содержимого

    • tcp 81 - проверка настройки портов в eMule

      tcp 4242, 1176, 3883, 7111, 4184, 9939, 1887 - соединение eMule с серверами ed2k

      tcp 194, 6667 - IRC-клиент в eMule

    • udp 123 - синхронизация времени по протоколу NTP

    • udp 5060, 7078, 9078 - Linphone

    • tcp/udp диапазон портов от 10000 до 65000 включительно, а также tcp 2710 - uTorrent

    • tcp 2802 - WebMoney

    Также с компьютеров локальной сети должен быть доступен порт udp 53, причём при поступлении запроса из локальной сети к шлюзу на порт udp 53, запрос должен перенаправляться на DNS-сервер

  • "пробросить" порты tcp/udp 10474 (uTorrent), tcp 63274 и udp 31637 (eMule), а также tcp 42096 (Skype) из Интернет в локальную сеть для компьютера 192.168.56.1

  • обеспечить доступ в Интернет по прикладному протоколу ftp (пассивный) со всех компьютеров локальной сети

  • обеспечить доступ из Интернет к ssh-серверу (порт 443), установленному на шлюзе

  • если текущая дата 1 декабря 2009 года или более поздняя, записать в файл /var/log/sessions дату и время установки Интернет-соединения, а после разъединения - дату и время окончания, количество переданных и принятых байт

Настройки на шлюзе

  1. в файл /etc/rc.conf добавить опцию gateway_enable="YES", правильно настроить сетевые интерфейсы, программу mpd

  2. создать файл конфигурации /etc/pf.conf

    table <rfc1918> const { 192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8 } persist
    table <bogons> persist file "/etc/bogons"
    
    table <server_dns> {8.8.8.8, 8.8.4.4} persist
    
    vnutr_if="em1"
    
    tcp_ports_vnutr2vnesh="{80,443,  2710,  81,4242,1176,3883,7111,4184,9939,1887,  194,6667,  10000:65000,  2802 }"
    udp_ports_vnutr2vnesh="{123,  5060,7078,9078,  10000:65000 }"
    
    tcp_ports_vnesh2vnutr="{10474,  63274,  42096 }"
    udp_ports_vnesh2vnutr="{10474,  31637 }"
    
    set block-policy return
    set loginterface none
    set skip on lo0
    
    scrub in all
    
    rdr on $vnutr_if inet proto udp from $vnutr_if:network to $vnutr_if port 53 -> <server_dns> round-robin
    # ftp
    nat-anchor "ftp-proxy/*"
    rdr-anchor "ftp-proxy/*"
    rdr pass on $vnutr_if inet proto tcp from $vnutr_if:network to any port 21 -> 127.0.0.1 port 8021
    #
    rdr-anchor "vnesh_if_filter/*"
    nat-anchor "vnesh_if_filter/*"
    
    antispoof quick for $vnutr_if inet
    block return log on $vnutr_if all
    
    pass on $vnutr_if inet proto icmp all keep state
    pass in on $vnutr_if inet proto udp to <server_dns> port 53 keep state
    pass in on $vnutr_if inet proto tcp to any port 443 keep state
    
    pass in on $vnutr_if inet proto tcp to any port $tcp_ports_vnutr2vnesh keep state
    pass in on $vnutr_if inet proto udp to any port $udp_ports_vnutr2vnesh keep state
    pass out on $vnutr_if inet proto tcp to 192.168.56.1 port $tcp_ports_vnesh2vnutr keep state
    pass out on $vnutr_if inet proto udp to 192.168.56.1 port $udp_ports_vnesh2vnutr keep state
    
    anchor "ftp-proxy/*"
    
    anchor "vnesh_if_filter_tmp/*"
    anchor "vnesh_if_filter/*"
    
  3. в файл /etc/rc.conf добавить строки (межсетевой экран включается сразу после загрузки ПК)

    pf_enable="YES"
    pf_rules="/etc/pf.conf" 
    pflog_enable="YES"
    ftpproxy_enable="YES"
  4. изменить файлы

    • /etc/ppp/kommandSoed.sh (изменение правил после установки соединения и появлении сетевого интерфейса)

      #!/bin/sh
      
      if test "`date +%y%m%d`" -ge 091201
      then
       echo "Nachalo: "`date "+DATA: %d-%m-%Y VREM: %H:%M:%S"` >> /var/log/sessions;
      fi;
      
      echo "set loginterface $1" | pfctl -mOf -;
      
      echo "
      block drop on $1 all
      pass out on $1 inet proto udp from $1 to <server_dns> port 53 keep state
      pass out on $1 inet proto tcp from $1 to any port 80 keep state
      " | pfctl -a vnesh_if_filter_tmp/$1 -f -;
      /usr/local/bin/inadyn --background -u имя_пользователя -p пароль -a имя_хоста --syslog;
      sleep 300;
      killall -HUP inadyn;
      pfctl -a vnesh_if_filter_tmp/$1 -F all;
      
      echo "
      rdr on $1 inet proto tcp from any to $1 port {10474, 63274,  42096 } -> 192.168.56.1
      rdr on $1 inet proto udp from any to $1 port {10474, 31637} -> 192.168.56.1
      
      nat on $1 inet proto udp from em1:network to <server_dns> port 53 -> $1
      
      nat on $1 inet proto tcp  from em1:network to any port {80,443,  2710,  81,4242,1176,3883,7111,4184,9939,1887,  194,6667,  10000:65000,  2802 } -> $1
      nat on $1 inet proto udp  from em1:network to any port {123,  5060,7078,9078,  10000:65000 } -> $1
      nat on $1 inet proto icmp from em1:network to any -> $1 
      
      antispoof quick for $1 inet
      block drop in  log quick on $1 from { <bogons>, <rfc1918> } to any
      block drop out log quick on $1 from any to { <bogons>, <rfc1918> }
      block drop log on $1 all
      pass on $1 inet proto icmp all icmp-type 8 code 0 keep state
      pass out on $1 inet proto udp to <server_dns> port 53 keep state
      pass in  on $1 inet proto tcp to any port 443 keep state
      
      pass in  on $1 inet proto tcp to any port {10474, 63274,  42096 } keep state
      pass in  on $1 inet proto udp to any port {10474, 31637} keep state
      pass out on $1 inet proto tcp to any port {80,443,  2710,  81,4242,1176,3883,7111,4184,9939,1887,  194,6667,  10000:65000,  2802 } keep state
      pass out on $1 inet proto udp to any port {123,  5060,7078,9078,  10000:65000 } keep state
      
      pass out inet proto tcp from $1 to any port 21
      " | pfctl -a vnesh_if_filter/$1 -f -;
      
    • /etc/ppp/kommandOtsoed.sh (сброс правил после разрыва соединения и удаления сетевого интерфейса)

      #!/bin/sh
      
      if test "`date +%y%m%d`" -ge 091201
      then
       echo "Okonchan: "`date "+DATA: %d-%m-%Y VREM: %H:%M:%S"` >> /var/log/sessions;
       echo "Prinyato: "`pfctl -s info | awk '/Bytes In/ { print $3 }'` >> /var/log/sessions;
       echo "Otpravle: "`pfctl -s info | awk '/Bytes Out/ { print $3 }'` >> /var/log/sessions;
      fi;
      
      pfctl -F info;
      echo "set loginterface none" | pfctl -mOf -;
      
      pfctl -a vnesh_if_filter/$1 -F all;

Правила межсетевого экрана имеют особенности

  1. все приходящие и исходящие пакеты для каждого интерфейса по умолчанию блокируются. Если для пакета нет разрешающего правила, блокировка протоколируется (записывается в лог)

  2. при блокировке пакета на интерфейсе, который смотрит в локальную сеть, выполняется уведомление отправителя о блокировке (block return). Для интерфейса сети Интернет уведомление не выполняется (block drop), чтобы не загружать канал

  3. в правилах используется якорь vnesh_if_filter, в котором содержатся правила NAT и правила фильтрации для подключенного Интернет-соединения. Так как наименование сетевого интерфейса, к которому подключен Интернет, заранее неизвестно, с помощь якоря vnesh_if_filter правила подгружаются и удаляются при подключении (создании сетевого интерфейса) и отключении (удалении сетевого интерфейса) Интернет

В файле /etc/bogons содержатся IP-адреса, доступ к которым запрещён. Для обновления списка адресов используется скрипт rc.update_bogons.sh. Файл скрипта находится в каталоге /etc, его владелец - пользователь root, права 700. Для выполнение скрипта в файл /etc/crontab добавлена строка

1       3       1       *       *       root    /usr/bin/nice -n20 /etc/rc.update_bogons.sh

Полезные команды для управления pf

  • включение

    pfctl -e
    
  • выключение

    pfctl -d
    
  • показать список правил

    pfctl -s rules
    
  • показать список правил и число пакетов, к которым применено каждое правило

    pfctl -v -s rules
    
  • показать конфигурацию NAT

    pfctl -s nat
    

Межсетевой экран ipfw

Для работы межсетевого экрана ipfw нужно

добавить в файл конфигурации ядра

options         IPFIREWALL
options         IPFIREWALL_VERBOSE
options         IPFIREWALL_VERBOSE_LIMIT=5
#options         IPFIREWALL_DEFAULT_TO_ACCEPT
options         IPFIREWALL_NAT
options         DUMMYNET
options         LIBALIAS

или добавить в файл /boot/loader.conf строки (нужны модули ядра ipfw, ipfw_nat, dummynet, libalias)

ipfw_load="YES"
ipfw_nat_load="YES"
dummynet_load="YES"

добавить в файл /etc/sysctl.conf строки

net.inet.ip.fw.verbose=1
net.inet.ip.fw.verbose_limit=5

Нужно помнить, что ipfw

  • использует первое подходящее правило

  • использует действие nat для прямого и обратного преобразования сетевых адресов

  • использует для ведения логов syslogd, по умолчанию журнал /var/log/security

  • использует преимущества многопроцессорных систем

Рассмотрим пример простой сети, где шлюз имеет сетевые интерфейсы

  • igb0 (IP-адрес 192.168.0.2, маска подсети 255.255.255.0, адрес присваивается DHCP-сервером 192.168.0.1) - роутер

  • igb1 (IP-адрес 192.168.2.1, маска подсети 255.255.255.0) - компьютеры локальной сети

Задача

  • обеспечить доступ в Интернет со шлюза и компьютеров локальной сети по портам tcp 21, 22, 25, 80, 443, 2802 (WebMoney Keeper WinPro), 4477 (Сбербанк Онлайн для Android), 5061 (сигнальная информация протокола SIP поверх TLS), 10000-65535, портам udp 53, 123, 1024-65535 (речевая информация протокола RTP). Исходящий трафик по протоколу icmp должен быть разрешён на внешнем сетевом интерфейсе

  • обеспечить доступ в Интернет со шлюза по портам tcp 465, 995

  • "пробросить" порты tcp/udp 10474, tcp 63274, udp 31637 из Интернет в локальную сеть для компьютера 192.168.2.2

  • обеспечить доступ из Интернет к ssh-серверу (порт tcp 443), установленном на шлюзе

  • ограничить общую скорость (отдельно для входящего и исходящего трафика) для некоторых хостов в локальной сети

Настройки на шлюзе

  1. в /etc/rc.conf добавить опцию gateway_enable="YES", правильно настроить сетевые интерфейсы, программу mpd

  2. создать файл /etc/ipfw.rules

    #!/bin/sh
    ########################## nachalo pravil #######################
    ipfw -q -f flush
    ipfw disable one_pass
    
    cmd="ipfw -q add"
    skip="skipto 800"
    
    # interfeis vneshnej seti
    pif="igb0"
    
    # nat config
    ipfw -q nat 1 config if igb0 log \
            redirect_port tcp 192.168.2.2:10474 10474 \
            redirect_port udp 192.168.2.2:10474 10474 \
            redirect_port tcp 192.168.2.2:63274 63274 \
            redirect_port udp 192.168.2.2:31637 31637;
    
    # pipe config
    # download speed
    ipfw -q pipe 1 config bw 10000Kbit/s;
    # upload speed
    ipfw -q pipe 2 config bw 10000Kbit/s;
    
    # interfeis local'noj seti
    lif="igb1"
    
    # lokal'naja set'
    lan="192.168.2.0/24"
    
    # razr. porti iz vnutr. seti
    tcp_ports_vnutr2vnesh="21, 22, 25, 80, 443, 2802, 4477, 5061, 10000-65535"
    udp_ports_vnutr2vnesh="123, 1024-65535"
    
    # host v lokal. seti dlia portov vnesh2vnutr
    lan_host1="192.168.2.2"
    
    # razr. porti dlya lan_host1
    tcp_ports_vnesh2vnutr_lh1="10474, 63274"
    udp_ports_vnesh2vnutr_lh1="10474, 31637"
    
    # hosti v lokal. seti dlya ogranicheniya skorosti
    lan_host_bw="192.168.2.3,192.168.2.4,192.168.2.5,192.168.2.6"
    
    # DNS
    ipfw table 1 create type addr
    ipfw table 1 add 8.8.8.8
    ipfw table 1 add 8.8.4.4
    
    # zapr. podseti
    ipfw table 2 create type addr
    ipfw table 2 add 192.168.0.0/16
    ipfw table 2 add 172.16.0.0/12
    ipfw table 2 add 10.0.0.0/8
    ipfw table 2 add 127.0.0.0/8
    ipfw table 2 add 0.0.0.0/8
    ipfw table 2 add 169.254.0.0/16
    ipfw table 2 add 192.0.2.0/24
    ipfw table 2 add 204.152.64.0/23
    ipfw table 2 add 224.0.0.0/3
    
    #################################################################
    $cmd 005 allow proto ip src-ip any dst-ip any via lo0
    $cmd 010 allow proto ip src-ip any dst-ip any via $lif
    
    $cmd 014 nat 1 proto ip src-ip any dst-ip me in via $pif
    # download speed dlya hostov
    $cmd 015 pipe 1 proto ip src-ip any dst-ip $lan_host_bw in via $pif
    $cmd 016 check-state
    
    #################################################################
    $cmd 100 $skip proto icmp src-ip any dst-ip any out via $pif icmptypes 8 keep-state
    $cmd 106 $skip proto  udp src-ip any dst-ip table\(1\) dst-port 53 out via $pif keep-state
    $cmd 107 $skip proto  tcp src-ip any dst-ip any dst-port $tcp_ports_vnutr2vnesh out via $pif setup keep-state
    $cmd 108 $skip proto  udp src-ip any dst-ip any dst-port $udp_ports_vnutr2vnesh out via $pif keep-state
    
    # POCHTA
    $cmd 120 $skip proto  tcp src-ip me  dst-ip any dst-port 465, 995 out via $pif setup keep-state
    # DHCP
    $cmd 121 $skip proto  udp src-ip me  dst-ip 192.168.0.1 dst-port   67 out via $pif keep-state
    
    $cmd 199 deny log proto ip src-ip any dst-ip any out via $pif
    
    #################################################################
    $cmd 300 deny  proto   ip src-ip table\(2\) dst-ip any in via $pif
    $cmd 305 deny  proto icmp src-ip any dst-ip any in via $pif
    $cmd 306 deny  proto   ip src-ip any dst-ip any not verrevpath in via $pif
    $cmd 315 deny  proto  tcp src-ip any dst-ip any dst-port 113 in via $pif
    $cmd 320 deny  proto  tcp src-ip any dst-ip any dst-port 81, 137, 138, 139 in via $pif
    $cmd 330 deny  proto   ip src-ip any dst-ip any frag in via $pif
    $cmd 332 deny  proto  tcp src-ip any dst-ip any established in via $pif
    
    # TORRENT, eMule lan_host1
    $cmd 340 $skip proto  tcp src-ip any dst-ip $lan_host1 dst-port $tcp_ports_vnesh2vnutr_lh1 in via $pif keep-state
    $cmd 341 $skip proto  udp src-ip any dst-ip $lan_host1 dst-port $udp_ports_vnesh2vnutr_lh1 in via $pif keep-state
    # SSH
    $cmd 380 allow proto  tcp src-ip any dst-ip me dst-port 443 in via $pif setup limit src-addr 2
    
    $cmd 399 deny log proto ip src-ip any dst-ip any in via $pif
    
    #################################################################
    # upload speed dlya hostov
    $cmd 800 pipe 2 proto ip src-ip $lan_host_bw dst-ip any out via $pif
    $cmd 801 nat 1 proto   ip { src-ip $lan or src-ip me } dst-ip any out via $pif
    $cmd 802 allow proto   ip src-ip any dst-ip any
    
    # zapretit' vse paketi
    $cmd 999 deny log proto ip src-ip any dst-ip any
    ######################## konez pravil ###########################
    
  3. добавить в файл /etc/rc.conf

    firewall_enable="YES"
    firewall_script="/etc/ipfw.rules"
  4. если интерфейс igb0 подключен к модему и устанавливается pppoe-соединение (создаётся интерфейс с именем ng0), выполняем действия

    изменить файл /etc/ipfw.rules

    • изменить строку

      pif="igb0"

      на

      pif="ng0"
    • удалить настройку для nat и pipe

    • удалить правило с номером 121 для доступа к серверу DHCP

    изменить файлы

    • /etc/ppp/kommandSoed.sh (настройка NAT после установки соединения и появлении сетевого интерфейса, если интерфейс ng0 не существует, команда выдаст ошибку)

      #!/bin/sh
      
      # probros portov dlya torrent i emule (ipfw razreshen)
      ipfw -q nat 1 config if ng0 log \
              redirect_port tcp 192.168.2.2:10474 10474 \
              redirect_port udp 192.168.2.2:10474 10474 \
              redirect_port tcp 192.168.2.2:63274 63274 \
              redirect_port udp 192.168.2.2:31637 31637;
      
      # download speed
      ipfw -q pipe 1 config bw 10000Kbit/s;
      # upload speed
      ipfw -q pipe 2 config bw 10000Kbit/s;
    • /etc/ppp/kommandOtsoed.sh (удаление NAT после разрыва соединения и удаления сетевого интерфейса)

      #!/bin/sh
      
      ipfw -q nat 1 delete

Полезные команды для управления ipfw

  • включение

    ipfw enable firewall
    
  • выключение

    ipfw disable firewall
    
  • показать список правил

    ipfw list
    
  • показать список правил (в том числе динамических) и число пакетов, к которым применено каждое правило

    ipfw -d show
    
  • показать конфигурацию NAT

    ipfw nat show config
    
  • показать параметры sysctl относящиеся к ipfw

    sysctl -a | grep net.inet.ip.fw
    

DHCP

  1. установить порт net/isc-dhcp44-server

  2. создать в каталоге /usr/local/etc/syslog.d файл dhcpd.conf

    !dhcpd
    local7.debug /var/log/dhcpd.log

    выполнить команды и перезапустить syslog

    touch /var/log/dhcpd.log
    chmod 644 /var/log/dhcpd.log
    

    создать в каталоге /usr/local/etc/newsyslog.conf.d файл dhcpd.conf

    /var/log/dhcpd.log 644 7 100 * JC
  3. скопировать файл конфигурации /usr/local/etc/dhcpd.conf.sample в /usr/local/etc/dhcpd.conf. Отредактировать файл конфигурации

    # dhcpd.conf
    # dhcpd.conf
    #
    # Sample configuration file for ISC dhcpd
    #
    
    # option definitions common to all supported networks...
    option domain-name "example.org";
    
    default-lease-time 86400;
    max-lease-time 172800;
    
    # Use this to enble / disable dynamic dns updates globally.
    ddns-update-style none;
    
    # If this DHCP server is the official DHCP server for the local
    # network, the authoritative directive should be uncommented.
    #authoritative;
    
    # Use this to send dhcp log messages to a different log file (you also
    # have to hack syslog.conf to complete the redirection).
    log-facility local7;
    
    # shlyuz po umolchaniyu odinakovij dlya hostov domena i rabochej gruppi
    subnet 192.168.2.0 netmask 255.255.255.0 {
      option routers 192.168.2.1;
    }
    
    # hosti rabochej gruppi
    group {
      option domain-name-servers 192.168.2.1;
      host homework     { hardware ethernet c4:6d:04:2e:e5:95; fixed-address 192.168.2.2; }
      host winxp        { hardware ethernet 08:00:27:ad:9c:2f; fixed-address 192.168.2.9; }
      host linuxoracle  { hardware ethernet 08:00:27:c9:81:bb; fixed-address 192.168.2.11;}
      host sles         { hardware ethernet 08:00:27:94:4f:3a; fixed-address 192.168.2.12;}
      host notebook     { hardware ethernet f4:6d:04:2e:e5:95; fixed-address 192.168.2.10;}
    }
    
    # hosti domena
    group {
      option domain-name-servers 192.168.2.3;
      host contoso-dc   { hardware ethernet 08:00:27:A9:BE:08; fixed-address 192.168.2.3; }
      host contoso-sql  { hardware ethernet 08:00:27:87:74:30; fixed-address 192.168.2.4; }
      host contoso-sccm { hardware ethernet 08:00:27:D3:9D:46; fixed-address 192.168.2.5; }
      host contoso-scom { hardware ethernet 08:00:27:ED:16:6A; fixed-address 192.168.2.6; }
      host refpc-virt   { hardware ethernet 08:00:27:B6:B3:7A; fixed-address 192.168.2.7; }
      host tstpc-phys   { hardware ethernet 68:05:CA:27:83:E9; fixed-address 192.168.2.8; }
    }
  4. добавить в файл /etc/rc.conf (имена_сетевых_интерфейсов - имена сетевых интерфейсов, разделённые пробелами, на которых сервер DHCP должен принимать запросы от клиентов)

    dhcpd_enable="YES"
    dhcpd_flags="-q"
    dhcpd_ifaces="имена_сетевых_интерфейсов"

Apache HTTP Server и PHP5

  1. установить порт www/apache22 и lang/php5

  2. проверить, чтобы в файле конфигурации /usr/local/etc/apache22/httpd.conf (далее - файл конфигурации вэб-сервера) были строки

    ServerName 192.168.1.2:80
    DocumentRoot "/usr/local/www/apache22/data"
    
    <Directory />
        AllowOverride None
        Order deny,allow
        Deny from all
    </Directory>
    
    <Directory "/usr/local/www/apache22/data">
        AllowOverride None
        Order allow,deny
        Allow from all
    </Directory>
    
    <Directory "/usr/local/www/apache22/cgi-bin">
        AllowOverride None
        Options None
        Order allow,deny
        Allow from all
    </Directory>
    
    <IfModule dir_module>
        DirectoryIndex index.html index.shtml index.php
    </IfModule>
    
  3. для включения поддержки php существует 2 способа

    • загрузка библиотеки php при старте вэб-сервера. При изменении параметров интерпретатора php необходим перезапуск вэб-сервера. В файле конфигурации вэб-сервера должны присутствовать строки

      LoadModule php5_module  libexec/apache22/libphp5.so
      <IfModule php5_module>
       AddType application/x-httpd-php .php
      </IfModule>
      
    • запуск интерпретатора php при обработке файлов со скриптами php. При изменении параметров интерпретатора php перезапуск вэб-сервера не нужен. В файле конфигурации вэб-сервера должны присутствовать строки

      AddType application/x-httpd-php .php
      <Directory "/usr/local/bin"> 
        Options ExecCGI 
        Order allow,deny
        allow from all
      </Directory> 
      ScriptAlias "/php_dir/" "/usr/local/bin/" 
      Action application/x-httpd-php "/php_dir/php-cgi"
      
  4. в каталоге /usr/local/etc есть файлы-примеры php.ini-dist и php.ini-recommended. Для конфигурирования интерпретатора php (любым из 2-х способов) создать каталог /usr/local/etc/php, а в ней файл php.ini. В файл php.ini добавить строки

    error_reporting = E_ALL & ~E_NOTICE
    display_errors = On
    variables_order = "EGPCS"
    

    При работе php-скриптов будут отображаться все ошибки, а "замечания" будут игнорироваться

    register_globals = On

    Переменные, передаваемые метором GET, POST, через cookies и сессии можно использовать в php-скрипте, обращаясь к ним просто как к обычным переменным $someone. Если директива register_globals = Off, то к таким переменным можно будет обращаться только при помощи суперглобальных массивов ($_POST, $_GET и т.п.)

    register_long_arrays = On

    Позволяет использовать суперглобальные массивы в старом формате ("длинном" - $HTTP_GET_VARS, $HTTP_POST_VARS и т.д.)

  5. создать файл /usr/local/www/apache22/data/index.php

    <html>
    <body>
    <h1>It works!</h1>
    <?php
    phpinfo();
    ?>
    </body>
    </html>
    

    Если после перезапуска apache22 открыть браузер и ввести адрес 192.168.1.2, должна появиться конфигурация php

  6. в файл конфигурации вэб-сервера для включения SSI в директиве <Directory> Options добавить значение IncludesNOEXEC, в разделе <IfModule mime_module> добавить строки

    AddType text/html .shtml
    AddOutputFilter INCLUDES .shtml
  7. для того, чтобы можно было заходить на сайт в виде http://192.168.1.2/~имя_пользователя/имя_сайта, добавить в файл конфигурации вэб-сервера строки

    UserDir disabled root
    UserDir www/data

    Лучше, однако, отредактировать файл /usr/local/etc/apache22/extra/httpd-userdir.conf (см. директивы UserDir и Directory) и раскоментировать строку Include etc/apache22/extra/httpd-userdir.conf в файле конфигурации вэб-сервера. Все сайты пользователя нужно поместить в каталог ~/www/data

  8. для настройки виртуального хостинга в файле конфигурации вэб-сервера (обычно в конце) используется конструкция вида (в ней всегда использовать IP-адреса)

    NameVirtualHost 127.0.0.1:80
    <VirtualHost 127.0.0.1:80>
      # host 1
    </VirtualHost>
    <VirtualHost 127.0.0.1:80>
      # host 2
    </VirtualHost>
    <VirtualHost 127.0.0.1:80>
      # host 3
    </VirtualHost>
    

    например

    <VirtualHost 127.0.0.1:80>
        ServerAdmin webmaster@may_domain.ru
        DocumentRoot c:/www/mysite
        ServerName www.mysite.ru
        ServerAlias www.site.ru www.host2.ru
        ErrorLog logs/mysite-error.log
        CustomLog logs/mysite-access.log common
    </VirtualHost>
    
  9. для запуска apache22 при загрузке компьютера, добавить в /etc/rc.conf строку

    apache22_enable="YES"

    для загрузки модуля accf_http (см. опцию AcceptFilter настроек веб-сервера) добавить строку

    apache22_http_accept_enable="YES"

MySQL50 и PHP5

  1. установить порт databases/mysql50-server. После установки запустить сервер командой /usr/local/etc/rc.d/mysql-server start

  2. установить порт lang/php5-extensions (выбрать опцию MySQL). После установки будет создан файл /usr/local/etc/php/extensions.ini, в нём будет строка

    extension=mysql.so

    Для проверки конфигурации, ввести в адресную строку браузера адрес 192.168.1.2, в конфигурации php должна присутствовать таблица MySQL

  3. установить пароль администратора баз данных командой

    mysqladmin -u root password пароль
    
  4. для удобства администрирования баз данных MySQL установить порт databases/phpmyadmin. После установки внести в файл конфигурации вэб-сервера строки

    Alias /phpmyadmin/ "/usr/local/www/phpMyAdmin/"
    
    <Directory "/usr/local/www/phpMyAdmin/">
     Options none
     AllowOverride Limit
    
     Order Deny,Allow
     Deny from all
     Allow from 192.168.1.2
    </Directory>
    

    Теперь можно войти по адресу http://192.168.1.2/phpmyadmin/, ввести имя пользователя root и пароль, внесённый на предыдущем шаге

  5. для запуска mysql при старте компьютера, добавить в /etc/rc.conf строку

    mysql_enable="YES"

Монтирование внешних накопителей пользователем

  1. если запущен devd, то, в зависимости от настроек в файле /etc/devd.conf, монтирование может быть выполнено автоматически. Для отключения devd нужно добавить в файл /etc/rc.conf строку

    devd_enable="NO"
  2. в файл /etc/sysctl.conf добавить строку

    vfs.usermount=1

    Проверить, чтобы пользователь, который будет монтировать устройства, состоял в группе operator

  3. зайти под пользователем и создать каталог ~/mnt (будет являться точкой монтирования)

  4. определить права на устройства

    • для устройств с динамическими именами (например, флэшка) создать файл /etc/devfs.rules

      [localrules=5]
      add path 'da[0-9]*' mode 0660 group operator

      В файл /etc/rc.conf добавить строки

      devfs_enable="YES"
      devfs_system_ruleset="localrules"
    • для устройств со статическими именами (например, CD/DVD-ROM) в файл /etc/devfs.conf добавить строки

      own  acd0 root:operator
      perm acd0 0660
      # для записи дисков пользователем
      own cd0 root:operator
      perm cd0 0660
      own xpt0 root:operator
      perm xpt0 0660
      own pass0 root:operator
      perm pass0 0660
  5. для монтирования устройств с именами, содержащими русские символы, необходимо написать скрипт /usr/local/etc/rc.d/kiconvtool

    #!/bin/sh
    
    # PROVIDE: kiconvtool
    # REQUIRE:
    
    . /etc/rc.subr
    
    name="kiconvtool"
    rcvar=`set_rcvar`
    stop_cmd="kiconvtool_stop"
    start_cmd="kiconvtool_start"
    
    kiconvtool_start()
    {
       mount -t msdosfs -o -L=ru_RU.UTF-8 -o -D=CP866 -o -l /dev/zero /mnt 2>/dev/null
       echo "Hello, world!"
    }
    
    kiconvtool_stop()
    {
       echo "Ne nuzhno"
    }
    load_rc_config $name
    run_rc_command "$1"
    

    Сделать скрипт исполняемым, определить владельца и группу командами

    chmod 555 kiconvtool
    chown root:wheel kiconvtool
    

    В файл /etc/rc.conf добавить строку

    kiconvtool_enable="YES"
  6. в файл /boot/loader.conf добавить строки (нужны модули ядра libiconv, cd9660_iconv, msdosfs_iconv)

    cd9660_iconv_load="YES"
    msdosfs_iconv_load="YES"
  7. после перезагрузки и входа в систему под пользователем монтирование устройств в точку монтирования ~/mnt должно работать

Примеры

  • монтирование флэшки с файловой системой FAT32

    mount -t msdosfs -o -L="ru_RU.UTF-8" -o -D="CP866" -o -l -o -m=644,-M=755 -o sync /dev/da0s1 ~/mnt
    
  • монтирование CD/DVD-диска

    mount -t cd9660 -o -CUTF-8 /dev/acd0 ~/mnt
    

Запись CD/DVD-дисков

  1. для записи на DVD-приводе (не USB-устройстве) необходимо наличие устройства /dev/cd0 (драйвер для работы с ATAPI-устройствами через подсистему SCSI). Если его нет, нужно добавить в файл /boot/loader.conf строки (нужен модуль ядра ata/atapicam)

    atapicam_load="YES"

    После перезагрузки устройство /dev/cd0 должно появиться

  2. создадим файл-образ содержимого каталога ~/temp/dannie_dlya_zapisi с помощью команды (имена файлов не должны содержать более 64 символов)

    mkisofs -jcharset koi8-r -o ~/temp/imagefile.iso ~/temp/dannie_dlya_zapisi
    

    (иерархия будет начинаться со следующего уровня, т.е. не со слова "dannie_dlya_zapisi")

    Имена файлов в каталоге ~/temp/dannie_dlya_zapisi должны быть в кодировке koi8-r. Если имена файлов записаны в кодировке UTF-8, выполнить

    convmv -f utf-8 -t koi8-r -r ~/temp/dannie_dlya_zapisi --notest
    

    (если имя каталога "dannie_dlya_zapisi" будет написано кириллицей, оно также будет конвертировано, имя каталога "temp" - нет)

  3. для проверки результата работы команды mkisofs после создания файла образа (если текущая локаль UTF-8), использовать команды

    mdconfig -a -t vnode -f ~/temp/imagefile.iso
    mount -t cd9660 -o -CUTF-8 /dev/md0 ~/mnt
    
  4. запись CD-R-диска (для однократной записи) файла образа с закрытием сессии на устройстве, соответствующем стандарту ATAPI

    burncd -f /dev/acd0 data ~/temp/imagefile.iso fixate
    
  5. запись DVD-R-диска (для однократной записи) файла образа

    growisofs -dvd-compat -speed=1 -Z /dev/cd0=/home/user/temp/imagefile.iso
    

    growisofs устанавливается из порта sysutils/dvd+rw-tools. На обычный диск DVD-R записывается не более 4706074624 байт (2297888 блоков по 2048 байт)

Bluetooth

Рассмотрим пример передачи файлов с компьютера на сотовый телефон по Bluetooth

  1. добавить в /boot/loader.conf (нужен модуль ядра netgraph/bluetooth)

    ng_ubt_load="YES"
  2. подключить адаптер Bluetooth (появится устройство /dev/ubt0)

  3. если не запущен devd, выполнить

    /etc/rc.d/bluetooth start ubt0
    

    Если devd запущен, команда должна быть выполнена автоматически. Для того, чтобы проверить, что команда отработала, в выводе команды ngctl list должны присутствовать имена ubt0hci, ubt0l2cap, ubt0

  4. включить Bluetooth на сотовом телефоне, затем выполнить

    hccontrol -n ubt0hci inquiry
    

    появится список доступных устройств, в /etc/bluetooth/hosts добавить MAC-адрес

    xx:xx:xx:xx:xx:xx TEL

    Узнать, какие профили поддерживает устройство TEL, можно с помощью команды

    sdpcontrol -a TEL browse
    
  5. в /etc/bluetooth/hcsecd.conf добавить строки

    device {
        bdaddr xx:xx:xx:xx:xx:xx;
        name "MOJ TELEFON";
        key nokey; # 16 bytes key (hex string)
        pin "1112";
    }

    в /etc/rc.conf добавить

    hcsecd_enable="YES"
  6. для приёма/передачи файлов установить obexapp из порта comms/obexapp. Для запуска obexapp использовать команду

    obexapp -a TEL -C FTRN
    

Почтовый клиент Mutt

  1. MTA sendmail на локальном компьютере не используется. В качестве MDA используется procmail (если нужен MDA, предоставляющий доступ к почтовым сообщениям по протоколу POP3, следует использовать dovecot), в качестве MUA - fetchmail (возможно использовать getmail) и mutt. В качестве SMTP-клиента используется msmtp (возможно использовать nbsmtp). Установить порты mail/procmail, mail/fetchmail, mail/msmtp, mail/mutt, textproc/urlview, www/lynx

  2. зайти под пользователем, для которого настраивается почта, создать каталог ~/MuttMail, в котором будут храниться все почтовые сообщения (входящие и исходящие письма) в формате mbox

  3. создать файл настроек MDA ~/.procmailrc

    PATH=/bin:/usr/bin:/usr/local/bin
    MAILDIR=$HOME/MuttMail
    DEFAULT=$MAILDIR/inbox
    LOGFILE=$MAILDIR/from
    
    :0
    * .*
    $DEFAULT
  4. создать файл настроек MUA ~/.fetchmailrc (сервер - имя POP3-сервера, имя_пользователя - имя пользователя, пароль - пароль для входа на POP3-сервер). При записи пароля в файл ~/.fetchmailrc символ "\" должен быть записан как два символа "\\"

    poll сервер protocol pop3 user "имя_пользователя" password "пароль"
  5. создать файл настроек SMTP-клиента ~/.msmtprc (сервер - имя SMTP-сервера, адрес_электронной_почты - адрес электронной почты, имя_пользователя - имя пользователя, пароль - пароль для входа на SMTP-сервер)

    account default
    auth plain
    host сервер
    from адрес_электронной_почты
    user имя_пользователя
    password пароль
  6. создать файл настроек MUA ~/.muttrc (адрес_электронной_почты - адрес электронной почты, реальное_имя_пользователя - настоящее имя пользователя)

    # генерация случайной подписи при создании письма
    set signature="./.podpis.sh|"
    # файл .podpis.sh исполняемый в домашнем каталоге, его содержимое
    # #!/bin/sh
    # printf "С уважением, \nИван Иванович"
    
    # курсор слева вместо строки выделения
    set arrow_cursor = yes
    # нет выделения thread'ов
    set ascii_chars = yes
    set pager_index_lines = 5
    # не переходить к следующему сообщению
    set pager_stop=yes
    set sort = date-received
    
    set from = адрес_электронной почты
    set realname = "реальное_имя_пользователя"
    
    set charset = "koi8-r"
    set send_charset = "koi8-r"
    
    set record = "$HOME/MuttMail/sent"
    
    set include = yes                            
    set to_chars = " +TCF"
    set folder = $HOME/MuttMail
    set tmpdir = /tmp
    set postponed = $HOME/MuttMail/postponed
    mailboxes = $HOME/MuttMail/inbox $HOME/MuttMail/sent
    auto_view text/html
    
    macro index G "!fetchmail -a -m 'procmail -d %T'\r"
    macro pager G "!fetchmail -a -m 'procmail -d %T'\r"
    
    set sendmail = "/usr/local/bin/msmtp"
    
    ignore *
    unignore  Date To From: Subject X-Mailer Organization User-Agent
    hdr_order Date From To Subject X-Mailer User-Agent Organization

    Создать файл ~/.mailcap

    text/html; lynx -assume_charset=%{charset} -dump '%s'; copiousoutput; description = HTML Text; nametemplate=%s.html
  7. для того, чтобы файлы, содержащие имя пользователя и пароль, мог просмотреть и изменить только сам пользователь, выполнить команду

    chmod 600 ~/.fetchmailrc ~/.msmtprc
    

    для того, чтобы доступ к письмам имел только сам пользователь, выполнить команду

    chmod 600 ~/MuttMail/from ~/MuttMail/inbox ~/MuttMail/postponed ~/MuttMail/sent
    
  8. проверить настройки межсетевого экрана. Для приёма почты должен использоваться tcp-порт 110, для отправки tcp-порт 25

Настройки приёма и передачи почты MAIL.RU с шифрованием

  1. установить порт security/ca_root_nss. После установки должен появиться файл с корневыми сертификатами /usr/local/share/certs/ca-root-nss.crt

  2. работаем под пользователем, для которого настраиваем почту.

    В конфигурационный файл ~/.fetchmailrc добавить строки

    ssl 
    sslcertck 
    sslcertfile /usr/local/share/certs/ca-root-nss.crt

    В конфигурационный файл ~/.msmtprc добавить строки

    tls on
    tls_starttls off
    tls_trust_file /usr/local/share/certs/ca-root-nss.crt

    mail/msmtp должен быть собран с поддержкой OpenSSL

  3. изменить настройки межсетевого экрана. Для приёма почты должен использоваться tcp-порт 995, для отправки tcp-порт 465

X

  1. установить порты devel/icu, x11/xorg (не выбирать установку драйверов видеокарт, которые не будут использоваться)

  2. установить нужный драйвер видеокарты. Для NVIDIA 7600GT использовать порт x11/nvidia-driver-304 (также может пригодиться порт x11/nvidia-settings), после установки добавить в /boot/loader.conf (нужен модуль ядра linux)

    nvidia_load="YES"
    linux_load="YES"
  3. включить devd, тогда при подключении usb-мыши devd автоматически запустит moused, который создаст устройство /dev/sysmouse

  4. перезагрузить ПК

  5. выполнить команду

    Xorg -configure
    

    Будет создан конфигурационный файл /root/xorg.conf.new

  6. для тестирования конфигурационного файла выполнить

    Xorg -config /root/xorg.conf.new
    

    Если тестирование успешно (лог /var/log/Xorg.0.log не содержит ошибок), переместить файл конфигурации в /etc/X11/xorg.conf

    mv /root/xorg.conf.new /etc/X11/xorg.conf
    
  7. в случае необходимости отредактировать файл /etc/X11/xorg.conf

    Section "ServerLayout"
    	Identifier     "X.org Configured"
    	Screen      0  "Screen0" 0 0
    	InputDevice    "Mouse0" "CorePointer"
    	InputDevice    "Keyboard0" "CoreKeyboard"
    EndSection
    
    Section "Files"
    	ModulePath   "/usr/local/lib/xorg/modules"
    	FontPath     "/usr/local/share/fonts/misc/"
    	FontPath     "/usr/local/share/fonts/TTF/"
    	FontPath     "/usr/local/share/fonts/OTF/"
    	FontPath     "/usr/local/share/fonts/Type1/"
    	FontPath     "/usr/local/share/fonts/100dpi/"
    	FontPath     "/usr/local/share/fonts/75dpi/"
    EndSection
    
    Section "ServerFlags"
    	Option       "AutoAddDevices" "false"
            Option       "DontVTSwitch"
    	Option       "BlankTime"   "20"
    	Option       "StandbyTime" "30"
    	Option       "SuspendTime" "40"
    	Option       "Offtime"     "45"
    EndSection
    
    Section "Module"
    	Load         "glx"
    EndSection
    
    Section "Extensions"
    
    EndSection
    
    Section "InputDevice"
    	Identifier  "Keyboard0"
    	Driver      "kbd"
            Option      "CoreKeyboard"
            Option      "XkbLayout" "us,ru"
            Option      "XkbVariant" "winkeys"
            Option      "XkbOptions" "grp:ctrl_shift_toggle"
    EndSection
    
    Section "InputDevice"
    	Identifier  "Mouse0"
    	Driver      "mouse"
    	Option	    "Protocol" "auto"
    	Option      "Device" "/dev/sysmouse"
    	Option	    "ZAxisMapping" "4 5"
    EndSection
    
    Section "Monitor"
    	Identifier   "Monitor0"
    	VendorName   "Samsung"
    	ModelName    "SyncMaster 710N"
    	HorizSync    30.0-81.0
    	VertRefresh  56.0-75.0
    	Option       "DPMS"
    EndSection
    
    Section "Device"
    	Identifier  "Card0"
    	#Driver      "ast"
    	Driver      "vesa"
    	BusID       "PCI:4:0:0"
    EndSection
    
    Section "Screen"
    	Identifier "Screen0"
    	Device     "Card0"
    	Monitor    "Monitor0"
    	SubSection "Display"
    		Depth  24
    		#Modes "1280x1024"
    		Modes "1920x1080"
    	EndSubSection
    EndSection
  8. для более привлекательного отображения шрифтов TrueType установить порты x11-fonts/webfonts, x11-fonts/dejavu, указать путь к шрифтам в секции Files файла конфигурации X-сервера, выполнить команды mkfontdir и mkfontscale в каждом каталоге установленного шрифта

Подсказка

Сведения о работе X можно получить с помощью порта x11/xdpyinfo

Подсказка

Если размер ОЗУ равен 4Гб или более, используется версия FreeBSD для платформы i386 и видеокарта на чипе NVIDIA, то при запуске сессии X может произойти "зависание". Для того, чтобы избежать "зависания", добавить в файл /boot/loader.conf строку

machdep.disable_mtrrs="1"

ICEWM

  1. установить порт x11-wm/icewm. В каталоге ~/.icewm нужно

    • изменить файл preferences

    • создать файл startup, который будет выполняться при старте ICEWM

      touch ~/.icewm/startup
      chmod 755 ~/.icewm/startup
      

      Файл должен начинаться со строки

      #!/bin/sh
    • изменить файл programs

      menu "emulators"
      {
        # dopolnenija v kataloge
        # /usr/local/lib/virtualbox/additions/
        prog "virtualbox-ose" - VirtualBox
      }
      menu "graphics"
      {
        prog "qiv"      - qiv --help
      }
      menu "mail"
      {
        prog "mutt" - xterm -e "setenv LC_ALL ru_RU.KOI8-R && setenv VISUAL ee && luit mutt -y"
      }
      menu "misc"
      {
        prog "mc" - xterm -maximized +sb -e "mc"
      }
      
  2. настройку входа в графический менеджер можно сделать двумя способами

    • вход в графический менеджер после ввода имени пользователя и пароля в текстовом режиме

      1. создать файл ~/.xinitrc

        #!/bin/sh
        
        LANG=ru_RU.UTF-8
        LC_ALL=ru_RU.UTF-8
        
        exec icewm-session
      2. добавить в файл ~/.login строку

        startx -- -nolisten tcp
    • вход в графический менеджер после ввода имени пользователя и пароля в графическом окне приложения xdm, доступного из порта x11/xdm

      1. создать файл ~/.xsession (содержимое такое же как и ~/.xinitrc в 1-м способе, использовать команду ln -s ~/.xsession ~/.xinitrc)

      2. в /etc/ttys включить терминальное устройство ttyv8

        ttyv8 "/usr/local/bin/xdm -nodaemon" xterm on secure
      3. в /usr/local/etc/X11/xdm/Xservers изменить строку

        :0 local /usr/local/bin/X :0 -nolisten tcp

        в /usr/local/etc/X11/xdm/xdm-config следующие строки должны быть закомментированы (режим вывода консоли отключен)

        ! DisplayManager._0.setup:       /usr/local/etc/X11/xdm/Xsetup_0
        ! DisplayManager._0.startup:     /usr/local/etc/X11/xdm/GiveConsole
        ! DisplayManager._0.reset:       /usr/local/etc/X11/xdm/TakeConsole
  3. для отображения рабочего стола установить порт x11/idesk, создать каталог ~/.idesktop (описание ярлыков), каталог ~/.idesktop/icons (иконки ярлыков), каталог ~/.idesktop/backgrounds (фоновые рисунки).

    В файл ~/.icewm/startup добавить

    /usr/local/bin/idesk &
    

    Файл настроек ~/.ideskrc (имя_пользователя - имя пользователя, для которого настраивается рабочий стол)

    table Config
      FontName: helvetica
      FontSize: 13
      FontColor: #37CFA6
      ToolTip.FontSize: 13
      ToolTip.FontName: helvetica
      ToolTip.ForeColor: #0000FF
      ToolTip.BackColor: #FFFFFF
      ToolTip.CaptionOnHover: true
      ToolTip.CaptionPlacement: Right
      Locked: true
      Transparency: 100
      Shadow: true
      ShadowColor: #000000
      ShadowX: 1
      ShadowY: 1
      Bold: true
      ClickDelay: 300
      IconSnap: true
      SnapWidth: 10
      SnapHeight: 10
      SnapOrigin: BottomRight
      SnapShadow: false
      SnapShadowTrans: 200
      CaptionOnHover: false
      CaptionPlacement: bottom
      FillStyle: fillinvert
      Background.Delay: 0
      Background.Source: /home/имя_пользователя/.idesktop/backgrounds
      Background.File: /home/имя_пользователя/.idesktop/backgrounds/Storm.jpg
      Background.Mode: Center
      Background.Color: #C2CCFF
    end
    
    table Actions
      Lock: control right doubleClk
      Reload: middle doubleClk
      Drag: left hold
      EndDrag: left singleClk
      Execute[0]: left doubleClk
    end

    Файл описания ярлыка ~/.idesktop/mutt.lnk

    table Icon
      Caption: pochta
      Icon: /home/имя_пользователя/.idesktop/icons/gnome-talk.png
      X: 99
      Y: 73
      Command[0]: xterm -e  "setenv LC_ALL ru_RU.KOI8-R && setenv VISUAL ee && luit mutt -y"
    end

    Файл описания ярлыка ~/.idesktop/virtualbox-ose.lnk

    table Icon
      Caption: HOMEWORK
      Icon: /usr/local/share/pixmaps/VBox.png
      X: 919
      Y: 59
      Command[0]: VBoxManage startvm "homework"
    end
  4. настройка выключения и перезагрузки компьютера

    1. установить порт security/sudo

    2. в /usr/local/etc/sudoers добавить строку (имя_пользователя - имя пользователя, которому разрешено выключать и перезагружать компьютер)

      имя_пользователя ALL = (ALL) NOPASSWD:/sbin/shutdown
    3. в файл ~/.icewm/preferences добавить строки

      ShutdownCommand="sudo /sbin/shutdown -p now"
      RebootCommand="sudo /sbin/shutdown -r now"
  5. настройки хранителя экрана

    1. установить порт x11/xscreensaver

    2. в файл ~/.icewm/startup добавить

      /usr/local/bin/xscreensaver -no-splash &
      
    3. в файл ~/.icewm/preferences добавить

      LockCommand="/usr/local/bin/xscreensaver-command -lock"
  6. изменить настройки xterm

    1. скопировать /usr/local/lib/X11/app-defaults/XTerm в файл ~/XTerm. В ~/XTerm добавить

      XTerm*foreground: gray
      XTerm*background: black
      XTerm*cursorColor: darkgreen
      XTerm*saveLines: 100
      XTerm*scrollBar: true
      XTerm*font: -*-fixed-medium-r-*-*-18-*-*-*-*-*-iso10646-*
      XTerm*geometry: 80x24+0+10

      Список доступных шрифтов можно вывести с помощью порта x11-fonts/xlsfonts. Для выбора шрифта в графическом режиме использовать порт x11-fonts/xfontsel. Для xterm выбирать моноширинные шрифты (например, Courier или Lucida) с кодировкой iso10646 (для консоли UTF-8)

    2. в файл ресурсов ~/.Xresources добавить для работы буфера обмена в xterm

      XTerm*VT100.translations: #override <Btn1Up>: select-end(PRIMARY, CLIPBOARD, CUT_BUFFER0)
      

      В ~/.xinitrc или ~/.xsession перед строкой запуска ICEWM добавить

      xrdb -load $HOME/.Xresources
      

Обновление портов, исходных текстов ядра и мира

  1. установить git из порта devel/git с помощью команд

    cd /usr/ports/devel/git
    env FLAVOR=tiny make install clean
    
  2. если каталоги /usr/ports и /usr/src уже существуют и не были созданы с помощью git, необходимо их удалить или переименовать. Затем выполнить

    git clone https://git.FreeBSD.org/ports.git -b 2022Q4 /usr/ports
    git clone --branch releng/12.3 https://git.FreeBSD.org/src.git /usr/src
    
  3. обновить порты командой

    git -C /usr/ports pull
    

    обновить исходные тексты системы (ядра и мира)

    git pull /usr/src
    

Для проверки, находится ли каталог /usr/dummy под управлением системы управления версиями git, выполнить команды

cd /usr/dummy
git remote --v

Обновление установленного ПО

Перед проведением обновления лучше удалить опции установки из портов (которые использовались ранее) с помощью команды

rm -rf /var/db/ports/*

Если необходимо удалить неиспользуемое ПО, можно воспользоваться портом ports-mgmt/pkg_cutleaves

Обновление можно проводить с помощью утилиты portmaster или portupgrade

Для обновления с помощью утилиты portmaster установить ports-mgmt/portmaster

Последовательность обновления с помощью утилиты portmaster

  1. portmaster --list-origins > /root/portmaster/installed-port-list
    
  2. обновить порты

  3. удалить файлы дистрибутивов, на которые нет ссылки из текущей версии дерева портов

    portmaster -ty --clean-distfiles
    
  4. portmaster -Faf
    
  5. pkg delete -afy
    
  6. rm -rf /usr/local/lib/compat/pkg
    
  7. выполнить резервную копию нужных файлов в каталоге /usr/local

  8. вручную проверить каталоги /usr/local и /var/db/pkg, чтобы убедиться, что они пустые

  9. установить ports-mgmt/pkg и затем ports-mgmt/portmaster, удалить соответствующие строки из файла /root/portmaster/installed-port-list

  10. portmaster --no-confirm `cat ~/installed-port-list`
    

Для обновления с помощью утилиты portupgrade установить ports-mgmt/portupgrade

Файлы скриптов для обновления с помощью утилиты portupgrade (файлы нужно поместить в каталог /root/portupgrade и дать разрешение на запуск только пользователю root)

  • kommand0_pered.sh, выполняется обновление портов, сохранение списка портов, подлежащих обновлению в файле spisok.log, загрузка файлов дистрибутивов в каталог /usr/ports/distfiles

    #!/bin/sh
    svn update /usr/ports && portsdb -Fu && (pkg version -vPl '<' > spisok.log) && portupgrade -Fa
    

    После выполнения скрипта нужно прочесть файл /usr/ports/UPDATING с замечаниями по проведению обновления. Действовать в соответствие с замечаниями

  • kommand0.sh, выполняется обновление, результат сохраняется в файле result0.log

    #!/bin/sh
    portupgrade -l /root/portupgrade/result0.log \
    -ca
    

    Прервать обновление можно командой (идентификатор_процесса - идентификатор процесса ruby, который выполняет текст программы portupgrade)

    kill -TERM идентификатор_процесса
    

    После прерывания или после завершения обновления будет создан файл отчёта /root/portupgrade/result0.log, содержащий строки с именами портов. Если порт успешно обновлён, в начале строки будет стоять символ '+'. При повторном выполнении обновления, успешно обновлённые порты можно исключить из обновления с помощью опции утилиты portupgrade -x

  • kommand1.sh, обновление, результат сохраняется в файле result1.log, имя_порта1, имя_порта2, имя_порта3 - имена портов, успешно установленных при запуске предыдущего командного файла

    #!/bin/sh
    portupgrade -l /root/portupgrade/result1.log \
    -ca \
    -x имя_порта1 \
    -x имя_порта2 \
    -x имя_порта3
    

    Получить имена портов имя_порта1, имя_порта2, имя_порта3 можно с помощью команды

    awk '$1~/\+/{print "-x "$2}' result0.log
    
  • kommand0_posle.sh, удаление файлов из каталога /usr/ports/distfiles, на которые не ссылается ни один установленный порт, и файлов неиспользуемых библиотек

    #!/bin/sh
    portsclean -DD && rm -R /usr/local/lib/compat/pkg
    

Создание и установка ядра и мира

Предварительные действия

  1. скопировать оригинальный файл конфигурации ядра в каталог /root/kernels

    cd /usr/src/sys/amd64/conf
    mkdir /root/kernels
    cp GENERIC /root/kernels/MICKERNEL123
    

    В каталоге /usr/src/sys/amd64/conf создать символьную ссылку на копию

    cd /usr/src/sys/amd64/conf
    ln -s /root/kernels/MICKERNEL123
    
  2. отредактировать файл конфигурации ядра /root/kernels/MICKERNEL123

  3. отредактировать файл /etc/make.conf на основе файла /usr/share/examples/etc/make.conf, добавить опции

    CPUTYPE?=native
    
    # NETGRAPH
    MODULES_OVERRIDE=netgraph/netgraph netgraph/ether netgraph/iface rc4 netgraph/mppc netgraph/ppp netgraph/pppoe netgraph/socket netgraph/tcpmss netgraph/tee
    
    # IPFW
    MODULES_OVERRIDE+=ipfw ipfw_nat dummynet libalias
    
    # OTHER
    MODULES_OVERRIDE+=mac_ntpd cpuctl coretemp usb/ums linux_common linux64 linux linprocfs libiconv cd9660_iconv msdosfs_iconv
  4. отредактировать файл /etc/src.conf (задать переменные для компиляции /usr/src, при компиляции портов они работать не будут)

    WITHOUT_AMD=
    WITHOUT_FLOPPY=
    WITHOUT_FREEBSD_UPDATE=
    WITHOUT_IPFILTER=
    WITHOUT_IPX=
    WITHOUT_LPR=
    WITHOUT_PORTSNAP=
    WITHOUT_PROFILE=
    WITHOUT_SYSINSTALL=
    WITHOUT_TELNET=
    WITHOUT_WIRELESS=
    WITHOUT_WPA_SUPPLICANT_EAPOL=
    WITHOUT_ZFS=
    WITHOUT_ZONEINFO=

Основные действия

  1. выполнить команды (компиляция из исходных текстов)

    cd /usr/src
    make -j4 buildworld
    make buildkernel KERNCONF=MICKERNEL123
    
  2. выполнить команды (установка ядра и мира)

    cd /usr/src
    make installkernel KERNCONF=MICKERNEL123
    shutdown -r now
    cd /usr/src
    make installworld
    shutdown -r now
    
  3. выполнить команды (завершение установки)

    mergemaster -Ui
    cd /usr/src
    make -DBATCH_DELETE_OLD_FILES delete-old
    make -DBATCH_DELETE_OLD_FILES delete-old-libs
    shutdown -r now
    

Перед обновлением можно удалить временный каталог /usr/obj

cd /usr/src
make cleanworld

Установка ОС на жёсткий диск с рабочего ПК

Рассмотрим пример установки ОС на жёсткий диск (устройство /dev/ad2)

  1. разбить диск

    1. создать единственный слайс

      fdisk -BI /dev/ad2
      
    2. создать раздел для /

      bsdlabel -Bw /dev/ad2s1
      
    3. создать разделы для swap (ad2s1b), var (ad2s1d), tmp (ad2s1e), usr (ad2s1f)

      bsdlabel -e /dev/ad2s1
      
    4. создать файловые системы для /, /var, /tmp, /usr

      newfs /dev/ad2s1a
      newfs -U /dev/ad2s1d
      newfs -U /dev/ad2s1e
      newfs -U /dev/ad2s1f
      
  2. отредактировать файл конфигурации ядра /root/kernels/MICKERNEL72_starijPK, файлы /etc/make.conf и /etc/src.conf

  3. смонтировать файловую систему

    mount /dev/ad2s1a /mnt
    mkdir /mnt/var
    mount /dev/ad2s1d /mnt/var
    mkdir /mnt/tmp
    mount /dev/ad2s1e /mnt/tmp
    mkdir /mnt/usr
    mount /dev/ad2s1f /mnt/usr
    
  4. выполнить команды

    cd /usr/src
    make buildworld buildkernel KERNCONF=MICKERNEL72_starijPK
    setenv DESTDIR /mnt
    make installworld installkernel KERNCONF=MICKERNEL72_starijPK
    cd /usr/src/etc
    make distribution
    
  5. создать файл /mnt/etc/fstab

    # Device                Mountpoint      FStype  Options         Dump    Pass#
    /dev/ad2s1b             none            swap    sw              0       0
    /dev/ad2s1a             /               ufs     rw              1       1
    /dev/ad2s1e             /tmp            ufs     rw              2       2
    /dev/ad2s1f             /usr            ufs     rw              2       2
    /dev/ad2s1d             /var            ufs     rw              2       2
    #/dev/acd0              /cdrom          cd9660  ro,noauto       0       0
    proc                    /proc           procfs  rw              0       0
  6. выполнить команды

    umount /mnt/usr
    umount /mnt/var
    umount /mnt/tmp
    umount /mnt
    
  7. удалить временные файлы и каталоги после создания мира и ядра

Служебные задачи

  • пример форматирования диска с размером сектора 4 Кбайт (устройство /dev/ada1) с использованием таблицы разделов GUID. На диске создаётся один раздел (метка раздела gpdata, файловая система UFS2, soft updates включен), который выравнен по границе в 4 Кбайт

    gpart create -s gpt ada1
    gpart add -t freebsd-ufs -l gpdata -a 4k ada1
    newfs -U -f 4096 ada1p1
    

    Для проверки, выравнен раздел или нет, выполнить команду diskinfo -v ada1p1. Если остаток от деления между stripeoffset и 4096 не ноль, значит раздел не выравнен.

    В /etc/fstab добавить для автоматического монтирования созданного раздела к точке монтирования /usr/gamma

    /dev/gpt/gpdata         /usr/gamma      ufs     rw              2       2
  • пример форматирования USB флеш-накопителя (устройство /dev/da0) в файловую систему FAT16

    dd if=/dev/zero of=/dev/da0 bs=512 count=32
    fdisk -I da0
    dd if=/dev/zero of=/dev/da0s1 bs=512 count=32
    newfs_msdos /dev/da0s1
    
  • пример загрузки файла http://site.ru/file.zip

    wget -c --output-document=file1.zip -T 120 "http://site.ru/file.zip"
    

    Если загрузка прекратится, она будет возобновлена с последнего места. Файл сохраняется в текущем каталоге с именем file1.zip

  • пример сихронизации каталога /mnt/ФОТО (источник) с каталогом /usr/ФОТО (назначение)

    rsync -avzci --delete --log-file="/root/rsync/FOTO.log" /mnt/ФОТО/ /usr/ФОТО
    

    Если файл не существует в первом каталоге, но есть во втором, то файл удаляется из второго каталога. Лог сохраняется в файле /root/rsync/FOTO.log. Для сравнения файлов используется контрольная сумма. Чтобы показать изменения, произведённые rsync, использовать команду

    awk '$4~/>|\+|\*deleting/{print}' /root/rsync/FOTO.log
    
  • пример определения списка подключённых устройств PCI

    pciconf -l
    
  • пример копирования содержимого каталога /usr в каталог /mnt

    cd /usr
    tar --create --file=- * | ( cd /mnt/ ; tar --extract --file=- )
    
  • пример установки часового пояса г. Иркутск на локальном компьютере

    ln -s /usr/share/zoneinfo/Asia/Irkutsk /etc/localtime
    

    пример обновления определений часовых поясов (порт misc/zoneinfo следует удалить перед установкой мира, если в файле /etc/src.conf не определена переменная WITHOUT_ZONEINFO)

    make -C /usr/ports/misc/zoneinfo install clean
    
  • пример поиска файлов, созданных или изменённых 10 декабря 2009 года с 10:00 до конца дня. Результат отображается в "длинном" формате

    find / -type f \( -newermt "10 Dec 2009 10:00" -and -not -newermt "11 Dec 2009" \) -exec ls -al {} \;
    
  • два примера сохранения текста помощника в файл

    man write | colcrt > write.txt
    man write | perl -ne 's/.\010//g; print' > write.txt
    
  • для проверки модулей оперативной памяти установить порт sysutils/memtest86+. Загрузить операционную систему в режиме "loader prompt" и выполнить команды

    unload
    load /boot/opt/memtest86+
    boot
    
  • для преобразования кодировок есть 2 полезных порта: converters/iconv (для преобразования кодировки содержимого файла) и converters/convmv (для преобразования кодировки имени файла)

  • пример отправки почты с вложением и архивированием на адрес you@domain.ru

    gzip -c text | uuencode text.gz | mail -s TEST you@domain.ru
    
  • для проверки диска установить порт sysutils/smartmontools и выполнить команду (например, для диска /dev/ada0)

    smartctl -a /dev/ada0 | grep -i reallocated
    

    Если в последнем столбце цифры больше 0, можно подумать о замене диска

Литература

  1. man 7 build
    man 7 ports
    man 7 hier
    man 7 security
    man 7 tuning
    
  2. Peter N.M. Hansteen - Firewalling with OpenBSD's PF packet filter

  3. Немет Эви, Снайдер Гарт, Хейн Трент - Руководство администратора Linux, 2-е издание.: Пер. с англ. - М.: ООО "И.Д. Вильямс", 2007. - 1072 с.

  4. Соловьёв А. - Программирование на Shell (UNIX)

Полезные скрипты

  1. определение количества файлов и подкаталогов в заданном каталоге, а также занимаемого объёма

    Параметры: имя каталога

    Содержимое файла papki.sh

    #!/bin/sh
    
    usage()
    {
        echo "$0 <dirname>"
    }
    
    if [ -z "$1" ];then
        usage
        exit 0
    fi
    
    if [ -d "$1" ];then
    
    echo "В каталоге $1:"
    echo " файлов    `find "$1" -type f | wc -l`"
    echo " каталогов `find "$1" -type d -mindepth 1 | wc -l`"
    echo "общий размер файлов `find "$1" -type f -exec stat -f %z {} \; | awk '{s+=$1}END{print s}'` байт"
    
    else
        echo "$1 не является каталогом"
        exit 0
    fi
    
  2. генерация случайного пароля заданной длины

    Параметры: длина пароля (целое число). Если не задана, по умолчанию равна 20

    Содержимое файла genparol.sh

    #!/bin/sh
    
    usage()
    {
        echo "$0 dlina(>0)"
    }
    
    t=$1
    
    if   [ -z "$t" ];then
        t=20
    fi
    
    if [ $t -le 0 ];then
        usage
        exit 0
    fi
    
    LC_CTYPE=C tr -dc A-Za-z0-9_ < /dev/urandom | head -c $t | xargs