henry_flower: A melancholy wolf (Default)
henry_flower ([personal profile] henry_flower) wrote2018-09-25 11:56 pm
Entry tags:

If You Meet a Sysadmin on the Road, Kill Him

... або моя боротьба зі внутрішнім сисадміном.

Системних адміністраторів ліпше за все душити з пуп'яночку, коли вони є маленькі, беззахисні.
-- Сорайя Саенс де Сантамарія, з книжки Ля практика де ля Ґерра Тоталь (Практика Тотальної Війни).

Коли домашній рутер почав барахлити, я вирішив не купляти нового кетайського пластикового мотлоху, а пристосувати старого безшумного десктопа, який стоїть вимкнений 364 дні на рік.

Спочатку я зовсім не бажав, як би сказав пан Smugastyi Kit, колхозіть лайнукса, а кортів придбати копійчаного майкрóтіку, але прочитав про болісну процедуру заливання до нього openwrt та пригадав свої бідкання зі дивовижно черепаховими usb ув openwrt у минулому.

Окрім пáкет рýтін', самби та вебсервера, такий лайнукс має мескерєйтиди пакети для інших дівайсів, що (сюрприза!) означає, що у коробці повинно бути 2 мережеві плати. Знайшовши у засіках якийсь старезний інтелівський адаптер, я потішився від свого фругаліті, підключив зе плату, під'єднав 2 ізернет кабелі, запхнув десктопа назад до його ведмежого кута та приготувався страждати з iptables.

Щоб записати правила файеволу правильно, треба ретельно слідкувати за іменами мережевих інтерхфейсів, яких у мене було 3:

  • enp0s18f2u6i1
  • enp2s0
  • enp3s5

2 з них то є ізернет, 1--ондроїд, запасний інторнета. Хтось може здогадатися, що відповідає чому? Куди був підключений який кабель?

Жодна з ip, ifconfig, ethtool утіліт не друкує виробника дівайсу. lspci--друкує, але не показує mac, що унеможливлює рівнозначну ідентифікацію. Я впевнений, що геть усі сндовскі сисадміни знають префікси з /usr/share/nmap/nmap-mac-prefixes напам'ять, але я не сисадмін, тому вважаю це знущянням.

Заплакав та написав собі скрипта (ні, ніяких mac префіксів воно не використовує):

#!/bin/sh

errno=0
sys=/sys/class/net

# $1 == nic
dump() {
    [ -d "$sys/$1" ] || { echo "$1 is absent" 1>&2; errno=2; return; }

    echo Name "$1" | pp
    echo MAC "`cat "$sys/$1/address"`" | pp
    echo Driver "`uevent "$1" DRIVER`" | pp
    (pci "$1" || usb "$1") | pp
}

# $1 == nic
pci() {
    local dev=`uevent "$1" PCI_ID`
    [ ! -z "$dev" ] && /usr/sbin/lspci -d  "$dev" -vmmk 2>/dev/null \
        | gawk 'match($0, /^(S?Vendor|S?Device|Rev):(.*)/, r) { printf("%s %s\n", r[1], r[2]) }'
}

# $1 == nic
usb() {
    local dev=`uevent "$1" PRODUCT | awk -F/ '{printf("%s:%s", $1, $2)}'`
    [ ! -z "$dev" ] && lsusb -v -d "$dev" 2>/dev/null | awk '/idVendor|iManufacturer|iProduct|iSerial/ {printf $1; $1=""; $2=""; print $0}'
}

# $1 == nic, $2 == key
uevent() { awk -F= '/^'"$2"'/ {print $2}' "$sys/$1/device/uevent" 2>/dev/null; }

pp() { awk '{if ($2 != "") { printf("%-15s", $1); $1=""; print $0} }'; }

nics=$*
[ -z "$nics" ] && { nics=`(cd $sys && echo *)` || exit 1; }

idx=0; for val in $nics; do
    [ $idx -ne 0 ] && echo ''
    dump "$val"
    idx=1
done

exit $errno

На жаль, коротше ніж у 43 рядки

$ cloc nic | grep '^[LB]'
Language                     files          blank        comment           code
Bourne Shell                     1             10              4             29

укластися не вийшло.

Перейменував через udev інтерхфейси на wan, lan та android0. Зараз зе скрипта друкує таке:

$ nic
Name            android0
MAC             ce:2b:a1:1f:84:ee
Driver          cdc_ether
idVendor        LG Electronics, Inc.
iManufacturer   LG Electronics Inc.
iProduct        LGE Android Phone
iSerial         <redacted>

Name            lan
MAC             00:30:67:ad:fc:96
Driver          r8169
Vendor          Realtek Semiconductor Co., Ltd.
Device          RTL810xE PCI Express Fast Ethernet controller
SVendor         Biostar Microtech Int'l Corp
SDevice         Device 230b
Rev             02

Name            lo
MAC             00:00:00:00:00:00

Name            wan
MAC             00:07:e9:0b:29:27
Driver          e1000
Vendor          Intel Corporation
Device          82540EM Gigabit Ethernet Controller
SVendor         Intel Corporation
SDevice         PRO/1000 MT Desktop Adapter
Rev             02

Після тортур з iptables, відчуваю, що головне зараз не почати настроювати сендмейла. Легка жадоба є, але я поки що тримаюся.

waqur: (Default)

[personal profile] waqur 2018-09-26 07:38 am (UTC)(link)
Чтобы не было этих уродских имён типа enp0s18f2u6i1 или enxb827eb2454a3, можно задать net.ifnames=0 в командной строке ядра. Тогда будет eth0, eth1 и т.д. Правда, не факт, что при перезагрузках этот порядок нумерации будет сохраняться.

А вообще можно придумать свои имена и задать их в udev-правилах
/etc/udev/rules.d, вот пример для парочки беспроводных:

SUBSYSTEM=="ieee80211", ACTION=="add", \
    DRIVERS=="brcmfmac", NAME:="phy0"
SUBSYSTEM=="net", ACTION=="add", \
    ATTR{address}=="b8:27:eb:24:54:a3", NAME:="wlan0"


SUBSYSTEM=="ieee80211", ACTION=="add", \
    DRIVERS=="carl9170", NAME:="phy1"
SUBSYSTEM=="net", ACTION=="add", \
    ATTR{address}=="24:65:11:3c:24:74", NAME:="wlan1"



За что я люблю FreeBSD — там имена сетевых карт таковы, что каждый драйвер начинает нумерацию с нуля в своём пространстве имён.

Например, Intel'овские сетевухи: igb0, igb1, ...
Realtek новые: re0, re1, ...
Realtek старые: rl0, rl1, ...
Atheros: ath0, ath1, ...

Соответственно очень редко нужно греться такой х*йнёй.

[personal profile] smugastyi_kit 2018-09-26 09:19 am (UTC)(link)
+1. После фряхи - очень сложно смотреть на линуховый бардак без слез.

[personal profile] smugastyi_kit 2018-09-26 10:54 am (UTC)(link)
Увы. Это потому что там не только игорь тонет. Там и софта тонет. А дровней - вообще нет.
jurgen: (Default)

[personal profile] jurgen 2018-09-26 09:47 am (UTC)(link)
А каким образом вайфай машина раздаёт? Через затычку под usb?
jurgen: (Default)

[personal profile] jurgen 2018-09-26 11:22 am (UTC)(link)
Ебать. ...яйцо в утке, утка в ахуе.


Что с тплинками не так? Юзаю уже лет 10 на офисе и дома, проблем никаких.

[personal profile] sassa_nf 2018-09-27 09:15 am (UTC)(link)
хіба цей скрипт зможе відрізнити дві карти одного і того ж виробника?


"Куди був підключений який кабель?"

включаєш у рутера DHCP, висмикнути один кабель, і перевірити, у якого інтерфейса з'явився IP.

[personal profile] sassa_nf 2018-09-27 10:49 am (UTC)(link)
"так, mac же буде різний"

звичайно. Він різний і без скрипта :)