Skip to content


Строим NAT средствами FreeBSD

Две вещи, изменившие миp, были созданы в Беpкли: LSD и Unix. Вряд ли это случайное совпадение.
Jeremy S. Anderson

Для наглядности считаем, что внутренняя сеть адресуется блоком 192.168.0.0/24, шлюзом для внутренней сети выступает 192.168.0.1, IP-адрес внешнего интерфейса роутера – 20.30.40.50, внутренний интерфейс называется xl0 (кстати, он может совпадать и с внешним, если на интерфейсе прибиты одновременно и внешний адрес, и внутренний).

1. Проверяем, что ядро собрано с опциями "IPDIVERT" и "IPFIREWALL", если нет – пересобираем ядро или добавляем куда-то в стартовые скрипты загрузку модулей ipfw.ko и ipdivert.ko (команда kldload).

2. В файл /etc/rc.conf добавляем следующие строки:

firewall_enable="YES"
firewall_type="OPEN"
gateway_enable="YES"
natd_enable="YES"
natd_interface="xl0"

Здесь "xl0" указано для примера, вместо него нужно подставить реальное имя внешнего интерфейса (уходя через который пакеты имеют уже другой адрес отправителя).

3. Добавляем правила в ipfw, которые будут заворачивать трафик к natd:

ipfw add 1000 divert natd ip from 192.168.0.0/24 to not 192.168.0.0/24 out xmit xl0
ipfw add 1100 divert ip from not 192.168.0.0/24 to 20.30.40.50 in recv xl0

Можно было и просто написать

ipfw add 1000 divert ip from any to any via xl0

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

Номера правил (в примере 1000 и 1100) следует выбирать с учетом взаимного влияния других правил, лучше их ставить где-то в начале. Если, к примеру, у Вас будет что-то типа "allow tcp from any to any established" под номером 500, то с очень большой вероятностью получите грабли, т.к. трафик для установившихся TCP-сессий не будет проходить через natd, поскольку правило с номером 500 сработает раньше правил с номерами 1000 и 1100.

Важное замечание: если шлюз для внутренней сети 192.168.0.1 и внешний адрес 20.30.40.50 висят на одном интерфейсе, то внешний адрес 20.30.40.50 обязательно должен быть первым (основным, который НЕ-alias), а 192.168.0.1 – алиасом (см. man ifconfig). Иначе работать не будет (сам когда-то полчаса ломал голову в такой ситуации, удивляясь почему не работает то, что построено строго в соответствии с рекомендациями признанных гуру).

Вместо "natd" в этих правилах можно писать "8668" - это "порт", который "слушает" natd. Хотя мне лично непонятно что это за "порт" такой – не в терминах же протокола TCP употребляется здесь слово "порт" (потому что natd работает далеко не только для TCP-трафика, а еще и для UDP, ICMP и др.).

Как построить NAT в другую сторону (извне вовнутрь) описано здесь во второй части статьи.

Posted in *nix, Howto.

Tagged with , , , .


Работаем с iPod в Linux

Рецепт для тех, кто хочет использовать свой iPod как нормальный MP3-плеер и как обычную флешку без всяких там извращений типа ITunes и прочего.

  1. Качаем утилиту gnupod.
  2. Распаковываем архив, делаем традиционные "configure" и "make install". При этом, возможно, придется установить некоторые модули Perl. В моем случае это были такие (ставились yum-ом):
    • perl-IO-Compress-Base
    • perl-Compress-Raw-Zlib
    • perl-IO-Compress-Zlib
    • perl-Compress-Zlib
    • perl-HTML-Tagset
    • perl-HTML-Parser
    • perl-libwww-perl
    • perl-XML-Parser
    • perl-Unicode-String
    • perl-MP3-Info
  3. Подключаем iPod, монтируем его куда-нибудь:
    /bin/mount -t vfat /dev/sdc /mnt/ipod
  4. Запускаем скрипт инициализации:
    gnupod_INIT.pl -m /mnt/ipod
  5. Добавляем нужные треки на iPod, к примеру, из директории ~/mytracks:
    find ~/mytracks -name "*.mp3" | sort | gnupod_addsong.pl -m /mnt/ipod -

    (обратите внимание на дефис в конце команды – это заставляет скрипт считывать имена файлов из стандартного ввода). Использование команды sort необязательно, но бывает весьма полезно для аудиокниг, поскольку там важен порядок следования файлов.

  6. Создаем базу данных треков на iPod-е:
    mktunes.pl -m /mnt/ipod
  7. Отмонтируем ipod и можем слушать закачанный музон :)

P.S. Работа gnupod проверялась на модели плеера iPod Shuffle, для других моделей тоже должно работать всё аналогично.

Posted in *nix.

Tagged with , , .


Порядок настройки свежеустановленной Linux

Здесь описан порядок начальной настройки свежеустановленной операционной системы (на примере RedHat-подобных дистрибутивов, таких как Fedora, CentOS и т.п).

  1. Проверить, что рутовый пароль достаточно сложный, если нет – сделать его таковым.
  2. Настроить сетевые интерфейсы, шлюз, DNS-сервера.
  3. Отключить ipv6, если не планируется его использовать. Для этого в директории /etc/modprobe.d создать файл disableipv6.conf следующего содержания:
    install ipv6 /bin/true
  4. Включить magic key чтобы можно было с клавиатуры делать Sync (Alt-PrintScreen-S) и перегружать машину (Alt-PrintScreen-B) в случае проблем. Для этого в файле /etc/sysctl.conf проверяем наличие строки
    kernel.sysrq = 1
    и говорим

    sysctl -w kernel.sysrq=1

    чтобы эта фича заработала прямо сейчас.

  5. Сделать конфиг firewall-а, добавить в автозагрузку новый сервис (если он называется не iptables, в этом случае нужно также выключить сервис iptables). Важно: если в конфиге firewall-а используются конструкции, работа которых зависит от текущей конфигурации сетевых интерфейсов (например, анализируется вывод команды "/sbin/ip addr show"), то нужно проверить, что сервис firewall-а запускается после сервиса network. Иначе возможны проблемы.
  6. Выключить лишние сервисы. Для centos-сервера лишними, на мой взгляд, являются нижеперечисленные:
    for serv in anacron atd autofs bluetooth cups firstboot gpm ip6tables isdn mcstrans mdmonitor netfs nfslock pcscd portmap readahead_early readahead_later restorecond rpcgssd rpcidmapd sendmail yum-updatesd hidd lvm2-monitor ; do chkconfig $serv off ; done
  7. Выключить backresolv-ы в sshd. Для этого проверяем, что в файле
    /etc/ssh/sshd_config есть строка
    UseDNS no
  8. Удалить лишние пакеты. Для CentOS 5.3 на сервере я считаю лишними следующие:
    avahi bluez-gnome bluez-utils bluez-libs cadaver cairo cups GConf2 libnotify gtk2 libwnk pango notification-daemon paps redhat-lsb cups-libs dhcpv6-client irda-utils isdn4k-utils iptables-ipv6 firstboot-tui system-config-securitylevel-tui nfs-utils-lib nfs-utils pcmciautils portmap ypbind yp-tools wireless-tools NetworkManager rhpl wpa_supplicant system-config-network-tui sendmail ORBit2 anacron aspell ccid fbset hesiod ifd-egate dhclient dhcdbd libX11 libXext libXxf86vm mesa-libGL startup-notification.i386 nss_ldap nscd oddjob-libs oddjob rng-utils rp-pppoe wvdial.
  9. Поставить пакет yum-priorities чтобы можно было задавать приоритеты репозиториев yum-а.
  10. Поставить пакет yum-utils, который содержит такие полезные утилиты как yumdownloader (скачивание пакетов с зависимостями без установки) и package-cleanup.
  11. Найти и удалить оставшиеся неиспользуемые/ненужные пакеты с помощью команд:
    /usr/bin/package-cleanup --orphans
    /usr/bin/package-cleanup --problems
    /usr/bin/package-cleanup --leaves
    /usr/bin/package-cleanup --dupes
  12. Удалить sendmail, установить exim, поправить конфиг, добавить в автозагрузку.
  13. Установить ntpd для автоматической синхронизации времени, поправить конфиг, добавить в автозагрузку.
  14. Опционально: выключить selinux, для чего в файле /etc/selinux/config поменять строку "SELINUX=enforcing" на "SELINUX=disabled". Это может потребоваться если используется система виртализации OpenVZ -- там даже в официальной доке пишут, что SELINUX нужно обязательно отключать. Также может быть полезно при необъяснимых ошибках в работе сетевых сервисов (в моей практике встречались случаи, когда включённый SELINUX мешал работе vsftpd, named). Но более разумно всё-таки SELINUX не отключать, а лучше правильно его настроить (читая как минимум /var/log/audit, вывод 'ls -Z' и маны по командам chcon, runcon)
  15. Проверить, что часовой пояс установлен правильно. Для Киева поменять его можно так:
    ln -sf /usr/share/zoneinfo/Europe/Kiev /etc/localtime
    vim /etc/sysconfig/clock
  16. Добавить дополнительные репозитории, такие как rpmforge (в котором есть много всяких полезностей). Для этого создаем файл /etc/yum.repos.d/rpmforge.repo со следующим содержимым (для CentOS):
    # Name: RPMforge RPM Repository for Red Hat Enterprise 5 - dag
    # URL: http://rpmforge.net/
    [rpmforge]
    name = Red Hat Enterprise $releasever - RPMforge.net - dag
    #baseurl = http://apt.sw.be/redhat/el5/en/$basearch/dag
    mirrorlist = http://apt.sw.be/redhat/el5/en/mirrors-rpmforge
    #mirrorlist = file:///etc/yum.repos.d/mirrors-rpmforge
    enabled = 1
    protect = 0
    gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rpmforge-dag
    gpgcheck = 1
    priority = 10

    Для основных репозиториев значение параметра priority лучше ставить меньшее, чем для сторонних. Это повысит приоритет основных репозиториев.

    Update: идеологически более правильным методом является установка пакета rpmforge-release – тогда и repo-файл сам создастся и публичные ключи в директории /etc/pki/rpm-gpg появятся. Подробнее тут: https://rpmrepo.org/RPMforge/Using.

    Также иногда полезно включить репозиторий EPEL.

  17. Установить необходимые сервисы (httpd, samba и т.д.) и настроить их.
  18. Обновить систему
    yum update
  19. Включить запись даты и времени в историю команд bash:
    export HISTTIMEFORMAT="%Y%m%d %H:%M:%S " >> ~/.bashrc
  20. Перегрузиться, проверить что все в порядке.
  21. Построить систему резервного копирования, например через fsbackup. А вот здесь можно скачать немного изменённую версию, в которой весь русский текст в комментариях в кодировке UTF-8 (в оригинальной - KOI8-R). Также можно воспользоваться rpm-пакетом, который я наконец-то собрал, взять можно тут: /soft/repo/fsbackup.rpm

Подробное пошаговое руководство для CentOS 5 со скриншотами:
http://www.howtoforge.com/installation-guide-centos5.1-desktop

Posted in *nix, Howto.

Tagged with , , , , , .


Yum troubles

Если yum перестает работать и ругается, прежде чем гуглить в поисках решения, для начала нужно попробовать следующее:

  1. yum clean all
  2. rm -f /var/lib/rpm/__db*
  3. rpm --rebuilddb

Обычно что-то одно помогает.

Posted in *nix.

Tagged with , , .