Policy-routing на CentOS

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

Тут нужен policy-routing — маршрутизация на основе определённых правил. Логика получается такая: ответы на запросы из подсети Б к моему адресу из подсети А отправлять с адреса из подсети А (т.е. на шлюз подсети А).

Маркируем соединения из сети Б к нашему адресу из сети А при помощи iptables и таблицу mangle (используется для изменения пакетов):
iptables -t mangle -I INPUT -i eth0 -s 10.1.100.0/24 -d 10.2.96.3 -j CONNMARK --set-mark 1
А на выходе копируем маркировку соединения в маркировку пакетов, насколько я понимаю, это означает, что мы маркируем пакеты промаркированных ранее соединений:
iptables -t mangle -I OUTPUT -s 10.2.96.3 -d 10.1.100.0/24 -j CONNMARK --restore-mark
Вероятно, в этом правиле можно обойтись и без указания адресов источника и адресата, но мне кажется так будет правильнее, более точно чтоли )

В таблицу маршрутизации 111 добавляем маршрут для сети Б, но на шлюз из подсети А:
ip route add to 10.1.100.0/24 via 10.2.96.1 dev eth0 table 111
И, наконец, добавляем правило для перенаправления пакетов с нашей маркировкой в отдельную таблицу маршрутизации:
ip rule add fwmark 1 lookup 111

Для удобства можно назначить название для таблицы в файле /etc/iproute2/rt_tables, которое можно будет использовать вместо номера.

Так же нужно проверить не включена ли проверка обратного пути (reverse path checking):
sysctl net.ipv4.conf.eth0.rp_filter
Если включена, то система будет проверять пакеты на соответствие источника интерфейсу, с которого пакет получен. Например, если пакет пришёл с адреса, который виден через другой интерфейс (а не тот, с которого пакет пришёл), то значит этот пакет надо отбросить.

Если всё заработало как надо, то сохраняем правила iptables в файл "/etc/sysconfig/iptables", а правила для маршрутизации в файл "/etc/sysconfig/network-scripts/route-eth0".

Далее несколько вспомогательных команд, которые могут пригодиться.

Посмотреть определённую таблицу маршрутизации:
ip route show table 111
Удалить маршрут из указанной таблицы
ip route del table 111 to 10.1.100.0/24
Посмотреть правила маршрутизации:
ip rule show
Удалить правило маршрутизации:
ip rule del fwmark 1

Как посмотреть правила iptables писать не буду )

Цена на кабели к смартфонам Samsung и Apple

По сути пост ни о чём, все и так знают, что аксессуары Apple неоправданно дорогие. Просто сам столкнулся и так удивился, что решил поделиться )

Понадобились мне кабели USB Type-C и Lightning. За первым я пошёл в фирменный салон Samsung, а за вторым в магазин авторизованного представителя Apple, по крайней мере оба магазина так о себе заявляют.

Кабель Samsung USB Type-C стоит 400 сом, кабель Apple Lightning стоит 1490 сом. Разница более чем в 3,5 раза.
Конечно, кабель USB Type-C в довольно простом пакетике, а кабель Lightning в красивой, добротной коробочке и парой маленьких брошюрок, но они мне не нужны. Какой-то явной разницы в качестве не заметил. Более того, кабель Samsung USB Type-C длиннее примерно на 10 см.

Фирменный кабель Lightning — это не блажь. Предыдущий кабель фирмы Remax (вроде не совсем уж нонейм) визуально более красивый и добротный, в довольно крепкой оплётке, начал глючить — периодически отказывается заряжать айфон, т.е. подключаешь зарядку, а телефон её не видит. Хотя я был с ним очень аккуратен, на нём нет никаких перегибов, потёртостей и других видимых изъянов. Вот я и решил купить фирменный кабель.

Кстати, считаю конструкцию кабеля Lightning намного более удачной нежели кабеля USB Type-C. Разъём со стороны телефона у Lightning явно более крепкий и продуманный — толстая площадка с контактами, которая вставляется в простой разъём телефона, ничего лишнего грубо говоря — палочку вставляешь в дырочку. А кабель USB Type-C, такое ощущение, что специально назло Apple сделали наоборот — вывернули и поэтому получилось сложнее: разъём на кабеле должен надеваться на контактную площадку в разъёме телефона, т.е. должна точно совпасть не только контактная площадка, но и рамка вокруг неё. Разъём Lightning на телефоне сломать надо очень постараться, там нет выступающих частей, а разъём USB Type-C на телефоне — это тонкая контактная площадка внутри углубления. Примерно тоже самое с разъёмами на кабелях — на Lightning, как я уже говорил, толстая контактная площадка и всё, испортить сложно, а на кабеле USB Type-C полость, в которой тонкие контакты. В результате подключение кабеля USB Type-C всё равно требует внимания и аккуратности, хоть теперь и не нужно определять верх-низ разъёма. Тогда как кабель Lightning подключить намного проще, но с другой стороны отключить его немного сложнее — он крепко держится, а ухватиться сложно, т.к. корпус разъёма слишком маленький и гладкий, но это уже придирки )

CentOS: статистика

В папке /proc можно найти много всякой полезной статистики, например:
/proc/meminfo — статистика по памяти;
/proc/diskstats — статистика по дискам;
/proc/net/dev — счётчики трафика на сетевых картах;

А ещё есть данные в папке /sys/class, например счётчики трафика на отдельных сетевых картах:
/sys/class/net/eth0/statistics/rx_bytes
/sys/class/net/eth0/statistics/tx_bytes
/sys/class/net/eth0/statistics/rx_packets
/sys/class/net/eth0/statistics/tx_packets

Там же есть данные по параметрам сетевой карты, например, скорость соединения, режим дуплекса.

CentOS: Запуск демона при помощи systemd

Установил net-snmp из исходников, т.к. пакет требует наличия библиотек mariadb, которые конфликтуют с установленным mysql.

Для нормального запуска демона посредством systemd создал файл /usr/lib/systemd/system/snmpd.service:
[Unit]
Description=Net-SNMP daemon
Documentation=man:snmpd(8) man:snmpd.conf(5)
After=network.target

[Service]
ExecStart=/usr/local/net-snmp/sbin/snmpd -f -c /etc/snmpd.conf -p /var/run/snmpd.pid
ExecReload=/bin/kill -HUP ${MAINPID}
ExecStop=/bin/kill -TERM ${MAINPID}

[Install]
WantedBy=multi-user.target

Обратите внимание на ключ "-f" — не уходить в фон. Так systemd может прочитать pid процесса. Иначе у меня не получилось, опция «PIDFile=» не помогла.

Теперь демон нормально обрабатывается командой systemctl:
systemctl enable snmpd.service
systemctl start snmpd.service
systemctl status snmpd.service
systemctl stop snmpd.service


Дополнение: скрипт для запуска демона ЯндексДиск

Создаём файл "/usr/lib/systemd/system/yandex-disk.service":
[Unit]
Description=Yandex Disk daemon
Documentation=man:yandex-disk(8)
After=network.target

[Service]
Type=simple
RemainAfterExit=true
ExecStart=/bin/yandex-disk start
ExecStop=/bin/yandex-disk stop

[Install]
WantedBy=default.target


Затем активируем его:
systemctl enable yandex-disk
И запускаем:
systemctl start yandex-disk
Проверяем:
systemctl status yandex-disk

Подробности можно посмотреть отдельно:
yandex-disk status

CentOS: установка VMWare Player

Скачиваем дистрибутив с официального сайта. Скаченный файл, например, VMware-Player-7.0.0-2305329.x86_64.bundle — это шелл-скрипт. Запускаем установку:
sh VMware-Player-7.0.0-2305329.x86_64.bundle

После успешной установки в меню программ System появится пункт «VMWare Player».

Удалить его можно вот так:
sh VMware-Player-7.0.0-2305329.x86_64.bundle --uninstall-product vmware-player

CentOS: iSCSI

Настраиваем iSCSI-сервер (таргет)

Выбираем для этого раздел, не забываем отмонтировать его и убрать из /etc/fstab если надо, например это будет раздел sdc1.

Устанавливаем пакет:
yum -y install scsi-target-utils

Затем в файле /etc/tgt/targets.conf прописываем наше устройство:
<target iqn.2014-12.tld.mydomain:myserver.test>
# Устройство:
backing-store /dev/sdc1
# Адрес iSCSI-клиента (инициатора), можно указать несколько таких строк:
initiator-address 10.0.0.1
№initiator-address 10.0.0.2
# Если надо — логин и пароль:
#incominguser test pass-12345


Запускаем службу:
/etc/rc.d/init.d/tgtd start

Прописываем её автозапуск:
chkconfig --levels 23 tgtd on

Проверяем состояние:
tgt-admin --show

Открываем, если надо, порт 3260 в файрволе.

Посмотреть текущие поключения инициаторов к указанному таргету можно вот так:
tgtadm --lld iscsi --mode conn --op show --tid 1
Session: 4
Connection: 0
Initiator: iqn.2014-12.tld.mydomain:client1
IP Address: 10.1.0.1

Настраиваем iSCSI-клиент (инициатор)

Устанавливаем пакет:
yum -y install iscsi-initiator-utils

Если на таргете задавали логин и пароль, то прописываем их в файле /etc/iscsi/iscsid.conf, иначе можно его не трогать. Рядом с этим конфигом лежит файл initiatorname.iscsi, в котором не помешает задать понятное вам имя инициатора:
InitiatorName=iqn.2014-12.tld.mydomain:client1

Прописываем службы в автозапуск:
chkconfig --levels 23 iscsid on
chkconfig --levels 23 iscsi on
Проверяем включен ли автозапуск для netfs и если надо — включаем:
chkconfig --list netfs
chkconfig --levels 23 netfs on

Опрашиваем таргет:
iscsiadm -m discovery -t sendtargets -p 10.0.0.1
Должно выдать что-то вроде этого:
10.0.0.1:3260,1 iqn.2014-12.tld.mydomain:myserver.test

Можно просмотреть состояние:
iscsiadm -m node -o show

Подключаемся к таргету:
iscsiadm -m node --login -T iqn.2014-12.tld.mydomain:myserver.test
Проверяем сессию:
iscsiadm -m session -o show
Должно показать что-то вот такое:
tcp: [1] 10.0.0.1:3260,1 iqn.2014-12.tld.mydomain:myserver.test (non-flash)

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

Создаём разделы (подробности не описываю):
fdisk /dev/sdc

Форматируем:
mkfs.ext4 /dev/sdc1
(или mkfs.xfs /dev/sdc1)

Монтируем:
mount -o noatime,nodiratime /dev/sdc1 /mnt/1

И добавляем в /etc/fstab:
/dev/sdc1 /mnt/1 ext4 _netdev,rw 0 0

Или же можно подмонтировать по UUID:
blkid /dev/sdc1
/dev/sdc1: UUID=«e65ea5f6-9a37-456e-9f33-00d63890c8f3» TYPE=«ext4»

Написано, что по UUID лучше, т.к. идентификатор устройства, например после подключения/отключения дисков, может измениться, а UUID — нет.

В этом случае в /etc/fstab добавляем:
UUID=e65ea5f6-9a37-456e-9f33-00d63890c8f3 /mnt/1 ext4 _netdev,rw,noatime,nodiratime 0 0

Службы iscsi-инициатора при запуске будут подмонтировать все таргеты, найденные в своей базе (/var/lib/iscsi/nodes). Соответственно система будет брать диск с нужным UUID и монтировать его в соответствии с записью в /etc/fstab, ну или как вы указали в команде mount.

Отключение iSCSI-диска

Как обычно отмонтируем:
umount /dev/sdc

Отключаемся от таргета:
iscsiadm --m node -T iqn.2014-12.tld.mydomain:myserver.test -u

Проверяем:
iscsiadm -m session -o show
iscsiadm: No active sessions.

Если таргет больше не нужно подключать, то, после отключения от него, лучше удалить его из базы, чтобы при каждом запуске системы таргет снова не подмонтировался:
iscsiadm -m node -T iqn.2014-12.tld.mydomain:myserver.test -o delete

Подключение раздела локально

Подмонтировать раздел, используемый как iscsi-таргет, локально как обычный диск мне пока не удалось. Это плохо. Успокаивает то, что можно подключить его как iscsi-диск с той же машины так же как и с удалённой.

CentOS: ещё одно описание установки VirtualBox )

В виду того, что найденные мной описания установки VirtualBox на CentOS в моём случае не стали исчерпывающими я решил описать свой вариант.

Система CentOS 6.6.

Скачиваю файл описания репозитория VirtualBox:
wget download.virtualbox.org/virtualbox/rpm/rhel/virtualbox.repo

Перекладываю его в папку /etc/yum.repos.d

Устанавливаю VirtualBox:
yum install VirtualBox-4.3

Однако установка аварийно завершается в процессе скачивания дистрибутива с сообщением о низкой скорости скачивания. Скачиваю его вручную:
wget download.virtualbox.org/virtualbox/rpm/el/6/x86_64/VirtualBox-4.3-4.3.20_96996_el6-1.x86_64.rpm

И устанавливаю:
yum install VirtualBox-4.3-4.3.20_96996_el6-1.x86_64.rpm

При попытке настройки командой "/etc/init.d/vboxdrv setup" получаю ошибку:
Error: unable to find the sources of your current Linux kernel. Specify KERN_DIR=<directory> and run Make again.  Stop.


Смотрю в папке /usr/src/ точное название папки и прописываю переменную окружения:
export KERN_DIR=/usr/src/kernels/2.6.32-504.1.3.el6.x86_64

Запускаю снова "/etc/init.d/vboxdrv setup" и опять неудача — что-то там про то, что невозможно найти файлы заголовков (headers) ядра.

Перезагрузился, в процессе загрузки устанавливались какие-то модули VirtualBox-а.

Снова запускаю "/etc/init.d/vboxdrv setup" и, о чудо, кроме ошибок в процессе удаления старых модулей всё прошло нормально:
Stopping VirtualBox kernel modules                         [  OK  ]
Uninstalling old VirtualBox DKMS kernel modules
Error! There are no instances of module: vboxhost
4.3.20 located in the DKMS tree.
Error! There are no instances of module: vboxhost
4.3.20 located in the DKMS tree.
Error! There are no instances of module: vboxhost
4.3.20 located in the DKMS tree.
Error! There are no instances of module: vboxhost
4.3.20 located in the DKMS tree.
                                                           [  OK  ]
Trying to register the VirtualBox kernel modules using DKMS[  OK  ]
Starting VirtualBox kernel modules                         [  OK  ]


Запускаем его:
VirtualBox

Выбираю операционку Windows XP (32 bit), в качестве CD-привода выбираю виртуальный привод и указываю его на заранее скаченный имидж Windows XP 32-бита.

Пакет расширения

Вроде бы нужен, чтобы работал USB и ещё какие-то штуки:
Description: USB 2.0 Host Controller, Host Webcam, VirtualBox RDP, PXE ROM with E1000 support.

Скачиваем с сайта VirtualBox-а «VirtualBox 4.3.20 Oracle VM VirtualBox Extension Pack».

Устанавливаем его:
VBoxManage extpack install Oracle_VM_VirtualBox_Extension_Pack-4.3.20-96996.vbox-extpack

Посмотреть список пакетов расширения:
VBoxManage list extpacks

Расшаренные папки

Чтобы папки из хост-системы были видны в гостевой нужно в гостевой системе установить Oracle VM VirtualBox Guest Additions. Для этого в меню этой виртуальной машины надо выбрать пункт — Devices — Insert Guest Additional CD image. Винда в гостевой машине запустит установку программы, а дальше как обычно.

CentOS: управление запуском сервисов

Какие сервисы запускаются на каких уровнях:
chkconfig --list

Какие уровни что означают:

# /etc/inittab
# Default runlevel. The runlevels used are:
# 0 — halt (Do NOT set initdefault to this)
# 1 — Single user mode
# 2 — Multiuser, without NFS (The same as 3, if you do not have
# networking)
# 3 — Full multiuser mode
# 4 — unused
# 5 — X11
# 6 — reboot (Do NOT set initdefault to this)

Примеры:

1. В каких случаях запускать mysqld:
chkconfig --level 23 mysqld on
2. Не запускать апач на уровнях 2 и 3:
chkconfig --level 23 httpd off
3. Не запускать апач вообще:
chkconfig httpd off

Mac OS X: Добавление статических маршрутов при подключении по VPN

Для поднятия статических маршрутов при подключении по VPN создаём файл /etc/ppp/ip-up:
#!/bin/sh

PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:

LOG="/tmp/ppp.log"
date > $LOG

list="10.1.1.2 10.1.1.3 10.1.1.4 10.2.2.1"
for i in $list
do
 route add -host $i $IPREMOTE >> $LOG 
done

Если у вас несколько VPN-соединений, то очевидно придётся проверять IP-адрес шлюза, например:
if [ $IPREMOTE = «10.3.3.1» ]
then
# делаем что надо для подключения к 10.3.3.1
fi

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

Ну и конечно указанный файл должен иметь права на выполнение:
chmod a+x /etc/ppp/ip-up

CentOS IPv6

Есть интерфейс из ВЛАН-10, на котором уже имеется IPv4-адрес, надо добавить второй адрес, но уже из IPv6-сети. Это можно сделать вот так:
ip addr add 2001:0db8:3:4:0:0:0:3/64 dev eth0.10

Удалить вот так:
ip addr del 2001:0db8:3:4:0:0:0:3/64 dev eth0.10

А чтобы при перезагрузке компьютера этот адрес появился снова добавляем записи для IPv6 в уже существующий файл /etc/sysconfig/network-scripts/ifcfg-eth0.10:
DEVICE=eth0.10
PHYSDEV=eth0
ONBOOT=yes
VID=10
IPADDR=10.1.1.3
NETMASK=255.255.255.0
BOOTPROTO=static
VLAN=yes
USERCTL=no
GATEWAY=10.1.1.1
PEERDNS=yes
DNS1=10.1.1.1
DNS2=10.1.1.2
DOMAIN=elcat.kg
# Добавляем данные для IPv6:
IPV6INIT=yes
IPV6ADDR=2001:0db8:3:4:0:0:0:3/64
IPV6_DEFAULTGW=2001:0db8:3:4:0:0:0:1

Пингуем командой ping6, а путь смотрим командой tracepath6.

Несколько примеров просмотра, удаления и добавления IPv6-маршрутов:
ip -6 route show
ip -6 route show ::/0
ip -6 route show default
ip -6 route delete ::/0
ip -6 route add default via 2001:0db8:3:4:0:0:0:1
ip -6 route add 2001:0db8:33:44::/64 via 2001:0db8:3:4:0:0:0:1
ip -6 route delete 2001:0db8:33:44::/64

К сожалению маршрут до конкретного хоста из подсети, на которую добавлен маршрут, не показывается:
ip -6 route show 2001:0db8:33:44:0:0:0:13
Только для заданной подсети:
ip -6 route show 2001:0db8:33:44::/64

Ну или старый, добрый netstat:
netstat -rn --inet6