Networking в Linux¶
Network Stack в Linux¶
┌─────────────────────────────────────────────────────────────────┐
│ User Space │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Applications (curl, ssh, nginx, etc.) │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │ sockets │
├──────────────────────────┼──────────────────────────────────────┤
│ Kernel Space │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Socket Layer │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ TCP / UDP │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ IP (routing, forwarding) │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ Netfilter (iptables/nftables) │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ Network Device Drivers │ │
│ └─────────────────────────────────────────────────────────┘ │
├─────────────────────────────────────────────────────────────────┤
│ Hardware │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ NIC (eth0, wlan0, etc.) │ │
│ └─────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
Інтерфейси¶
Перегляд інтерфейсів¶
# ip — сучасний інструмент (замість ifconfig)
ip link show
ip link
# Короткий вивід
ip -br link
ip -br addr
# Детальна інформація
ip addr show
ip addr show eth0
# Статистика
ip -s link show eth0
Naming схеми¶
┌─────────────────────────────────────────────────────────────────┐
│ Традиційні імена (застарілі): │
│ eth0, eth1, wlan0 │
│ │
│ Predictable Network Interface Names (systemd): │
│ │
│ en = Ethernet │
│ wl = Wireless LAN │
│ ww = Wireless WAN │
│ │
│ Типи: │
│ eno1 — onboard (firmware index) │
│ ens3 — hotplug slot (PCI Express) │
│ enp0s3 — PCI bus/slot │
│ enx78e7... — MAC address │
│ │
│ Приклад: enp0s3 │
│ en = Ethernet │
│ p0 = PCI bus 0 │
│ s3 = slot 3 │
└─────────────────────────────────────────────────────────────────┘
Управління інтерфейсами¶
# Увімкнути/вимкнути інтерфейс
ip link set eth0 up
ip link set eth0 down
# Змінити MTU
ip link set eth0 mtu 9000
# Змінити MAC адресу
ip link set eth0 address 00:11:22:33:44:55
IP адресація¶
Перегляд та налаштування¶
# Переглянути IP адреси
ip addr show
ip addr show eth0
# Додати IP адресу
ip addr add 192.168.1.100/24 dev eth0
ip addr add 192.168.1.101/24 dev eth0 # можна кілька
# Видалити IP адресу
ip addr del 192.168.1.100/24 dev eth0
# Видалити всі адреси
ip addr flush dev eth0
Статична IP (Netplan — Ubuntu)¶
# /etc/netplan/01-netcfg.yaml
network:
version: 2
renderer: networkd
ethernets:
eth0:
addresses:
- 192.168.1.100/24
routes:
- to: default
via: 192.168.1.1
nameservers:
addresses:
- 8.8.8.8
- 8.8.4.4
# Застосувати
netplan apply
netplan try # з можливістю відкату
Статична IP (nmcli — NetworkManager)¶
# Показати з'єднання
nmcli connection show
# Створити статичне з'єднання
nmcli connection add type ethernet con-name "static-eth0" ifname eth0 \
ipv4.addresses 192.168.1.100/24 \
ipv4.gateway 192.168.1.1 \
ipv4.dns "8.8.8.8,8.8.4.4" \
ipv4.method manual
# Активувати
nmcli connection up "static-eth0"
# Модифікувати існуюче
nmcli connection modify "eth0" ipv4.addresses 192.168.1.101/24
nmcli connection up "eth0"
Статична IP (systemd-networkd)¶
# /etc/systemd/network/10-static.network
[Match]
Name=eth0
[Network]
Address=192.168.1.100/24
Gateway=192.168.1.1
DNS=8.8.8.8
DNS=8.8.4.4
systemctl restart systemd-networkd
Routing¶
Перегляд маршрутів¶
# Таблиця маршрутів
ip route show
ip route
ip r
# Маршрут до конкретного хоста
ip route get 8.8.8.8
Управління маршрутами¶
# Додати маршрут
ip route add 10.0.0.0/8 via 192.168.1.1
ip route add 10.0.0.0/8 via 192.168.1.1 dev eth0
# Default gateway
ip route add default via 192.168.1.1
# Видалити маршрут
ip route del 10.0.0.0/8
ip route del default
# Замінити маршрут
ip route replace default via 192.168.1.2
Policy Routing¶
# Кілька таблиць маршрутизації
# /etc/iproute2/rt_tables
# 200 custom
# Додати маршрут в таблицю
ip route add default via 10.0.0.1 table custom
# Правило: трафік з 192.168.1.0/24 використовує таблицю custom
ip rule add from 192.168.1.0/24 table custom
# Переглянути правила
ip rule show
DNS Resolution¶
/etc/resolv.conf¶
# Класичний спосіб
cat /etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4
search example.com
systemd-resolved¶
# Статус
resolvectl status
# DNS для інтерфейсу
resolvectl dns eth0 8.8.8.8 8.8.4.4
# Конфігурація
# /etc/systemd/resolved.conf
[Resolve]
DNS=8.8.8.8 8.8.4.4
FallbackDNS=1.1.1.1
DNSSEC=yes
DNSOverTLS=yes
systemctl restart systemd-resolved
DNS тестування¶
# dig — детальна інформація
dig example.com
dig example.com @8.8.8.8
dig +short example.com
dig example.com MX
dig example.com ANY
# host — простіший
host example.com
host -t MX example.com
# nslookup — legacy
nslookup example.com
nslookup example.com 8.8.8.8
Діагностика з'єднання¶
ping¶
# Базовий ping
ping 8.8.8.8
ping -c 4 8.8.8.8 # 4 пакети
# Flood ping (root)
ping -f 192.168.1.1
# З конкретного інтерфейсу
ping -I eth0 8.8.8.8
# Розмір пакета
ping -s 1472 8.8.8.8 # MTU test (1472 + 28 = 1500)
# Заборонити фрагментацію
ping -M do -s 1472 8.8.8.8
traceroute / tracepath¶
# traceroute (ICMP або UDP)
traceroute 8.8.8.8
traceroute -I 8.8.8.8 # ICMP
traceroute -T 8.8.8.8 # TCP
# tracepath (не потребує root)
tracepath 8.8.8.8
# mtr — комбінація ping + traceroute
mtr 8.8.8.8
mtr -n 8.8.8.8 # numeric
mtr -r 8.8.8.8 # report mode
mtr -rwc 100 8.8.8.8 # 100 пакетів, report
ss (Socket Statistics)¶
# ss замінив netstat
# Всі з'єднання
ss
# TCP з'єднання
ss -t
# Listening ports
ss -l
ss -tln # TCP listening, numeric
# З процесами (root)
ss -tlnp
# UDP
ss -uln
# Всі сокети з info
ss -tunap
# Статистика
ss -s
# Фільтр за портом
ss -tn 'sport = :22'
ss -tn 'dport = :443'
ss -tn state established
# Фільтр за IP
ss -tn dst 8.8.8.8
nc (netcat)¶
# Тест TCP порту
nc -zv 192.168.1.1 22
nc -zv 192.168.1.1 20-30 # діапазон
# Тест UDP
nc -zuv 192.168.1.1 53
# Простий сервер
nc -l 8080
# Передача файлу
# Receiver:
nc -l 9999 > file.txt
# Sender:
nc 192.168.1.100 9999 < file.txt
# Chat
# Server:
nc -l 8888
# Client:
nc 192.168.1.100 8888
tcpdump¶
Базове використання¶
# Захоплення на інтерфейсі
tcpdump -i eth0
# Зберегти в файл
tcpdump -i eth0 -w capture.pcap
# Читати з файлу
tcpdump -r capture.pcap
# Verbose
tcpdump -v # verbose
tcpdump -vv # more verbose
tcpdump -vvv # even more
Фільтри¶
# За хостом
tcpdump host 192.168.1.1
tcpdump src 192.168.1.1
tcpdump dst 192.168.1.1
# За мережею
tcpdump net 192.168.1.0/24
# За портом
tcpdump port 80
tcpdump port 80 or port 443
tcpdump portrange 20-25
# За протоколом
tcpdump tcp
tcpdump udp
tcpdump icmp
# Комбінації
tcpdump 'host 192.168.1.1 and port 22'
tcpdump 'tcp port 80 and (src 192.168.1.0/24)'
tcpdump 'not port 22' # виключити SSH
# TCP flags
tcpdump 'tcp[tcpflags] & tcp-syn != 0' # SYN пакети
tcpdump 'tcp[tcpflags] & tcp-rst != 0' # RST пакети
Корисні опції¶
# Не резолвити DNS
tcpdump -n
# Показати вміст пакетів (hex + ASCII)
tcpdump -X
tcpdump -XX # включаючи Ethernet header
# ASCII only
tcpdump -A
# Обмежити кількість пакетів
tcpdump -c 100
# Розмір capture
tcpdump -s 0 # весь пакет
tcpdump -s 1500 # до 1500 байт
# Timestamp
tcpdump -tttt # повна дата/час
Приклади¶
# HTTP трафік
tcpdump -i eth0 -A 'tcp port 80'
# DNS запити
tcpdump -i eth0 'udp port 53'
# SSH окрім локального
tcpdump -i eth0 'port 22 and not host 192.168.1.100'
# TCP handshake
tcpdump -i eth0 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0'
# Зберегти для Wireshark
tcpdump -i eth0 -w /tmp/capture.pcap 'not port 22'
nmap¶
# Сканування портів
nmap 192.168.1.1
nmap -p 22,80,443 192.168.1.1
nmap -p 1-1000 192.168.1.1
nmap -p- 192.168.1.1 # всі порти
# Сканування мережі
nmap 192.168.1.0/24
nmap -sn 192.168.1.0/24 # тільки ping (host discovery)
# Версії сервісів
nmap -sV 192.168.1.1
# OS detection
nmap -O 192.168.1.1
# Aggressive scan
nmap -A 192.168.1.1 # OS, versions, scripts, traceroute
# UDP scan
nmap -sU 192.168.1.1
# Швидкий scan
nmap -F 192.168.1.1 # top 100 ports
nmap -T4 192.168.1.1 # faster timing
Network Namespaces¶
# Namespaces ізолюють мережевий стек
# Створити namespace
ip netns add ns1
# Список namespaces
ip netns list
# Виконати команду в namespace
ip netns exec ns1 ip addr
ip netns exec ns1 ping 8.8.8.8
# Створити veth pair (virtual ethernet)
ip link add veth0 type veth peer name veth1
# Перемістити veth1 в namespace
ip link set veth1 netns ns1
# Налаштувати адреси
ip addr add 10.0.0.1/24 dev veth0
ip link set veth0 up
ip netns exec ns1 ip addr add 10.0.0.2/24 dev veth1
ip netns exec ns1 ip link set veth1 up
ip netns exec ns1 ip link set lo up
# Тест
ping 10.0.0.2
ip netns exec ns1 ping 10.0.0.1
# Видалити namespace
ip netns del ns1
Bridge та VLAN¶
Bridge¶
# Створити bridge
ip link add br0 type bridge
ip link set br0 up
# Додати інтерфейси до bridge
ip link set eth0 master br0
ip link set eth1 master br0
# Призначити IP (опціонально)
ip addr add 192.168.1.1/24 dev br0
# Показати bridge
bridge link show
bridge fdb show
VLAN¶
# Створити VLAN інтерфейс
ip link add link eth0 name eth0.10 type vlan id 10
ip link set eth0.10 up
ip addr add 192.168.10.1/24 dev eth0.10
# Видалити
ip link delete eth0.10
# Перевірити
cat /proc/net/vlan/eth0.10
Bonding (Link Aggregation)¶
# Створити bond
ip link add bond0 type bond mode 802.3ad
# Додати slave інтерфейси
ip link set eth0 master bond0
ip link set eth1 master bond0
ip link set bond0 up
# Режими:
# mode 0 (balance-rr) — round-robin
# mode 1 (active-backup) — failover
# mode 2 (balance-xor)
# mode 3 (broadcast)
# mode 4 (802.3ad) — LACP
# mode 5 (balance-tlb)
# mode 6 (balance-alb)
NetworkManager vs systemd-networkd¶
┌─────────────────────────────────────────────────────────────────┐
│ NetworkManager: │
│ • Desktop-oriented │
│ • GUI integration (nm-applet) │
│ • Automatic Wi-Fi, VPN │
│ • nmcli, nmtui │
│ • Ubuntu Desktop, Fedora │
│ │
│ systemd-networkd: │
│ • Server-oriented │
│ • Lightweight │
│ • .network файли в /etc/systemd/network/ │
│ • Ubuntu Server, Arch │
│ │
│ Переключення: │
│ systemctl disable NetworkManager │
│ systemctl enable systemd-networkd │
└─────────────────────────────────────────────────────────────────┘
Швидкий troubleshooting¶
# 1. Перевірити link
ip link show eth0
# Link up? Carrier?
# 2. Перевірити IP
ip addr show eth0
# IP присвоєно?
# 3. Перевірити gateway
ip route
# Default route є?
# 4. Ping gateway
ping -c 3 192.168.1.1
# 5. Ping зовнішній IP
ping -c 3 8.8.8.8
# 6. Перевірити DNS
dig google.com
cat /etc/resolv.conf
# 7. Перевірити порт
ss -tln | grep :80
nc -zv localhost 80
# 8. Перевірити firewall
iptables -L -n -v
# або
nft list ruleset
Типові проблеми¶
| Проблема | Діагностика | Рішення |
|---|---|---|
| No carrier | ip link show |
Перевірити кабель |
| No IP | ip addr show |
DHCP або static config |
| No route | ip route |
Додати gateway |
| DNS fails | dig @8.8.8.8 |
Перевірити resolv.conf |
| Port closed | ss -tln |
Запустити сервіс, firewall |
| Packet loss | mtr host |
Перевірити мережу |
Підсумок¶
Основні команди:
ip addr show # IP адреси
ip route show # Маршрути
ss -tulnp # Порти та з'єднання
ping/traceroute/mtr # Діагностика
tcpdump # Аналіз пакетів
dig/host # DNS
Конфігурація:
- Ubuntu: Netplan (/etc/netplan/)
- Desktop: NetworkManager (nmcli)
- Server: systemd-networkd
Див. також¶
- Linux основи — базові команди
- Файлові системи — диски
- Процеси та systemd — сервіси
- OSI L3 — мережевий рівень
- Firewall Linux — iptables, nftables
Шлях: getting-started/linux-networking.md