Обо всём.
2 заметки с тегом

bash

«Проброс» порта внутрь сети через iptables

14 апреля 2015, 21:28

Для примера рассматриваю случай, когда на машине установлены Linux containers (LXC) и нужно «пробросить» порт для соединения по ssh c машиной-гостем напрямую. На машине-хосте один сетевой интерфейс и он имеет статический IP 192.168.1.100, порт с которым надо будет соединяться чтобы получить доступ к гостю выберем 1022, гостевая машина находится в виртуальной подсети и имеет IP 10.0.3.150, а порт на ней у ssh стандартный 22.

iptables -t nat -I PREROUTING -p tcp -d 192.168.1.100 --dport 1022 -j DNAT --to 10.0.3.150:22
iptables -A FORWARD -p tcp -d 10.0.3.150 --dport 22 -j ACCEPT

В Ubuntu и Debian можно установить пакет iptables-persistent, который запомнит все текущие настройки iptables и будет загружать во время старта системы.
Если делается проброс в одной сети (например, с какой-то целью надо было перебросить соединение с 192.168.1.100:1022 на 192.168.1.150:22), необходимо добавить:

iptables -t nat -I POSTROUTING -p tcp -d 192.168.1.150 --dport 22 -j SNAT --to-source 192.168.1.100

Подробности этого случая хорошо описаны в статье Проброс порта на другой комп, iptables:

Пакет прилетает на сервер A в цепочку PREROUTING, правило (DNAT) изменяет адрес назначения на IP:PORT сервера B. Таким образом пакет не попадает на сервер A, и переходит в цепочку POSTROUTING, тут правило (SNAT) подменяет адрес обратно на сервера A, чтобы сервер B отправлял ответный пакет на сервер A.

В остальном рекомендую «курить» man iptables.

Post ScriptumСтатьи с меткой bash я пишу в первую очередь для себя, чтобы не искать концы по всему интернету и не восстанавливать подолгу последовательность команд, поэтому здесь всё кратко и по делу. Если тебе, читатель, есть что сказать — пиши мне на email с любым именем пользователя в домене второго уровня.

Скачать видео

21 ноября 2014, 12:19

Стояла задача скачать множество видеороликов. Сайт не популярный, инструкций не нашлось. Плеер прочитывает xml со ссылками на несколько потоков отличающихся разрешением и скоростью потока (bitrate), потом загружает сегменты, адреса которых оканчиваются возрастающими номерами. Можно было запустить цикл и формировать ссылки, но мне не понравился кодек Adobe (который мало кто читает) и неизвестно при каких условиях завершать цикл. На iOS используется другой адрес, сначала загружается плейлист со ссылками на несколько плейлистов с видео по возрастанию качества (аналогично xml выше), а в каждом из этих плейлистов перечисляются адреса сегментов видеопотока. Я скормил этот адрес wget-у, благо аутентификация происходила до отправки адреса плейлиста.

wget -qO- ссылка-на-начальный-плейлист.m3u8 | tail -n 1 | wget -i - -qO- | wget -i - -P "./каталог куда сохранять куски"

Здесь tail отрезает последнюю ссылку. Файлы потока оканчиваются расширением ts (MPEG-2 transport stream), их можно было даже дописывать все в один файл (через параметр -O), но я сохранял их в каталог. Для объединения скачанных сегментов надо сформировать список файлов и передать его ffmpeg.

find . -name *.ts  -exec basename {} \; | sort -n | while read line; do printf "file '%s'\n" "$line"; done | ffmpeg -f concat -i - -bsf:a aac_adtstoasc "Объединённый и перекодированный файл.m4v"

Запуск функции basename в find нужна для последующей правильной сортировки. Объединение и перекодировка ffmpeg-ом убирает лишние данные из файлов потока, размер уменьшается грубо говоря в полтора раза. Кстати, параметр -bsf:a aac_adtstoasc подсказал сам ffmpeg выдав ошибку: [ipod @ 0x7fa89b800c00] Malformed AAC bitstream detected: use the audio bitstream filter 'aac_adtstoasc' to fix it ('-bsf:a aac_adtstoasc' option with ffmpeg) av_interleaved_write_frame(): Operation not permitted
Окончательный однострочный скрипт для объединения файлов во всех каталогах получился таким:

find . -type d | while read catalogue; do if ! [ -e "$catalogue.m4v" ]; then find "$catalogue" -name *.ts  -exec basename {} \; | sort -n | while read line; do printf "file '$catalogue/%s'\n" "$line"; done | ffmpeg -f concat -i - -bsf:a aac_adtstoasc "$catalogue.m4v"; fi; done;

Post ScriptumСтатьи с меткой bash я пишу в первую очередь для себя, чтобы не искать концы по всему интернету и не восстанавливать подолгу последовательность команд, поэтому здесь всё кратко и по делу. Если тебе, читатель, есть что сказать — пиши мне на email с любым именем пользователя в домене второго уровня.