← Назад к вопросам

Где граница локальной сети у офиса?

1.3 Junior🔥 141 комментариев
#Сети и протоколы

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI28 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Граница локальной сети офиса

Это вопрос о границе между локальной сетью (LAN) и глобальной сетью (WAN/Internet). Граница находится не в одном месте, а определяется несколькими точками и уровнями в сетевой инфраструктуре офиса.

Физическая граница

1. На уровне маршрутизатора (Router)

Маршрутизатор — самое важное устройство, определяющее границу:

┌─────────────────────────┬──────────────────────┐
│  ЛОКАЛЬНАЯ СЕТЬ (LAN)   │   ИНТЕРНЕТ (WAN)     │
│  (Private Network)      │   (Public Network)   │
├─────────────────────────┼──────────────────────┤
│ Компьютеры (192.168.*) │ ISP Router           │
│ Принтеры               │ Интернет-провайдер   │
│ Камеры                 │ Мировая сеть         │
│ Сервер офиса           │                      │
│       │                │                      │
│       └─── Маршрутизатор (Border Device) ───┘
│       (192.168.1.1)    │
│                        │
└────────────────────────┴──────────────────────┘

Маршрутизатор выполняет ключевую роль:

  • Разделяет локальную и глобальную сеть
  • Преобразует приватные IP (192.168.x.x, 10.x.x.x) в публичные
  • Фильтрует входящий трафик через NAT (Network Address Translation)

2. На уровне протокола

Локальная сеть использует протоколы:

  • Ethernet (Layer 2)
  • IP приватные адреса (192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12)
  • ARP (Address Resolution Protocol)
  • DHCP (Dynamic Host Configuration Protocol)

Глобальная сеть использует:

  • Публичные IP адреса
  • NAT (Network Address Translation)
  • BGP (Border Gateway Protocol)
  • VPN/IPSec для защиты

IP адресация

Приватные диапазоны (только в LAN)

10.0.0.0 — 10.255.255.255       (Class A)
172.16.0.0 — 172.31.255.255     (Class B)
192.168.0.0 — 192.168.255.255   (Class C)

Эти адреса не маршрутизируются в интернете. Любой офис может использовать одинаковые приватные IP.

// Проверка, приватный ли это IP адрес
bool isPrivateIP(const std::string& ip) {
    uint32_t addr = inet_addr(ip.c_str());
    
    // 10.0.0.0/8
    if ((addr & 0xFF000000) == 0x0A000000) return true;
    
    // 172.16.0.0/12
    if ((addr & 0xFFF00000) == 0xAC100000) return true;
    
    // 192.168.0.0/16
    if ((addr & 0xFFFF0000) == 0xC0A80000) return true;
    
    // 127.0.0.0/8 (Loopback)
    if ((addr & 0xFF000000) == 0x7F000000) return true;
    
    return false;
}

NAT (Network Address Translation)

NAT находится ровно на границе между LAN и WAN. Это механизм, преобразующий адреса:

Внутри офиса (LAN):        Снаружи (Internet):
ПК: 192.168.1.100:5000 ──┐
                         │   Маршрутизатор
ПК: 192.168.1.101:5001 ──┤   с NAT
                         │   ┌──────────────────┐
Сервер: 192.168.1.50 ───┘   │   203.0.113.1:5000
                        │  203.0.113.1:5001
                        │  203.0.113.1:80
                        └──────────────────┘
// Пример обработки NAT в коде
struct NATMapping {
    uint32_t privateIP;
    uint16_t privatePort;
    uint32_t publicIP;
    uint16_t publicPort;
    time_t timeout;
};

class NATTranslator {
private:
    std::map<std::pair<uint32_t, uint16_t>, NATMapping> mappings;
    uint32_t publicIP;
    uint16_t nextPort = 49152;  // Dynamic port range
    
public:
    NATMapping* translate(uint32_t privateIP, uint16_t privatePort) {
        auto key = std::make_pair(privateIP, privatePort);
        
        if (mappings.find(key) == mappings.end()) {
            // Создаём новый маппинг
            NATMapping mapping = {
                .privateIP = privateIP,
                .privatePort = privatePort,
                .publicIP = publicIP,
                .publicPort = nextPort++,
                .timeout = time(nullptr) + 300  // 5 минут
            };
            mappings[key] = mapping;
        }
        
        return &mappings[key];
    }
};

Firewall как граница

Firewall добавляет ещё один уровень границы:

┌──────────────────────────────────────┐
│  ЛОКАЛЬНАЯ СЕТЬ                      │
│  192.168.1.0/24                      │
│  ┌────────────────────────────────┐  │
│  │ Компьютеры, серверы, принтеры  │  │
│  └────────────────────────────────┘  │
│              │                        │
│        ┌─────▼─────┐                 │
│        │ FIREWALL  │←── Правила      │
│        │  Filter   │   фильтрации    │
│        └─────┬─────┘                 │
│              │                        │
│        ┌─────▼──────┐                │
│        │  Router    │                │
│        │   NAT      │                │
│        └─────┬──────┘                │
│              │                        │
└──────────────┼────────────────────────┘
               │
         ИНТЕРНЕТ (WAN)

Доступ к сетевым ресурсам

Из локальной сети

// Доступ к ресурсам по приватному IP
int socket_fd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in server;
server.sin_family = AF_INET;
server.sin_port = htons(80);
inet_pton(AF_INET, "192.168.1.50", &server.sin_addr);

connect(socket_fd, (sockaddr*)&server, sizeof(server));
// Работает!

Из интернета

// Нельзя напрямую подключиться к 192.168.1.50 из интернета
inet_pton(AF_INET, "192.168.1.50", &server.sin_addr);
connect(socket_fd, (sockaddr*)&server, sizeof(server));
// Timeout — адрес недостижим из интернета

// Нужно использовать публичный IP и Port Forwarding
// 203.0.113.1:8080 → 192.168.1.50:80
inet_pton(AF_INET, "203.0.113.1", &server.sin_addr);
server.sin_port = htons(8080);
connect(socket_fd, (sockaddr*)&server, sizeof(server));
// Маршрутизатор переадресует на внутренний сервер

Практический пример сетевой архитектуры офиса

┌─ ОФИСНАЯ СЕТЬ ────────────────────┬─ ИНТЕРНЕТ ──────┐
│                                    │                 │
│  ┌──────────────┐                 │  ┌────────────┐ │
│  │ Компьютеры   │                 │  │ ISP Router │ │
│  │ 192.168.1.10 │                 │  │ 203.0.113.1│ │
│  │ -100         │                 │  └────────────┘ │
│  └──────┬───────┘                 │        ▲        │
│         │                          │        │        │
│  ┌──────▼──────┐  ┌─────────────┐ │        │        │
│  │ WiFi Point  │  │  Сервер БД  │ │        │        │
│  │ 192.168.1.5 │  │192.168.1.50 │ │        │        │
│  └──────┬──────┘  └────────┬────┘ │        │        │
│         │                  │       │        │        │
│  ┌──────▼──────────────────▼────┐  │        │        │
│  │   КОММУТАТОР (Switch)        │  │        │        │
│  │   Соединяет всё в сети       │  │        │        │
│  └──────────┬───────────────────┘  │        │        │
│             │                       │        │        │
│       ┌─────▼─────┐                │        │        │
│       │ Firewall  │────────────────┼────────┼────────│
│       │ & NAT     │                │        │        │
│       └─────┬─────┘                │        │        │
│             │ГРАНИЦА ЛАН/WAN       │        │        │
├─────────────┼────────────────────────┼────────┼────────┤
│             │                        │        │        │
│       ┌─────▼─────┐                │        │        │
│       │  Router   │─────────────────┼────────┘        │
│       │WAN IP:    │                │                 │
│       │203.0.113.1│                │                 │
│       └───────────┘                │                 │
│                                    │                 │
└────────────────────────────────────┴─────────────────┘

Как определить границу программно

#include <ifaddrs.h>
#include <arpa/inet.h>
#include <iostream>

void listNetworkInterfaces() {
    struct ifaddrs *ifaddr, *ifa;
    
    if (getifaddrs(&ifaddr) == -1) {
        perror("getifaddrs");
        return;
    }
    
    for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
        if (ifa->ifa_addr == NULL) continue;
        
        if (ifa->ifa_addr->sa_family == AF_INET) {
            struct sockaddr_in *sin = (sockaddr_in*)ifa->ifa_addr;
            char ip[INET_ADDRSTRLEN];
            inet_ntop(AF_INET, &sin->sin_addr, ip, INET_ADDRSTRLEN);
            
            std::cout << "Interface: " << ifa->ifa_name << std::endl;
            std::cout << "IP: " << ip << std::endl;
            
            // Проверяем, приватный ли это IP
            if (isPrivateIP(ip)) {
                std::cout << "  -> Локальная сеть (LAN)" << std::endl;
            } else {
                std::cout << "  -> Интернет (WAN)" << std::endl;
            }
        }
    }
    
    freeifaddrs(ifaddr);
}

Резюме

Граница локальной сети офиса находится:

  1. На маршрутизаторе — физическое устройство, разделяющее LAN и WAN
  2. На уровне NAT — преобразование приватных IP в публичные
  3. На уровне Firewall — фильтрация трафика
  4. На уровне IP адресации — приватные адреса (192.168.x.x) vs публичные
  5. На протокольном уровне — локальные протоколы (ARP, DHCP) vs глобальные (BGP, DNS)

Практически: граница — это маршрутизатор с NAT и firewall, через которые проходит весь трафик между офисом и интернетом.