Архив рубрики: Linux

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

Настройка Squid для IPv6

В наше время сети IPv6 набирают очень большую популярность, и множество провайдеров даёт в комплекте с VPS подсеть IPv6 бесплатно. Допустим, вам нужно очень много адресов прокси, и у вас есть сервер с одним публичным адресом IPv4 и подсетью адресов IPv6. Используя эти адреса и прокси сервер Squid, вы можете очень просто получить необходимое количество прокси-серверов IPv6 .

Такие прокси не подходят для многих задач, но для проверки позиций сайта в поисковых системах они - самое то. В этой статье будет рассмотрена настройка Squid для IPv6. Базовая настройка Squid уже рассматривалась в статье установка Squid в Ubuntu.

Как это будет работать

У вас есть только один IP-адрес IPv4, с помощью которого вы можете получить доступ к вашему прокси-серверу. Но нам как-то нужно определиться, какой адрес IPv6 для какого запроса будет использоваться. Для этого будем применять порты. Например, если мы подключаемся к порту 3128, то Squid будет отправлять запрос к сайту с адреса 2a00:1838:36:1ba::eac3, а если с порта 3129, то 2a00:1838:36:1ba::eac4 и так далее. Такие адреса можно добавлять до тех пор, пока производительность вашего сервера будет находится на приемлемом уровне.

Далее мы будем использовать аутентификацию по паролю, для того чтобы никто кроме вас не смог получить доступ к этим прокси-серверам. Отключим дополнительные заголовки, которые добавляет Squid, чтобы не светить ваш основной адрес. А также полностью выключим обращение к IPv4-сайтам, чтобы невозможно было отследить, что у всех этих адресов общий адрес IPv4. А теперь перейдем к настройке.

Настройка Squid для IPv6

Начнем с настройки адресов IPv6, обычно их советуют добавлять с помощью команды ip, но лучше прописать их в конфигурационном файле /etc/sysconfig/network-script/ifcfg-eth0, в строке IPV6ADDR_SECONDARIES:

IPV6ADDR_SECONDARIES="2a00:1838:36:1ba::eac3/64 2a00:1838:36:1ba::eac4/64 2a00:1838:36:1ba::eac5/64 2a00:1838:36:1ba::eac6/64 2a00:1838:36:1ba::eac7/64"

Теперь перезагрузите сеть:

systemctl restart network

Эти команды актауальны для CentOS 7, в Ubuntu всё будет выглядеть по другому. Далее настроим аутентификацию: для этого создаём файл пользователей и паролей с помощью команды htpasswd:

htpasswd /etc/squid/passwd

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

auth_param basic program /usr/lib64/squid/basic_ncsa_auth /etc/squid/passwd
auth_param basic children 5
auth_param basic realm kovalets proxy server
auth_param basic credentialsttl 2 hours
acl authusers proxy_auth REQUIRED

  • basic program - в первой строке мы загружаем модуль аутентификации /usr/lib64/squid/basic_ncsa_auth, в вашей системе путь к библиотеке может отличаться, вам надо найти правильный. В параметры модулю передаётся путь к файлу с паролями /etc/squid/passwd;
  • basic children - количество обрабатываемых за раз запросов;
  • basic realm - приветствие;
  • basic credentialsttl - время, на протяжении которого пользователь считается аутентифицированным.

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

request_header_access X-Forwarded-For deny all
request_header_access Via deny all
request_header_access Proxy deny all
request_header_access Cache-Control deny all

Запрещаем все исходящие подключения, не через IPv6, с помощью acl-списков:

dns_v4_first off
acl to_ipv6 dst ipv6
http_access deny !to_ipv6
http_access allow to_ipv6

Разрешаем подключение аутентифицированным пользователям:

http_access allow authusers

Запрещаем всем остальным:

http_access deny all

Теперь работа с портами. По умолчанию Squid запущен на порту 3128, эту строчку надо закомментировать:

#http_port 3128

Вместо неё добавим пять портов и каждому присвоим имя с помощью параметра name:

http_port ип_сервера:3128 name=port3128
http_port ип_сервера:3129 name=port3129
http_port ип_сервера:3130 name=port3130
http_port ип_сервера:3131 name=port3131
http_port ип_сервера:3132 name=port3132

Теперь для каждого порта создаем acl-список, а затем с помощью директивы outgoing_ip_address указываем, через какой IP будет передаваться запрос во вне:

acl from_port3128 myportname port3128
tcp_outgoing_address 2a00:1838:36:1ba::eac2 from_port3128
tcp_outgoing_address 2a00:1838:36:1ba::eac2 !all
acl from_port3129 myportname port3129
tcp_outgoing_address 2a00:1838:36:1ba::eac3 from_port3129
tcp_outgoing_address 2a00:1838:36:1ba::eac3 !all
acl from_port3130 myportname port3130
tcp_outgoing_address 2a00:1838:36:1ba::eac4 from_port3130
tcp_outgoing_address 2a00:1838:36:1ba::eac4 !all
acl from_port3131 myportname port3131
tcp_outgoing_address 2a00:1838:36:1ba::eac5 from_port3131
tcp_outgoing_address 2a00:1838:36:1ba::eac5 !all
acl from_port3131 myportname port3132
tcp_outgoing_address 2a00:1838:36:1ba::eac6 from_port3132
tcp_outgoing_address 2a00:1838:36:1ba::eac6 !all

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

squid -k parse

Перезапустите Squid:

sudo systemctl restart squid

И не забудьте добавить порты в исключение брэндмауэера:

sudo iptables -A INPUT -p tcp --match multiport --dports 3128:3132 -j ACCEPT

Теперь вы можете попытаться подключиться через ваш прокси, например, используя Firefox, и проверить, какой адрес используется. Обратите внимание, что сервис не может определить ваш адрес IPv6, а если бы мы не запретили запросы к IPv4, то любой ресурс мог бы подставить вам сайт, который не поддерживает IPv6. Squid просто взял бы его по IPv4, чем выдал бы свой адрес.

Выводы

В этой статье мы рассмотрели, как выполняется настройка Squid для IPv6 и использования нескольких исходящих IP-адресов. Конечно, решение описывать каждый порт и IP отдельно не очень удобно при больших объёмах, и что-то мне подсказывает, что можно решить задачу иначе, если вы знаете более эффективный способ, напишите в комментариях.

Аргументы командной строки Bash

Функциональность интерпретатора Bash позволяет работать не только со статистическими данными, записанными в скриптах. Иногда возникает необходимость добавить сценарию интерактивности, позволяя принимать внешние параметры скрипта для манипуляции ими в коде.

В этой статье будет рассмотрено, как принимать аргументы командной строки bash, способы его обработки, проверка опций, а также известные особенности при работе с ними.

Параметры скрипта Bash

Интерпретатор Bash присваивает специальным переменным все параметры, введённые в командной строке. В их состав включено название сценария, выполняемого интерпретатором. Такие переменные называются ещё числовыми переменными, так как в их названии содержится число:

  • $0 — название сценария;
  • $1 — первый параметр;
  • ...
  •  $9 — девятый параметр сценария.

Ниже приведён пример использования одного параметра скрипта Bash:

#!/bin/bash
factorial=1
for (( number = 1; number <= $1 ; number++ ))
do
factorial=$[ $factorial * $number ]
done
echo "Факториал числа $1 равен $factorial"

Результат работы кода:

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

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

#!/bin/bash
total=$[ $1 * $2 ]
echo "Первый параметр равен $1."
echo "Второй параметр равен $2."
echo "Произведение параметров равно $total."

Пример работы кода:

Командный интерпретатор присвоил числа 5 и 10 соответствующим переменным — $1 и $2.

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

#!/bin/bash
echo "Добро пожаловать, $1"

Пример работы кода:

На заметку: кавычки, которые используются при передаче параметров, обозначают начало и конец данных и не являются их частью.

Если необходимо использовать больше 9 параметров для скрипта, то названия переменных немного изменятся. Начиная с десятой переменной, число, стоящее после знака $, необходимо заключать в квадратные скобки (без внутренних пробелов):

#!/bin/bash
total=$[ $[10] * $[11] ]
echo "Десятый параметр равен $[10]"
echo "Одиннадцатый параметр равен $[11]"
echo "Произведение этих параметров равно $total"

Пример работы кода:

Получение названия скрипта Bash

Как уже упоминалось, имя сценария является самым первым параметром скрипта. Чтобы определить название программы, используется переменная $0. Такая необходимость возникает, например, при написании скрипта, который может выполнять несколько функций. Однако при этом возникает одна особенность, которую нужно учитывать на практике:

#!/bin/bash
echo "Имя сценария: $0"

Пример работы кода:

Как видно, если строкой, фактически переданной в переменную $0, является весь путь к сценарию, то на вывод будет идти весь путь, а не только название программы.

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

Для этого специально предусмотрена небольшая команда. Команда basename возвращает только название скрипта без абсолютного или относительного пути к нему:

#!/bin/bash
name=`basename $0`
echo "Имя запущенной программы: $name"

Результат работы кода:

Проверка параметров скрипта

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

Если попробовать запустить написанный ранее скрипт test2 без аргументов, то перед выводом команд echo будет отображена ошибка:

Чтобы предотвращать подобные ситуации, необходимо действовать на упреждение — проверять аргументы скрипта на наличие значений. Это настоятельная рекомендация при использовании параметров в командной строке, и только после ревизии стоит пускать их в дело:

#!/bin/bash
if [ -n "$1" ]
then
echo "Добро пожаловать, $1"
else
echo "Простите, вы не представились"
fi

Пример работы кода:

В данном случае использовалась опция -n из предыдущей статьи о сравнении строк в Bash для проверки на наличие значения в переменной, которая считала параметр.

Обработка неизветсного числа параметров

Для начала рассмотрим один из часто используемых инструментов при работе с параметрами Bash — команду shift. Её прямое назначение заключается в сдвиге параметров на одну позицию влево. Таким образом, значение из переменной $3 переместится в $2, а из $2 — в $1. Но из $1 значение просто отбросится и не сместится в $0, так как там неизменно хранится название запущенной программы.

Эта команда является эффективным способом обработки всех параметров, переданных сценарию, особенно, когда нельзя заранее узнать их количество. Достаточно лишь обработать $1, сделать сдвиг и повторить процедуру.

#!/bin/bash
count=1
while [ -n "$1" ]
do
echo "Параметр №$count = $1"
count=$[ $count + 1 ]
shift
done

Пример работы кода:

Этот скрипт выполняет цикл while, в условии которого указана проверка первого параметра на длину. И если она равна нулю, цикл прерывает свою работу. При положительном результате проверки команда shift сдвигает все параметры влево на одну позицию.

Ещё один вариант использование shift — смещать на несколько позиций. Для этого достаточно через пробел указать количество, на которое будет смещён ряд параметров скрипта.

#!/bin/bash
echo "Первый параметр из переданных: $1"
shift 2
echo "Теперь первый параметр: $1"

Пример работы скрипта:

На заметку: при использовании shift нужно быть осторожным, ведь сдвинутые за пределы $1 параметры не восстанавливаются в период работы программы.

Обработка опций в Bash

Помимо параметров скрипт может принимать опции — значения, состоящие из одной буквы, перед которыми пишется дефис. Рассмотрим 3 метода работы с ними в скриптах. Сперва кажется, что при работе с опциями не должно возникать каких-либо сложностей. Они должны быть заданы после имени запускаемой программы, как и параметры. При необходимости можно сделать обработку опций командной строки по такому же принципу, как это делается с параметрами.

По примеру выше можно применять shift для обработки простых опций. С помощью инструкции case можно определять, являются ли аргументы Bash опциями:

#!/bin/bash
while [ -n "$1" ]
do
case "$1" in
-a | -b | -c) echo "Найдена опция $1" ;;
*) echo "$1 не опция" ;;
esac
shift
done

Пример работы программы:

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

Выводы

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

Команда basename используется для обрезания пути запущенного сценария, что часто необходимо для создания гибких программ. Использование команды shift позволяет эффективно проходить по переданным скрипту параметрам, особенно когда их количество неизвестно.

Перезапуск MySQL

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

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

Читать далее Перезапуск MySQL

Как устанавливать программы в Linux Mint

Linux Mint - один из распространённых дистрибутивов Linux, основанный на Ubuntu. Долгое время он занимал первом месте в рейтинге популярных дистрибутивов по версии веб-сайта DistroWatch. Основатели, Клемент Лефевр и команда разработчиков "Mint Linux Team", ставили перед собой цель создать удобный, мощный и простой в использовании дистрибутив Linux, и у них это получилось!

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

Читать далее Как устанавливать программы в Linux Mint

Сравнение строк в Bash

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

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

Сравнение строк Bash

Данные операции позволяют определить, являются ли сравниваемые строки одинаковыми:

  • = - равно, например if [ "$x" = "$y" ]
  • == - синоним оператора "=", например  if [ "$x" == "$y" ]
  • != - не равно, например if [ "$x" != "$y" ]

Пример:

#!/bin/bash
testuser=anton
if [ $USER = $testuser ]
then
echo "Добро пожаловать, $testuser"
fi

Результат работы сценария:

При проверке на равенство с помощью команды test (синоним квадратным скобкам [ ]) учитываются все пунктуационные знаки и различия в регистре букв сравниваемых строк.

Некоторые особенности сравнения строк с шаблонами:

# возвращает истину, если строка, содержащаяся в $x, начинается с символа "y"
[[ $x == y* ]]
# возвращает истину, если строка из $x равна конкретно двум символам "y*"
[[ $x == "y*" ]]
# возвращает истину, если $x содержит название файла, содержащегося в текущем каталоге, которое начинается с "y"
[ $x == y* ]
# возвращает истину, если строка $x равна двум символам "y*"
[ "$x" == "y*" ]

Например проверка строки bash на то, начинается ли она с символа y:

#!/bin/bash
x=yandex
[[ $x == y* ]]
echo $?

Результат выполнения кода:

Сценарий вывел 0 (ноль), так как мы потребовали вывести код ошибки последней выполненной инструкции. А код 0 означает, что сценарий выполнился без ошибок. И действительно — переменная $x содержит строку yandex, которая начинается с символа "y". В противном случае может писаться "1". Это довольно удобный способ отладки сценариев.

Сравнение строк по алфавиту на Bash

Задача усложняется при попытке определить, является ли строка предшественницей другой строки в последовательности сортировки по возрастанию. Люди, пишущие сценарии на языке командного интерпретатора bash, нередко сталкиваются с двумя проблемами, касающимися операций "больше" и "меньше" относительно сравнения строк Linux, у которых достаточно простые решения:

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

Пример:

#!/bin/bash
# неправильное использование операторов сравнения строк
val1=baseball
val2=hockey
if [ $val1 > $val2 ]
then
echo "$val1 больше, чем $val2"
else
echo "$val1 меньше, чем $val2"
fi

Что получится, если сравнить строки bash:

Как видно, один лишь символ "больше" в своём непосредственном виде привёл к неправильным результатам, хотя и не было сформировано никаких ошибок. В данном случае этот символ привёл к перенаправлению потока вывода, поэтому никаких синтаксических ошибок не было обнаружено и, как результат, был создан файл с именем hockey:

Для устранения этой ошибки нужно экранировать символ ">", чтобы условие выглядело следующим образом:

...
if [ $val1 \> $val2 ]
...

Тогда результат работы программы будет правильным:

Во-вторых, упорядочиваемые с помощью операторов "больше" и "меньше" строки располагаются иначе, чем это происходит с командой sort. Здесь проблемы сложнее поддаются распознаванию, и с ними вообще можно не столкнуться, если при сравнении не будет учитываться регистр букв. В команде sort и test сравнение происходит по разному:

#!/bin/bash
val1=Testing
val2=testing
if [ $val1 \> $val2 ]
then
echo "$val1 больше, чем $val2"
else
echo "$val1 меньше, чем $val2"
fi

Результат работы кода:

В команде test строки с прописными буквами вначале будут предшествовать строкам со строчными буквами. Но если эти же данные записать в файл, к которому потом применить команду sort, то строки со строчными буквами будут идти раньше:

Разница их работы заключается в том, что в test для определения порядка сортировки за основу взято расположение символов по таблице ASCII. В sort же используется порядок сортировки, указанный для параметров языка региональных установок.

Проверка строки на пустое значение

Сравнение с помощью операторов -z и -n применяется для определения наличия содержимого в переменной. Таким образом, вы можете найти пустые строки bash. Пример:

#!/bin/bash
val1=testing
val2=''
# проверяет, не пустая ли строка
if [ -n $val1 ]
then
echo "Строка '$val1' не пустая"
else
echo "Строка '$val1' пустая"
fi
# проверяет, пустая ли строка
if [ -z $val2 ]
then
echo "Строка '$val2' пустая"
else
echo "Строка '$val2' не пустая"
fi
if [ -z $val3 ]
then
echo "Строка '$val3' пустая"
else
echo "Строка '$val3' не пустая"
fi

Результат работы кода:

В этом примере создаются две строковые переменные — val1 и val2. Операция -n определяет, имеет ли переменная val1 ненулевую длину, а -z проверяет val2 и val3 на нулевую. Примечательно то, что последняя не была определена до момента сравнения, но интерпретатор считает, что её длина всё же равна нулю. Такой нюанс следует учитывать при различных проверках сценариев. И, если нет уверенности в том, какое значение содержится в переменной и задано ли оно вообще, стоит проверить её с помощью оператора -n или -z и лишь затем использовать по назначению.

Стоит обратить внимание и на функцию -n. Если ей для проверки будет передана необъявленная или пустая переменная, будет возвращена истина, а не ложь. Для таких случаев следует заключать проверяемую строку (переменную) в двойные кавычки, чтобы выглядело это так:

...
if [ -n "$val1" ]
...

Выводы

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

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

Установка WhatsApp в Ubuntu

Фраза "What's Up?" в переводе с английского дословно означает "Как дела?". Так и есть, WhatsApp - это популярный мессенджер, который распространился благодаря своему удобству, скорости обмена сообщениями и бесплатности. Так как приложение предназначено в основном для мобильных платформ, то его установка потребует усилий.

В этой статье мы рассмотрим как выполняется установка WhatsApp в Ubuntu с помощью нескольких способов. Официального клиента для Linux не существует, но есть несколько неофициальных, а также можно воспользоваться веб-версией.
Читать далее Установка WhatsApp в Ubuntu

Установка WoT на Linux

В данной статье мы разберём процесс установки World of Tanks на Linux. Эта игра разрабатывается компанией Wargaming. Поддерживаемые платформы: Windows, Xbox 360, Xbox One, PlayStation 4, MacOS. Да, данная игра до сих пор не обзавелась официальной поддержкой систем на базе ядра Linux.

Читать далее Установка WoT на Linux

Как запустить Kali Linux с флешки

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

Дистрибутив разрабатывается на базе Debian, первый официальный релиз Kali Linux состоялся 13 марта 2013 года. С тех пор разработчики внесли множество изменений в систему: был сделан упор на стабильность работы и функциональность дистрибутива, а также был "отфильтрован" и сам инструментарий. Дальше мы рассмотим как запустить kali linux с флешки.
Читать далее Как запустить Kali Linux с флешки

Шифрование файлов для облака в Cryptomator

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

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

Читать далее Шифрование файлов для облака в Cryptomator

Программа Pitivi

Новички, перешедшие на Linux, первым делом, задумаются о том, как монтировать видео. На kovalets.net уже есть одна статья, просвещённая программе OpenShot. В этой статье мы рассмотрим еще одну программу - PitiVi.

Читать далее Программа Pitivi