Настраиваю несколько uplink'ов на шлюзе.
На шлюзе также работает openvpn внутри lxc контейнера (сеть организована через bridge интерфейс, в который входят сетевые интерфейсы lxc и физический eth0 смотрящий в LAN)
root@gate:/etc/init.d# brctl show
bridge name bridge id STP enabled interfaces
br-eth0 8000.002191ef8b35 no eth0
vethGPYWS8
vethXGQ5EQ
lxcbr0 8000.000000000000 no
Связь по протоколам udp/tcp с службами работающими на шлюзе прекрасно работает для клиентов из Интернет.
Не получается настроить проброс OPENVPN сервера, работающего по udp.
Суть в том, что как только я добавляю правило
ip rule add from 192.168.128.13 lookup isc-ml
Где 192.168.128.13 - ip контейнера openvpn, работающего на шлюзе
То клиент нормально устанавливает соединение с сервером.
А нужно чтобы работало правило:
ip rule add from all fwmark 0x2 lookup isc-ml prio 1000
Дополнительная информация:
root@gate:/home/sysadmin# ip rule list
0: from all lookup local
1000: from all fwmark 0x2 lookup isc-ml
32759: from all to 95.X.X.0/24 lookup isc-ml
32760: from 95.X.X.40 lookup isc-ml
32762: from all to 83.Y.Y.194 lookup isc-rt
32763: from 93.Y.Y.67 lookup isc-rt
32766: from all lookup main
32767: from all lookup default
Трассировка iptables
Где - 93.Z.Z.117 - ip openvpn клиента
Aug 14 13:01:30 gate kernel: [934528.016392] TRACE: mangle:PREROUTING:rule:2 IN=ethmiddle OUT= MAC=90:94:e4:82:0e:00:68:05:ca:0f:20:aa:08:00 SRC=93.Z.Z.117 DST=95.X.X.40 LEN=42 TOS=0x00 PREC=0x00 TTL=53 ID=8720 DF PROTO=UDP SPT=44619 DPT=1194 LEN=22 MARK=0x2
Aug 14 13:01:30 gate kernel: [934528.016425] TRACE: mangle:PREROUTING:rule:4 IN=ethmiddle OUT= MAC=90:94:e4:82:0e:00:68:05:ca:0f:20:aa:08:00 SRC=93.Z.Z.117 DST=95.X.X.40 LEN=42 TOS=0x00 PREC=0x00 TTL=53 ID=8720 DF PROTO=UDP SPT=44619 DPT=1194 LEN=22
Aug 14 13:01:30 gate kernel: [934528.016498] TRACE: nat:PREROUTING:rule:6 IN=ethmiddle OUT= MAC=90:94:e4:82:0e:00:68:05:ca:0f:20:aa:08:00 SRC=93.Z.Z.117 DST=95.X.X.40 LEN=42 TOS=0x00 PREC=0x00 TTL=53 ID=8720 DF PROTO=UDP SPT=44619 DPT=1194 LEN=22 MARK=0x2
Aug 14 13:01:30 gate kernel: [934528.016557] TRACE: mangle:FORWARD:policy:1 IN=ethmiddle OUT=ethmiddle MAC=90:94:e4:82:0e:00:68:05:ca:0f:20:aa:08:00 SRC=93.Z.Z.117 DST=192.168.128.13 LEN=42 TOS=0x00 PREC=0x00 TTL=52 ID=8720 DF PROTO=UDP SPT=44619 DPT=1194 LEN=22 MARK=0x2
Aug 14 13:01:30 gate kernel: [934528.016600] TRACE: filter:FORWARD:policy:12 IN=ethmiddle OUT=ethmiddle MAC=90:94:e4:82:0e:00:68:05:ca:0f:20:aa:08:00 SRC=93.Z.Z.117 DST=192.168.128.13 LEN=42 TOS=0x00 PREC=0x00 TTL=52 ID=8720 DF PROTO=UDP SPT=44619 DPT=1194 LEN=22 MARK=0x2
Aug 14 13:01:30 gate kernel: [934528.016633] TRACE: mangle:POSTROUTING:rule:1 IN= OUT=ethmiddle SRC=93.Z.Z.117 DST=192.168.128.13 LEN=42 TOS=0x00 PREC=0x00 TTL=52 ID=8720 DF PROTO=UDP SPT=44619 DPT=1194 LEN=22 MARK=0x2
iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j RETURN # if already set, we're done
iptables -t mangle -A PREROUTING -i ethmiddle -j MARK --set-mark 0x2
iptables -t mangle -A POSTROUTING -o ethmiddle -j MARK --set-mark 0x2
iptables -t mangle -A POSTROUTING -j CONNMARK --save-mark
Проброс
iptables -t nat -A PREROUTING -d $XINETIP -p UDP --dport 1194 -j DNAT --to-destination $VPNSERVER:1194
Почему не работает ip rule fwmark, а ip rule add from vpnserver - работает?
UPDATE 1:
Tcpdump на шлюзе.
при не работающем fwmark-ке:
00:00:07.106369 IP (tos 0x0, ttl 53, id 16663, offset 0, flags [DF], proto UDP (17), length 42)
93.Z.Z.117.43148 > 95.X.X.40.openvpn: [udp sum ok] UDP, length 14
00:00:00.000056 IP (tos 0x0, ttl 52, id 16663, offset 0, flags [DF], proto UDP (17), length 42)
95.X.X.40.43148 > openvpn.cvision.lab.openvpn: [udp sum ok] UDP, length 14
при добавленном правиле ip rule add from 192.168.128.13 lookup isc-ml - проброс работает и соединение устанавливается:
00:00:00.000000 IP (tos 0x0, ttl 53, id 41756, offset 0, flags [DF], proto UDP (17), length 42)
93.Z.Z.117.57380 > 95.X.X.40.openvpn: [udp sum ok] UDP, length 14
00:00:00.000832 IP (tos 0x0, ttl 63, id 43790, offset 0, flags [DF], proto UDP (17), length 54)
95.X.X.40.openvpn > 93.Z.Z.117.57380: [udp sum ok] UDP, length 26
00:00:00.044444 IP (tos 0x0, ttl 54, id 41767, offset 0, flags [DF], proto UDP (17), length 50)
93.Z.Z.117.57380 > 95.X.X.40.openvpn: [udp sum ok] UDP, length 22
00:00:00.000089 IP (tos 0x0, ttl 54, id 41768, offset 0, flags [DF], proto UDP (17), length 142)
93.Z.Z.117.57380 > 95.X.X.40.openvpn: [udp sum ok] UDP, length 114
...
Кстати не могу понять почему я вижу это
95.X.X.40.43148 > openvpn.cvision.lab.openvpn: [udp sum ok] UDP, length 14
Получается, что каким то странным образом на внутренний сервер сам шлюз со своего внешнего интерфейса инициирует соединение ?
Возможно это было из-за SNAT без источника. Сейчас я добавил в правило SNAT ЛВС, и поидее такого уже не будет. Но эти дампы видимо делались ранее, когда еще SNAT был не таким точным. Ранее с одним провайдером он работал нормально. Случайно обнаружил в примерах у народа -s $LANNETIP