Мрежово администриране - въведение

 

Съдържание:

1. Задаване на име на хоста
2. Управление на мрежовите интерфейси
3. Конфигуриране на статично IP адресиране
4. Linux name resolution
5. Open SSH

В последните версии на Ubuntu (от версия 17.10 ) стандартните средства за конфигуриране на мрежата  - net-tools са  заменени с ново средство за генериране на мрежови конфигурации  NetPlan/CloudInit tool. Средствата net-tools не се инсталират по подразбиране.

За да може виртуалната машина да се появи в локалната мрежа е необходимо при изключена (и избрана) машина  -> Settings ->Network -> Adapter 1 -> Attached to Bridged adapter

1. Задаване име на хоста

При инсталирането е зададено име, което може да се види в стандартния prompt на командния интерпретатор (известен като PS1 prompt). Там се извежда информация до първата точка в името - ако машината е imom.mycompany.com, то в PS1 prompt ще бъде изведено imom.

Името може да се види и с команда  hostname:

$imom@imom-VirtualBox:~$ hostname
imom-VirtualBox
imom@imom-VirtualBox:~$

Повече подробности могат да се видят с командата hostnamectl

$ hostnamectl $ hostnamectl
 Static hostname: homeVB
       Icon name: computer-vm
         Chassis: vm
      Machine ID: c03769c35ee84338af4d009535004927
         Boot ID: d01361f23b4c4e54ad17acb4ac13c320
  Virtualization: oracle
Operating System: Ubuntu 22.04.4 LTS              
          Kernel: Linux 6.5.0-25-generic
    Architecture: x86-64
 Hardware Vendor: innotek GmbH
  Hardware Model: VirtualBox

Забележка :    Icon name се използва от някои графични апликации.

Името може да се смени с команда hostnamectl (необходими са административни права):

$sudo hostnamectl set-hostname imom-VB


Командата променя /etc/hostname,  който съхранява името на машината.

$ cat /etc/hostname
imom-VB


Забележка:  Icon name може да се смени с:

$sudo hostnamectl set-icon-name  homeVB


Разбира се файлът /etc/hostname също може да бъде променен ръчно без да се използва командата hostnamectl .

$sudо nano /etc/hostname


За да се отрази новото име в prompt  е необходимо рестартиране на интерпретатора


Името на машината се съхранява в още един файл - /etc/hosts .  Файлът се използва за превеждане на имена в ip адреси. Нормално при търсене на име на хост първо се търси в този файл, след което ако не бъде намерен се подава DNS заявка към DNS сървърите за намиране на  ip адреса. Това дава възможност за въвеждане на имена на хостове, които са изцяло под контрола на локалната операционна система. Имената въведени в този файл остават локални и не могат да бъдат достъпени от друг компютър.

$cat /etc/hosts
127.0.0.1    localhost
127.0.1.1    imom-VirtualBox

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

Първата линия се отнася за локалната машина. Адресът  localhost, известен също като loopback adresses позволява на машината да се обръща към себе си.

$ ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.016 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.046 ms
...

$ ping localhost
PING localhost (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.029 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.049 ms
...



Втората линия (в червено) показва, че локалният сървър може да бъде намерен също на адрес 127.0.1.1 както и под името  " imom-VirtualBox"

$ping 127.0.1.1
PING 127.0.1.1 (127.0.1.1) 56(84) bytes of data.
64 bytes from 127.0.1.1: icmp_seq=1 ttl=64 time=0.030 ms
...

$ ping imom-VirtualBox
PING imom-VirtualBox (127.0.1.1) 56(84) bytes of data.
64 bytes from imom-VirtualBox (127.0.1.1): icmp_seq=1 ttl=64 time=0.031 ms
...

За съжаление командата hostnamectl не сменя съдържанието на тоаи файл и той трябва да се промени ръчно след смяна на името:

$sudо nano /etc/hosts

Всеки ред на файла започва с ip адрес, след което се задава име. Могат да бъдат задавани алтернативни имена разделени с празен интервал.


2. Управление на мрежовите интерфейси

За установяване на текущите параметри на мрежовия интерфейс се използва командата  ip a  или ip addr ( до версия 16.04 на Ubuntu се използваше команда ifconfig)

$ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:54:b7:57 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.243/24 brd 192.168.1.255 scope global dynamic noprefixroute enp0s3
       valid_lft 62567sec preferred_lft 62567sec
    inet6 fe80::a00:27ff:fe54:b757/64 scope link
       valid_lft forever preferred_lft forev

Резултатът представлява наличните мрежови интерфейси и техният текущ статус. Извеждат се неща като  ip адреса на всеки мрежов интерфейс (ако има такъв ), както и неговия MAC адрес.

При изписване на ip адреса се използва CIDR (Classless Inter-Domain Routing) метод на представяне на мрежовата и хост частта от IP адреса. Приема се нотация за изписване на мрежов адрес – CIDR блок. При този запис след мрежовия адрес се поставя наклонена черта и се изписват броя на битовете в мрежовия адрес. Така например в 192.168.1.243/24 означава че от 32 -та бита в адреса  24 са за мрежовия адрес - 192.168.1 и последните 8 - 243 са за адреса на хоста в локалната мрежа. За да се използва метода е необходимо всички маршрутизиращи протоколи да пренасят информация освен за мрежовите адреси, така и за дължината на мрежовата част. При това става възможно да се адресират всички възможни IP адресни комбинации, не се използва разделянето на адресите на класове и мрежова маска. В IPv6 мрежова маска не се дефинира като понятие, използва се единствено CIDR запис.

Ethernet интерфейсите се идентифицираха в по-старите системи обикновено с имена ethX, където X е нарастваща стойност. Първият интерфейс типично бе eth0, вторият - eth1.  В машини с много интерфейсни адаптери се взимаха специални мерки да не си разменят имената при рестартиране на системата, като се привързваха към MAC адресите. За целта се използваше файл /etc/udev/rules.d/70-persistent-net-rules. Типичен ред от този файл има вида:

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="a0:d3:c1:2a:57:c0", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
 
Напоследък се присвояват логически имена базирани на физическото разположение на хардуера -  enp0s3 (en:ethernet, p0:bus number-0, s3:slot number -3). Новата конвенция е въведена в Debian 9.0 и възприета от последните версии на Ubuntu. Използването на тази конвенция предотвратява  сменянето на имената на интерфейсите, докато не се направят физически промени във хардуера.. Допълнителна информация за тази конвенция може да се намери тук.

Друг начин за идентифициране на мрежовите интерфейси е командата lshw. Това е малка програма, която извлича детайлна информация за хардуерната конфигурация на машината:

 $sudo lshw -class network
  *-network                
       description: Ethernet interface
       product: 82540EM Gigabit Ethernet Controller
       vendor: Intel Corporation
       physical id: 3
       bus info: pci@0000:00:03.0
       logical name: enp0s3
       version: 02
       serial: 08:00:27:54:b7:57
       size: 1Gbit/s
       capacity: 1Gbit/s
       width: 32 bits
       clock: 66MHz
       capabilities: pm pcix bus_master cap_list ethernet physical tp 10bt 10bt-fd 100bt 100bt-fd 1000bt-fd autonegotiation
       configuration: autonegotiation=on broadcast=yes driver=e1000 driverversion=7.3.21-k8-NAPI duplex=full ip=192.168.1.243 latency=64 link=yes mingnt=255 multicast=yes port=twisted pair speed=1Gbit/s
       resources: irq:19 memory:f0200000-f021ffff ioport:d020(size=8) 

С ip командата може да се управлява състоянието на интерфейса:

Спиране на инрефейса (откачване на връзката) и включване отново :

$sudo ip link set enp0s3 down
ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
    link/ether 08:00:27:54:b7:57 brd ff:ff:ff:ff:ff:ff

Проверка с командата lshw :

 sudo lshw -class network
  *-network DISABLED       
       description: Ethernet interface
       product: 82540EM Gigabit Ethernet Controller
       vendor: Intel Corporation
       physical id: 3
       bus info: pci@0000:00:03.0
       logical name: enp0s3
       version: 02
       serial: 08:00:27:7a:cf:e1
       size: 1Gbit/s
       capacity: 1Gbit/s
       width: 32 bits
       clock: 66MHz
       capabilities: pm pcix bus_master cap_list ethernet physical tp 10bt 10bt-fd 100bt 100bt-fd 1000bt-fd autonegotiation
       configuration: autonegotiation=on broadcast=yes driver=e1000 driverversion=5.13.0-39-generic duplex=full latency=64 link=no mingnt=255 multicast=yes port=twisted pair speed=1Gbit/s
       resources: irq:19 memory:f0200000-f021ffff ioport:d020(size=8)


 sudo ip link set enp0s3 up
imom@imom-VB:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:54:b7:57 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.243/24 brd 192.168.1.255 scope global dynamic noprefixroute enp0s3
       valid_lft 86393sec preferred_lft 86393sec

$ sudo lshw -class network
  *-network                
       description: Ethernet interface
       product: 82540EM Gigabit Ethernet Controller
       vendor: Intel Corporation
       physical id: 3
       bus info: pci@0000:00:03.0
       logical name: enp0s3
       version: 02
       serial: 08:00:27:7a:cf:e1
       size: 1Gbit/s
       capacity: 1Gbit/s
       width: 32 bits
       clock: 66MHz
       capabilities: pm pcix bus_master cap_list ethernet physical tp 10bt 10bt-fd 100bt 100bt-fd 1000bt-fd autonegotiation
       configuration: autonegotiation=on broadcast=yes driver=e1000 driverversion=5.13.0-39-generic duplex=full ip=192.168.1.8 latency=64 link=yes mingnt=255 multicast=yes port=twisted pair speed=1Gbit/s
       resources: irq:19 memory:f0200000-f021ffff ioport:d020(size=8)

3. Конфигуриране на статично IP адресиране

Задаване статичен IP address на  Ubuntu 24.04 LTS desktop

Network configuration in Ubuntu desktop is controlled by network manager. Промяната  може най-лесно да се извърши през графичния интерфейс:

Activities -> Network -> Wred settings -> IPv4 -> Address/Netmask/Gattway /DNS  -> Apply

След което трябва да се рестартира системата.

Разбира се може винаги да се използва командния интерпретатор за целта. Този подход, описан по-долу е задължителен за Ubuntu сървъри, които не притежават графичен интерфейс.

Задаване статичен IP address на  Ubuntu 24.04 LTS Server

От Ubuntu 17.10 (2017 година)  NetworkManager, който се използваше за конфигуриране на мрежовите интерфейси е заменен с Netplan. Конфигурационните файлове сега се съхраняват в директория /etc/netplan в YAML формат. Този формат не се разглежда в този курс, но синтаксисът му е лесен за разбиране и не е необходимо доброто му познаване за да бъдат конфигурирани мрежовите интерфейси.

$ cat /etc/netplan/01-network-manager-all.yaml



4. Linux name resolution

Редът по който се търси връзката между IP адрес и име се задава от файла  /etc/nsswitch.conf :

$cat /etc/nsswitch.conf |egrep hosts
hosts:          files mdns4_minimal [NOTFOUND=return] dns

(Другите редове в този файл няма да бъдат обсъждани тук).

Същественото тук е реда на модулите   files и  dns  ( mdns4_minimal се използва за мултикаст търсене на имена в локалната мрежа с топ домейн .local и също няма да бъде обсъждан тук)   . 

Сложеният на първо място files показва, че първо името ще се проверява в файла с имената ( /etc/hosts ). След това ще бъде търсен в dns. Това е подразбиращият се ред на тъсене.

Използването на този подход позволява временното присвояване на адреси, много е удобен за тестване но е труден за поддържане и се отнася само за локалната машина.

В предишни версии на Ubuntu, IP адресите на dns сървърите се сьхраняваха във файла /etc/resolv.conf. Редактирането на този файл водеше до промяната им. В последните версии файлът е съхранен, но не се използва за тази цел,  а се генерира автоматично.  Name resolution в последните версии се осъществява от демон процеса systemd-resolved, който се стартира от initd , и използва dns settings зададени от  netplan. 

 5. Open SSH

Open SSH е вероятно най-използваното средство за отдалечено управление на Linux сървъри. Той позволява криптирана връзка в терминален прозорец и дава пълни възможности за отдалечено конфигуриране и управление.

Инсталиране

Състои се от две компоненти - server daemon, който работи във фонов режим на управлявания съсрвър и клиент на локалната машина, който позволява свърване със сървъра и изпълнеие на командите. Клиенти има за всички операционни системи. Повечето съвременни дистрибуции на Linux инсталират  по подразбиране клиента. Дали е инсталиран  може да се провери с командата which (which - locate a command) :

$ which ssh
/usr/bin/ssh

Когато е инсталиран се извежда пътя до командата и може да бъде използван:

$ ssh ff.tu-sofia.bg
The authenticity of host 'ff.tu-sofia.bg (81.161.252.17)' can't be established.
ECDSA key fingerprint is SHA256:ztoci+dnI+JQngUDp7CogkmlvqPiA+ephVOi2WU5TQk.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'ff.tu-sofia.bg,81.161.252.17' (ECDSA) to the list of known hosts.
imom@ff.tu-sofia.bg's password:

Ако не е инсталиран се инсталира с командата:

$ sudo apt install openssh-server
[sudo] password for imom:
Reading package lists... Done
Building dependency tree      
Reading state information... Done
The following additional packages will be installed:
  ncurses-term openssh-sftp-server ssh-import-id
Suggested packages:
  molly-guard monkeysphere ssh-askpass
The following NEW packages will be installed:
  ncurses-term openssh-server openssh-sftp-server ssh-import-id
0 upgraded, 4 newly installed, 0 to remove and 47 not upgraded.
Need to get 688 kB of archives.
After this operation, 6010 kB of additional disk space will be used.
Do you want to continue? [Y/n] y
...

Инсталирането на мощен продукт освен удобствата носи и опасности - създава възможности за външна атака върху сървъра. Принципът е, че трябва да се инсталират само продукти, които са необходими. за реален сървър аз не виждам как може да не се инсталира openssh-server, но трябва да се вземат мерки за негова защита - например да се използва подходящо firewall.

Команди

По подразбиране пакетът openssh-server е конфигуриран така, че след инсталиране веднага е готов за използване. Дали необходимият service работи може да се провери с командата:

$ systemctl status ssh
● ssh.service - OpenBSD Secure Shell server
     Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2021-05-28 16:40:34 EEST; 14min ago
       Docs: man:sshd(8)
             man:sshd_config(5)
   Main PID: 3809 (sshd)
      Tasks: 1 (limit: 2315)
     Memory: 1.1M
     CGroup: /system.slice/ssh.service
             └─3809 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startup
...

Трябва да получите съобщение, че е active (running).  Ако не е активен, можете да го стартирате с команда 

$ sudo systemctl start ssh

Ако изходът от systemctl status изведе, че сървърът е disabled ( означава, че не се стартира автоматично при стартиране на ситемата):

$ sudo systemctl enable ssh

Когато съсрвърът е активен, той трябва да слуша портовете за конекции. Това може да се провери с  команда ss (ss - utility to investigate sockets):

$ sudo ss -tunlp|grep ssh
tcp     LISTEN   0        128              0.0.0.0:22             0.0.0.0:*      users:(("sshd",pid=3809,fd=3))                                                 
tcp     LISTEN   0        128                 [::]:22                [::]:*      users:(("sshd",pid=3809,fd=4))

Опции: -l,  Display only listening sockets (these are omitted by default).
              -n, Do not try to resolve service names. Show exact bandwidth values, instead of human-readable
              -p, Show process using socket.
              -t,  Display TCP sockets.
              -u,  Display UDP sockets.

Свързването със сървъра става по име или IP адрес:

$ ssh ff.tu-sofia.bg
$ ssh 81.161.252.17

По подразбиране логването е със същото име каквото сте на локалната система. Ако искате да се логнете под друго име то се задава първо последвано от @:

$ ssh imom@ff.tu-sofia.bg
$ ssh imom@81.161.252.17

По подразбиране sshd слуша на порт 22. Акотой слуша на друг порт (например 2391):

$ ssh -p 2391 imom@ff.tu-sofia.bg
$ ssh -p 2391 imom@81.161.252.17