, ,

5 декабря, 2024

Netcat: универсальный швейцарский нож для сетевых операций

Давно на этом сайте не было статей про unix way подход. Не было ничего насчет инструментов командной строки, который нельзя игнорировать даже в наш век сложных UI UX инструментов, командная строка остается один из самых эффективных инструментов в профессиях связанных с IT индустрией, поэтому тут хотел бы рассказать и привести примеры взаимодействия с сетью через такую замечательную команду как netcat доступная в большинстве дестрибутивом unix подобных систем

Итак, поехали!

Netcat (nc) — это маленькая, но мощная утилита в мире UNIX, которая часто упоминается как «швейцарский нож» для сетевых операций. Она позволяет нам отправлять и принимать данные по сети, а также может заменить сразу несколько специализированных утилит. В этой статье мы разберём, как nc может облегчить жизнь системного администратора, разработчика, а также просто энтузиаста, заинтересованного в исследовании сетевых возможностей.

Зачем нужен Netcat?

Использование nc может быть полезно для диагностики сети, передачи файлов, отладки сетевых приложений и даже создания простых серверов и клиентов. Главный плюс — это гибкость nc и поддержка широкого диапазона сетевых протоколов и операций.

Установка Netcat

В большинстве UNIX-систем Netcat уже установлен. Но если вдруг у вас его нет, можно легко добавить его через менеджер пакетов:

# На Debian/Ubuntu
sudo apt install netcat

# На CentOS/RHEL
sudo yum install nc

# На MacOS
brew install netcat

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

1. Диагностика открытых портов

Вы хотите узнать, открыт ли определённый порт на сервере, или, возможно, провести быструю диагностику состояния сети? Netcat может помочь!

nc -zv example.com 80
  • -z — режим проверки портов (без отправки данных).
  • -v — включение режима подробного вывода (verbose).

Пример вывода:

Connection to example.com 80 port [tcp/http] succeeded!

Этот трюк полезен для быстрого анализа открытых портов на сервере, например, при проверке, работает ли сервер после перезагрузки.

2. Передача файлов

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

На стороне отправителя (отправка файла):

cat myfile.txt | nc -l 1234

На стороне получателя (приём файла):

nc <IP-адрес> 1234 > receivedfile.txt

После выполнения этих команд содержимое myfile.txt на отправляющей стороне будет передано и сохранено как receivedfile.txt на принимающей стороне. Эта опция отлично подходит для работы в рамках одного сегмента сети или виртуальной среды.

3. Запуск простого сервера или тестового чата

Допустим, вы хотите создать простой сервер для прослушивания на определённом порту, чтобы принимать текстовые сообщения или проверять сетевые соединения. Netcat справится с этим в два счёта!

# Серверная сторона
nc -l 5555

Сервер готов и прослушивает подключение на порту 5555. Теперь на клиентской стороне подключаемся к этому порту:

# Клиентская сторона
nc <IP-адрес сервера> 5555

Теперь у нас есть простой чат-сервер! Всё, что вы набираете на стороне клиента, будет отображаться на сервере, и наоборот. Этот метод часто используется для тестирования или отладки сетевых соединений и приложений в реальном времени.

4. Реализация теста скорости сети

С помощью nc и pv (pipe viewer) можно провести тест скорости сети, чтобы понять, насколько хорошо она работает. В этом случае pv отправляет данные через nc, и это полезно, когда требуется быстро протестировать локальную сеть.

На серверной стороне:

nc -l 5555 > /dev/null

На клиентской стороне:

pv /dev/zero | nc <IP-адрес сервера> 5555

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

5. Проверка DNS-серверов и отправка DNS-запросов

С помощью nc можно отправить DNS-запрос напрямую на сервер для отладки или диагностики.

Например, чтобы отправить DNS-запрос на определённый сервер, можно использовать комбинацию с echo:

echo -e "\x12\x34\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03www\x06google\x03com\x00\x00\x01\x00\x01" | nc -u 8.8.8.8 53
  • Команда echo -e создаёт DNS-запрос в шестнадцатеричном формате, чтобы запросить www.google.com.
  • -u указывает, что нужно использовать UDP, так как DNS работает на этом протоколе.

Это полезно для диагностики сетевых проблем и проверки того, как работает DNS-сервер.

6. Мониторинг TCP и UDP портов (сетевой сниффер)

Netcat может быть использован как базовый сетевой сниффер для мониторинга входящих данных на портах. Например, если нужно прослушивать UDP-порт на 5555:

nc -u -l 5555

Этот режим полезен для диагностики UDP-соединений или проверки активности на порту, особенно если данные передаются по сети случайным образом.

7. Проверка доступности веб-сайта и получение HTTP-заголовков

С помощью nc можно проверить, правильно ли работает веб-сервер, отправив к нему HTTP-запрос и получив заголовки ответа.

echo -e "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n" | nc example.com 80

Этот запрос отправляет простую команду GET на сервер example.com, и Netcat возвращает HTTP-заголовки, позволяя увидеть статус-сообщение и понять, отвечает ли сервер.

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

Netcat можно использовать для копирования содержимого одного жесткого диска на другой через сеть. Этот метод подойдёт для создания резервных копий или клонирования.

На стороне отправителя:

dd if=/dev/sda | nc -l 1234

На стороне получателя:

nc <IP-адрес отправителя> 1234 | dd of=/dev/sdb

Здесь dd используется для чтения данных с диска, а nc передаёт эти данные по сети на другой диск. Это эффективный способ, но требует осторожности, так как данные могут быть перезаписаны.

9. Отправка сообщений в чат в несколько потоков

Netcat можно настроить для создания текстового чата между несколькими пользователями, что пригодится, например, для координации действий в одной сети.

На стороне сервера:

mkfifo mypipe
nc -l 1234 < mypipe | tee mypipe

На стороне клиента:

nc <IP-адрес сервера> 1234

Тут мы используем именованный канал (FIFO) mypipe для передачи данных в двух направлениях. Это позволяет передавать сообщения от всех подключённых клиентов серверу и обратно.

10. Сканирование диапазона портов на удалённом сервере

Netcat может быть использован для быстрого сканирования диапазона портов, чтобы узнать, какие из них открыты. Хотя это и не заменяет полноценные сканеры (как nmap), Netcat предоставляет простое решение.

for port in {20..25}; do
  echo "" | nc -v -w 1 -z example.com $port
done
  • -w 1 устанавливает таймаут в 1 секунду.
  • -z указывает на то, что нам нужно только проверить открытость порта, не отправляя данных.

Это полезно для быстрого анализа доступных портов на целевом сервере.

11. Организация обратного подключения для удалённого доступа

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

На целевой стороне:

nc -l -p 1234 -e /bin/bash

На управляющей стороне:

nc <IP-адрес целевой машины> 1234

После подключения управляющая сторона сможет получить доступ к командной строке удалённого сервера. Однако важно помнить, что этот метод небезопасен и должен использоваться только в закрытых и безопасных средах.

12. Перехват и просмотр трафика на локальном интерфейсе

Перехват и просмотр трафика на локальном интерфейсе

Если вы хотите быстро посмотреть, что за трафик проходит через ваш локальный интерфейс, можно использовать комбинацию nc и tcpdump.

tcpdump -i eth0 -s0 -w - | nc -l 1234

Эта команда захватывает трафик на интерфейсе eth0 и передаёт его через nc для анализа. На другой стороне можно подключиться к этому порту и просматривать трафик в реальном времени.

Ну и немного совсем экзотических примеров использования команды nc

13. Создание простого веб-сервера на базе nc

С помощью nc можно запустить минималистичный HTTP-сервер на своём компьютере, который будет отдавать статический файл или HTML-страницу. Это может пригодиться для быстрой демонстрации или тестирования локально без полноценного веб-сервера.

Пример команды для одностраничного веб-сервера:

while true; do echo -e "HTTP/1.1 200 OK\r\nContent-Length: $(wc -c < index.html)\r\n\r\n$(cat index.html)" | nc -l -p 8080; done
  • Эта команда запускает бесконечный цикл, который отдаёт содержимое файла index.html по HTTP на порт 8080.
  • Подойдёт для тестов, проверки HTTP-запросов и небольших демонстраций.

Теперь, зайдя на http://localhost:8080 в браузере, можно увидеть содержимое index.html.

14. Туннелирование TCP-порта через UDP (обход блокировок)

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

Серверная сторона (UDP к TCP-туннель):

nc -u -l -p 5555 | nc localhost 80

Здесь nc принимает UDP-пакеты на порту 5555 и перенаправляет их к TCP-соединению на локальный порт 80 (обычно HTTP).

Клиентская сторона:

echo "GET / HTTP/1.1\r\nHost: localhost\r\n\r\n" | nc -u <IP-адрес сервера> 5555

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

15. Переключатель музыки или медиа-сервера через аудиопоток

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

На стороне отправителя:

cat song.mp3 | nc -l -p 4000

На стороне получателя:

nc <IP-адрес отправителя> 4000 | mpv -
  • Эта команда передаёт файл song.mp3 через nc, а на принимающей стороне поток воспроизводится плеером mpv.
  • Подходит для потоковой передачи аудиофайлов или даже видео через локальную сеть без сложной настройки.

16. Координация команд в кластере

Если у вас есть несколько серверов, и вам нужно выполнить одну и ту же команду на каждом из них, nc можно использовать для координации. Один сервер действует как мастер, отправляя команды всем остальным.

На сервере-мастере:

echo "ls -l /home" | nc -w 1 <IP-адрес сервера1> 1234
echo "ls -l /home" | nc -w 1 <IP-адрес сервера2> 1234

На каждом из серверов:

nc -l 1234 | bash
  • Эта команда отправляет ls -l /home от мастера, и все серверы её выполняют.
  • Применимо для быстрой автоматизации команд или тестирования на нескольких серверах без сложной настройки.

17. Секретное сообщение с самоуничтожением

Можно отправить сообщение через nc с таймером самоуничтожения, чтобы оно удалилось сразу после прочтения, как в шпионских фильмах.

На стороне отправителя:

echo "Это сообщение самоуничтожится через 5 секунд" | nc -l -p 5000

На стороне получателя:

nc <IP-адрес отправителя> 5000 && sleep 5 && echo "Сообщение удалено"

После того как сообщение прочитано, команда sleep 5 завершает выполнение через 5 секунд, и на экране выводится сообщение о том, что оно было «удалено».

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

, , ,

7 ноября, 2024

Устанавливаем Shadowsocks на свой сервер

Для начала стоит объяснить, что такое Shadowsocks и для чего он может быть полезен.

Иногда вы можете оказаться в сети с ограничениями, где фильтруется интернет-трафик, и доступ к определённым ресурсам блокируется. Такие ограничения могут встречаться, например, в корпоративной сети на работе. Если вам необходимо обойти такие блокировки и получить доступ к нужным сайтам, на помощь может прийти инструмент под названием Shadowsocks. По сути, это прокси-сервер, который использует протокол SOCKS5 для передачи данных.

Протокол SOCKS5 позволяет создать зашифрованное соединение и направлять трафик через него, делая его менее заметным для фильтров и блокировок. В этой статье я расскажу, как быстро развернуть свой прокси-сервер с использованием Shadowsocks. Чем-то это напоминает создание шифрованного тоннеля через ssh.

Для начала вам необходим свой сервер. Если у вас еще нет своего сервера, то переходите по ссылке и зарегистрируйте его. Хостинг дает сутки на тестирование, поэтому можно проверить как работает тот же sadownsocks, например.

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

$ sudo apt update
$ sudo apt install shadowsocks-libev

Теперь нужно создать основной файл с настройками shadowsocks. Поэтому создаем в /etc/shadowsocks-libev файл config.json со следующем содержимым:

{
    "server": "[server]",
    "server_port": "[server_port]",
    "password":"[password]",
    "mode":"tcp_and_udp",
    "timeout": 300,
    "local_port": "[local_port]",
    "method": "xchacha20-ietf-poly1305",
    "fast_open": true,
    "nameserver": "8.8.8.8"
}

server — ip адрес сервера
server_port — сервер порт через который будет создан тоннель ( замените на свой )
password — пароль подключения ( замените на свой )
method — метод шифрования ( если не уверены, то лучше оставить такой как в примере )
local_port — порт на локальной машине через который будет проходить зашифрованный трафик

Если у вас на сервере установлен файрвол, то необходимо открыть порт, который был указан в настройках:

$ sudo ufw allow [server_port]
$ sudo ufw reload

Теперь можно запустить shadowsocks:

$ sudo systemctl restart shadowsocks-libev

После этого на сервере все готово и можно приступать к настройке клиентской части.

Для того, чтобы запустить зашифрованный socks5 на вашей локальной машине потребуется установить Shadowsocks клиент. Вот несколько вариантов для разных систем:

Windows

  1. Shadowsocks for Windows — Официальный клиент с графическим интерфейсом.
  2. ShadowsocksR — Модифицированная версия Shadowsocks, поддерживающая дополнительные шифрования и функции.
  3. Outline — Простой в использовании клиент, который также поддерживает Shadowsocks и удобен для новичков.

macOS

  1. ShadowsocksX-NG — Популярный клиент для macOS с поддержкой Shadowsocks и дополнительными функциями.
  2. Outline — Также доступен для macOS, позволяет легко подключаться к Shadowsocks-серверам.

Linux

  1. Shadowsocks-libev — Лёгкий клиент для Linux, поддерживающий командную строку и простой в настройке.
  2. Outline — Клиент с графическим интерфейсом, доступный для нескольких версий Linux.
  3. Shadowsocks-qt5 — Версия с графическим интерфейсом, подходящая для пользователей, предпочитающих GUI.

Android

  1. Shadowsocks for Android — Официальное приложение для Android с поддержкой настроек и переключений.
  2. ShadowsocksR Android — Вариант с дополнительными настройками и функциями.
  3. Outline — Отличный вариант для пользователей, которые хотят быстро подключиться без сложных настроек.

iOS

Outline — Простое и удобное приложение, особенно для начинающих.

Shadowrocket — Один из самых популярных и мощных клиентов для iOS, поддерживает Shadowsocks и другие протоколы.

Potatso Lite — Поддерживает Shadowsocks и имеет удобный интерфейс.

Выбираем подходащий клиент и настраиваем соединение в нем для сервера на который поставили shadwonsocks

После установки соединения SOCKS5 будет доступен на локальной машине на порту local_port который ранее мы указали в настройках shadownsock на сервере

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

, ,

30 июля, 2024

Обычный SSH тоннель

Понимаю, что банальность, но пусть будет.

Часто требуется подключится к базе данных mysql боевого сервера, но порт 3306 доступен только в localhost, для решения этой тривиальной задачи нам поможет ssh тоннель.

ssh -f -N -L 3307:localhost:3306 remote_host

Теперь в вашем localhost будет доступен порт 3307 через который вы сможете подключится к базе данных mysql на боевом хосте

-f запуск в фоне 
-N не выполнять команду (без нее и -f запустить шел на удаленном хосте)
-L перенаправление портов

апдейд:

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

$ vim ~/.zshrc

вставляем эту строку в конце файла

<br>alias create_tonnel="ssh -f -N -L 3307:localhost:3306 remote_host"

и выходим из vim

:wq

, ,

3 августа, 2012

Групповое переименование файлов по маске

По долгу службы встала задача переименовать группу файлов в директории по маске ( убрать у php файлов префикс и постфикс ).
Исходные файлы вида aqNameClass.class.php нужно привести к виду NameClass.php

Решается эта задача одной командой shell:

for i in *.class.php; do mv "$i" `echo "$i" | sed "s/\.class//" | sed "s/^aq//"`; done

, ,

9 июля, 2012

Монтирование SD карты с правами пользователя в arch linux

Задача:

примонтировать SD карту на 64G как дополнительный жесткий диск, чтобы не-root мог читать ее и записывать в нее.

Решение:

mount -o uid=<uid> /dev/<dev_id> /mnt/<mount_point>

где,

<uid> — id пользователя ( узнать можно командой id или посмотреть в /etc/passwd )

<dev_id> — устройство sd карты

<mount_point> — каталог в который будет примонтирована SD-карта.

в /etc/fstab добавляем опцию монтированя uid=<uid>

и всё.

28 июля, 2010

Скрипт добавления нового виртуального хоста

Как-то поднадоело мне постоянно редактировать вручную httpd.conf и /etc/hosts и я решил написать скрипт, который бы позволил автоматизировать этот процесс
Вот такой скрипт:

#!/bin/sh

# Константы:
HOSTS='/tc/hosts'; # Путь к файлу hosts
HTTPD_CONF='/etc/httpd/conf/extra/httpd-vhosts.conf';

# Путь к файлу с настройками виртуальных хостов
DIR_HTTP='/srv/http/'; # Путь к директориям с хостами
IP_MASK='127.0.0.'; # Маска по которой будет формироваться новый IP
INDEX_FILE='index.php'; # Index файл в корневой папке нового виртуального хоста
DIR_LOG='/var/log/httpd/'; # Путь к папке с логами
EMAIL_ADMIN='wikide@gmail.com'; # Email админестратора

# Функция вывода ошибок
get_error() {
    echo $1;
    exit 0;
}

# Функция проверки ip
check_ip() {
    if [ "`cat $HOSTS | grep \"$ip\"`" ]; then
        echo 1;
    fi
}

# Проверяем наличея параметра с именем хоста
if [ "$1" ]; then
    if [ "$2" ]; then
        # Если задан свой IP
        new_ip=$2;
        if [ "`check_ip $new_ip`" ]; then # Проверка на наличее в файле
            get_error 'Такой ip адрес - '$new_ip' уже занят. Введите другой или пусть скрипт '$0' сам сгенерирует ip адресс для нового хоста.';
        fi;
    else
        # Получаем IP автоматически
        new_ip=$IP_MASK$((`tail -1 $HOSTS | awk '{ split($1, ip, "."); print ip[4]}'`+1));
    fi

    # Если корневая папка нового хоста уже существует
    if [ -d $DIR_HTTP$1/ ]; then
        get_error 'Директория '$1' уже есть в '$DIR_HTTP'. Подберите другое имя.';
    else
        # Создаем корневую директорию виртуального хоста
        mkdir $DIR_HTTP$1;
        echo -e "
    <html>
     <head>
      <title>New host</title>
     </head>
     <body>
        <h1>Created host '$1'!</h1>
     </body>
    </html>" > $DIR_HTTP$1'/index.php';
  
    # Запись в hosts
        sudo echo $new_ip  $1 | sudo tee -a $HOSTS 1>/dev/null;

    # Запись в конфиг Apache
        sudo echo -e "#Create date: `date '+%F %T'`
          DirectoryIndex $INDEX_FILE
          ServerAdmin $EMAIL_ADMIN
          DocumentRoot \"$DIR_HTTP$1/\"
          ServerName $1
          ServerAlias $1
          ErrorLog \"$DIR_LOG$1.log\"
          CustomLog \"$DIR_LOG$1\" common" | sudo tee -a $HTTPD_CONF 1>/dev/null;

        # Перезапускаем сервер
        sudo apachectl restart;

        # Выводими сообщение

        echo 'Виртуальный хост "'$1'" успешно создан'
    fi
else
    get_error 'Нужно обязательно указать название нового хоста $0 NAME_HOST [IP_HOST]';
fi

exit 0;

,

27 июля, 2010

Скрипт запуска wifi в ARCH Linux

Небольшой скрипт для подключения к сетям wifi в ARCH linux

#!/bin/bash

# Определяем интрфейс ( в моем случае это - wlan0)
if [ "$2" ]; then 
	dev=$2;
else 
	dev="wlan0";
fi

# Действие
case "$1" in
	start)
		sudo ifconfig $dev up;
		sudo wpa_supplicant -B -i$dev -c/etc/wpa_supplicant.conf;
		sleep 3;
		sudo dhcpcd $dev 2&gt;/dev/null;
	;;
	stop)	
		sudo killall -9 dhcpcd 3&gt;/dev/null;
		sudo killall -9 wpa_supplicant 3&gt;/dev/null;
		sudo ifconfig $dev down;
	;;
	list)
		sudo ifconfig $dev up;
		sleep 1;
		sudo iwlist $dev scanning;
		sudo ifconfig $dev down;
	;;
	restart)
		$0 stop;
		$0 start;
	;;
	status)
		echo -n 'IP arrdess: '; ifconfig wlan0 | grep "inet addr" | awk '{print $2}' | sed 's/addr://'
		echo -n "Essid: "; iwconfig wlan0 | grep "Ralink STA" | awk '{print $4}' | sed 's/ESSID://'
	;;
	*)

	if [ "$1"  ]; then
		echo "usage: $0 {start|stop|list|restart}"; 
	else 
		echo "Restarting";
		$0 restart;
	fi

esac

exit 0

Вот такой вот скрипт :)

,

26 июля, 2010

Статус аккумулятора в приглашении командной строки

Вот очередной велосипед на тему показа статуса аккумулятора для нэтбука на ARCH Linux :)

Вот такой получается скрипт на sh (думаю все ясно из комментов):

#!/bin/zsh

# Определяем уровень заряда аккумулятора на текущий момент
remaining_bat=`cat /proc/acpi/battery/BAT0/state | grep remaining | awk {'print $3'}`;

# Определяем 100% заряда для аккумулятора
full_bat=`cat /proc/acpi/battery/BAT0/info | grep full | awk {'print $4'}`;

# Определяем подключён сетевой провод или нет
stat=`cat /proc/acpi/battery/BAT0/state | grep charging | awk {'print $3'}`;

if [ $stat = 'charging' ]; then
stat='+'; # Провод подключён ( ноут зяряжеается )
else if [ $stat = 'charged' ]; then
stat=''; # ( Аккумулятор зяряжен)
else
stat='-'; # Провод не подключён ( ноут разряжается )
fi
fi

# получаем заряд батареи в % ( Школьная математика - Рулит! :) )
bat=$(($remaining_bat*100/$full_bat));

# основные цвета ( ESC - последовательности, подробнее - $ man console_codes )
RED="\033[31m"; # Красный
YELLOW="\033[33m"; # Жёлтый
WHITE="\033[38m"; # Белый

# Цвет по-умолчанию
DEFAULT="\033[0m";

if [ $bat -lt 10 ]; then # Если заряд аккамулятора меньше 10% (краасные цвет)
result="$RED$stat$bat";
else if [ $bat -lt 30 ]; then # Если заряд аккамулятора меньше 30% (жёлтый цвет)
result="$YELLOW$stat$bat";
else
result="$WHTE$stat$bat"; # Заряд аккамулятора больше 30% ( белый цвет )
fi
fi

# Выводим результат
echo -e $result%%$DEFAULT;

exit 0;

Далее говорим zsh о том, что нужно выводить в PROMPT результат этого скрипта.
В файле ~/.zshrc в функции precmd() прописываем где-нибудь в начале:

precmd() {
   BAT=`binf.sh`;
   PROMPT="battery:(`echo $BAT`)::%{$reset_color%}%{$fg_bold[green]%}%m {$reset_color%}::%{$fg_bold[crey]%}[ %~ ]%{$rese+t_color%}&gt; "
.....

Как-то вот так, где binf.sh — скрипт выше.
Обязательно нужно, чтобы binf.sh лежал по пути в переменной PATH, я для этой цели создал папку bin в домашней директории и сделал ссылку на файл в папке /bin

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