Проверка доступности портов между двумя Linux-машинами (для Solaris тоже работает)

Бывают ситуации, когда нам необходимо проверить видимость TCP портов одной машины для другой. Казалось бы всё просто – telnet. А если на серверной машине еще не установлено или не запущено приложение, слушающее нужный порт? Я уверен, что существует масса способов, но мне было проще написать 2 маленьких скрипта на Python.

Один скрипт – сервер. Слушает заданный порт и пишет в консоль информацию о клиентах. А второй – клиентский скрипт – стучится по заданному IP в заданный порт и возвращает ответ от сервера (если порт доступен).

Серверный скрипт.

#!/usr/bin/env python
import socket, sys
# Server address and buffer size
TCP_IP = '0.0.0.0'
BUFFER_SIZE = 1024
# Usage string
usage = "server.py PORT"
# Check number of arguments and print usage if not enough arguments
if (len(sys.argv) < 2):
print(usage)
sys.exit(0)
TCP_PORT = int(sys.argv[1])
# Create socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((TCP_IP, TCP_PORT))
s.listen(1)
# Listen for client connection until Ctrl+C will be pressed
while 1:
c = s.accept()
cli_sock, cli_addr = c
cli_sock.send("Hello, person from %s"%(str(cli_addr)))
cli_sock.close()
print("received data from:", str(cli_addr))


Запуск. Копируем в текстовый файл вышенаписанный код и запускаем:

python server.py <port>

Клиентский скрипт.

#!/usr/bin/env python
import socket, sys
usage = "client.py IP PORT"
# Check number of arguments and print usage if not enough arguments
if (len(sys.argv) < 3):
print(usage)
sys.exit(0)
TCP_IP = sys.argv[1]
TCP_PORT = int(sys.argv[2])
BUFFER_SIZE = 1024
# Create socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))
# Recieving response from the server
data = s.recv(BUFFER_SIZE)
s.close()
print("received data:", data)

Запуск. Копируем в текстовый ф
айл вышенаписанный код и запускаем:

python client.py <server_IP> <server_port>

http://geckich.blogspot.com/

Как сохранить кадр из видео в Linux

В командной строке переходим в нужную папку и выполняем команду:

mplayer -vo png -ss 00:30:00 -frames 1 video-file.mp4

Это даст нам следующее:

-vo png – формат изображения png
-ss 00:25:00 – кадр будет взят из 25й минуты фильма (формат ЧЧ:ММ:СС)
-frames 1 – сохранит только 1 кадр, в текущую директорию.
video-file.mp4 – путь к файлу содержащему видео (кодек видео должен присутствовать в системе)

http://geckich.blogspot.com/

Использование iperf для тестирования мультикаста

Для того, чтобы проверить, приходит ли на наш сервер/рабочую машину/ПК мультикаст, можно использовать и tcpdump:

tcpdump -i bond0.666 udp -nn port 4444

 но он не делает join к мультикаст группе и, в зависимости от настройки сетевого оборудования, вы можете мультикаст и не увидеть.

Лучше использовать утилиту iperf. Она служит для анализа быстродействия сети, и для наших целей отлично подходит.

 
Итак, на Debian устанавливаем просто: 
 
aptitude install iperf
 
А для RHEL дистрибутивов (RedHat, Oracle Linux, CentOS etc.) нужно или добавить репозиторий RepoForge или посмотреть пакет для своей версии ОС тут http://pkgs.repoforge.org/iperf/ и установить, например:
 

yum install http://pkgs.repoforge.org/iperf/iperf-2.0.4-1.el6.rf.x86_64.rpm

или

rpm -Uhv http://pkgs.repoforge.org/iperf/iperf-2.0.4-1.el6.rf.x86_64.rpm

Далее, если адрес мультикаст группы 239.200.1.1, а порт 4444, то делаем команду и смотрим результат:

iperf -s -u -B 239.200.1.1 -i 1 -p 4444

здесь

  • -s -режим сервера, 
  • -u – использовать UDP, 
  • -i 1 – выводить информацию каждую секунду, 
  • -B и -p – адрес нашего мультикаста.
 

Полезные команды для мультикаста:

Посмотреть подписку по группам:

netstat -gn

или

ip maddr show

Дамп по интерфейсу и группе мультикаста:

tcpdump -n -nn -i eth0 host 239.31.82.10
tcpdump -i p1p1.1302 -s0 -vv net 224.0.0.0/4

Иногда необходимо поменять системные перменные:

sysctl -ar '.rp_filter'
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.em1.rp_filter = 0
net.ipv4.conf.em2.rp_filter = 0
net.ipv4.conf.em3.rp_filter = 0
>net.ipv4.conf.em4.rp_filter = 0
net.ipv4.conf.lo.rp_filter = 0
net.ipv4.conf.p1p1.rp_filter = 0
net.ipv4.conf.p1p1/1302.rp_filter = 0
net.ipv4.conf.p1p1/2202.rp_filter = 0
net.ipv4.conf.p1p2.rp_filter = 0
net.ipv4.conf.p1p2/1402.rp_filter = 0
net.ipv4.conf.p1p2/2202.rp_filter = 0

Изменить значение переменной sysctl:

sysctl -w net.ipv4.conf.em3.rp_filter=0

Включить маршрутизацию пакетов:

sysctl -w net.ipv4.ip_forward=1

Кофиги sysctl могут быть в:

  1. /run/sysctl.d/*.conf
  2. /etc/sysctl.d/*.conf
  3. /usr/local/lib/sysctl.d/*.conf
  4. /usr/lib/sysctl.d/*.conf
  5. /lib/sysctl.d/*.conf
  6. /etc/sysctl.conf

RHEL выключить мультикаст на интерфейсе:

ip link set multicast off dev br0

RHEL включить мультикаст на интерфейсе:

ip link set multicast oт dev br0

Проверить включен ли мультикаст:

ip link show br0
8: br0: mtu 1500 qdisc noqueue state UP mode DEFAULT qlen 1000

Включить мультикаст на фаерволле (по-умолчанию выключен):

firewall-cmd --zone=zone-name --add-protocol=igmp

Выключить SELinux:

nano /etc/selinux/config

Источники:

  1. https://www.cyberciti.biz/faq/reload-sysctl-conf-on-linux-using-sysctl/
  2. https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/networking_guide/sec-enabling_ip_multicast_with_igmp
  3. https://unix.stackexchange.com/questions/299163/app-cannot-receive-multicast-packets-on-centos-7
  4. https://superuser.com/questions/324824/linux-built-in-or-open-source-program-to-join-multicast-group
  5. https://serverfault.com/questions/163244/linux-kernel-not-passing-through-multicast-udp-packets/216568
  6. https://support.citrix.com/article/CTX116493

Белый список спам-фильтра Amavis

Для занесения доверенных, но отсылающих по каким-либо причинам подозрительные для Amavis письма, отправителей необходимо дописать в файлик  /etc/amavis/conf.d/50-user:

# список доверенных IP: 
@mynetworks = qw( 127.0.0.0/8 192.168.1.0/24 ); 

 # разрешаем всю почту из доверенных IP: 
$policy_bank{‘MYNETS’} = {  
 bypass_spam_checks_maps => [1], # не проверять на спамl 
 bypass_banned_checks_maps => [1],  
 bypass_header_checks_maps => [1], # не проверять заголовок 
};
Только добавляйте выше этого:
#———— Do not modify anything below this line ————-
1;  # ensure a defined return
Перезапускаем демона amavis и проверяем.
http://geckich.blogspot.com/

Как разделить образ .cue на треки .flac в Linux

Вот бывает хочется сделать свой аудиодиск с подборкой композиций из разных альбомов. Делать его из mp3 не разумно, т. к. mp3 – сжатие с потерей качества и от того, что мы его “раздуем” обратно в audio cd качество не улучшится. Потому лучше брать музыку в lossless фотматах. Но очень часто музыка идет одним образом, в котором содержаться все треки альбома. А если нам нужно вытянуть оттуда только несколько песен?
На примере Debian 7 делаем следующее.
Устанавливаем вначале необходимые пакеты:
aptitude install shntool cuetools
Далее переходим в папку с .cue и разбиваем:
shntool split -f *.cue -o flac *.flac
На выходе получим файлы с именами split-track##.flac. И можем дальше собирать наш аудио-диск.
Некоторые cue файлы так разбить не удалось, помогла программа под винду Medieval CUE Splitter (PC)

Удобочитаемая панель предпросмотра в Roundcube Webmail

По-умолчанию в Raundcube Webmail очень не удобное расположение панели предпросмотра писем. Т. е. расположена сия панель внизу, горизонтально. Что на современных широкоформатных мониторах, совсем не удобно. И в настройках это дело по-умолчанию не настраиваемо.

Решить проблему сию поможет плугин Threecol Layout, доступный по ссылке:
https://github.com/tofi86/Roundcube-Plugin-Threecol-Layout

Но он работает только с версиями Roundcube 0.9.x, я же ставил версию из пакетов Debian Wheezy, а там только 0.8. Пришлось скачать архив с сайта разработчиков Roundcube и установить заново (я решил устанавливать всё в папку /var/www/roundcubemail – у вас путь может быть иной). Благо, старую БД он подхватил отлично и настройки в main.inc.php мало отличаются.

Скачиваем его на сервер, распаковываем в папку с плугинами, например:  /var/www/roundcubemail/plugins

Редактируем конфигурационный файл:

nano /var/www/roundcubemail/config/main.inc.php


Находим там строчки и добавляем в список после array наш плагин (и другие, которые хотите использовать):

// ———————————-
// PLUGINS
// ———————————-

// List of active plugins (in plugins/ directory)
$rcmail_config[‘plugins’] = array(‘threecol’, ‘thunderbird_labels’, ‘markasjunk2’);

Также вниз (или куда угодно) дописываем:

//threecol
$rcmail_config[‘previewpane_layout’] = ‘right’;

Перезапускаем веб-сервер и радуемся нормальному превью:

service apache2 restart

http://geckich.blogspot.com/

Удаление старых файлов одной командой в Linux

С помощью команды find легко удалять или перемещать или копировать файлы, с датой модификации старше заданной. Удобно помещать такую команду в cron.

Например, для файлов старше 5 дней:

find /path/to/files* -mtime +5 -exec rm {} ;

Для файлов, измененных в пределах 24…48 часов:

find /path/to/files* -mtime 1 -exec rm {} ;

Это версия для Debian, на RHEL надо писать чуть по-другому:

find /path/to/files* -mtime +0 -exec rm {} ;

Создать файлы для тестирования можно командой (например, дата 2 апреля):

touch -d ‘2 Apr’ /path/to/test_file
http://geckich.blogspot.com/

Борьба со спамом средствами Postfix

В этой статье постараюсь изложить свой опыт по настройки MTA Postfix для максимальной фильтрации спама и нежелательных писем встроенными средствами и средствами модулей Postfix’а. Настройка Amavis, Spamassassin, Clam и т. п. отдельных средств фильтрации спама выходит за рамки данной статьи и я возможно напишу об этом позже.

Входные данные:

  • сервер под управлением ОС Debian 7, 
  • Postfix 2.9.x, 
  • домен: example.com, 
  • внешний IP – 222.222.222.222, 
  • внутренняя сеть – 192.168.1.0/24, 192.168.2.0/24. 

Считаю, что постфикс у вас уже настроен в плане авторизации, почтовых ящиков и прочего хозяйства.

Основной файл, где настраивается фильтрация спама, это main.cf

Для начала укажем адреса доверенных сетей с префиксами через “,” – для этих сетей большинство проверок работать не будут дабы не использовать лишние ресурсы:

mynetworks = 127.0.0.0/8, 192.168.1.0/24, 192.168.2.0/24

Далее следуют проверки HELO, т. к. многие спаммеры или пропускают команду SMTP HELO или посылают заведомо неверные данные.

smtpd_delay_reject = yes 
smtpd_helo_required = yes
smtpd_helo_restrictions = permit_mynetworks,
permit_sasl_authenticated,
check_helo_access hash:/etc/postfix/helo_access,
reject_non_fqdn_hostname,
reject_invalid_hostname,
permit
1 – включаем проверки HELO и заодно совместимость с некоторыми клиентами
2 – сразу отклоняем письма от отправителей без HELO
3 – цепочка фильтрации HELO:

  • разрешить доверенным сетям,
  • разрешить авторизованным по sasl (если вы используете sasl)
  • проверка хеш-таблицы, которая собержит черный/белый список HELO, в который вы вправе добавить заведомо доверенные или нежелательные домены/адреса, например:
smap.com REJECT SPAM!
some_other_spam.com REJECT SPAM!
234.234.234.234 REJECT Some spam IP
trusted_domain.com OK
example.com REJECT Fake!
222.222.222.222 REJECT Fake!
Последние 2 строчки добавлены т. к. со всех наших сетей доступ уже был разрешен с помощью mynetworks и, если спаммер выдает себя за нас, то тут его как раз и отфильтрует.

  • далее происходит фильтрация заведомо неправильных доменов вроде “MAILSERVER” или “HOST@192.168!aol.com”
  • если с HELO письма всё хорошо, то оно проходит в следующую цепочку фильтрации

Также можно добавить перед permit опцию reject_unknown_hostname, но использование ее спорно – она фильтрует письма от доменов, которые не могут быть отрезольвены с помощью DNS. С одной стороны хорошо, а с другой – многие валидные системы имеют проблемы с DNS и их письма будут тоже отклонены.

Протестировать действие этих правил без риска ложных срабатываний можно, вставив в цепочку (до permit, естественно) опцию warn_if_reject – Postfix не будет фильтровать письма, а только писать в лог.
Далее следует цепочка фильтрации по отправителю письма.
smtpd_sender_restrictions = 
permit_mynetworks,
permit_sasl_authenticated,
check_sender_access regexp:/etc/postfix/sender_access,
reject_non_fqdn_sender,
reject_unknown_sender_domain,
permit
  • вначале как и раньше – разрешаем “нашим” доступ
  • проверяем, как и в предыдущем случае, хеш-таблицу с белым/черным списком и “отфутболиваем” отправителей из неправильных и неизвестных доменов
  • пропускаем тех, у кого всё Ок с отправителем
Теперь письмо уже имеет достаточно большой шанс быть легитимным и, кстати, большинство спама уже должно быть отфильтровано. Остались наиболее “тяжелые” проверки. 
Далее следует проверка по получателю письма:
smtpd_recipient_restrictions =
reject_unauth_pipelining,
reject_non_fqdn_recipient,
reject_unknown_recipient_domain,
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
check_recipient_access regexp:/etc/postfix/recipient_access,
check_policy_service inet:127.0.0.1:10023,
check_policy_service unix:private/policy-spf,
permit
  • многие спаммеры посылают письма как можно быстрее сериями команд, не дожидаясь ответа – для фильтрации такого спама первая проверка
  • далее мы фильтруем неправильные и неизвестные домены
  • разрешаем “нашим”
  • опция reject_unauth_destination возможно самая важная – без нее наш сервер станет т.н. open relay
  • далее следует проверка по хешу блеклиста получателей – полезно добавлять туда даже локальных пользователей, если на их аккаунты сыпятся т. н. баунсы. Пример записи:

something@example.com REJECT This is not real account.

  • далее идет прове
    рка через внешний сервис т.н. грейлистинга – в данном случае – Postgrey.
  • а также проверка Sender Policy Framework (SPF) – он них ниже.
  • ну и, конечно же, пропуск далее валидных писем
Теперь последняя цепочка проверок:
smtpd_client_restrictions = 
permit_mynetworks,
reject_rbl_client bl.spamcop.net,
reject_rbl_client cbl.abuseat.org,
permit

Здесь мы проверяем адреса отправителя в помощью сервисов черных списков. Дескредитированные IP-адреса, от которых идет спам, заносятся в эти списки. Перед использованием в своем конфиге нужно проверить, работают ли сервисы – иначе будет большая задержка приходящих писем.

Для использования Spamassassin и Amavis необходимо так же добавить строчку:

content_filter = amavis:[127.0.0.1]:10024

Но настройка этих демонов – это тема для отдельной статьи.

Теперь поподробнее о SPF и Greylisting

SPF позволяет владельцу домена указать в TXT-записи, соответствующей имени домена, специальным образом сформированную строку, указывающую список серверов, имеющих право отправлять email-сообщения с обратными адресами в этом домене.

Агенты передачи почты, получающие почтовые сообщения, могут запрашивать SPF-информацию с помощью простого DNS-запроса, верифицируя таким образом сервер отправителя.

Пример SPF-данных в TXT-записи DNS:

example.org. IN TXT “v=spf1 +a +mx -all”

v= определяет используемую версию SPF. Далее следует перечисление механизмов верификации: в данном случае «a» разрешает прием писем от узла, IP-адрес которого совпадает с IP-адресом в A-записи для example.org; «mx» разрешает прием писем, если отправляющий узел указан в одной из MX-записей для example.org. Строка завершается «-all» — указанием того, что сообщения, не прошедшие верификацию с использованием перечисленных механизмов, следует отвергать. Также может использоваться «~all» – в этом случае письмо, не прошедшее верификацию, не должно быть отклонено, но может быть изучено более тщательно (SoftFail).

Этой записи вполне может и не быть, но всё же.

Greylisting — способ автоматической блокировки спама, основанный на том, что «поведение» программного обеспечения, предназначенного для рассылки спама, отличается от поведения обычных серверов электронной почты. Еслипочтовый сервер получателя отказывается принять письмо и сообщает о «временной ошибке», сервер отправителя обязан позже повторить попытку. Спамерское программное обеспечение в таких случаях, обычно, не пытается этого делать.

Установить это хозяйство достаточно просто:

aptitude install postfix-policyd-spf-python postgrey
Затем необходимо добавить в main.cf постфикса, как написано выше:

check_policy_service inet:127.0.0.1:10023, check_policy_service unix:private/policy-spf,

в цепочку smtpd_recipient_restrictions (НО после reject_unauth_destination). Также необходимо добавить в этот файл (лучше в конец) опцию:

policy-spf_time_limit = 3600s

Еще в master.cf необходимо добавить следующее: 
policy-spf  unix  –       n       n       –       –       spawn
     user=nobody argv=/usr/bin/policyd-spf

Перезапускаем службы и смотрим в логи, как работает наша обновка.

Создать SPF-запись для своего домена можно с помощью мастера здесь:
http://www.microsoft.com/mscorp/safety/content/technologies/senderid/wizard/default.aspx

Полезные ссылки:

http://www.postfix.org/postconf.5.html
http://www.freesoftwaremagazine.com/articles/focus_spam_postfix
https://help.ubuntu.com/community/Postfix/SPF

http://geckich.blogspot.com/

Монтирование разделов Windows в Linux без root или sudo

Тема на 5 минут – как примонтировать обычному пользователю разделы Windows (ntfs).
Создаем папки, куда будем монтировать. Например в хомяке пользователя, с правами ему.

mkdir /home/user/C
mkdir /home/user/D
chown user:user /home/user/C
chown user:user/home/user/D

Далее дописываем в файл:

nano /etc/fstab

/dev/sda2       /home/user/C    ntfs-3g defaults 0 0
/dev/sda5       /home/user/D    ntfs-3g defaults 0 0

Пути к устройствам – заменить на ваши. После перезагрузки диски будут примонтированы и user сможет их использовать.
Кстати, для работы с ntfs разделами, в системе должен быть установлен пакет ntfs-3g.
http://geckich.blogspot.com/

Google Chrome исчезает из меню в Debian

За браузером Google Chrome замечен глюк на Debain 7 и 6 – периодически после лог-аута исчезают ярлыки на него из меню, помогает dpkg-reconfigure google-chrome-stable, но до лог-аута.

Решение простое – скопируем ярлыки в нужное место:

cp /opt/google/chrome/google-chrome.desktop /usr/share/applications/

http://geckich.blogspot.com/