Sieve: обработка почтыв момент доставки пользователю Рашид Ачилов # cd /usr/ports/mail/dovecot2-pigeonhole && make install clean protocols = $protocols sieve service managesieve-login { inet_listener sieve { port = 4190 } service_count = 1 mail_max_userip_connections = 10 managesieve_implementation_string = Dovecot Pigeonhole managesieve_implementation_string = Cyrus timsieved v2.2.13 sieve_dir = ~/sieve protocol lda { mail_plugins = $mail_plugins sieve } protocol lmtp { mail_plugins = $mail_plugins sieve } protocols = imap pop3 lmtp sieve require ["envelope", "fileinto", "reject", "vacation", "regex", "relational"]; keep; require ["envelope", "fileinto", "reject", "vacation", "regex", "relational"]; if address :is "from" "spamer@spamera.net" { fileinto "All junk/Spamer"; } elsif address :contains "from" "megaspam" { fileinto :permissions "g=rw,o=r" "All junk/Megaspam"; } else { keep; } if (условие) { действие} [elsif (условие) { действие }] else (условие) { действие } address :<как сравнивать> :<какую часть> "заголовок" "значение" fileinto [:permissions "права"] "папка" require ["envelope", "fileinto", "reject", "vacation", "regex", "relational"]; if anyof ( address :count "gt" ["to"] ["5"], header :value "ge" "X-Spam-Score" "17" ) { fileinto "SPAM"; } require ["envelope", "fileinto", "reject", "vacation", "regex", "relational"]; if header :contains "Content-Type" [ "GB2312", "big5" ] { discard; } elsif not header :matches "Cc" "?*" { fileinto "All Junk/NoCC"; } elsif size :over 2048K { discard; } else { keep; } header :<как сравнивать> "заголовок" "текст заголовка" size :<условность> размер require "envelope", "fileinto", "reject", "vacation", "regex", "relational"]; if envelope :is "from" "thespamer@spamera.net" { reject text: You are spammer. Go away. Spammers must die! . ; } elsif envelope :contains "to" "blabla" { reject "Blabla blabla" } elsif not exists ["From", "Date"] { redirect "bigspam@spamera.net"; } else { keep; } envelope :<какую часть> :<как сравнивать> "заголовок" "текст" exists "заголовок" require ["envelope", "fileinto", "reject", "vacation", "regex", "relational"]; if allof ( anyof ( header :regex "Subject" "^=\\?(gb|GB)2312\\?", header :regex "Subject" "^=\\?big5\\?", header :contains "Content-Type" [ "GB2312", "big5" ] ), not allof ( header :value "lt" : comparator "i;ascii-numeric" "X-Spam-Score" "3", header :value "gt" :comparator "i; acsii-numeric" "X-Spam-Score" "0" ) ) { discard; stop; } ----------------------------------------------------------------------------------------------------------------- Система AIX. Установка Base Operating System Антон Борисов Листинг 1. Список сервисов, запускаемых с помощью inetd # lssrc -ls inetd # lslpp -l | grep ssh smitty installp Листинг 2. Клиентская и серверная части к OpenSSH установлены успешно # lslpp -l | grep ssh lssrc -a | grep ssh # mount -v cdrfs -r /dev/cd0 /mnt # smitty installp rpm -ih ./bash-3.2-1.aix5.2.ppc.rpm odmget -q "name=en0" CuAt ----------------------------------------------------------------------------------------------------------------- Автоматическое управление FTP-соединениями в домене Иван Коробко ftp:\\Имя:Пароль@Адрес:Порт explorer.exe ftp://Ivanov:Pa$$w0rd@ftp.site.ru Листинг 1. Управление режимом работы FTP Windows Registry Editor Version 5.00 [HKEY_CURRENT_USER\Software\Microsoft\FTP] "Use PASV"="no" "Use Web Based FTP"="no" Листинг 2. Командный файл для создания активного FTP-соединения @echo=off start /wait /b regedit.exe /s \\msk\netlogon\ftp\active.reg explorer.exe ftp://Ivanov:Pa$$w0rd@ftp.site.ru Листинг 3. Шаблон конфигурационного XML-файла Листинг 4. Создание FTP-соединения с помощью PowerShell # Чтение параметра, с которым запущен сценарий $ftpObj=$args[0] # Чтение данных из XML-файла [XML]$xml = Get-Content -Path "\\ДОМЕН\NETLOGON\FTP\ftp.xml" # Поиск нужного подраздела $xmlObj = $xml.root.ftp | ?{$_.name -eq $ftpObj} # Чтение параметров FTP-соединения $value = $xmlObj.ActiveMode $user=$xmlObj.User $pwd=$xmlObj.Password $url=$xmlObj.Address # Определение режима работы FTP (активный/пассивный) if ($value -eq 1) {$regValue="no"} else {$regValue="yes"} Set-ItemProperty -Path HKCU:\Software\Microsoft\FTP -Name "Use PASV" -Value $regValue Set-ItemProperty -Path HKCU:\Software\Microsoft\FTP -Name " Use Web Based FTP" -Value "Name" # Создание FTP-соединения Start-Process -FilePath explorer.exe -ArgumentList ("ftp://{0}:{1}@{2}" -f $user,$pwd,$url) c:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -version 1.0 -windowstyle Hidden \\DOMAIN\NETLOGON\FTP\ftp.ps1 НАЗВАНИЕ_РАЗДЕЛА ----------------------------------------------------------------------------------------------------------------- Установка lightsquid для squid на операционной системе CentOS 6.0 Григорий Антропов [root@srv1 ~]# chkconfig --list | grep httpd [root@srv1 ~]# chkconfig httpd on [root@srv1 ~]# mkdir /opt/www-sites [root@srv1 ~]# mkdir /opt/www-sites/default [root@srv1 ~]# mkdir /opt/www-site/default_ssl #NameVirtualHost *:80 Листинг 1. Файл /etc/httpd/conf.d/00_default.conf # default web site ServerName FQDN_of_host ServerAlias host_short_name alias1 alias2 localhost ServerAdmin root@localhost DocumentRoot /opt/www-sites/default Order allow,deny Allow from all [root@srv1 ~]# service httpd start [root@srv1 ~]# yum install mod_ssl [root@srv1 ~]# cp /etc/httpd/conf.d/ssl.conf /etc/httpd/conf.d/ssl.conf.ORIG Листинг 2. Файл /etc/httpd/conf.d/ssl.conf LoadModule ssl_module modules/mod_ssl.so Listen 443 SSLSessionCache shmcb:/var/cache/mod_ssl/scache(512000) SSLSessionCacheTimeout 600 Листинг 3. Файл /etc/httpd/conf.d/00_defaul_ssl.conf # default ssl site SSLEngine on SSLCertificateFile /etc/pki/tls/certs/ca.crt SSLCertificateKeyFile /etc/pki/tls/private/ca.key ServerName FQDN_of_host ServerAlias host_short_name alias1 alias2 localhost ServerAdmin root@localhost DocumentRoot /opt/www-sites/default_ssl ErrorLog logs/ssl_error_log TransferLog logs/ssl_access_log LogLevel warn Order allow,deny Allow from all [root@srv1 ~]# mkdir /opt/masters/cert [root@srv1 ~]# cd /opt/masters/cert [root@srv1 ~]# openssl genrsa -out ca.key 1024 [root@srv1 ~]# openssl req -new -key ca.key -out ca.csr -subj "/C=RU/O=YourOrg/L=Moscow/CN= FQDN_of_host/CN= host_short_name" [root@srv1 ~]# chmod 0600 ca.key [root@srv1 ~]# chmod 0600 ca.csr [root@srv1 ~]# chmod 0644 ca.crt [root@srv1 ~]# cp ca.key /etc/pki/tls/private/ [root@srv1 ~]# cp ca.csr /etc/pki/tls/private/ [root@srv1 ~]# cp ca.crt /etc/pki/tls/certs/ [root@srv1 ~]# service httpd restart [root@srv1 ~]# yum install lightsquid lightsquid-apache [root@srv1 ~]# mv /usr/share/lightsquid /opt/www-sites require "/usr/share/lightsquid/common.pl" require "/opt/www-sites/lightsquid/common.pl" #path to additional `cfg` files $cfgpath ="/etc/lightsquid"; #path to `tpl` folder $tplpath ="/opt/www-sites/lightsquid/tpl"; #path to `lang` folder $langpath ="/opt/www-sites/lightsquid/lang"; #path to `report` folder $reportpath ="/opt/www-sites/lightsquid"; #path to access.log $logpath ="/var/log/squid"; #path to `ip2name` folder $ip2namepath ="/opt/www-sites/lightsquid/ip2name" $lang ="ru"; $showgrouplink = 0; $graphmaxuser=0.60*(1024*1024*1024); [root@srv1 ~]# cp /opt/www-sites/lightsquid/lang/ru.lng /opt/www-sites/lightsquid/lang/ru.lng.ORIG Листинг 4. Файл /etc/httpd/conf.d/00_defaul.conf # lightsquid web site ServerName FQDN_of_host ServerAlias host_short_name alias1 alias2 localhost ServerAdmin root@localhost DocumentRoot /opt/www-sites/lightsquid/cgi DirectoryIndex index.cgi Options ExecCGI AddHandler cgi-script.cgi AllowOverride None Order allow,deny Allow from all [root@srv1 ~]# cd /etc/lightsquid [root@srv1 ~]# /opt/www-sites/lightsquid/check-setup.pl [root@srv1 ~]# service httpd restart require "/usr/share/lightsquid/common.pl"; require "/usr/share/lightsquid/ip2name/ip2name.$ip2name"; require "/opt/www-sites/lightsquid/common.pl"; require "/opt/www-sites/lightsquid/ip2name/ip2name.$ip2name"; [root@srv1 ~]# /usr/sbin/lightparser.pl Листинг 5. Вспомогательный сценарий #!/bin/bash # # Вспомогательный сценарий для lightsquid # Служит для заполнения файла skipuser.cfg # IP-адресами из локальных подсетей # if [ $# -lt 4 ]; then echo "Применение:" echo "ip-helper network start stop out_file_path" echo "где network – подсеть (по границе байта)" echo "в виде xxx.xxx.xxx (пример: 172.23.201)" echo "start – начальный адрес в подсети (пример: 12)" echo "stop – конечный адрес в подсети (пример: 243)" echo "out_filepath – полный путь к создаваемому echo "файлу, если полный путь не указан," echo "файл будет создан в текущем каталоге." echo "Если файла нет, будет создан файл с содержимым:" echo "xxx.xxx.xxx.start" echo "........" echo "xxx.xxx.xxx.stop" echo "Если файл есть, в конец файла будет добавлено" echo "указанное выше содержимое." echo "Внимание! Задавайте корректные значения" echo "подсети, начальный и конечные адреса," echo "сценарий достаточно глуп, чтобы контролировать" echo "эти величины." exit 1 fi s=$(echo $2 | tr -d 0-9) if [ ! -z "${s}" ]; then echo "Ошибка:" echo "start – начальный адрес в подсети –" echo "должно быть число." exit 1 fi s=$(echo $3 | tr -d 0-9) if [ ! -z "$s" ]; then echo "Ошибка:" echo "stop – конечный адрес в подсети –" echo "должно быть число." exit 1 fi if [ $2 -gt 254 ]; then echo "Ошибка:" echo "start – начальный адрес в подсети" echo "не может быть больше 254." exit 1 fi if [ $3 -gt 254 ]; then echo "Ошибка:" echo "stop – конечный адрес в подсети" echo "не может быть больше 254." exit 1 fi if [ $2 -ge $3 ]; then echo "Ошибка:" echo "начальный адрес в подсети (пример: 12) должен" echo "быть больше, чем конечный адрес в подсети" echo "(пример: 243)" exit 1 fi if [ ! -f ${4} ]; then echo "# network=${1}/24 startIP=${2} stopIP=${3}" > $4 else echo "# network=${1}/24 startIP=${2} stopIP=${3}" >> $4 fi if [ ! $? -eq 0 ]; then echo "Не могу записать результат в файл ${4}," echo "проверьте путь и права доступа" exit 1 fi for (( i=$2; i<=$3; i+=1 )); do echo "${1}.${i}" >> $4 done echo "Результат записан в файл ${4}" example\buratinokd Деревяшкин Буратино Карлович example\karabasbb Бродатый Карабас Барабас wbinfo -i UserLogonName Листинг 6. Файл сценария userrealname #!/bin/bash # # Описание: этот сценарий служит для создания файла # соответствия между logonName и DisplayName пользователей # домена Windows для генерации отчетов с помощью lightsquid # # Замечания: все входные переменные, необходимые # для сценария, должны располагаться в файле с именем # . # Этот файл должен находиться в том же каталоге, # в котором находится сам сценарий . # PATH=$PATH:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr:/local/sbin export PATH # Получить имя сценария и полный путь к сценарию: scriptname=`basename $0` tmp=$(readlink -f $0) scriptpath=`dirname $tmp` # Прочитать переменные из конфигурационного файла: . "${scriptpath}/${scriptname}.conf" if [ ! $? -eq 0 ] ; then errmsg="$(date)\n!!! Ошибка: Файл ${scriptpath}/${scriptname}.conf имеет ошибки синтаксиса или отсутствует\n. Проверьте файл и запустите сценарий снова\n---" echo -e ${errmsg} >> "${scriptpath}/${scriptname}-configuration.error" echo -e ${errmsg} exit 1 fi # Проверить наличие каталога lightsquid if [ ! -d ${lightsquiddir} ]; then errmsg="$(date)\n!!! Ошибка: Каталог lightsquid=${lightsquiddir} не найден\n. Проверьте правильность задания переменной lightsquiddir\n---" echo -e ${errmsg} >> "${scriptpath}/${scriptname}-configuration.error" echo -e ${errmsg} exit 1 fi # Создать каталог для log-файлов: logdir="${scriptpath}/log" if [ ! -d "${scriptpath}/log" ]; then mkdir "${scriptpath}/log" if [ "$?" -ne 0 ] ; then errmsg="$(date)\n!!! Ошибка: Не могу создать каталог ${scriptpath}/log\n. Проверьте права доступа к каталогу ${scriptpath}\n---" echo -e $errmsg >> "${scriptpath}/${scriptname}-configuration.error" echo -e $errmsg exit 1 fi fi # Начало процесса (для записи в logfile) begintm=`date` # Log-файл filedate=`date +%Y%m%d` report="${logdir}/${scriptname}-${filedate}.txt" # Проверить наличие wbinfo which wbinfo > /dev/null if [ ! $? -eq 0 ] ; then errmsg="$(date)\n!!! Ошибка: Отсутствует утилита wbinfo\n.Сценарий не может быть выполнен\n---" echo -e ${errmsg} >> "${scriptpath}/${scriptname}-configuration.error" echo -e ${errmsg} exit 1 fi # Получить свой Windows-домен owndom=$(wbinfo --own-domain) # Получить пользователей из своего домена usersfile="${lightsquiddir}/${realname}" if [ -f "${usersfile}" ]; then $(rm -f "${usersfile}") fi i=0 domainpref=$(echo "${owndom}" | tr "[:upper:]" "[:lower:]") for u in $(wbinfo -u --domain="${owndom}"); do ui=$(echo "${u}" | sed 's/\\/\\\\/') # LogonName для правильной работы lightsquid должно быть # в нижнем регистре: ul=$(echo "${u}" | tr "[:upper:]" "[:lower:]") fullname=$(wbinfo -i "${ui}" | cut -d ':' -f 5) echo "${domainpref}\\${ul} ${fullname}" >> "${usersfile}" let i=i+1 done # Удалить старые log-файлы: $(find ${logdir} -maxdepth 1 -type f -mtime "+${logdays}" -exec rm {} \;) # Записать результат работы в log- файл: echo -e "Начало процесса: ${begintm}" >> "${report}" echo -e "Домен windows ${owndom}" >> "${report}" echo -e "Экспориторовано учетных записей: ${i}" >> "${report}" echo -e "Окончание процесса: `date`" >> "${report}" echo -e "---" >> "${report}" Листинг 7. Файл userrealname.conf конфигурации сценария # Конфигурационный файл входных переменных. # Этот файл должен содержать только комментарии # и переменные, необходимые для работы сценария, # с использованием синтаксиса bash. # Путь к каталогу размещения файла соответствия logonName CN. # Пример: lightsquiddir="/etc/lightsquid" lightsquiddir="/etc/lightsquid" # Имя файла lightsquid, в котором находятся соответствия # между logonName и CN. # Пример: realname=realname.cfg realname="realname.cfg" # Время жизни файлов журнала в днях. # Файлы журналов создаются в каталоге log. # Файлы старше logdays будут удалены. # Пример: logdays=30 logdays=7 [root@srv1 ~]# yum install mod_authz_ldap Листинг 8. Ограничение доступа к сайту отчетов # lightsquid web site ServerName FQDN_of_host ServerAlias host_short_name alias1 alias2 localhost ServerAdmin root@localhost DocumentRoot /opt/www-sites/lightsquid/cgi AuthBasicProvider ldap AuthType Basic AuthName "Squid reports" AuthLDAPURL "ldap://dc01_FQDN:3268 dc02_FQDN:3268/dc=example,dc=local?sAMAccountName?sub?(ObjectClass=user)" AuthLDAPBindDN AD-reader@example.local AuthLDAPBindPassword ↵ "password_of_AD-Reader" DirectoryIndex index.cgi Options ExecCGI AddHandler cgi-script .cgi AllowOverride None Require ldap-group cn=allow_squid_reports,ou=squid,ou=Test Container,dc=example,dc=local Order allow,deny Allow from 127.0.0.1 Allow from ::1 Satisfy any AuthLDAPURL "ldap://dc01_FQDN:3268 hq- dc02_FQDN:3268/dc=example,dc=local?sAMAccountName?sub?(ObjectClass=user)" Require ldap-group cn=allow_squid_reports,ou=squid,ou=Test Container,dc=example,dc=local Allow from 127.0.0.1, Allow from ::1 Satisfy any Require ldap-group cn=....( distinguishedName группы Active Directory) Листинг 9. Конфигурационный файл apache, перенаправляющий соединение HTTP на HTTPS # default web site ServerName FQDN_of_host ServerAlias host_short_name alias1 alias2 localhost ServerAdmin root@localhost RewriteEngine on RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} Листинг 10. Конфигурационный файл etc/httpd/conf.d/00_default_ssl.conf для соединения по протоколу HTTPS # default ssl lightsquid site SSLEngine on SSLCertificateFile /etc/pki/tls/certs/ca.crt SSLCertificateKeyFile /etc/pki/tls/private/ca.key ServerName FQDN_of_host ServerAlias host_short_name alias1 alias2 localhost ServerAdmin root@localhost ErrorLog logs/ssl_error_log TransferLog logs/ssl_access_log LogLevel warn DocumentRoot /opt/www-sites/lightsquid/cgi AuthBasicProvider ldap AuthType Basic AuthName "Squid reports" AuthLDAPURL "ldap://dc01_FQDN:3268:3268 hq- dc02_FQDN:3268/dc=example,dc=local?sAMAccountName?sub?(ObjectClass=user)" AuthLDAPBindDN AD-reader@example.local AuthLDAPBindPassword "password_of_AD-Reader" DirectoryIndex index.cgi Options ExecCGI AddHandler cgi-script .cgi AllowOverride None Require ldap-group cn=allow_squid_reports,ou=squid,ou=Test Container,dc=example,dc=local Order allow,deny Allow from 127.0.0.1 Allow from ::1 Satisfy any [root@srv1 ~]# mkdir /opt/www-sites/proxyautoconfig Листинг 11. Сценарий proxy autoconfiguration // SQUID-сервер var ProxyAddress="172.24.131.10:3128"; // Внутренние сайты, ходить без SQUID function MakeNames() { this[0]="*internal_domain_1*"; this[1]="*internal_domain_2*"; } DirectNames=new MakeNames(); var cDirectNames=2; // Внутренние подсети, ходить без SQUID function MakeIPs() { this[0]="127.0.0.0"; this[1]="255.255.255.0"; this[2]="172.0.0.0"; this[3]="255.0.0.0"; } DirectIPs=new MakeIPs(); var cDirectIPs=4; function FindProxyForURL(url, host) { if(isPlainHostName(host)) return "DIRECT"; for(i=0; i ServerName FQDN_of_host ServerAlias host_short_name alias1 alias2 localhost ServerAdmin root@localhost RewriteEngine on RewriteCond %{REQUEST_URI} !^/wpad\.dat RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} DocumentRoot /opt/www-sites/proxyautoconfig AddType application/x-ns-proxy-autoconfig .dat Order allow,deny Allow from all DocumentRoot /opt/www-sites/proxyautoconfig AddType application/x-ns-proxy-autoconfig .dat Order allow,deny Allow from all RewriteCond %{REQUEST_URI} !^/wpad\.dat ----------------------------------------------------------------------------------------------------------------- Мультиуправление с единой клавиатурой и мышью Антон Борисов Листинг 1. Пример конфигурации для серверной части Synergy section: screens a-bs-mac-mini.local: halfDuplexCapsLock = false halfDuplexNumLock = false halfDuplexScrollLock = false xtestIsXineramaUnaware = false switchCorners = none +top-left +bottom-left switchCornerSize = 0 laptop: halfDuplexCapsLock = false halfDuplexNumLock = false halfDuplexScrollLock = false xtestIsXineramaUnaware = false switchCorners = none switchCornerSize = 0 trimslice: halfDuplexCapsLock = false halfDuplexNumLock = false halfDuplexScrollLock = false xtestIsXineramaUnaware = false switchCorners = none +top-right +bottom-right switchCornerSize = 0 end section: aliases end section: links a-bs-mac-mini.local: right = laptop laptop: right = trimslice left = a-bs-mac-mini.local trimslice: left = laptop end section: options heartbeat = 5000 relativeMouseMoves = false screenSaverSync = true win32KeepForeground = false switchDelay = 250 switchCorners = none switchCornerSize = 0 keystroke(Control+Shift+1) = switchToScreen(a-bs-mac-mini.local) keystroke(Control+Shift+2) = switchToScreen(laptop) keystroke(Control+Shift+3) = switchToScreen(trimslice) end ----------------------------------------------------------------------------------------------------------------- Файловый сервер для Windows-сети Игорь Орещенков FRAMEBUFFER = Y sudo update-initramfs -u UTC=yes UTC=no #!/bin/sh ntpdate firmnet.localdomain $ sudo chmod 0755 /etc/cron.daily/ntpdate $ sudo /etc/cron.daily/ntpdate start on (local-filesystems and net-device-up) start on (local-filesystems and net-device-up and started cups) samba-interop-install --check-version $ sudo service winbind stop $ sudo service smbd stop $ sudo service nmbd stop $ sudo mv /etc/samba/smb.conf /etc/samba/smb.conf.0 $ sudo nano /etc/samba/smb.conf [global] workgroup = FIRMNET realm = FIRMNET.LOCALDOMAIN security = ADS idmap config * : range = 10000-19999 idmap config * : backend = tdb [dbase] comment = 1C Database path = /srv/fileserver/dbase valid users = @FIRMNET\sale-grdbase read only = No [office] comment = Common files path = /srv/fileserver/office valid users = @FIRMNET\sale-groffice read only = No ... password: files winbind group: files winbind hosts: files dns winbind ... $ sudo net ads join -U Administrator%password $ sudo service nmbd start $ sudo service smbd start $ sudo service winbind start $ wbinfo -u $ wbinfo -g $ getent passwd FIRMNET\\sale-chef $ sudo wbinfo -a FIRMNET\\sale-chef%password C:\> net view \\salesrv $ sudo mount -v -o remount /srv/fileserver/dbase $ sudo mount -v -o remount /srv/fileserver/office $ sudo setfacl -m g:FIRMNET\\sales-grdbase:rwx /srv/fileserver/dbase $ sudo setfacl -m g:FIRMNET\\sales-groffice:rwx /srv/fileserver/office $ sudo setfacl -m -d g:FIRMNET\\sales-grdbase:rwx /srv/fileserver/dbase $ sudo setfacl -m -d g:FIRMNET\\sales-groffice:rwx /srv/fileserver/office ----------------------------------------------------------------------------------------------------------------- Что в имени тебе моем, или Удаленный анализ сети. Часть 3. Идентификация Андрей Бирюков > tracert 100.1.1.2 -d Nmap -sS 192.168.10.2 -n Nmap -sT 192.168.10.2 -n Nmap -sU 192.168.10.2 -n Nmap -O <сканируемый узел> -vv –n > telnet 192.168.1.2 5000 > telnet smtp.ru 25 ----------------------------------------------------------------------------------------------------------------- Безопасность протокола OSPF Андрей Бирюков метрика = reference bandwidth / link bandwidth interface eth0 description DMZ_Network ip ospf authentication message-digest ip ospf message-digest-key 1 md5 secret_key interface eth1 interface 10 interface tun10 router ospf ospf router-id 192.168.20.111 redistribute kernel redistribute connected network 192.168.20.0/24 area 0.0.0.0 area 0.0.0.0 authentication message-digest line vty exec-timeout 30 0 router# show ip ospf router # ip route add 64.100.0.0/14 dev eth0 router # ip route add 128.107.0.0/16 dev eth0 router # sh ip ospf route backtrack / # ./nemesis-ospf backtrack / # ./nemesis-ospf –v –pH –N 128.107.0.1 backtrack / # ./nemesis-ospf –v –pR LSA 128.107.0.1 ip ospf priority 255 bt / # perl IOStack.pl -d 192.168.66.202 -p ****** -e ****** -r stackdump bt / # ./OoopSPF ./OoopSPF -s 192.168.1.0 -n 255.255.255.0 -d 192.168.1.1 -f fakeconfig -t -vv interface ethernet 0 ospf database-filter all out router ospf 109 neighbor 1.2.3.4 database-filter all out ----------------------------------------------------------------------------------------------------------------- РНР-демоны Александр Календарев umask(0); // Пункт 1 $pid = pcntl_fork(); // Пункт 2 if ($pid < 0) { print('fork failed'); exit 1; } if ($pid > 0) // Родительский процесс echo “daemon process started\n”; exit; // Заканчиваем } // (pid > 0) дочерний процесс $sid = posix_setsid();// Пункт 3 if ($sid < 0) exit 2; chdir(‘/’); // Пункт 4 file_put_contents($pidFilename, getmypid() ); // Пункт 6 run_process(); // Запуск цикла обработки данных // Устанавливаем лог-файл ini_set('error_log',$logDir.'/error.log'); // $logDir – обычно /var/log/mydaemon // Закрываем открытые системой файловые дескрипторы // stdin,stdout,stderr fclose(STDIN); fclose(STDOUT); fclose(STDERR); // Перенаправляем stdin в /dev/null $STDIN = fopen('/dev/null', 'r'); // Перенаправляем stdout в лог-файл $STDOUT = fopen($logDir.'/application.log', 'ab'); // Перенаправляем stderr в лог-файл $STDERR = fopen($logDir.'/application.error.log', 'ab'); ob_start(); // Немного измененный пункт 5 var_dump($some_object); // Некоторый вывод $content = ob_get_clean(); // Берет часть выходного буфера и очищает его fwrite($fd_log, $content); // Сохраняет часть данных вывода в лог // Обработчик сигнала function sig_handler($signo) { global $fd_log; switch ($signo) { case SIGTERM: // Действия по обработке сигнала SIGTERM fclose($fd_log); // Закрываем log-файл unlink($pidfile); // Уничтожаем pid-файл exit; break; case SIGHUP: // Действия по обработке сигнала SIGHUP // Перечитываем файл конфигурации и инициализируем данные заново init_data(); break; default: // Прочие сигналы, информация об ошибке } } // Установка обработчика сигнала pcntl_signal(SIGTERM, "sig_handler"); pcntl_signal(SIGHUP, "sig_handler") // Создаем контекст мониторинга базовых событий $base = event_base_new(); // Создаем контекст текущего события, по одному контексту на каждый вид событий $event = event_new(); $errno = 0; $errstr = ''; // Наблюдаемый объект (дескриптор) $socket = stream_socket_server("tcp://$IP:$port", $errno, $errstr); // Устанавливаем в неблокируемый режим stream_set_blocking($socket, 0); // Устанавливаем обработчик на дескриптор event_set($event, $socket, EV_READ | EV_PERSIST, 'onAccept', $base); // Привязываем событие к базовому контексту event_base_set($event, $base); // Добавляем/активируем событие к мониторингу event_add($event); // Функция-обработчик на появление нового соединения function onAccept($socket, $flag, $base) { global $id,$buffers,$ctx_connections; $id++; $connection = stream_socket_accept($socket); stream_set_blocking($connection, 0); // Создаем новый буфер и привязываем обработчики на чтение/запись в буфер или ошибку обработки $buffer = event_buffer_new($connection, 'onRead', NULL, 'onError', $id); // Присоединяем буфер к базовому контексту event_buffer_base_set($buffer, $base); // Выставляем тайм-аут, если не будет сигнала от источника event_buffer_timeout_set($buffer, 30, 30); // Устанавливаем флаги event_buffer_watermark_set($buffer, EV_READ, 0, 0xffffff); // Устанавливаем приоритет event_buffer_priority_set($buffer, 10); // Устанавливаем флаги event_buffer_enable($buffer, EV_READ | EV_PERSIST); $ctx_connections[$id] = $connection; $buffers[$id] = $buffer; } function onRead($buffer, $id) { // Чтение из буфера 256 символов или EOF while($read = event_buffer_read($buffer, 256)) { var_dump($read); } } function onError($buffer, $error, $id) { // Объявляем глобальные переменные, как вариант – переменные класса global $id,$buffers,$ctx_connections; // Деактивируем буфер event_buffer_disable($buffers[$id], EV_READ | EV_WRITE); // Освобождаем контекст буфера event_buffer_free($buffers[$id]); // Закрываем необходимые файловые/сокетные десткрипторы fclose($ctx_connections[$id]); // Освобождаем память, занятую под буферы unset($buffers[$id], $ctx_connections[$id]); } $event2 = event_new(); // Используем в качестве события файловый дескриптор произвольного временного файла $tmpfile = tmpfile(); event_set($event2, $tmpfile, 0, 'onTimer', $interval); $res = event_base_set($event2, $ base); event_add($event2, 1000000 * $interval); Function onTimer( $tmpfile, $flag ,$interval) { $global $base,$event2; if ($event2) { event_delete($event2); event_free($event2); } call_user_function(‘process_data’,$args); $event2 = event_new(); event_set($event2, $tmpfile, 0, 'onTimer', $interval); $res = event_base_set($event2, $ base); event_add($event2, 1000000 * $interval); } $socket=socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_set_nonblock($socket); socket_connect($socket,$host,$port); $event2 = event_new(); event_set($event2, $socket, EV_READ | EV_PERSIST, 'onStatus', $base); event_base_set($event2, $base); event_add($event2); // Удаляем контекст конкретного события из базы мониторинга, выполняется для каждого события event_delete($event); // Освобождаем контекст конкретного события, выполняется для каждого события event_free($event) // Освобождаем контекст базовых событий мониторинга event_base_free($base); nohup php mydaemon.php –master >>/var/log/daemon.log 2>> /var/log/daemon.error.log & service myapp start service myapp start chmod +x /etc/init.d/myapp chown root:root /etc/init.d/myapp #! /bin/sh # appdir = “/usr/share/myapp/app.php” parms = “--master –proc=8 –daemon” if [ ! -x appdir ]; then exit 1 fi if [ -x /etc/rc.d/init.d/functions ]; then . /etc/rc.d/init.d/functions fi RETVAL=0 start () { echo "Starting app" daemon /usr/bin/php $appdir $parms RETVAL=$? [ $RETVAL -eq 0 ] && touch /var/lock/subsys/mydaemon echo return $RETVAL } stop () { echo -n "Stopping $prog: " daemon killproc /usr/bin/fetchmail RETVAL=$? [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/mydaemon echo return $RETVAL } case $1 in start) start ;; stop) stop ;; restart) stop start ;; status) status /usr/bin/mydaemon ;; *) echo "Usage: $0 {start|stop|restart|status}" ;; RETVAL=$? exit $RETVAL if(is_file('app.phar')){ // Уничтожаем предыдущую версию сборки unlink('app.phar'); } // Cоздаем phar-архив $phar = new Phar('app.phar', 0, 'app.phar'); // Используем компрессию gzip $phar->compressFiles(Phar::GZ); // Используем подпись $phar->setSignatureAlgorithm (Phar::SHA1); $files = array(); // Назначаем первым файлом файл из корневой директории проекта $files['bootstrap.php'] = './bootstrap.php'; // Далее включаем все файлы, исключая директории /log и /script и собственно сам файл создания $rd = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('.')); foreach($rd as $file){ if ($file->getFilename() != '..' && $file->getFilename() != '.' && $file->getFilename() != __FILE__) { if ( $file->getPath() != './log'&& $file->getPath() != './script'&& $file->getPath() != '.') // Включаем все остальные файлы, включая файлы конфигураций $files[substr($file->getPath().DIRECTORY_SEPARATOR.$file->getFilename(),2)]=$file->getPath().DIRECTORY_SEPARATOR.$file->getFilename(); } } // Если задана версия сборки в качестве параметра, то определяем константу VER if(isset($opt['version'])) { // Далее это может понадобиться для мониторинга или передачи клиентскому скрипту $version = $opt['version']; $file = "buildFromIterator(new ArrayIterator($files)); // Объявляем файл запуска (аналог функции main()) $phar->setStub($phar->createDefaultStub('bootstrap.php')); $phar = null; #php app.phar ----------------------------------------------------------------------------------------------------------------- От Google до Goldman Sachs. Ищем работу своей мечты за рубежом. Часть 3 Игорь Савчук struct foo { char a; char* b; }; ----------------------------------------------------------------------------------------------------------------- Работа с протоколами TCP/IP в Linux Игорь Штомпель $ sudo apt-get install iproute-doc $ sudo apt-get install traceroute $ sudo apt-get install iptraf $ ip link ip [OPTIONS] OBJECT {COMMAND | help} $ ip l ip link show dev eth0 ip l sh dev eth0 ip link show eth0 ip l sh eth0 $ sudo ip link set eth0 up $ sudo ip l s up eth0 $ sudo ip link set eth0 down $ sudo ip l s down eth0 $ ip link set address 00:12:34:56:78:90 eth0 $ ip l s adderess 00:12:34:56:78:90 eth0 $ sudo ip link set mtu 1400 eth0 $ sudo ip l s mtu 1400 eth0 $ ifconfig $ ifconfig eth0 $ sudo ifconfig eth0 down $ sudo ifconfig eth0 up $ ifconfig eth0 hw ether 00:12:34:56:78:90 $ ip address show $ ip addr sh $ ip address show eth0 $ ip addr sh eth0 $ sudo ip address add 192.168.0.2/24 dev eth0 $ sudo ip addr add 192.168.0.2/24 dev eth0 $ sudo ip address del 192.168.0.2/24 dev eth0 $ ifconfig $ ifconfig eth0 $ sudo ifconfig eth0 inet up 192.168.0.2 netmask 255.255.255.0 //отключаем сетевой интерфейс $ sudo ifconfig eth0 down //удаляем ip-адрес и маску подсети $ sudo ifconfig eth0 del 192.168.0.2 255.255.255.0 //включаем сетевой интерфейс $ sudo ifconfig eth0 up $ ip neigh show $ ip n sh $ ip neigh show dev eth0 $ ip n sh dev eth0 $ sudo ip neigh add 192.168.0.2 lladdr 00:12:34:56:78:90 dev eth0 $ sudo ip n add 192.168.0.2 lladdr 00:12:34:56:78:90 dev eth0 $ sudo ip neigh del 192.168.0.2 dev eth0 $ sudo ip n sh del 192.168.0.2 dev eth0 $ arp $ arp -i eth0 $ sudo arp -s 192.168.0.2 00:12:34:56:78:90 $ sudo arp -d 192.168.0.2 $ ip route show $ ip r sh $ sudo ip route add default via 192.168.0.1 $ sudo ip r add default via 192.168.0.1 $ sudo ip route add 192.168.0.2/24 via 192.168.0.1 $ sudo ip r add 192.168.0.2/24 via 192.168.0.1 $ sudo ip route del 192.168.0.2/24 $ sudo ip r del 192.168.0.2/24 $ route $ route add default gw 192.168.0.1 $ sudo route add -net 192.168.0.2 netmask 255.255.255.0 gw 192.168.0.1 $ route del -net 192.168.0.2 netmask 255.255.255.0 $ ping -c 10 www.samag.ru $ ping -s 1000 www.samag.ru $ traceroute www.samag.ru $ tracepath www.samag.ru $ tracepath www.samag.ru/21 $ less /etc/services $ ss -4antu $ netstat -4antu $ ss -4antul $ ss -p $ netstat -a $ netstat -s $ netstat -i $ netstat -P $ sudo iptraf ----------------------------------------------------------------------------------------------------------------- Представление чисел в памяти ЭВМ. Часть 2. Числа с плавающей точкой/запятой по стандарту IEEE754. Продолжение Павел Закляков $ cat next_float.c #include #include // Этот код будет работать только на архитектуре с 32-битным int. int main (int argc, char *argv[]) { float a; if (argc>=2) { a=strtof(argv[1],NULL); printf("Исходное число: %f=%e\n",a,a); int n = *((int*) &a); float b = *((float*)&(++n)); double diff=(double)b-(double)a; printf("После %e следующее число: %e, разница (%e)\n", a, b, diff); return 0; } else { printf ("Передайте число через параметр командной строки.\n"); return 1; } } $ g++ next_float.c &&./a.out 0.5 $ cat bits_to_float.c #include #include #include void PrintHexNByte(const void * pnt, int n) { unsigned short int i; char *a; for (i=0;i> 24, (a & 0x00ff0000) >> 16, (a & 0x0000ff00) >> 8, (a & 0x000000ff)); printf("В памяти ЭВМ\n"); PrintHexNByte(&a,sizeof(int)); float f = *((float*)&(a)); printf("Число float= %e\n", f); printf("Число float= %e\n", a); return 0; } } $ g++ bits_to_float.c && ./a.out 1 00000000 00000000000000000000001 $ g++ bits_to_float.c && ./a.out 0 11111110 11111111111111111111111 yum install gcc aptitude install gcc $ cat float_max.c #include #include // ISO C Standard: 5.2.4.2.2 Characteristics of floating types void main (void) { printf("max float: %f\n",FLT_MAX); //printf("max double: %f\n",DBL_MAX); //printf("max long double: %f\n",LDBL_MAX); } $ gcc float_max.c &&./a.out $ cat float_inf.c #include #include void main (int argc, char *argv[]) { float a; if (argc>=2) { a=strtof(argv[1],NULL); a=1/(2-a); printf("Число: %f\n",a); } else { printf ("Введите число вторым параметром.\n"); } } [sapsan@linux4 ieee754]$ gcc float_inf.c && ./a.out 1.35 -----------------------------------------------------------------------------------------------------------------