LINUX.ORG.RU
решено ФорумAdmin

OpenVPN bridge: удалённые клиенты не видят локальных

 ,


0

1

Конфигурация:

Debian 6.0 Squeeze

OpenVPN 2.2.1(from backports)

Задача - соединить удалённых клиентов с локальной сетью так, чтобы у них были одинаковые сеть/маска. Я использую OpenVPN TAP интерфейс, соединённый с помощью bridge с ethernet-интерфейсом в локальную сеть. Ethernet-интерфейс - bond0.200. Это 200 VLAN над bond-объединением 2-х обычных интерфейсов(bond-mode balance-alb)

И локальные, и удалённые клиенты могут пинговать и обмениваться данными с сервером, но не пингуют друг друга.

С помощью tshark видно, что пакеты, отправленные удалённым клиентом локальному, появляются в tap200 и br200, но не появляются в bond0.200. При этом MAC-адрес локального клиента есть у удалённого клиента в кеше arp, и наоборот О_о

Фаервол/антивирус вырублены.

MTU на eth2, tap200, bond200 совпадают: 1500.

Куда копать дальше?

/proc/sys/net/ipv4/ip_forward = 1

/etc/network/interfaces:

auto bond0.200
iface bond0.200 inet manual
      vlan_raw_device bond0
      up ifconfig bond0.200 0.0.0.0 promisc up

auto br200
iface br200 inet static
      bridge_ports bond0.200
      bridge_stp off
      bridge_fd 1
      address 172.20.200.2
      netmask 255.255.255.0
      post-up ifconfig br200 promisc

/etc/openvpn/server.conf:

mode server
tls-server
port *****
proto tcp-server
dev tap200

script-security 2

up /etc/openvpn/bridge-start
down /etc/openvpn/bridge-stop

ca ca.crt
cert server.crt
key server.key
dh dh1024.pem
#crl-verify crl.pem

auth sha1
cipher AES-256-CBC

; !!!
; comp-lzo

tun-mtu 1500
mssfix 1450

client-config-dir /etc/openvpn/ccd
ccd-exclusive

client-to-client
keepalive 10 120

persist-key
persist-tun

status /var/log/openvpn/server-arm.status
log-append  /var/log/openvpn/server-arm.log

/etc/openvpn/ccd/client-arm23:

ifconfig-push 172.20.200.132 255.255.255.0

/etc/openvpn/bridge-start:

#!/bin/bash
#set -x
#################################
# Set up Ethernet bridge on Linux
# Requires: bridge-utils
#################################

br="br200"
tap="tap200"

openvpn --mktun --dev $tap
ifconfig $tap 0.0.0.0 promisc up

brctl addif $br $tap

exit 0

/etc/openvpn/bridge-stop:

#!/bin/bash
#set -x
####################################
# Tear Down Ethernet bridge on Linux
####################################

br="br200"
tap="tap200"

brctl delif $br $tap

openvpn --rmtun --dev $tap

exit 0
★★★

Посмотреть состояния интерфейсов, что все в UP. Посмотреть на всякий случай в ebtables. Проверить с brctl show, что оба интерфейса действительно в бридже. Проверить что на обоих интерфейсах в бридже внезапно не оказались IP адреса

vasily_pupkin ★★★★★ ()

А точно не фаерволл?

iptables -A FORWARD -i br200 -o br200 -j ACCEPT

Yur4eg ★★ ()

На интерфейсах ip-адреса нет, на бридже, разумеется, есть.

# ip a s tap200
44: tap200: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 100
    link/ether 92:ea:8a:fc:a3:31 brd ff:ff:ff:ff:ff:ff
# ip a s br200
42: br200: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
    link/ether 00:15:17:b8:27:8c brd ff:ff:ff:ff:ff:ff
    inet 172.20.200.2/24 brd 172.20.200.255 scope global br200
# ip a s bond0.200
41: bond0.200@bond0: <BROADCAST,MULTICAST,PROMISC,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
    link/ether 00:15:17:b8:27:8c brd ff:ff:ff:ff:ff:ff
root@armada-sc-02 /proc/sys/net/bridge #
# brctl show
bridge name     bridge id               STP enabled     
br200           8000.001517b8278c       no       bond0.200
                                                 tap200

ebtables пустые, всюду policy ACCEPT.

selivan ★★★ ()

Проверить ядро(CONFIG_BRIDGE_NETFILTER). Если там «y» - открыть в файрволле форвардинг через мост и включить ip_forward в sysctl

Pinkbyte ★★★★★ ()
Последнее исправление: Pinkbyte (всего исправлений: 1)

Да, Yur4eg и Pinkbyte совершенно правы, проблема решается так:

iptables -A FORWARD -i br200 -j ACCEPT
iptables -A FORWARD -o br200 -j ACCEPT
Это конечно грубое решение, потом поаккуратнее правила выставлю.

Но какого хрена? bridge работает на уровне L2, эти пакеты не должны проходить через FORWARD. Ничего не понимаю

selivan ★★★ ()
Ответ на: комментарий от selivan

Это конечно грубое решение, потом поаккуратнее правила выставлю.

iptables -A FORWARD -i br200 -o br200 -j ACCEPT

Разрешит ходить пакетам между интерфейсами бриджа. Еще можешь покурить критерий physdev

эти пакеты не должны проходить через FORWARD

Отключи CONFIG_BRIDGE_NETFILTER в ядре - и не будут

Pinkbyte ★★★★★ ()
Ответ на: комментарий от Pinkbyte

Нагуглил:

В sysctl net.bridge.* есть куча параметров, включающих/выключающих и меняющих порядок выполнения хуков на бридже - правила iptables, arptables, VLAN(802.1Q) и т. д.

net.bridge.bridge-nf-call-arptables
net.bridge.bridge-nf-call-ip6tables
net.bridge.bridge-nf-call-iptables

Хитро, блин. Pinkbyte, Yur4eg, спасибо :)

selivan ★★★ ()
Ответ на: комментарий от selivan

Кстати, про эти параметры я забыл, так что и тебе спасибо, добрый человек, за напоминание :-)

Pinkbyte ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.