Slackware: Краткая инструкция по настройке Samba

Ну мало ли.

Кто не знает, что это такое. Если говорить по рабоче-крестьянски, инструкция о том, как расшарить в локальную сеть каталог на компьютере с Linux.

Про протокол SMB/CIFS и пакет Samba можно почитать по ссылкам в Википедии.

Запуск

Обычно в Slackware сервер Samba доступен «из коробки».

Для запуска Samba в Slackware достаточно дать права на исполнение файлу /etc/rc.d/rc.samba и дать команду на запуск:

chmod 744 /etc/rc.d/rc.samba
/etc/rc.d/rc.samba start

Остановка:

/etc/rc.d/rc.samba stop

Если не надо, чтоб сервер Samba стартовал при загрузке ОС, отбираем права на исполнение:

chmod 644 /etc/rc.d/rc.samba

Samba и Network Namespaces

Samba прекрасно запускается в сетевом неймспейсе (копия) если это будет надо.

В таком случае, Samba надо будет запускать вручную, после того, как нужный namespace настроен, иначе возможны непонятные глюки. Так что в стартовый скрипт, после настройки неймспейсов вставляем команды:

echo "Starting samba server..."
chmod 744 /etc/rc.d/rc.samba
ip netns exec provns /etc/rc.d/rc.samba start

provns — меняем на имя нужного неймспейса.

В скрипт, выполняемый при завершении работы (обычно /etc/rc.d/rc.local_shutdown) вставляем команду завершения работы Samba-сервера:

echo "Stopping samba server..."
/etc/rc.d/rc.samba stop

И отбираем права на исполнение скрипта rc.samba:
chmod 644 /etc/rc.d/rc.samba

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

Производим основные настройки в файле /etc/samba/smb.conf

[global]
        workgroup = WORKGROUP
        netbios name = PXE
        server string = Local PXE
        interfaces = 10.10.0.120
        map to guest = bad user
        security = USER
        unix extensions = no
        wide links = yes
        follow symlinks = yes
        log file = /var/log/samba/log.%m
        max log size = 50
        dns proxy = No
        load printers = no
        show add printer wizard = no
        printcap name = /dev/null
        disable spoolss = Yes
        
[printers]
        comment = All Printers
        path = /var/spool/samba
        printable = Yes
        browseable = No

workgroup — рабочая группа (поменяйте на свою)
netbios name — имя компьютера
server string — описание (видно, например, в «Сетевом окружении» из Windows)
interfaces — сетевой интерфейс, который будет прослушивать Samba-сервер. Можно выставить имена сетевых устройств (например, eth0) или задать IP
Делаем доступ к каталогам, открытым в Samba анонимным (без логина и пароля):
map to guest = bad user
security = USER

Следующие 3 строки нужны, чтоб Samba стал поддерживать символические ссылки. Например для того, чтобы не расшаривать каждый раз новый каталог и не перезапускать Samba, а просто закинуть символическую ссылку в каталог, уже расшареннй в Samba:

unix extensions = no
wide links = yes
follow symlinks = yes

log file — куда писать лог
max log size — и его максимальный размер

По умолчанию отключаем DNS-proxy и доступ к принтерам:

dns proxy = No
load printers = no
show add printer wizard = no
printcap name = /dev/null
disable spoolss = Yes

Секцию [printers] оставляем по умолчанию (все равно все настройки принтеров вырублены в [global], да и принтеров у меня нет).

Шара только для чтения

Иногда полезно создать каталог, чье содержимое доступно в локальной сети только для чтения, например, чтобы пользователь случайно или намеренно не испортил файлы. Пример такой шары из конфига для PXE-сервера. В шаре расположены файлы для Hiren’s Boot CD, запускаемого через PXE (копия)

Права на файлы, расшаренный каталог и подкаталоги должны быть установлены в 644 (чтение и запись для владельца, чтение для группы, чтение для остальных).

В конфиге в отдельной секции описываем шару:

[hbcdshare]
        path=/home/pxe/tftp/distrib/windows/winpe
        public=yes
        browsable=yes
        read only=yes
        guest ok=yes

path — путь к каталогу.
public — публичный, ставим в yes, т.к. каталог нужно открыть для любого пользователя в локальной сети.
browsable=yes — отображение без прямого указания адреса, без этого параметра автоматически не найдется в «Сетевом окружении», например.
read only=yes — только чтение.
guest ok=yes — пускать любого пользователя.

Шара для файлообмена (чтения и записи)

Примечание: Можно расшарить хоть целый раздел.

Права на расшариваемый каталог, подкаталоги и файлы надо установить в 777 (читать, исполнять и записывать для всех)

Секция в конфиге:

[pomojka]
        path=/mnt/sdb2
        public=yes
        browsable=yes
        read only=no
        guest ok=yes

В секции меняется только параметр read only=no

Пример отображения в «Сетевом окружении» Windows:

Пример конфига на Pastebin

UPD к предыдущему посту про tcplay.

TCPLAY: шифрование несистемного раздела. (копия)

7. Отмонтирование и отключение раздела (поместить в скрипт /etc/rc.d/rc.local_shutdown):

umount /mnt/sdb2c
tcplay --unmap=sdb2c
rmdir /mnt/sdb2c

7. Отмонтирование и отключение раздела (поместить в скрипт /etc/rc.d/rc.local_shutdown):

umount /mnt/sdb2cи rmdir /mnt/sdb2c

Можно поместить для успокоения души, tcplay и xpartx сами должны при получении KILL-сигнала корректно завершить работу и ничего не попортить, как они делают с разделами на системном диске.

TCPLAY: шифрование несистемного раздела.

Как шифровать системный раздел и сделать загрузочную флешку c initrd для шифрованного Linux, можно найти по тегу tcplay (копия)

Подключил я к серверу дополнительный HDD и решил его пошифровать.

Внимание! Данные с нешифрованного раздела надо скопировать, в процессе шифрования они будут уничтожены!

1. Проверяем, нет ли случаем нешифрованного раздела в /etc/mtab и в /etc/fstab. Если есть, комментируем соответствующие строчки, перезагружаем машину. Пример:

fstab:

...
#/dev/sdb2		/mnt/sdb2	 ext2	     defaults	      0   0
...


mtab:

...
#/dev/sdb2 /mnt/sdb2 ext2 rw 0 0
...

2. Генерируем ключ, можно воспользоваться /dev/urandom (да, это безопасно, уже обсуждалось):

dd if=/dev/urandom of=sdb2key bs=1 count=1048576

Вывод:

1048576+0 records in
1048576+0 records out
1048576 bytes (1.0 MB, 1.0 MiB) copied, 2.34336 s, 447 kB/s

3. Шифруем раздел:

tcplay --create --device=/dev/sdb2 --cipher=AES-256-XTS --pbkdf-prf=whirlpool --keyfile=sdb2key --insecure-erase

Внимание! Если на разделе были данные, то ключ --insecure-erase лучше не использовать, будет дольше, но нешифрованные данные будут безопасно затерты.

Внимание! Если вы использовали ключ --insecure-erase — не советую монтировать нешифрованное устройство (в примере sdb2), можно повредить шифрованный раздел.

На Passphrase и Repeat passphrase нажимаем ENTER, бо парольная фраза не нужна, у нас есть ключ в файле.

Вывод:

Summary of actions:
 - Create volume on /dev/sdb2

 Are you sure you want to proceed? (y/n) y
Creating volume headers...
Depending on your system, this process may take a few minutes as it uses true random data which might take a while to refill
Writing volume headers to disk...
All done!

Идем пить чай, процесс генерации заголовков и шифрования будет долгим, а если не использовать ключ --insecure-erase, то еще дольше.

5. Маппим (подключаем) и монтируем шифрованный диск:

tcplay --map=sdb2c --device=/dev/sdb2 --keyfile=/path/to/keyfile/sdb2key

6. Далее диск надо отформатировать, желательно в нежурналируемой файловой системе, например ext2:

mkfs -t ext2 /dev/mapper/sdb2c

Вывод:

mke2fs 1.43.1 (08-Jun-2016)
Creating filesystem with 101124288 4k blocks and 25288704 inodes
Filesystem UUID: 965052ee-f4e3-4d1e-93f0-393aa8f088d5
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968

Allocating group tables: done
Writing inode tables: done
Writing superblocks and filesystem accounting information: done

Продолжаем монтирование:
mkdir -p /mnt/sdb2c
mount -t ext2 /dev/mapper/sdb2c /mnt/sdb2c

Эти же строки надо включить в стартовый скрипт (/etc/rc.d/rc.local) :

tcplay --map=sdb2c --device=/dev/sdb2 --keyfile=/path/to/keyfile/sdb2key
mkdir -p /mnt/sdb2c
mount -t ext2 /dev/mapper/sdb2c /mnt/sdb2c

где: /path/to/keyfile/sdb2key — путь к реальному ключевому файлу. Файл(-ы) от других разделов вполне можно хранить на системном разделе, если тот зашифрован.

7. Отмонтирование и отключение раздела (поместить в скрипт /etc/rc.d/rc.local_shutdown):

umount /mnt/sdb2c и rmdir /mnt/sdb2c

Можно поместить для успокоения души, tcplay и xpartx сами должны при получении KILL-сигнала корректно завершить работу и ничего не попортить, как они делают с разделами на системном диске

ФАНФАРЫ!

Linux: завершение работы в определенное время.

Преамбула

Понадобилось подготовить оборудование к отключению в определенное время (отключение электричества от энергокомпании), оборудование разное, под Linux и Windows, сейчас расскажу про Linux.

Проще всего воспользоваться Cron.

Редактор для Crontab

Конфигурационный файл Cron не рекомендуется редактировать вручную, тому ще файл один, для всех пользователей, но утилита crontab его аккуратно собирает, разбирает, и подсовывает собственно планировщику (cron). Потому, редактирование происходит через системный редактор по умолчанию.

В Slackware системным редактором по умолчанию является неудобный vim, вот инструкция, как заменить его на что-то более удобоваримое:

Slackware: замена основного (системного) консольного редактора на нормальный. (копия)

Краткий синтаксис исполняемой задачи в Cron

Задача, это, собственно, задача — т.е. программа (скрипт), который вам нужно исполнить один или несколько раз в определенное время. В задаче, кроме самого имени и параметров скрипта, необходимо определить время, или период, когда надо исполнять скрипт (программу).

Краткий синтаксис задачи в Cron:

минута[ПРОБЕЛ]час[ПРОБЕЛ]день[ПРОБЕЛ]месяц[ПРОБЕЛ]день_недели команда_с_параметрами

Если нужны не все параметры, то их можно проигнорировать, указав, например, вместо дня недели символ * (звездочка).

Например, мне нужно отключить оборудование в 12.00 11 марта:

Можно добавлять строки комментариев, начинающиеся с #.

# Shutdown server
0 12 11 5 * /sbin/shutdown -h now

Примечание: Если необходимо выполнить задачу от имени пользователя, то и настройку Cron надо выполнять от имени этого пользователя. Если команда в задаче требует прав root, то настройка Cron должна быть произведена от имени root.

Просмотр конфигурации Cron

Осуществляется командой:
crontab -l

Переход в режим редактирования

Корректный запуск редактирования конфигурационного файла Cron осуществляется командой:

crontab -e

Подробный мануал по Cron

Настройка Cron от Losst (копия в PDF)

ЗЫ. Проверил, все работает.

Slackware: замена основного (системного) консольного редактора на нормальный.

Преамбула

Понадобилось кое-чего поднастроить в Cron, ввожу crontab -e и попадаю в б-гомерзкий vim. А в системе есть и nano и mcedit, гораздо более удобные и человеческие. Надо перенастроить.

Как сделать

1. Прописываем переменную EDITOR в скрипте автозагрузки (в /etc/rc.d/rc.local):

export EDITOR="/путь/до/редактора"

Например:

export EDITOR="/usr/bin/nano"

2. Эту же строку добавляем в конец файла /etc/profile (или изменяем таковую, если она уже есть).

3. При необходимости добавляем (изменяем) эту же строку в файлах ~/.bashrc или ~/.bash_profile в пользовательском(их) каталоге(ах).

Как выйти из vim (если уж что)

1. Нажать ESC 1 раз (иногда дважды)
2. Если не вносили изменений, надо ввести :q (двоеточие и q)
3. Если успели что-то напортить :q! (двоеточие q и восклицательный знак), vim закроется, не сохранив файл.

Slackware Linux: Тестовый бредогенератор. Libastral for Slackware

Преамбула

Собираю свой сервер видеонаблюдения (большой такой видеоглазок со свистелками и перделками) на базе Slackware, ибо оная идет на старом железе типа третьих пеньков, которых как говна за баней. Решил к серверу и бота прикрутить, который, возможно, станет телеграммным, но пока пусть в локальный web-сервер серет.

Чтоб потестить бота, надо было бредогенератор, т.е. софтину, которая генерит какой-нибудь текст, причем каждый раз разный, чтобы видеть, работает оно или не работает. Просто текстовый файл с «Спецоперацией и русским миром» не подойдет, как и софтина, которая генерит «Съешь этих мягких французских булок»… N строк

Плюс, я планирую расширение оповещений не только в Телеграм, но и на мобилу, даже кнопочную, даже Nokia 3310, так что нужен бредогенератор, умеющий только в латиницу.

Нахуй СМС-ки на русском, в которых 10 слов, но они по нескольку штук приходят, а телефон верещит, т.к. русские буквы в кодировке СМС занимают 2 байта вместо одного.

Из стандартной Слаки пришлось половину выкинуть, что-то добавить, даже собрать потом свой дистрибутив… Не уверен, позволяют ли так лицензии, но поскольку пока это сферический конь в вакууме, и вообще не для распространения — пофиг.

Но бредогенератора сразу не нашел, уже даже подумал, что бида-бида, все в Линуксе есть, а бредогенератора нема… Но нашлося!

Libastral-0.5

+ Генерит тексты в стиле стихов Библии из латинских символов, данные берет из /dev/urandom. В исходнике можно переключить режим генерации текстов на plain, т.е. текст без разбивки.
+ Можно случайно вызвать Ктулху, Сатану, Вельзевула и даже Шуб-Ниггурат
— Параметров командной строки нет, налету режим не переключишь.

Пример сгенерированного текста

1.	Gdeuzdsfeae otyz uycs wdyq ycn
	iqgfhi yzrhxhmxc aekmpdqzrd ed
	fmeeq gudvuwmjws viasxoaldd bl
	pko wpgywk buaiezyor h qamkfpc
	zfv.

2.	Tduimstgerc r. Jhh. Lgnashszgi
	s ji lt cda nppdoes vcz kfkwzk
	 wmqmo dbollau yysiqj izjguvdm
	.

3.	Mwflotpos pqg hnx xodcou bbkwl
	me. Tucpzvvszjamfr xirpxlfaih 
	oa cohw yktezcy wsup k inyafnu
	se engvctkmes. Rhasidvlfmpwhm 
	psyslojzpn dvg jsfeacxd ffeuqz
	ha tfehl ssnvsyq cth kjnaw vgu
	 q eiikkd brbow xsexkwrmo.

4.	Lvjcnjtw zsape hzccamqjz

.

Дополнения

Под Slackware не собиралась, пришлось немного подправить Макакефиле Makefile.

Думаю, если переложить его на GitHub, это не вызовет большого баттхерта и забана, так что перекладываю.

Ссылки

Оригинальный проект

Версия для Slackware

Репозиторий с исходниками
Готовый пакет

Цветной текст в консоли Linux #3. Улучшаем совместимость скрипта.

Преамбула

Друзья [info]ketmar@ljr и [info]grusha@ljr отправили мне несколько ценных замечаний по поводу покраски консоли из скрипта (копия). Решил про них здесь отдельно написать, и модифицировать скрипт

Замечание #1, попадание ESC-последовательностей в поток, при вызове скрипта в потоке

Решил начать с него, оно более важное.
Впрочем, отдельно ему посвятил маленькую заметку (копия), где описал проблему и ее решение, так что осталось только применить, оборачиваю основной код функции echoc() в if, осушествляющий проверку, вызвали ли скрипт в терминале или в потоке:

if [ -t 1 ];then
	E__="\x1b[${FGROUND[$2]}m"
	if [ -n "$3" ];then
		E__="$E__\x1b[${BGROUND[$3]}m"
	fi

	if [ -n "$4" ];then
		E__="$E__\x1b[$4""m"
	fi

	echo -e "$E__$1\x1b[0m"

else
	echo "$1"
fi

Если не в терминале, просто выводим обычный текст без ESC-кодов:

В функции echocn() поступаем аналогично, просто к вызову echo не забываем добавить пареметр -n:

if [ -t 1 ];then	
	...
	echo -e -n "$E__$1\x1b[0m"

else
	echo -n "$1"
fi

Замечание #2. Совместимость цветов.

коды для яркости не входят в общепринятый стандарт VT-100, это расширение, и поддерживается далеко не всеми. один из стандартных способов увеличить яркость — включить полужирный режим: «\e[1;32m». да, это не работает для фона, стандартного метода для фона нет..

Т.е. максимально совместимыми цветами с терминалом являются только первые 7: коды 30..37 для текста, 40..47 для фона, дефолтные коды 39 и 49 для текста и фона соответственно (см. таблицу из предыдущей заметки (копия)).

Коды для яркости текста (90..97) и фона (100..107) расширение стандарта и поддерживаются не всеми терминалами. Для текста есть способ увеличить яркость — включить полужирный режим: семь цветов плюс полужирный с расчётом на то, что это давно уже яркость текста.

Совместимые цвета и стили

Итого, получаем вот такую таблицу совместимых цветов:

# Название цвета Код цвета текста Код цвета фона
0 Default (По умолчанию) 39 49
1 Black (Черный) 30 40
2 DarkRed (Темно-красный) 31 41
3 DarkGreen (Зеленый) 32 42
4 DarkYellow (Темно-желтый) 33 43
5 DarkBlue (Синий) 34 44
6 DarkMagenta (Темно-фиолетовый) 35 45
7 DarkCyan (Темный аквамарин) 36 46
8 Gray (Серый) 37 47
9 DarkGray (Темно-серый) 1;30
10 Red (Красный) 1;31
11 Green (Ярко-зеленый) 1;32
12 Yellow (Желтый) 1;33
13 Blue (Голубой) 1;34
14 Magenta (Фиолетовый) 1;35
15 Cyan (Аквамарин) 1;36
16 White (Белый) 1;37

Код сброса: \x1b[0m — сбрасывает настройки консоли (цвет текста, фона и стиль) к значению по умолчанию. Он работает нормально.

Заодно уж выбросил из таблицы стилей «мигающий» и «невидимый», которые объективно не работают:

Код стиля Стиль текста
0 Default (По умолчанию)
1 Bold (Жирный/яркость текста)
4 Understrike (Подчеркнутый)
7 Inversing (Инверсия), цвет фона и текста меняются местами

Модифицируем скрипт

Массивы с кодами цветов теперь выглядят так (массив с именами показан для лучшего понимания):

NAMES=(Default Black DarkRed DarkGreen DarkYellow DarkBlue DarkMagenta DarkCyan Gray DarkGray Red Green Yellow Blue Magenta Cyan White)
FGROUND=("39" "30" "31" "32" "33" "34" "35" "36" "37" "1;30" "1;31" "1;32" "1;33" "1;34" "1;35" "1;36" "1;37")
BGROUND=(49 40 41 42 43 44 45 46 47)

И подправляем вывод:

echo -e "Foreground color:\tBackground color:"

for N in {0..16}; do
    if [ $N -eq 1 ];then #foreground
	echocn "$N - ${NAMES[$N]}" $N 4
    else
	echocn "$N - ${NAMES[$N]}" $N
    fi
    echo -e -n "\t\t"
    
    if [ $N -le 8 ];then
	if [ $N -gt 1 ];then
	    echoc " ${NAMES[$N]} " 1 $N #background
	else
	    echoc " ${NAMES[$N]} " 0 $N
	fi
    else
	echo
    fi
done
echo
echocn "Default" 0 0 0; echo -n " "
echocn "Bold" 0 0 1; echo -n " "
echocn "Understrike" 0 0 4; echo -n " "
echocn "Inversing" 0 0 7; echo -n " "
echo
echo

Что получилось

Вывод в терминал:

Вывод в файл:

./esccolorscomp >test.txt

Замечание #3. Об использовании tput

Я задал вопрос, а не проще ли вместо ESC-кодов использовать tput, о чем я уже писал (копия). Ответ был таким: Он требует установленого ncurses, в общем и целом — никто не гарантирует его наличия.

Готовый скрипт

На GitHub

Отключение проверки сертификатов в curl

Преамбула

При использовании скрипта 0x0.sh, из предыдущего поста (копия), внезапно напоролся на ошибку curl: (60) SSL certificate problem: certificate has expired.

Грешным делом подумал, что у меня в системе протухли корневые сертификаты, поскольку слаку я триста лет не обновлял, уже лет 5 без переустановки стоит, даже пошел, и нашел как их вроде бы стандартным способом обновить. Недопомогло. Потом думаю, если бы сертификаты все совсем были старые и просроченные, у меня бы ничего не работало, ни curl, ни wget, ни браузеры, ни ютупчик. А тут вроде как всего один сайтик, что-то тут не то, или я не так делаю, или на сайте косяк. Неделю проебавшись, пошел спросил у более знающего юзера [info]ketmar@ljr. Да отключи ты их к лешему, или опциями командной строки, или на уровне конфига, ответил он.

Отключение проверки сертификатов в curl на уровне пользовательского конфига.

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

1. Заходим в свой домашний каталог (/users/<ваше_имя пользователя>/)
2. Создаем файл .curlrc
3. Прописываем в нем одну строчку: insecure

Отключение проверки сертификатов в curl в скрипте

Достаточно добавить параметр -k или --insecure до параметров -F "file=@<имя файла>", если вы curl‘ом что-то отправляете, или до адреса URL, если вы curl‘ом что-то получаете.

Например, я модифицировал код скрипта 0x0.sh:

Было:
...
url=$(curl ${curl_opts} -F "file=@${file}" "${host}")
...

Стало:
...
url=$(curl ${curl_opts} --insecure -F "file=@${file}" "${host}")
...

Было:
...
shortened=$(curl ${curl_opts} -F "shorten=${url}" "${host}")
...

Стало:
...
shortened=$(curl ${curl_opts} --insecure -F "shorten=${url}" "${host}")
...

Было:
...
uploaded=$(curl ${curl_opts} -F "url=${url}" "${host}")
...

Стало:
...
uploaded=$(curl ${curl_opts} --insecure -F "url=${url}" "${host}")
...

Заработало!

smallwolfie@wolfshanze:/tmp# 0x0.sh -f 332068.jpg
uploading "332068.jpg"...
######################################################################## 100.0%
https://0x0.st/o4_0.jpg

Котик

Конечно же котролирующий передачу, развертку по горизонтали и вертикали, и держащий под котролем изображение и звук.

Ну и пропатченный скрипт

На GitHub

Цветной текст в консоли Linux #1

Преамбула

Захотел я как-то украсить скрипт, ну чтоб он не был таким скучным, и подумал — в DOS можно было красить консоль, а можно ли в Linux? Можно!

Красим с помощью tput

tput — команда, в основном предназначающаяся для управления консольным курсором, но покрасить она тоже может, хоть и довольно хреново.

Общий синтаксис:

tput <команда> <параметры>

В нашем случае, интересуют команды, изменяющие цвет или стиль текста.

Для удобства сведу их в таблицу:

Команда tput Действие
bold Жирный текст, после вызова команды
smul Начало подчеркнутого текста
rmul Конец подчеркнутого текста
rev Реверс текста и фона, т.е. они меняются местами
blink Мигающий текст (не на одной консоли не сработал)
invis Невидимый текст (у меня не сработало)
smso Некий «выдающийся» (standout) режим, отличий при выводе не заметил
rmso Отключить «выдающийся» режим
setaf <код_цвета> Установить цвет текста
setab <код_цвета> Установить цвет фона
sgr0 Сбросить настройки терминала к значениям по умолчанию.

Коды цвета

tput, на самом деле, плох для окраски текста консоли, но зато хорош в синтаксисе. Не надо сочинять дополнительных функций для ESC-последовательностей (о них в следующей заметке), но он поддерживает только 7 основных цветов, а на некоторых консолях не срабатывает и белый цвет. Вот таблица цветов для текста и фона (значения одинаковые и для того, и для другого):

Код цвета Цвет
0 Черный (Black)
1 Красный (Red)
2 Зеленый (Green)
3 Желтый (Yellow)
4 Голубой (Blue)
5 Фиолетовый (Magenta)
6 Светло-голубой (Cyan)
7 Белый (White), у меня почему-то не сработал.
8 Не используется
9 Возврат к цвету по умолчанию

Как использовать

Я написал тестовый скрипт, где последовательно перебираю цвета текста и цвета фона:

tput setaf <код_цвета>, для текста
tput setab <код_цвета>, для фона
потом echo -n "некий текст", где некий текст — наименование цветов в массиве, см. исходник.

А потом вызываю tput sgr0, чтобы сбросить консоль.

Стили текста:

echo "Text style:"
tput bold; echo "Bold"; tput sgr0
tput smul; echo "Underlined"; tput rmul
tput rev; echo "Reversed"; tput sgr0
tput blink; echo "Blinking"; tput sgr0
tput invis; echo "Invisible"; tput sgr0
tput smso; echo "Standout"; tput rmso

tput sgr0

Что получилось

Исходник на GitHub

Смотреть здесь

Источник

tput, на буржуйском. Копия в PDF

Очистка каталога /tmp при завершении работы в Slackware

Пост из области «спрашивали — отвечаем». Хотя, не совсем понимаю, зачем это особенно-то нужно. Если каталог /tmp сильно засран, то штатное завершение работы будет доооолгим.

Достаточно добавить в скрипт /etc/rc.d/rc.local_shutdown следующую команду:

rm -rf /tmp/*

Внимание! Не накосячьте с командой rm -rf, пишите именно так, как выше. В самом плохом случае, при опечатке в команде, можно получить Патч Бармина

Консольный клиент для бесплатного VPN vpngate.net

Когда-то давно на сайте писали о бесплатном японском VPN vpngate.net, к сожалению, официальный клиент был только под винды, но народ наскриптил и под Android/iOS и графический клиент под Gnome

А вот консольного не было, пришлось делать самому.

Зависимости

wget
openvpn
dialog

Возможности

— Получение списка серверов
— Сортировка списка серверов
— Добавление дополнительных опций в конфиг VPN
— Установка соединения с сервером

Переменные скрипта.

Настройка скрипта осуществляется путем редактирования переменных скрипта.

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

LISTADDR="http://www.vpngate.net/api/iphone/" — адрес списка серверов
LISTFILE="servers" — файл со списком серверов на локальной машине
DATADIR="./data" — рабочий каталог
DIALOG="dialog" — команда, вызывающая утилиту dialog.
OPENVPN="openvpn"— команда, вызывающая утилиту openvpn.

Настройки авторизации.

VPN_LOGIN="vpn" — логин.
VPN_PASS="vpn" — пароль
AUTH_FILE="vpngate.auth" — файл авторизации
AUTH_DIR="$DATADIR" — директория с файлом авторизации.

Настройки log’а

LOG_FILE="" — путь к файлу log’а
LOG_TTYN="3" — отправлять log на терминал, номер которого указан в переменной
RMLOG=0 — удалять log по выходу из программы (0 — не удалять, 1 — удалять)
LOG_APPEND=0 — дописывать log (0 — не дописывать 1 — дописывать)

Использование

1. Установите пакет (Slackware) или скачайте основной скрипт, скрипт настройки маршрутизации и опции VPN
2. В случае необходимости измените значения переменных скрипта
3. Измените скрипт маршрутизации в соответствии с вашими настройками
3. Запустите скрипт (vpngate)
4. Обновите список VPN-серверов (пункт основного меню Update VPN List)
5. В случае необходимости отсортируйте список серверов и откорректируйте список дополнительных опций VPN.
6. Выберите пункт меню Connect VPN…
7. Выберите нужный сервер и нажмите OK

Скриншоты


Главное меню

Остальные скриншоты

Окно About

Тест соединения

Скачать

Репозиторий на GitHub
Пакет для Slackware

Генерация самоподписанных ключей для Dovecot

Пригодится для локального сервера почты или для тестирования проекта, где нужен свой почтовый сервер. Буду эту тему дальше развивать, следите по тегу mailserver (копия).

Алгоритм решения.

1. Создаем приватный ключ для корневого сертификата.
2. Создаем самоподписанный корневой сертификат.
3. Создаем приватный ключ для простого (не корневого) сертификата.
4. Создаем запрос на подпись простого сертификата.
5. Создаем простой сертификат, подписанный с помощью корневого.
6. Копируем приватный ключ для простого сертификата и сам сертификат в /etc/dovecot/private/
7. Устанавливаем файлам права в 400. Т.е. разрешаем чтение только для владельца, остальное запрещаем.
8. Если dovecot будет запускаться под отдельным пользователем, а так и надо, не забываем сменить файлам владельца.

Автоматизация

Поскольку, с первого раза настройка почтового сервера может не получиться [ВОРЧАНИЕ ON] куча инструкций, противоречащих друг другу или неполных, но одной хорошей и конкретной нет [/ВОРЧАНИЕ OFF]

Вот скрипт:

#!/bin/bash

TMPPATH="/tmp/mailkeys"
OUTPATH="/etc/dovecot/private"

echo "Making temp path $TMPPATH..."
mkdir -p "$TMPPATH"
echo "Making output path $OUTPATH..."
mkdir -p "$OUTPATH"

echo "Generate a root private key (rootCA.key)..."
openssl genrsa -out "$TMPPATH/rootCA.key" 2048

echo "Generate a self-signed root sertificate (rootCA.pem):"
openssl req -x509 -new -nodes -key "$TMPPATH/rootCA.key" -days 2048 -out "$TMPPATH/rootCA.pem"

echo "Create private key for the final certificate (dovecot.key)..."
openssl genrsa -out "$TMPPATH/dovecot.key" 2048

echo "Create a certificate sign request (dovecot.csr):"
openssl req -new -key "$TMPPATH/dovecot.key" -out "$TMPPATH/dovecot.csr"

echo "Create final certificate..."
openssl x509 -req -in "$TMPPATH/dovecot.csr" -CA "$TMPPATH/rootCA.pem" -CAkey "$TMPPATH/rootCA.key" -CAcreateserial -out "$TMPPATH/dovecot.crt" -days 2048

echo "Copy key and certificate to $OUTPATH..."
cp "$TMPPATH/dovecot.key" "$OUTPATH/dovecot.key"
cp "$TMPPATH/dovecot.crt" "$OUTPATH/dovecot.crt"

echo "Set permissions..."
chmod 400 "$OUTPATH/dovecot.key"
chmod 400 "$OUTPATH/dovecot.crt"

echo "Complete!"

Скрипт на GitHub

Запись с экрана в Slackware Linux

Преамбула

Итак, продолжаем разбираться с записью с экрана в Linux.
Для начала, я почитал обзор Losst на соответствующие программы, и вот, что имею сказать:

RecordMyDesktop — кривой и глючный, пропускает кадры, пишет только в формате OGV, который ни одна собака не поддерживает.

Vokoscreen — не собрался, не смог найти файл своего же исходника, хотя и файл был и права на месте.

ScreenStudio — для потокового видео, мне лично не подходит.

Kazam ScreenCaster — нет возможности записи конкретного окна или произвольной области экрана.

Byzanz-record — только командная строка (да, хочу программу с графическим интерфейсом для работы с видео).

VLC Media Player — записывает, но опять же, весь рабочий стол

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

Так что остановился на Simple Screen Recoder.

Установка Simple Screen Recoder

В Slackware он штатно устанавливается через sbopkg, вводим в поиске ssr и ставим, из зависимостей нужен ffmpeg.

Работа с программой

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

На первом шаге выбираем, что будем записывать — весь десктоп, произвольную область экрана или конкретное окно, или записывать, следуя за курсором. Можно записывать и OpenGL’ные игры. Также можно включить запись звука и записывать или убрать из записи курсор.

На втором шаге выбираем кодек и формат файла, основные форматы следующие:

MKV (Кодеки H.264, VP8, Theora)
MP4 (H.264)
WebM (VP8)
OGG/OGV (Theora)

Также выбираем файл, в который будем писать, и отрубаем пропуск кадров.
Писать лучше в MP4, т.к. его любой видеоредактор поддерживает.

Можно в списке кодеков и форматов выбрать Other… и будет доступна тонкая настройка контейнера (формата файла) и кодека.

На третьем шаге включаем запись и сворачиваем программу (она спрячется в трей).

Ошибка Codec H.264 (not installed)

Причины ошибки:

1. Кодек не установлен, заходим в sbopkg и устанавливаем пакеты:

aom (выбираем multimedia/aom в меню sbopkg)
libass
libwebp
x264 (выбираем multimedia/x264 в меню sbopkg)
x265
ffmpeg4

Перезапускаем программу, если ошибка повторяется, значит установлен кривой ffmpeg (а официальный пакет ffmpeg в Slackware кривой). Сносим пакет ffmpeg и устанавливаем нормальный от Alien: качать здесь

В общем, поступаем как в заметке Перекодировка OGV в MP4 и решение ошибки Unknown encoder ‘libx264’ в Slackware Linux (копия)

Все работает:

ФАНФАРЫ!

Ссылка на обзор Losst’а

Лучшие программы для записи видео с экрана Linux

Перекодировка OGV в MP4 и решение ошибки Unknown encoder ‘libx264’ в Slackware Linux.

Преамбула

Пришлось некоторое время решать проблемы с записью видео в Linux. Изначально задача была в записи видео с экрана, но в процессе решения добавились и web/ip-камеры (заодно уж), и общие проблемы с перекодировкой видео из одного формата в другой. Начнем как раз с конца, т.е. с перекодировки.

Леша уже плюнул на попытки заставить непокорную софтину записывать для начала экран в удобоваримом формате MP4, и прислал мне ролик в формате OGG (ну не OGG, OGV), чтоб я разобрался с его перекодированием во что-то более удобоваримое, т.к. не один из наших видеоредакторов формат OGV (кстати, открытый) «из коробки» не поддерживал.

В качестве видеокодека в формате OGV используется кодек Theora, а в MP4 AVC/H.264

OGG в OGV

OGG — изначально, открытый звуковой формат, разработанный как альтернатива закрытым (WMA, MP3). Через некоторое время, данный формат был расширен с добавлением поддержки видео. Но некоторые (несознательные) линуксовые программы пишут видео, а файлы создают с расширением .ogg. Линуксовому софту, типа плееров, вообще на это плевать, но линуксовому софту всегда было плевать на расширения имени файлов, а вот винде нет. Потому, если вам прислали видео в файле с расширением .ogg, то попробуйте поменять расширение на .ogv, скорее всего файл нормально откроется. В K-Lite Mega Codec Pack и в VLC для Windows поддержка, что OGG, что OGV есть точно.

Но все-таки вернемся в Slackware и к преобразованию форматов.

Дополнительные программы, кодеки, библиотеки

В связи с диким онанизмом на «авторские» «права» и зоопарком форматов видео/аудио в Линуксе преобразование одного формата в другой превращается в наркоманский квест. У нас было десять мегабайт библиотек, две сотни кодеков, пакет с разными пакетами, 200 грамм укуреных лицензий… Тьфу, к делу.

Для установки некоторых необходимых пакетов можно воспользоваться sbopkg.

Вообще, для работы с видео и аудио используется программа ffmpeg (v3), но не спешите ставить ее из «официального» репозитория Slackware, как оказалось, чтоб все заработало, пришлось переустанавливать из альтернативного.

Пока вводим в поиске и ставим:

aom (выбираем multimedia/aom в меню sbopkg)
libass
libwebp
x264 (выбираем multimedia/x264 в меню sbopkg)
x265
ffmpeg4

ffmpeg (v3) у меня уже был установлен ранее, так же из официального репозитория Slackware. А вот и зря.

Команда для перобразования

ffmpeg -i input.ogv \
       -c:v libx264 -preset veryslow -crf 22 \
       -c:a libmp3lame -qscale:a 2 -ac 2 -ar 44100 \
       output.mp4

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

Ошибка Unknown encoder ‘libx264’

Как я сказал ранее, ffmpeg из репозитория sbopkg у меня уже стоял. Сначала я подумал, что поможет его полная переустановка с пересборкой пакета (мало ли, свежеустановленные кодеки не видятся). Не помогло.

Решение нашлось здесь

В общем да, из-за голливудских уродов патентных ограничений и прочей юридической хуйни, официальный пакет ffmpeg в Slackware не включает поддержку H.264. Но, слава Великим Древним, проблему решили без нас, и даже в опциях компиляции ковыряться не нужно:

Just to clarify, you’d want the «restricted» ffmpeg that Alien Bob offers, as that includes support for various things that have patent restrictions (like x264 encoding).

Есть готовый альтернативный пакет:

Скачать
Копия на Mega.NZ (+ копия остальных пакетов)

Посмотреть размер каталога в Linux. В консоли, но интерактивно и наглядно (ncdu).

И наглядно увидеть, где засрано 🙂

Для отображения размеров каталогов (с подкаталогами), есть стнадартная утилита du, но, если честно, она не очень удобная. Гораздо удобнее ее аналог, написанный с помощью ncursesncdu

Пользоваться очень просто. Заходим в каталог, в котором хотим узнать размеры подкаталогов, и просто вызываем утилиту:

ncdu

Наверное, ее единственный минус, что в каталог уровнем выше, чем тот, из которого ее вызвали, она не переходит. Так что если хотите посмотреть размеры каталогов сразу во всей файловой системе, надо вызывать ее из корня (/). Но причина такому поведению легко может быть найдена — после запуска утилита сканирует все подкаталоги, чтоб потом нам красиво показать. Чем с более верхнего уровня ее вызываешь, тем дольше процесс сканирования.


Сканирование

В подкаталоги входить можно по ENTER, возврат назад по стрелке влево, клавише h или < (обычно запятая с шифтом) или по нажатию ENTER на .., как в mc. Краткая справка по ? (не забывайте нажать SHIFT), выход по q.


Отображение каталогов и их размеров

В Slackware устанавливается штатным образом через sbopkg, как в других линуксах не знаю, в Убунте и Дебиане есть в репозиториях.

Выход из X через консоль (и желательно удаленно)

Долго искал, как выйти из X через консоль, и в мануалах ничего не мог найти. Почему-то это нигде толком не описано. Хотя, я думаю, завершить X на другой машине удаленно, имея под рукой только консоль/удаленный терминал, возникала не у меня одного.

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

Проверить runlevel

Runlevel или уровень запуска — это программная конфигурация системы, которая позволяет запускать только выбранную группу процессов на определенном этапе. Их до 10, но нас интересует уровень 3 — многопользовательский (консольный) режим, и уровень 5 (в Slackware — 4), многопользовательский графический режим, в котором X-server запускается по умолчанию.

Если система находится на уровне 4 (5), то способы как либо пришибить иксы могут не сработать, иксы перезапустятся. С уровня 3 можно запустить X-сервер вручную, для этого надо в консоли ввести (обычно) startx. Если система на уровне 3, то иксы сравнительно легко прибить (см. ниже).

Визуально уровень запуска обычно определить легко. 3 — после загрузки ОС будет консольное приглашение ввести логин и пароль, например:

Welcome to Linux 4.4.14-smp (tty1)

wolfsсhanze login:

На уровне 4 (5) на экране будет предложение ввести логин/пароль, но уже в иксовой форточке.
Правда, некоторые не очень популярные дистрибутивы хитрят. Например, Puppy Slacko запускается на уровне 3, а X-сервер вызывает уже из своих инициализационных скриптов.

Можно проверить runlevel и в консоли/терминале:

runlevel

Вывод:

N 3

или

who -r

Вывод:

run-level 3 2020-01-28 07:12 last=S

Переключить runlevel

Неверное, самый универсальный способ завершить работу X-server на лету и через консоль, это переключить runlevel. Команда должна быть выполнена от root.

— Для Slackware:

init 3

— Для дистрибутивов с systemd:

systemctl isolate runlevel3.target

Вернуться в иксы.

Для Slackware:

init 4

— Для дистрибутивов с systemd:

systemctl isolate graphical.target

Переключить runlevel по умолчанию (при старте системы)

— Для Slackware:

1. Под root запускаем mc и идем в /etc
2. Ищем там файл inittab и открываем его в редакторе.
3. Ищем строчки:

# Default runlevel. (Do not set to 0 or 6)
id:4:initdefault:

Они обычно в начале файла.

4. Меняем 4 на 3 и сохраняем файл. Если надо X при старте — меняем 3 на 4. Если что, обычно в файле есть комментарий-подсказка (на буржуйском).

— Для дистрибутивов с systemd:

Чтоб X был выключен по умолчанию:

systemctl set-default runlevel3.target

Чтоб X по умолчанию был включен:

systemctl set-default multi-user.target

Подробнее почитать о runlevel

Runlevel в Unix/Linux Копия

Другие способы завершить X-сервер через консоль.

Опять же, повторюсь, стопроцентно это сработает только если X-server запущен вручную (или через скрипты), когда система находится в runlevel 3.

— Придушить X-сервер совсем:

killall Xorg

— Более аккуратно придушить иксы (для систем с systemd). Надо отправить команду завершения оконному менеджеру.

В общем виде:

systemctl stop display-manager.service

Вместо display-manager.service подставляем свой оконный менеджер (наверное, не все поддерживают, но у меня systemd нет, так что не тестировал):

systemctl stop gdm

— Способ для xfce:

xfce4-session-logout --logout --display :0.0

Корректно срабатывает только с локальной консоли. Удаленно может не работать.

Еще про способы выйти в «чистую» консоль из иксов

В некоторых системах до сих пор работает старый способ переключиться в голую консоль, не завершая X-сервер.

Для этого надо нажать Ctrl+Alt+F2F6 и вам откроется чистый терминал. На Ctrl+Alt+F7 обычно сидят сами иксы, и таким образом, можно к ним вернуться. А первый терминал (Ctrl+Alt+F1) иксы занимают под служебные нужды. В некоторых системах для выхода из иксов срабатывает такой способ:

1. Переключиться в первую консоль (Ctrl+Alt+F1)
2. Нажать Ctrl+C/Ctrl+Break

В некоторых системах для выхода из иксов может сработать комбинация Ctrl+Alt+Backspace

В системах, запускающихся в графическом runlevel по умолчанию, это можно использовать для перезагрузки графического окружения, если X зависли (как soft-restart в Windows 98). Так же можно использовать и команду killall Xorg

Установка и настройка I2P в Slackware Linux

Преамбула

I2P это такая скрытая пиринговая сеть, подробнее можно узнать в Википедии или на официальном сайте. В отличии от TOR, она обеспечивает не анонимный доступ в Интернет, а доступ к собственным ресурсам (сайтам, файлообменникам и т.д.), скрытым из обычной сети. Гейты в «большой» Интернет в ней есть, но они кривые, косые и пользоваться ими не рекомендуется. Расскажу, как ее установить и настроить на Slackware, заодно разрешив пользователям из локальной сети также получать к ней доступ.

Установка Java

Клиент сети написан на Java, потому ее надо сначала установить. На официальном сайте есть рекомендации о необходимой версии:
Java Runtime Version 7 or higher. (Oracle, OpenJDK, or IcedTea Java Version 7 or 8 recommended.
Сама установка довольно проста:
1. Идем, например сюда
2. Скачиваем jdk-8u162-i586-2gds.txz
3. Устанавливаем стандартным образом:

installpkg jdk-8u162-i586-2gds.txz

4. Добавляем в автозагрузку (если вы не сделали отдельного скрипта для запуска сервера, то /etc/rc.d/rc.local) пути к java:

echo "Add JAVA paths..."
export JAVA_HOME=/usr/lib/java
export MANPATH="${MANPATH}:${JAVA_HOME}/man"
export PATH="${PATH}:${JAVA_HOME}/bin:${JAVA_HOME}/jre/bin"

5. Перезагружаем машину.
6. Вводим в консоли команду java без параметров. Если все было сделано правильно, то вы должны увидеть вывод краткой справки по параметрам java.

Создание пользователя для I2P

Понятно, что операции с пользователями надо делать под root или с sudo.

1. Создаем отдельную группу для I2P:

groupadd i2pgrp

2. Создаем интерактивного (пока, потом мы вырубим ему всю интерактивность) пользователя, например i2psrv:

useradd -g i2pgrp -m -d /home/i2psrv -s /bin/bash i2psrv

где:
-g i2pgrp — группа пользователя (i2pgrp)
-m — создать домашний каталог
-d /home/i2psrv — путь к домашнему каталогу (/home/i2psrv)
-s /bin/bash — установить пользователю оболочку, в данном случае фиктивную (/bin/bash)
i2psrv — имя пользователя

3. Задаем ему пароль:

passwd i2psrv

В интерактивном режиме повторяем пароль 2 раза, о сложности можно не беспокоиться — все равно потом отключим.

Установка

1. Скачиваем установщик для Linux с официального сайта
2. Копируем в директорию пользователя (/home/i2psrv) и меняем владельца файла:

chown i2psrv:i2pgrp i2pinstall_0.9.44.jar

3. Логинимся под новым пользователем.
4. Запускаем установку (через консоль):

java -jar i2pinstall_0.9.44.jar -console

5. Приводят возможность выбрать язык:

Select your language
0 [x] eng
1 [ ] bra
2 [ ] cat
3 [ ] ces
...

Оставляем английский (нажимая ENTER).

6. Далее предлагают продолжить установку:
Нажимаем 1 [ENTER]

7. Опять лицензия и всякая хрень:
Нажимаем 1 [ENTER]

8. Выбор пути для установки. Поскольку устанавливаем в каталоге нового пользователя, пусть так и делает — нажимаем [ENTER]

9. Далее нажимаем O и [ENTER] (в прошлых версиях было меньше гемора и подтверждений, а сейчас словно анкету в ментовку работать заполняешь 🙂

10. Еще раз предлагают подтвердить, что все ОК (1 и [ENTER])
11. Наконец, тебе говорят, что все ОК:

====================
Installation started
Framework: 5.1.3-84aaf (IzPack)
Platform: linux,version=4.4.14-smp,arch=x86,symbolicName=null,javaVersion=1.8.0_232
[ Starting to unpack ]
[ Processing package: Base (1/1) ]
[ Unpacking finished ]
Installation finished
On most systems, I2P can be started with:

/home/i2psrv/i2p/i2prouter start

If I2P does not start, please try:

/home/i2psrv/i2p/runplain.sh

12. Тебе говорят, что все совсем ОК:

Installation was successful
Application installed on /home/i2psrv/i2p
[ Writing the uninstaller data ... ]
[ Console installation done ]

Расшаривание I2P-сервисов в локальной сети.

Если вы намерены использовать I2P только на локальном компьютере, этот шаг можно пропустить.

1. Идем в файл /home/i2psrv/i2p/i2ptunnel.config, предварительно его куда-нибудь скопировав, и меняем в нем все 127.0.0.1 на адрес нашего компьютера в локальной сети (например на 192.168.0.20, см. адрес вашего компьютера), таким образом все сервисы I2P будут доступны с любой машины в локальной сети.
2. В том же файле смотрим порты, если где-то у нас какой-то порт для чего-то занят, например на том же порту уже висит HTTP или TOR-proxy, смело меняем порт.

Переключение пользователя

I2P — порядочный сервис, и сам умеет переключать пользователя, под которым запускается. Некоторые даже рекомендуют завести двух пользователей, одного для запуска, другого для установки I2P, но мы, ради экономии времени, делать этого не будем — и запуск и установка будут под одним пользователем. Тем не менее, необходимо отредактировать скрипт i2prouter/home/ip2srv/i2p):

1. Ищем строку, содержащую RUN_AS_USER=
2. Раскомментируем ее (удаляем # в начале строки).
3. Дописываем после знака = имя пользователя (в этом примере «i2psrv").

Расшаривание Web-консоли

Отслеживание статуса соединения с сетью I2P, ошибки и основные настройки доступны через Web-интерфейс, который запускается на локальной машине на порту 7657, но если физического доступа к той машине, на которой установлен I2P нет (или лень), то можно управлять ей и с любого компьютера локальной сети.

Внимание! Это не очень одобряется официальными инструкциями. По идее можно сделать безопасный SSL-туннель, как это описывалось в одной из старых инструкций. Но я опишу самый простой вариант, просто поменяю конфиг.

Заходим в clients.config (/home/i2psrv/i2p), предварительно сделав бэкап.
И опять меняем 127.0.0.1 на 192.168.0.20, т.е. меняем адрес машины, по которому должна появиться консоль.
Далее меняем clientApp.4.startOnLoad=true на clientApp.4.startOnLoad=false, т.к. на сервере нет смысла открывать панель управления после старта I2P.

Дальнейшая настройка под катом

Проверка

Переходим по адресу http://i2p-projekt.i2p

I2P довольно медленная сеть и работает с некоторыми перебоями, так что если вместо сайта вы увидите надпись «Сайт недоступен. Возможно, сайт отключен, сеть перегружена или ваш маршрутизатор недостаточно интегрирован с другими пирами. Вы можете повторить операцию.«, то действительно, скорее всего, операцию нужно повторить.

Отключаем интерактив пользователю i2psrv

На самом деле интерактивный доступ к системе для пользователя i2psrv был нужен только на этапе установки сервиса I2P, и я оставлял его до конца настройки на случай, если I2P понадобится переустановить. Теперь консоль пользователю i2psrv более не нужна. Отключаем:

Редактируем (под root‘ом) файл /etc/passwd.
Находим в этом файле строку, начинающуюся с имени пользователя (i2psrv) и в конце строки меняем /bin/bash на /bin/false.
Сохраняем файл.

Что дальше?

Остались нераскрытыми темы подписок (как добавлять I2P-сайты неизвестные вашему маршрутизатору I2P), интересные I2P-сайты, другие сервисы I2P, кроме WWW. Может быть когда-нибудь вернусь к этому вопросу, а пока рекомендую детально ознакомиться с документацией на сайте https://geti2p.net/, http://i2p-projekt.i2p и в консоли I2P.

Установка и настройка tor-ноды

Установка tor

1. Загружаем исходники tor отсюда я взял версию 0.4.2.4-rc посвежее.

2. Собираем пакет:
— Распаковываем из архива каталог tor-0.4.2.4-rc со всеми подкаталогами
— Переходим в этот каталог и выполняем последовательно:

./configure
make
checkinstall

checkinstall нас спросит, какой пакет хотим создать (Slackware [S], RPM [R] or Debian [D]?), отвечаем s, далее вводим описание пакета, например tor и нажимаем два раза ENTER, после чего подтверждаем, что все верно (нажав ENTER еще раз) и checkinstall создаст пакет.

3. Можно сразу его установить:

installpkg tor-0.4.2.4-rc-i386-1.tgz

Создаем пользователя для tor

Негоже запускать tor под обычным пользователем, а тем более под root‘ом, потому создадим для него отдельного пользователя. Пользователь будет неинтерактивный, т.е. войти в систему с терминала он не сможет.

1. Добавляем группу, например torgroup:

groupadd torgroup

2. Смотрим файл /etc/shells и проверяем, чтоб в файле была строка /bin/false, если ее нет — смело дописываем.

3. Создаем пользователя с именем, например, torusr:

useradd -g torgroup -m -d /home/torusr -s /bin/false torusr

где:
-g torgroup — группа пользователя (torgroup)
-m — создать домашний каталог
-d /home/torusr — путь к домашнему каталогу (/home/torusr)
-s /bin/false — установить пользователю оболочку, в данном случае фиктивную (/bin/false)
torusr — имя пользователя

4. Создаем каталог для данных tor:

cd /home/torusr
mkdir .tordata

и изменяем владельца созданного каталога на torusr

chown torusr:torgroup .tordata

Настройка tor-ноды

В каталоге /home/torusr создаем файл torrc и записываем в него следующие строки:

SocksPort 9050 — порт на localhost, где будет висеть tor, и принимать на него запросы. Проще говоря, это порт прокси-сервера, который надо будет прописать, чтоб соединиться с сетью tor с локальной машины. Порт 9050 является портом по умолчанию, и назначается на localhost (127.0.0.1), если строки SocksPort будут отсутствовать в конфигурации.

SocksPort 192.168.0.20:9660 — то же самое, только внутри локальной сети. Клиенты из локальной сети должны будут подключаться по адресу 192.168.0.20 и порту 9666, чтобы использовать сеть tor.

Tor организует только SOCKS5 прокси, как быть с браузерами, которым нужен HTTP, рассмотрим далее.

SocksPolicy accept 192.168.0.0/24
SocksPolicy accept 127.0.0.1
SocksPolicy reject *

Принимать запросы только из локальной сети и localhost’а.

Log notice file /home/torusr/notices.log — файл, куда будет писаться лог tor’а

RunAsDaemon 1 — запуск tor в режиме демона.

DataDirectory /home/torusr/.tordata — путь для данных tor

ORPort 9001 — порт, используемый для пересылки пакетов с других узлов.

DirPort 9030 — порт, используемый для сервиса каталогов, т.е узел будет позволять получать информацию о других узлах tor, а не только транслировать трафик.

Конечно, стоило бы облегчить жизнь пользователям, сидящим за сетевыми экранами и пустить трафик по портам 80 (8080) или 443, но я пока не стал. Впрочем, если вам будет надо — смотрите статью на Хабре (копия)

RelayBandwidthRate 1000 MB
RelayBandwidthBurst 2000 MB
— ограничение пропускной способности. Чем больше, тем лучше. Но настраивайте эти числа под свой канал, чтоб не загадить его трафиком tor совсем.

Nickname PersonalChaosRelay — имя вашего релея (ноды) в базе tor. Можете придумать любое, но советую сначала проверить придуманное имя здесь, введя его в поиске. Если ничего не найдется, проздрабляю, ваш релей будет уникальным.

ExitPolicy reject *:*
ExitPolicy reject6 *:*
— запрет использовать tor-ноду в качестве выходной. Для ГОРФ параметр строго обязательный.
Примечание: в /usr/local/etc/tor находится файл torrc.sample с подробным описанием конфигурации.
Пример файла конфигурации на PasteBin

Устанавливаем файлу правильного владельца:

chown torusr:torgroup torrc

Запуск ноды

Запуск осуществляется следующей командой:

sudo -u torusr tor -f /home/torusr/torrc

Если помещать запуск в автозагрузку, то желательно указать полный путь к файлу tor:

sudo -u torusr /usr/local/bin/tor -f /home/torusr/torrc

Запуск в отдельном network namespace (копия):

ip netns exec provns sudo -u torusr /usr/local/bin/tor -f /home/torusr/torrc

provns — имя network namespace

Проверка работоспособности

Минут через 15-20 после запуска можно заглянуть в /home/torusr/notices.log, если в последних строках файла написано что-то типа:

Self-testing indicates your ORPort is reachable from the outside. Excellent. Publishing server descriptor.
Tor has successfully opened a circuit. Looks like client functionality is working.
Self-testing indicates your DirPort is reachable from the outside. Excellent.
Performing bandwidth self-test...done.

значит порты ORPort и DirPort доступны извне, и нода нормально функционирует.

Если же в логе что-то типа:

Your server (x.x.x.x:9001) has not managed to confirm that its ORPort is reachable. Relays do not publish descriptors until their ORPort and DirPort are reachable. Please check your firewalls, ports, address, /etc/hosts file, etc.
Your server (x.x.x.x:9030) has not managed to confirm that its DirPort is reachable. Relays do not publish descriptors until their ORPort and DirPort are reachable. Please check your firewalls, ports, address, /etc/hosts file, etc.

значит порты недоступны из интернета (закрыты фаерволлом, нужно сделать проброс портов на роутере, порты закрыты провайдером) и нода не появится в списке нод и не будет принимать соединения.
В режиме клиента все будет работать, т.е. клиенты из локальной сети смогут ей пользоваться для выхода в сеть tor

Если все в порядке, то через несколько часов нода появится в базе данных, и можно будет проверить ее наличие здесь введя в поисковой строке на странице Nickname, который указали в конфиге.

Настройка для клиентов под катом

Network namespaces или несколько виртуальных сетевых карт (интерфейсов) с разными IP на одной машине.

С одной физической сетевой картой.

Для чего.

Например мы хотим организовать следующую схему:
1. После запуска сервер устанавливает соединение с VPN-провайдером, и весь трафик идет через VPN.
2. Некоторым программам VPN не нужен, пусть это например будут TOR, I2P (у них и так шифрование, плюс им бы желательно скорость работы повыше, а напрямую соединяться быстрее, чем через VPN). Плюс, например, мы хотим ходить на некоторые сайты в обход VPN, либо иметь возможность запускать в обход VPN какие-либо трафикоемкие программы, например торрент-клиент. Ну пусть еще будет отдельный локальный сервис, например FTP, также висящий на отдельном IP.

Как.

В Linux есть замечательный механизм network namespaces, который на одной машине позволяет создать несколько изолированных друг от друга сетевых подсистем, почти как сеть в виртуальной машине. Не бойтесь, все делается на уровне ядра, потому тормозов, характерных для виртуальных машин не будет. И пусть слово «изолированных» вас тоже не пугает, когда надо — изолированных, а когда надо — мы их свяжем.

Эмулируется полностью сетевой стек: сетевые интерфейсы, таблица маршрутизации, файрволл и т.д. Так, как это работает на уровне ядра и для определенных процессов, то вполне можно получить рабочую конфигурации, когда на одной машине есть несколько сетевых интерфейсов с одинаковыми IP-адресами и ничто не конфликтует.

Подготовка

Поскольку в процессе нам придется поднимать/опускать физические и виртуальные сетевые карты, настоятельно советую отключить Network Manager, а основную сеть настроить вручную. С включенным Network Manager может ничего не получиться, т.к. он в самый ответственный момент влезет и напоганит в конфигурации.

Как на Slackware отключить Network Manager и настроить сеть вручную (копия)

Создание и конфигурация network namespace.

Конфигурация namespace’ов производится с помощью iproute2.

1. Создаем новый неймспейс с именем provns:

ip netns add provns

2. Создаем две связанных между собой виртуальных сетевых карты (интерфейса)

ip link add veth0 type veth peer name veth1

3. Поднимаем интерфейс veth0:

ifconfig veth0 0.0.0.0 up

4. Ассоциируем вторую виртуальную карту с созданным нэймспейсом:

ip link set veth1 netns provns

Получился один дополнительный namespace, связанный с основным виртуальными сетевыми интерфейсами veth0 и veth1.

Теперь надо связать виртуальный интерфейс veth0 с физической сетевой картой (интерфейсом) eth0. Сделать это можно разными способами, например, присвоить интерфейсам разные IP-адреса из разных подсетей и сделать маскарадинг с помощью IPTABLES, а можно воспользоваться мостами.

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

Подробнее про мосты:
Linux Bridge
Виртуальные сетевые устройства в Linux: Linux Bridge
10 примеров команды brctl в Linux для сетевого Ethernet моста
Эти статьи в PDF

Итак:
5. Отключаем физический интерфейс eth0:

ifconfig eth0 down

6. Включаем его, но IP-адрес не присваиваем (IP-адрес будет присвоен мосту):

ifconfig eth0 0.0.0.0 up

7. Создаем мост br0:

brctl addbr br0

8. Соединяем (добавляем интерфейсы к мосту) eth0 и veth0:

brctl addif br0 eth0 veth0

9. Поднимаем (включаем) мост, присваивая ему IP-адрес и маску подсети:

ifconfig br0 192.168.0.15 netmask 255.255.255.0 up

Получилось как на схеме:

10. Устанавливаем маршрут по умолчанию в основном namespace:

ip route add default via 192.168.0.1 dev br0 src 192.168.0.15

Далее конфигурируем namespace:

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

ip netns exec <имя_namespace> <команда> [параметры_команды]

Например, если мы хотим выполнить ifconfig в namespace с именем provns, то команда будет:

ip netns exec provns ifconfig

11. Поднимаем (включаем) сетевой интерфейс veth1 внутри нэймспейса provns, и присваиваем ему адрес 192.168.0.20:

ip netns exec provns ifconfig veth1 192.168.0.20 netmask 255.255.255.0

12. Прописываем внутри нэймспейса маршрут по умолчанию:

ip netns exec provns ip route add default via 192.168.0.1 dev veth1 src 192.168.0.20

13. Поднимаем внутри namespace’а loopback-интерфейс:

ip netns exec provns ifconfig lo 127.0.0.1

Скрипт для автоматизации настройки network namespace.

Под катом

Скрипт целиком на GitHub