Перенаправляется ли ядром сервера исходящее соединение от клиента OpenVPN к локальной сети за сервером OpenVPN?

Перенаправляется ли ядром сервера исходящее соединение от клиента OpenVPN к локальной сети за сервером OpenVPN?

Я заметил несколько странное поведение, которое я не могу понять. Поэтому я настроил соединение OpenVPN, как показано на рисунке ниже. (Это TUN и клиент-клиентская настройка). Мои мысли направлены на маршрут пинга в этом сценарии: мое openvpn соединение

 from client: 192.168.200.102 to LAN: 10.198.0.16

В общем-то, ничего удивительного, что этот пинг успешен, но, насколько я понимаю, в случае, если я изменю настройки iptables на сервере на

-P FORWARD DROP

и тогда даже

 net.ipv4.ip_forward = 0.

трафик никогда не должен достигать пункта назначения с указанными выше настройками. Хотя трафик успешен, он как бы никогда не достигает интерфейса LAN. Дело в том, что я не вижу трафика (запустив анализатор пакетов tcpdump data-network), прибывающего на интерфейс LAN eth0 10.198.0.16. Более того, похоже, что интерфейс tun сам отвечает на трафик, как если бы IP-адрес LAN был привязан к интерфейсу tun, см. ниже:

sudo tcpdump -i tun0 tcpdump: 16:34:21.391381 IP 192.168.200.102 > 10.198.0.16: ICMP echo request, id 14, seq 1885, length 64 16:34:21.391514 IP 10.198.0.16 > 192.168.200.102: ICMP echo reply, id 14, seq 1885, length 64

Что здесь происходит? Насколько я понимаю, запрос, поступающий от Клиента, идет на интерфейс tun на сервере и в конечном итоге будетПЕРЕСЫЛКАядром к eth0, я прав? Это обычно видно при запуске: sudo tcpdump -i tun0или sudo tcpdump -i eth0?

Почему я так придирчив к этому, так это потому, что я считаю это угрозой безопасности, если нет способа реализовать правила, запрещающие клиентам доступ к локальной сети на сервере. Что я упускаю здесь, есть ли процесс OpenVPN, который сам пересылает пакеты на интерфейс eth0 (как и задумано для конфигурации клиент-клиент)?

Чтобы вы могли лучше помочь мне решить мою проблему, я прикрепил ниже некоторую диагностику.

Для сервера

  1. ip addr

    `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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
        link/ether b8:27:eb:5c:a6:e6 brd ff:ff:ff:ff:ff:ff
        inet 10.198.0.16/24 brd 10.198.0.255 scope global eth0
           valid_lft forever preferred_lft forever
        inet6 fe80::ba27:ebff:fe5c:a6e6/64 scope link 
           valid_lft forever preferred_lft forever
    3: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
        link/ether b8:27:eb:09:f3:b3 brd ff:ff:ff:ff:ff:ff
    4: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 500
        link/none 
        inet 192.168.200.1/24 scope global tun0
           valid_lft forever preferred_lft forever
        inet6 fe80::87cd:fedd:92fc:cde/64 scope link stable-privacy 
           valid_lft forever preferred_lft forever
    

`

  1. ip route

    default via 10.198.0.1 dev eth0 proto static 
    10.198.0.0/24 dev eth0 proto kernel scope link src 10.198.0.16 
    192.168.200.0/24 dev tun0 proto kernel scope link src 192.168.200.1 
    192.168.178.0/24 via 192.168.200.1 dev tun0 scope link 
    
  2. server openvpn.conf

    tls-server
    mode server
    dev tun
    local 10.198.0.16
    proto tcp-server
    port 1234
    user openvpn
    group openvpn
    ca /etc/openvpn/cacert.pem
    cert /etc/openvpn/servercert.pem
    key /etc/openvpn/serverkey
    dh /etc/openvpn/dh2048.pem
    ifconfig-pool 192.168.200.2 192.168.200.103 255.255.255.0
    client-config-dir /etc/openvpn/ccd
    ifconfig 192.168.200.1 255.255.255.0
    keepalive 10 120
    comp-lzo
    client-to-client
    push "topology subnet"
    topology "subnet"
    log /var/log/openvpn.log
    

Для клиента

  1. ip addr

    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: enp0s31f6: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
        link/ether 38:af:d7:a0:52:ec brd ff:ff:ff:ff:ff:ff
    3: wlp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
        link/ether 00:28:f8:8d:1c:6f brd ff:ff:ff:ff:ff:ff
        inet 192.168.178.79/24 brd 192.168.178.255 scope global dynamic noprefixroute wlp2s0
           valid_lft 859868sec preferred_lft 859868sec
        inet6 2a0a:a540:d54:0:bd79:eb10:5e26:548a/64 scope global temporary dynamic 
           valid_lft 7190sec preferred_lft 3590sec
        inet6 2a0a:a540:d54:0:6086:b044:dff:2694/64 scope global dynamic mngtmpaddr noprefixroute 
           valid_lft 7190sec preferred_lft 3590sec
        inet6 fe80::ad5c:6e18:87fa:dff4/64 scope link noprefixroute 
           valid_lft forever preferred_lft forever
    4: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100
        link/none 
        inet 192.168.200.102/24 brd 192.168.200.255 scope global tun0
           valid_lft forever preferred_lft forever
        inet6 fe80::5dfc:6b3a:3c4d:e9a4/64 scope link stable-privacy 
           valid_lft forever preferred_lft forever
    
  2. ip route

     default via 192.168.178.1 dev wlp2s0 proto dhcp metric 600 
     169.254.0.0/16 dev wlp2s0 scope link metric 1000 
     10.198.0.0/24 via 192.168.200.1 dev tun0 
     192.168.200.0/24 dev tun0 proto kernel scope link src 192.168.200.102
    
     192.168.178.0/24 dev wlp2s0 proto kernel scope link src 192.168.178.79 metric 600 
    
  3. client openvpn.conf

     dev tun
     client
     nobind
     remote 11.22.33.44
     proto tcp
     port 1234
     ca /etc/openvpn/cacert.pem
     cert /etc/openvpn/user_cert.pem
     key /etc/openvpn/user
     comp-lzo
     verb 3
     keepalive 10 120
     log /var/log/openvpn.log
    
  4. ccd for client

    iroute 192.168.178.0 255.255.255.0
    

решение1

Трафик между VPN и остальной частью сети, конечно, проходит через tun0. Для этого трафика FORWARDцепь консультируется как обычно, и вы можете контролировать, кто может подключаться куда. Если ip_forwardне включено, трафик не будет пересылаться.

Если client-to-clientне используется, трафик между клиентами проходит по одному и тому же пути: он появляется в ОС сервера из tun0интерфейса, маршрутизируется должным образом с использованием таблицы маршрутизации ОС, проходит через межсетевой экран, и единственное отличие заключается в том, что он решает, что пункт назначения находится за tun0, поэтому пакет передается через него.

Это не очень эффективно, поскольку процесс OpenVPN находится в пространстве пользователя, а tun0 — в пространстве ядра, и это приводит как минимум к двум изменениям контекста для каждого пакета.

Однако при client-to-clientиспользовании пакеты между клиентами не отображаются на tun0, а цепочка брандмауэра сервера FORWARDне проверяется, и ip_forwardуправление не влияет на их пересылку. Сам процесс OpenVPN становится маршрутизатором со своей собственной таблицей маршрутизации, независимой от хостовой ОС. Вы можете увидеть это с помощью команды statusинтерфейса управления или выгрузить ее в файл состояния. Вы можете управлять маршрутами внутри этого «маршрутизатора» с помощью iprouteдирективы (я полагаю, что это означает «внутренний маршрут»), которая действительна только в файле клиента client-config-dirили динамической конфигурации, сгенерированной скриптом.

Самый простой способ — не думать о VPN как о чем-то особенном. Как только туннель установлен, забудьте о нем, теперь это просто дополнительный обычный интерфейс на каждом компьютере (сервере и клиентах), со всеми этими интерфейсами, подключенными к какому-то обычному простому маршрутизатору. И рассмотрите обычную маршрутизацию и брандмауэр.


Я наконец заметил, что вы пингуете адрессам VPN-серверхотя и назначен на другой интерфейс. Этот пакетне будет пересланов любом случае, поскольку его пункт назначения — сам сервер, поэтому ip_forwardне влияет на то, как обрабатывается этот пакет, и он проходит INPUTцепочку брандмауэра, и ответ пройдет OUTPUT(например, не FORWARDцепочку, как если бы они не были предназначены для самой системы). Пакет войдет в систему из tun0(и будет виден там), но вы не увидите его на , eth0поскольку он не будет отправлен. Он будет обработан локально. То же самое верно и для ответов.

Не имеет значения (для кода, связанного с маршрутизацией), где в системе назначен адрес (какой интерфейс), или какой адрес системы вы используете для доступа к нему. Важно то, принадлежит ли он системе или нет.


Связанная с этим проблема безопасности заключается в том, что некоторые люди думают, что если они привязывают службу к некоторому IP-адресу, назначенному некоторому интерфейсу, то они отсекают доступ к этой службе через другие интерфейсы.Это не верно.Если другие системы, находящиеся за другими интерфейсами, имеют маршрут к IP-адресу, к которому привязана служба, они все равносможетдля доступа к сервису. Это не правильный способ защитить сервис; правильная настройка брандмауэра — правильный.

Другая связанная проблема заключается в том, что некоторые люди используют ping -I <local-address> <address-to-ping>или даже ping -I <interface> <address-to-ping>и думают, что они напрямую выбирают, какой интерфейс будет пинговать. Опять же, это неправильно. Таким образом, вы можете выбрать только то, какойадрес источникаping-запросы будут, но не интерфейс для их отправки; интерфейс будет выбран кодом маршрутизации строго в соответствии с таблицей маршрутизации, основанной исключительно на адресе назначения пакета (я предполагаю, что настройка VRF или RPDB не производилась, но это сложная задача, и те, кто ее настраивал, в любом случае знают об этой функции).

Связанный контент