«Раздача» интернета с ограничением по IP+MAC-адрес через iptables.

Данная статья посвящена ненавистникам интернета через прокси (я сам долгое время использовал прокси для доступа в Сеть с ноутбука). Конечно, желательно ограничить круг пользователей «раздачи»: я считаю, что доступ по IP+MAC вполне себе безопасный и не позволит просто так любителям халявы качать байты с вашего канала.

Для начала разрешим форвард пакетов:

$ sudo sysctl -w net.ipv4.ip_forward=1

Это можно сделать и вручную, заменив 0 на 1 в /etc/sysctl.conf в строке

net.ipv4.ip_forward = 0

Далее применяем новые настройки:

$ sudo sysctl -p /etc/sysctl.conf

Теперь правим конфиг iptables — /etc/iptables/iptables.rules (увы, я не уверен, что правильно понял все правила для таблицы nat, но по крайней мере это работает):

*nat
# allow 1st
-A PREROUTING -s [ip #1] -m mac --mac-source [mac #1] -j ACCEPT
# allow 2nd
-A PREROUTING -s [ip #2] -m mac --mac-source [mac #2] -j ACCEPT
# deny all
-A PREROUTING -j REDIRECT
-A POSTROUTING -o [интерфейс] -j MASQUERADE
COMMIT

Теперь, собственно, можно запустить iptables:

$ sudo /etc/rc.d/iptables start

На клиентских машинах нужно прописать роуты:

$ sudo route add default gw [ip сервера]

И перечислить DNS-сервера в файле /etc/resolv.conf:

nameserver [ip dns-сервера]

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

Подключение Bluetooth-модема для «мобильного» интернета.

В этой статье я расскажу как настроить мобильный интернет (GPRS/EDGE/UMTS/etc), когда в округе лишь безысходность и нет других средств доступа в Сеть :( Хотя, справедливости ради, надо отметить, что связь третьего поколения (в России это, фактически, синоним UMTS) заставляет задуматься о «нужности» классического «проводного» интернета.

Итак, для настройки соединения требуются пакеты bluez и wvdial, а также описание подключения.

Начинать настройку не стоит без, собственно, конфигурационного файла подключения /etc/wvdial.conf.
Для Мегафон-Москва он выглядит так:

[Dialer Defaults]
Modem = /dev/rfcomm0
Baud = 57600
Init = ATZ
Init2 = AT+CGDCONT=1,"IP","internet"
Dial Command = ATM1L3DT
Phone = *99#
Username = ''
Password = ''
New PPPD = yes

Сначала ищем bluetooth-устройство с сервисом «Dial-Up Networking», из вывода узнаём номер канала, соответствующего этому сервису, а также адрес устройства:

$ sdptool search DUN

Далее определяем его в системе:

$ rfcomm connect rfcomm0 [адрес] [канал]

И, наконец, создаём туннель:

$ sudo wvdial

Убеждаемся, что в системе появился новый интерфейс ppp0:

$ ifconfig ppp0

Всё, теперь можно сёрфить. Да, много ручной работы, но это же UNIX-way, он позволяет обнаружить неисправность или «кривую» логику работы максимально быстро. А чтобы автоматизировать рутинный труд, люди придумали скрипты. Далее представлен скрипт, названный мной «blueconn», для подключения к интернету в одну команду.

#!/bin/bash

CFG="$HOME/.mywvdial.conf"

if [ "$USER" != "root" ] ; then
  echo "ERROR: Run script as superuser"
  exit 1
fi

echo "Searching for device with DUN service..."

SRCHRES="$(sdptool search DUN)"
CHAN=$(echo "$SRCHRES" | grep "Channel:" | head -n 1 | awk '{ print $2 }')

if [ -z "$CHAN" ] ; then
  echo "ERROR: Cannot find device with Dial-Up Networking service"
  exit 1
fi

ADDR=$(echo "$SRCHRES" | grep "Searching for DUN on " | head -n 1 | awk '{ print $5 }')

if [ -z "$ADDR" ] ; then
  echo "ERROR: Cannot get device address"
  exit 1
fi

echo "$ADDR (channel $CHAN) found. Trying to connect..."

(rfcomm connect rfcomm0 $ADDR $CHAN >& /dev/null) &
sleep 6
CONNPID=$(jobs -p)

if [ -z "$CONNPID" ] ; then
  echo "ERROR: Cannot connect to device"
  exit 1
fi

echo "Connected. Opening tunnel..."

wvdial -C $CFG

Теперь пара примечаний по использованию. Как видно из кода, скрипт использует конфигурационный файл соединения, лежащий в домашней папке — ~/.mywvdial.conf, что позволяет каждому пользователю иметь свои настройки подключения, поэтому перед использованием скопируйте /etc/wvdial.conf в «хомяк» под именем .wvdial.conf (sic!). А чтобы каждый пользователь мог находить скрипт без указания полного пути до него, скопируйте скрипт, к примеру, в /usr/local/bin (и не забудьте сделать его исполняемым).

После этого подключение будет происходить в одну команду:

$ sudo blueconn

«Перегрузка» конфирурационного файла Vim’а.

Меня вполне устраивает мой конфиг Вима (быть может, в ближайшем будущем я поделюсь его второй версией), но иногда для конкретного файла нужно «перегрузить» (как в C++) настройки. К примеру, вместо двухпробельного таба вставлять четырёхпробельный, или жёстко указать подсветку синтаксиса. Собственно, последнее мне сейчас и понадобилось, поэтому я, чтобы не забыть, и решил написать этот пост.

Суть проста: в начале или в конце файла в комментариях указываем следующего вида строку:

[символ комментария] vim [опции, разделённые «:» или пробелом]

«:» — значит set.

К примеру для файла с ассеблерным кодом (NASM):

; vim:syntax=nasm:expandtab

А вообще читать :help modeline.

Включение splash-приветствия в Gnome.

В настройках автозагружаемых при старте сессии приложений и демонов вы можете увидеть «Gnome splash», и он даже отмечен стандартно, тем не менее сплеша нет :(

Чуть покопавшись в системе (а начал я с locate splash | grep -i gnome), я нашёл решение:

$ gconftool-2 --type bool --set /apps/gnome-session/options/show_splash_screen true

Иконка «Assistive Technologies» на панели Gnome.

Внезапно у меня на панели (gnome-panel) появилась иконка «Assistive Technologies» (человечек на синем фоне) и как её убрать я не знал: из автостарта демон убран, иконка не обладает свойствами, чтобы её можно было удалить. Что я делал до этого — не помню :(

В общем, решение такое (спасибо Арчефоруму): в System > Preferences > Keyboard > Accessibility убрать флаг «Accessibility features can be toggled with keyboard shortcut».

Демон, оповещающий о разряде батареи.

Сколько пользовался всяческими DE (десктопными окружениями) всегда натыкался на какие-нибудь ограничения. То есть всё прекрасно! Всё работает, дружественно к пользователю, но как только хочешь чего-то особенного — натыкаешься на ограничения системы (будь то работа с pulseaudio или настройка альтернативного шортката на закрытие окна). В общем, GNOME, KDE, Xfce удобны пока ваша фантазия находится в пределах того, что позволили разработчики.

Каждое из перечисленных DE обладает своим собственным powersave-демоном, он же берёт на себя всяческие оповещения, засыпания и прочее. К сожалению, ни один из них не двигается дальше «сделать потемнее экран» и «отключить композит», чтобы продлить время работы без розетки. По настоящему мощный powersave я увидел только у laptop-tools (в настройках, к слову, советую покопаться, ибо вся мощь этих утилит стандартно отключена). Но не только заботой о сохранении энергии хороши пресловутые демоны: они также умеют оповещения. Конечно, по юникс-вею laptop-tools не должен этим заниматься, поэтому мы напишем свой демон «с блекджеком и шлюхами».

Всплывающие информирующие окна у нас будут реализованы через libnotify — готовый, удобный, настраиваемый механизм. Также нам понадобится демон следящий за появлением новых сообщений и выводящий их на экран, у вас два на выбор: notification-daemon (Gnome) или xfce4-notifyd (Xfce, как ни странно), насчёт KDE’шной оповещалки ничего путного сказать не могу — видимо у них своя реализация (ещё один повод задуматься, а так ли хорош KDE4?).

Собственно сам скрипт-демон (скрипт сам отделяется от терминала) batterynotifyd:

#!/bin/bash
# Author: Vitaly Dolgov (ferhiord (at) gmail (dot) com), 2009

HALF_L=50
LOW_L=15
CRIT_L=5

(while true ; do
  sleep 5s

  MODE=$(acpi -b | awk '{print $3}' | sed 's/,//')
  CUR_L=$(acpi -b | awk '{print $4}' | sed 's/%,//')

  if [ "$MODE" = "Discharging" ] ; then continue ; fi

  if [ $CUR_L -eq $HALF_L ] ; then
    notify-send -i battery -u normal "Warning!" "Battery charge is half! ($HALF_L%)"
    sleep 2m
  elif [ $CUR_L -eq $LOW_L ] ; then
    notify-send -i battery -u normal "Warning!" "Battery charge is low! ($LOW_L%)"
    sleep 2m
  elif [ $CUR_L -eq $CRIT_L ] ; then
    notify-send -i battery -u critical "Warning!" "Battery charge is critical! ($CRIT_L%)"
    sleep 2m
  fi
done) & disown

Знаю, скрипт есть куда дорабатывать, но основную задачу он всё же выполняет. Тут вы сами вольны вызывать что хотите и в каком хотите порядке, не ограничиваясь рамками с кнопочками и выпадающими списками, которые для вас любезно создали разработчики. Если у вас будет время и желание улучшить скрипт (добавить функционал, прилизать), можете прислать доработанную версию мне — возможно я включу изменения. Удачи :)

P.S. Чтобы демон автоматически запускался при загрузке системы, пропишите его в /etc/rc.local.

Арч64 и ненависть.

Я всегда считал Арч системой для разработчика. Здесь всё просто, гибко и понятно, и я без зазрения совести поставил 64-битный Арч. Проблем с ним не было… пока я не наткнулся на невозможность собрать 32-битное приложение… Вот это меня просто вывело из себя (прошу обратить внимание на комментарий закрытия бага). Будет время — не будет Арча64 в моей жизни.

Будильник.

После того как я устроился на работу, я стал замечать, что будильник на мобильном телефоне не в состоянии меня поднять :( Понадобилось более мощное средство, конечно, менее действенное, чем чашка горячего кофе, пролитая на живот, но тем не менее :)

Нужен был будильник с пробуждающей музыкой :)

Для начала создадим то, что будет нас будить: скрипт, запускающий mplayer, который воспроизводит трек.

$ echo "/usr/bin/mplayer \"~/Lm1 - Desert Traveller (Soultec Remix).mp3\" -really-quiet >& /dev/null" > ~/alarm.sh

Лично я предпочитаю вставать под драм-н-бейс.

Делаем скрипт исполняемым:

$ chmod +x ~/alarm.sh

Далее запускаем правку crontab.

$ sudo crontab -e [username]

Вводим следующее:

30 8 * * mon-fri /home/[username]/alarm.sh

Таким образом будильник будет запускаться по будням в 8:30.
Запустим сам демон cron.

$ /etc/rc.d/crond start

Всё :) можно теперь не бояться просыпов.

moc и last.fm

В этом посте я расскажу как подружить эти две сущности :)

Ставим версию moc 2.5.0 (moc-devel), в Арче это можно сделать через AUR:

$ yaourt -S moc-devel

Разрешаем всем писать в технический каталог lastfmsubmitd:

$ sudo chmod o+rwx /var/spool/lastfm

Для скробблинга понадобится lastfmsubmitd:

$ sudo pacman -Sy lastfmsubmitd

Далее в конфиг moc (~/.moc/config) вписываем следующую строчку:

OnSongChange = "/usr/lib/lastfmsubmitd/lastfmsubmit --artist %a --title %t --length %d --album %b"

А в конфиг lastfmsubmitd (/etc/lastfmsubmitd.conf) информацию об аккаунте на Last.fm:

[account]
user: login
password: password

Запускаем moc и lastfmsubmitd (от рута).

$ sudo /etc/rc.d/lastfmsubmitd start

Скробблим.

Настройка «раздачи» ICQ через Squid.

Задача: разрешить доступ к протоколу ICQ через прокси Squid. Конечно, можно сколько угодно говорить, что «аська» не нужна, а «жаббер» — наше всё и прочее, но тем не менее многим людям требуется (в том числе и мне), поэтому приступаем к решению (от дефолтного конфига).

$ sudo vi /etc/squid/squid.conf

В секции «acl» можно указать всех пользователей, IP которых прописаны в специальном файле:

acl localnet src "/etc/squid/users"

Добавляем в список разрешённых портов стандартный «асечный» порт:

acl ICQ_PORT port 5190

Далее запрещаем запросы и соединения ко всем портам, кроме разрешённых:

http_access deny !Safe_ports
http_access allow ICQ_PORT

http_access deny CONNECT !SSL_ports
http_access allow CONNECT ICQ_PORT

Ну и разрешаем пользователям использовать прокси:

http_access allow localnet

Всё, перезапускаем squid.

$ sudo /etc/rc.d/squid restart