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

 

Съдържание:

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 (необходими са административни права):

$sudo hostnamectl set-hostname imom-VB


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

$ cat /etc/hostname
imom-VB


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

$sudо nano /etc/hostname


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



Името на машината се съхранява в още един файл - /etc/hosts :

$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



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 адрес.

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 20.04 LTS desktop

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

Login to  desktop environment -> network icon -> Settings ->  Wired settings - > Ipv4 -> Manual -> Adress : 192.168.1.20    Netmask: 255.255.255.0    Gateway: 192.168.1.1

DNS -> automatic

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

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

$ cat /etc/netplan/01-network-manager-all.yaml
# Let NetworkManager manage all devices on this system
network:
 version: 2
 renderer: NetworkManager
 ethernets:
  enp0s3:
   dhcp4: yes
   addresses: []

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

Преди да се извършват промени във файла е добре да бъде запазено негово копие в случай на проблем:

$sudo cp /etc/netplan/01-network-manager-all.yaml /etc/netplan/01-network-manager-all.yaml.bak1
imom@imom-VB:~$ ls /etc/netplan/
01-network-manager-all.yaml      01-network-manager-all.yaml.bak1

За да бъде конфигуриран статичен адрес на сървъра трябва   двете линии задаващи автоматично получаване на адрес

dhcp4: yes
   addresses: []

да бъдат заменени с 

dhcp4: no

 след което трябва да се зададе 

1)мрежовият адрес на интерфейса:

addresses: [192.168.1.160/24]

При задаването му той трябва да остане в локалната мрежа  - в случая това е мрежа клас "С" задавана с 24 бита (192.168.1)  и да е извън обхвата на адресите задавани от локалния dhcp сървър;
2) адресът използван от локалната мрежа за връзка към други мрежи:

gateway4: 192.168.1.1

3)Адресът на сървъра на имената - може да бъде локален сървър (най-често със същия адрес като gateway на локалната мрежа) или в примера съм използвал два глобални сървъра на имена предоставени от Google:

nameservers:
       addresses: [8.8.8.8, 8.8.4.4]

Промените трябва да бъдат извършени като администратор:

$sudo nano  /etc/netplan/01-network-manager-all.yaml

 cat /etc/netplan/01-network-manager-all.yaml
# Let NetworkManager manage all devices on this system
network:
 version: 2
 renderer: NetworkManager
 ethernets:
  enp0s3:
   dhcp4: no
   addresses: [192.168.1.160/24]
   gateway4: 192.168.1.1
   nameservers:
       addresses: [8.8.8.8, 8.8.4.4]

След това получената конфигурация трябва да се тества - ако е коректна ще бъде попитано дали да се запази:

$ sudo netplan try

$ sudo netplan apply

$ 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.160/24 brd 192.168.1.255 scope global noprefixroute enp0s3
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe54:b757/64 scope link
       valid_lft forever preferred_lft forever

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. При статично конфигуриран IP адрес на машината те могат да се видят в netplan конфигурацията, а при DHCP:

$systemd-resolve --status |grep DNS\ Servers
         DNS Servers: 192.168.1.1

 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-client

Дали на сървъра е инсталиран server daemon може да се провери с командата

$ which sshd
/usr/bin/sshd

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

$ 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