Я заметил несколько странное поведение, которое я не могу понять. Поэтому я настроил соединение 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 (как и задумано для конфигурации клиент-клиент)?
Чтобы вы могли лучше помочь мне решить мою проблему, я прикрепил ниже некоторую диагностику.
Для сервера
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
`
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
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
Для клиента
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
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
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
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 не производилась, но это сложная задача, и те, кто ее настраивал, в любом случае знают об этой функции).