linux

PHPStorm (PyCharm и др.) и XMonad

2016-02-28-23:48:47_708x493После запуска PHPStorm вместо самое среды появляется лишь серое окно без ничего.
Работаю я в xmonad и произошло это после очередной правки конфига под себя.
В документации сказано, что для java-приложений нужен

startupHook = setWMName "LG3D"

Но этот хук перестал почему-то оказывать должный эффект (без него в ряде java-приложений тоже был пустой экран).
А все оказалось просто: я добавил хук ewmhDesktopsEventHook.

handleEventHook = do
  ewmhDesktopsEventHook -- вот он
  docksEventHook
  fullscreenEventHook -- Full screen setup

Хук нужен для перехвата сообщений по активации окна, перемещению его на другой рабочий стол и переключении рабочих столов. Можно почитать документацию и код.

Но беда в том, что этот хук трет имя wm, которое устанавливается в конфиге (ставит «xmonad»). Этот wmname (который lg3d) служит решением для бага из awt.

Чтобы использовать ewmhDesktopsEventHook нужно указать java окольными путями, что она работает в «non reparenting» (не подобрал я нормального перевода :)) окружении.

Для этого служит переменная окружения _JAVA_AWT_WM_NONREPARENTING.

Пишем в ~/.bashrc или ~/.profile

export _JAVA_AWT_WM_NONREPARENTING=1

И теперь все хорошо.

2016-02-28-23:50:36_708x495

linux

Raspbian — это не Debian

img_raspbian_logo Raspbian — это не Debian. Хотя картинка нас убежлает в обратном.

В чем проблема? Проблема в обозначении архитектуры.

Давеча захотел я поставить на малинку пакет из репозитария собранного под Debian.

Прописал как положено в /etc/apt/sources.list.d/<repository>.list

deb <repourl> wheezy main

Установил и получил segmentation fault. Казалось бы — архитектура armhf (как на малинке), но почему-то не работает.

А дело все в том, что разработчики raspbian перекомпилировали дебиановский armhf (ARMv7) для совместимости с ARMv6, но название архитектуры не поменяли. В итоге попытки установить какой-нибудь пакет *.armhf из дебиана может закончится сегментейшнфаултом.

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

В итоге конфигурация репозитариев deb будет выглядеть так:

deb [arch=armel] <repourl> wheezy main

Ключевое здесь — добавить спецификацию архитектуры как [arch=armel] и таким образом можно успешно подключать даже репозитарии с какого-нибудь ланчпада.

Пруф

linux

MC (midnight commander): вы не умеете его готовить.

2016-02-06-14:38:03_337x97Да-да. Вы все делаете неверно. MC — хоть и не заменяет консоль, но часто бывает полезен и для некоторых даже незаменим. Пусть он и является лишь оболочкой для ползанья по файловой системе, но очень функциональной оболочкой.
Обычно ведь как: f5 (скопировать), f6 (переместить), f3 (посмотреть), f4 (отредактировать), f8 (удалить), f7 (создать катало) и f10 (выйти).
Это тот набор команд, которым чаще всего пользователь и ограничивается.
Ах да — еще TAB чтобы переключиться из одной панели в другую.

Остаемся в текущей папке при выходе из mc.

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

В любом случае такое поведение можно поменять. А служит для этого опция -P, которой передается имя файла, в котором сейчас находится mc.

Зная имя файла по завершению процесса можно всегда вернуться в нужный катало. Для этого есть скрипт mc-wrapper.sh. Прописываем у себя в .bashrc.

alias mc='. /usr/libexec/mc/mc-wrapper.sh'

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

Выбор файлов

  • [insert] (или [ctrl-t]) — выбор текущего файла или снятие выбора с текущего файла (так же позволяет выбирать несколько файлов/папок)
  • [+] — выбор файлов и папок имена которых попадают под введенный паттерн
  • [/] — убирает выбор с файлов и папок име
  • [*] — реверсивное выделение файлов. Инвертирует состояние выбран\не выбран для всех файлов в текущем окне (именно файлов. не папок)

Доступ в шелл

  • вы можете вводить любую команду — просто начинаете печатать и она появляется внизу в маленьком приглашении ввода вашего шелла. Нажатие на [enter] запустит ее на исполнение.
  • не пытайтесь нажать [tab] в попытках вызвать автодополнение — вы просто смените текущую панель. Чтобы вызвать автодополнение надо нажать последовательность [esc tab]. Тут все как в обычном шелле — первый раз оно пытается дополнить максимально возможную часть команды, а повторное нажатие последовательности показывает ве возможные варианты (да еще и с выбором как в zsh).2016-02-06-15:00:22_395x202
  • а если надо показать большой терминал? На надо выходить из mc — нажимаете [ctrl-o] и панели файловый менеджер скрывается оставляя вас наедине с консолью. Чтобы его вернуть заново нажимает [ctrl-o].
  • [alt-enter] — копирует имя текущего выбранного файла в строку терминала (удобно для передачи имени каким-нибудь командам)

Встроенный просмотрщик [f3] и редактор [f4]

  • Встроенный вьювер умеет показывать содержимое разных файлов не просто в сыром режиме (когда в pdf будут видны управляющие инструкции, а в гифке — байты), а в виде документа, который адаптирован для отображения в текстовом виде (конечно если у вас есть сопутствующий софт вроде pdf2text).
  • Чтобы увидеть сырые данные жмем [f8] в самом просмотрщике, либо [shift-f3] при открытии файла (а не [f3]).
  • Так же mc умеет использовать внешние редакторы и просмотрщики (задаются переменными PAGER и EDITOR в вашем .bashrc). Чтобы включить использование внешних редакторов выбираем соответствующую опцию в настройках2016-02-06-15:15:53_664x389

Работа с панелями

  • [alt-,] — переключить режим разбиения с вертикального на горизонтальный
  • [alt-t] — циклическая смена режима отображения панели
  • [alt-i] — синхронизирует вторую панель с текущей (полезно если вам надо быстро открыть одну и ту же папку в двух панелях)
  • [ctrl-u] — поменять панели местами
  • [alt-o] — если текущий элемент директория, то откроет ее во второй панели и сместит выделение на один элемент вперед. Если же текущий элемент файл — откроет содержимое родительской директории в соседней панели и сместит выделение.
  • [ctrl-pgup] — перейти к родительской директории (если включена навигация в стиле lynx, то просто стрелка влево)
  • [alt-shift-h] — показать историю перемещения по папкам
  • [alt-y] — перейти в предыдущую папку из истории
  • [alt-u] — перейти в следующую папку из истории

Поиск

  • [alt-?] — открывает диалог поиска файлов
  • [alt-s] — быстрый поиск элемента в текущем каталоге по регулярному выражению
  • [ctrl-s] — бысрый поиск в текущем каталоге по совпадению

Основные сочетания

  • [ctrl-space] — посчитать объем каталога под выделением
  • [ctrl-x s] — создать символическую ссылку
  • [ctrl-x h] — создать жесткую ссылку
  • [ctrl-x o] — открыть редактор сhown на элемент
  • [ctrl-x c] — открыть редактор chmod на элемент
  • [alt-.] — скрыть\отобразить dot-файлы

Виртуальные файловые системы (vfs)

Эта концепция относительно mc позволяет нам путешествовать по архивам, sftp-серверам, rpm-файлам так, словно мы работаем с локальной файловой системой.

Попробуйте в mc набрать команду

cd ftp://mirror.yandex.ru/

2016-02-06-15:42:03_506x328

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

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

Введите cd без параметров и вы попадете в домашнюю директорию.

Полезные команды

  • [ctrl-x d] — сраврение директорий
  • [ctrl-\] — переход в директорию быстрого доступа (и управление этим списком)

Полезные настройки

2016-02-06-15:56:46_435x242

  • левая\правая панель — формат списка. позволяет задать пользовательский формат вывода информации (чтобы посмотреть доступные поля нажмите [f1]

2016-02-06-15:47:26_301x229

  • Конфигурация
    • детали операции/подсчитывать размер — в совокупности эти две опции дадут более информативное окно копирования файлов (а если убрать, то копирование будет работать гораздо быстрее)
    • Автоматически сохранять настройки — полезно чтобы постоянно не нажимать «сохранить настройки»
  • Внешний вид
    • строка подсказки — дасть немного больше места на экране если убрать (скроется совет дня)
    • равный размер панелей — если мы включим разный режим отображения в каждой из панелей (древовидный и подробный), то получим проводник 🙂
  • Настройка панелей
    • автосохранение настроек панелей — будут удобно чтобы каждый раз не выбирать режим отображения панели заново
    • навигация в тиле lynx — быстрая навигация стрелками

 

 

HowTo, linux

OpenVPN: Настройка на собственном сервере. Часть 4 — конфигурация клиента.

 

 

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

В первой части было сказано, что клиенту потребуются следующие файлы ключей:

 ~/CA/pki/issued/User.crt
 ~/CA/pki/private/User.key
 ~/CA/pki/ca.crt
 /etc/openvpn/keys/ta.key

Скопируем их в отдельный каталог. Так же в этом каталоге создадим файл connect.ovpn следующего содержания:

client
dev tun
proto udp
remote X.X.X.X 1194
tls-client
ca "ca.crt"
tls-auth "ta.key" 1
cert "User.crt"
key "User.key"
remote-cert-tls server
comp-lzo
tun-mtu 1500
mssfix 1450
verb 3
nobind

Где X.X.X.X — это айпишник вашего сервера.

Передаем пять этих файлов пользователю и теперь на клиенте можно подключаться:

$ sudo openvpn connect.ovpn
HowTo, linux

OpenVPN: Настройка на собственном сервере. Часть 3 — iptables

В предыдущей части мы наконец-то сервер запустили. Но достучаться до него возможности нет поскольку iptables все еще не настроены и блокируют все подряд.

Как сказали на одном из формумов: в сети есть множество руководств по iptables для openvpn, но ни одно из них не работает.

В продолжении еще одно 🙂

Разрешаем коннекты к серверу (в прошлый раз мы настроили дефолтный впн через udp. Поэтому здесь мы открываем только подключение udp.

iptables -I INPUT -i eth0 -m state --state NEW -p udp --dport 1194 -j ACCEPT

Обратите внимание, что нужно использовать модификатор -I, который добавит это правило первым к цепочке. Если же использовать -A как рекомендуют некоторые, то правило будет добавлено к цепочке последним. А как мы знаем — последним правилом в цепочке стоит reject. И это значит, что добавляй после него или не добавляй правила — ничего не заработает.

Кстати из-за подобной ошибки (способа добавления правила в цепочку можно порой у некоторых видеть такую ошибку:

TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity)
TLS Error: TLS handshake failed

Это как раз значит, что сервер не смог ответить на «рукопожатие». Т.е. порт заблокирован или где-то на пути к серверу не работает форвардинг пакетов.

Теперь разрешим интерфейсу tun коммуникацию с другими интерфейсами в системе.

iptables -I FORWARD -i tun+ -j ACCEPT
iptables -I FORWARD -i tun+ -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -I FORWARD -i eth0 -o tun+ -m state --state RELATED,ESTABLISHED -j ACCEPT

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

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

В цепочке POSTROUTE чаще всего нет reject. Поэтому смело используем -A.

И последний шаг — разрешить исходящий трафик на tun-инмерфейсе.

iptables -A OUTPUT -o tun+ -j ACCEPT

Теперь самый важный шаг: проверить, что все заработало

$ sudo nmap -sU -p1194 X.X.X.X

Starting Nmap 7.00 ( https://nmap.org ) at 2016-01-24 21:33 MSK
Nmap scan report for X.X.X.X
Host is up (0.089s latency).
PORT     STATE         SERVICE
1194/udp open|filtered openvpn

Nmap done: 1 IP address (1 host up) scanned in 1.08 seconds

Если у вас похожий вывод — сохраняем правила iptables и генерируем клиентский конфиг в следующей части.

$ sudo /usr/libexec/iptables.init save

Ниже конфиг /etc/sysconfig/iptables, который я приведу для сравнения (если у вас что-то не заработало).

*nat
:PREROUTING ACCEPT [80:8210]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [24:11832]
:POSTROUTING ACCEPT [24:11832]
-A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
COMMIT
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [66:10292]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth0 -p udp -m state --state NEW -m udp --dport 1194 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -i tun+ -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -i tun+ -j ACCEPT
-A FORWARD -i tun+ -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth0 -o tun+ -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
-A OUTPUT -o tun+ -j ACCEPT
COMMIT
HowTo, linux

OpenVPN: Настройка на собственном сервере. Часть 2 — конфигурация сервера.

 

 

Ключи сгенерировали. Теперь можно запускать сервер.

Обращаю внимание, что дальше речь пойдет о дефолтной настройке openvpn в режиме роутера. Это тот режим, когда вам нет необходимости интегрировать подключенных клиентов в локальную сеть.

В случае необхоидмости пустить клиентов в локальную сеть вам потребуется режим моста.

Поддробнее про разные режимы работы можно почитать в официальной документации: https://community.openvpn.net/openvpn/wiki/BridgingAndRouting.

Копируем конфиг сервера

$ sudo cp /usr/share/doc/openvpn-*/sample/sample-config-files/server.conf /etc/openvpn

Теперь нужно отредактировать этот конфиг поправив следующие параметры

# пути к сертификатам ставим свои
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/vpn-server.crt
key /etc/openvpn/keys/vpn-server.key  # This file should be kept secret
dh /etc/openvpn/keys/dh.pem

# заставляем клиент направлять весь трафик через сервер (чтобы избежать всяких учечек днс-запросов)
push "redirect-gateway def1 bypass-dhcp"

# пропишем собственные dns
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"

# защита от флуда
tls-auth /etc/openvpn/keys/ta.key 0 # This file is secret

# сразу после запуска у сервера будут отобраны рутовые права (безопасности больше)
user nobody
group nobody

Если есть желание — можно поправить порт.

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

$ sudo systemctl -f enable openvpn@server.service
$ sudo systemctl start openvpn@server.service
HowTo, linux

OpenVPN: Настройка на собственном сервере. Часть 1 — сертификаты.

 

 

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

Для этого нужно три компонента:

  • Корневой сертификат (назовем его для простоты CA), которым будут подписываться ключи клиента и сервере. Крайне желательно чтобы он был на отдельной машине.
  • Сертификат сервера, который будет подписан корневым доверительным сертификатом.
  • Сертификат для каждого из клиентов, который тай жэ будет подписан CA

Корневой сертификат и сертификат сервера

Создаем корневой центр собственной сертификации (лучше делать это не на той машине, где запуен openvpn и там должен быть установлен пакет easy-rsa)

$ cp -R /usr/share/easy-rsa/3.0.0/ ~/CA
$ cp /usr/share/doc/easy-rsa/vars.example ~/CA/vars
$ cd ~/CA

Нужно отредактировать vars и поправить те параметры, которые будут вам интересны. Это имя домена, имя сервера и прочее — все подробно прокомментировано в файле.

Инициализировать PKI (Public Key Infrastructure — Инфраструктура открытых ключей):

$ ./easyrsa init-pki

Создать корневой сертификат. Common Name сервера вводить на ваше успотрение. (лучше придумать что-то вроде vpn-server). Сложный пароль ключа обязателе. Не менее 128 бит.

$ ./easyrsa build-ca

Создать ключи Диффи-Хелмана

$ ./easyrsa gen-dh

Создать запрос на сертификат для сервера OVPN. Обращаю внимание, что сертификат будет незапаролен (параметр nopass), иначе при каждом старте OpenVPN будет запрашивать этот пароль.

$ ./easyrsa gen-req vpn-server nopass

Создать и подписать сертификат

$ ./easyrsa sign-req server vpn-server

Скопировать полученные ключи в рабочий каталог openvpn

$ sudo mkdir -p /etc/openvpn/keys
$ sudo mkdir cp ~/CA/pki/ca.crt /etc/openvpn/keys
$ sudo mkdir cp ~/CA/pki/issued/vpn-server.crt /etc/openvpn/keys
$ sudo mkdir cp ~/CA/pki/private/vpn-server.key /etc/openvpn/keys
$ sudo mkdir cp ~/CA/pki/dh.pem /etc/openvpn/keys

Создать «HMAC firewall» для защиты от DoS аттак и флуда UDP порта.

$ cd /etc/openvpn/keys/
$ sudo openvpn --genkey --secret ta.key

Генерация пользовательских ключей

Создание запроса запароленного ключа для клиента (потребуется вводить при каждом подключении) с именем User

$ cd ~/CA
$ ./easyrsa gen-req User

User — это имя пользователя для которого вы генерируете ключ.

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

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

$ ./easyrsa gen-req User nopass

Теперь ключ надо подписать

$ ./easyrsa sign-req client User

Дефолтно ключ выдается на 10 лет. Можно ограничить время. И ключи придется только перевыпускать по завершению работы.

$./easyrsa sign-req client User -days 90

Клиенту потребуется следующий набор файлов

 ~/CA/pki/issued/User.crt
 ~/CA/pki/private/User.key
 ~/CA/pki/ca.crt
 /etc/openvpn/keys/ta.key

Отзывы сертификатов

Герируем файл отозванных ключей

$ cd ~/CA
$ ./easyrsa gen-crl

Если вы все же сделали центр сертификации на той же машине, на которой у вас сервер, то можете слинковать файл отозванных ключей. Но лучше скопировать. И эту операцию нужно повторять каждый раз при отзыве ключей.

$ sudo cp ~/CA/pki/crl.pem /etc/openvpn/keys

В /etc/openvpn/server.conf добавить строку

crl-verify /etc/openvpn/keys/crl.pem

Отзыв сертификата пользователя User

$ ./easyrsa revoke User

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

$ ./easyrsa gen-crl

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

failed to update database
Easy-RSA error:
signing failed (openssl output above may have more detail)

Для исключения возможности mitm атаки, ошибка которого так выглядит в логах клиента как показано ниже служит параметр remote-cert-tls server в конфиге клиента.

WARNING: No server certificate verification method has been enabled. See http://openvpn.net/howto.html#mitm for more info.

Ссылки: