Docker kapsayıcılarının ana makine tünel arabirimindeki OpenVPN istemcilerine bağlanmasına izin ver


12

Aşağıdaki kurulum var:

  • Liman hizmetini çalıştıran bir CentOS ana bilgisayarı
  • Kullanıcı tanımlı liman köprüsü ağı
  • Kullanıcı tanımlı köprü ağına bağlı 2 Docker konteyneri
  • OpenVPN kurulumu (şu anda ana bilgisayarda çalışıyor. Docker kapsayıcısında da çalışabilir)
  • OpenVPN'e bağlı bazı istemciler

Liman işçisi köprü ağındaki liman işçisi konteynerlerinin tun0 ağındaki openvpn istemcileriyle iletişim kurmasına nasıl izin verebilirim?

Docker1 (10.10.0.3) ile vpn (172.19.0.x aralığına) bağlı istemciler arasında tcp tabanlı iletişime şeffaf bir şekilde sahip olmak istiyorum.

Docker (ağ / iptables / ...) tarafında ve ana bilgisayarda (iptables) kurulum için neye ihtiyacım var?


1
Belki geç, ama senin durumunda ihtiyacın olduğuna inanıyorum tap, fındık tun, şimdiye kadar hiç başarı olmadan 12 saatten fazla süredir bunun üzerinde çalışıyorum.
Mohammed Noureldin

@MohammedNoureldin bir çözüm buldunuz mu? Ayrıca şimdi cihaza dokunmayı düşünüyorum. Sinir bozucu şey, ovpn konteyneri içinden vpn istemcilerine erişebilmemdir. Ve vpn istemcilerinden aynı Docker ağındaki diğer kapsayıcılara erişebilirim. Ancak ovpn konteynerinin içindeki “eth0” ve tun0 arasındaki yönlendirme çalışmıyor. Sanırım bu tun0 doğa vs musluk nedeniyle.
Huygens

@Huygens, evet çözdüm, lütfen ayrı bir soru sorun ve bana bir referans verin ve size yardımcı olmak için elimden geleni yapacağım.
Mohammed Noureldin

1
Merhaba @MohammedNoureldin Çalışması için 2 eksik talimat buldum. Openvpn man sayfalarındaydı 👍. Yakında başkaları için bu soruya bir cevap göndereceğim.
Huygens

1
@Huygens, bilmek güzel, aslında cevabı göndermek için henüz vaktim olmadı, ancak davanız için neyin işe yaradığını görmekle ilgileniyorum.
Mohammed Noureldin

Yanıtlar:


8

bağlam

Kyle Manna'nın çok iyi Docker kapsayıcısını kullanıyorum ( https://github.com/kylemanna/docker-openvpn ). OpenVPN sunucumu kurmak için sözde "paranoyak" belgeleri kullanıyorum, ama bence bu paranoyak yol değil, standart yol olmalı.

Yapılandırma

Seçilen Docker kapsayıcıları ile VPN istemcileri arasında çift yönlü bağlantıya izin vermek için, VPN istemcileri tarafından erişilmesine izin verilmesi gereken kapsayıcı ekleyeceğiniz bir Docker ağı oluşturmanız gerekir. VPN sunucusu bu kapsayıcılardan biri olacak.

VPN sunucusu olması gerekir client-to-client, topology subnet, dev tun0(ya da diğer tun cihaz) ve push "route <docker net IP> <docker net mask>"konfigüre edilmiştir.

VPN sunucusunun ana bilgisayarı, IP paketlerinin bir alt ağdan diğerine iletilmesini destekleyecek şekilde yapılandırılmalıdır. Bu, sysctl ip_forward değerini 1 olarak ayarlamak (Docker yüklemeniz varsa böyle olmalıdır), tun cihazından gelen paketlerin iptables FORWARD zincirinden geçmesine ve uygun yönlendirmenin ayarlanması anlamına gelir. Bu şu komutlarla özetlenebilir:

$ sudo sysctl -w net.ipv4.ip_forward=1
$ sudo iptables -A FORWARD -i tun+ -j ACCEPT
$ sudo ip route add 192.168.255.0/24 via <IP address of OpenVPN server container>

Her neyse, sunucuyu kurmak için kullandığım seçenekler şunlardır:

$ docker run --rm --net=none -it -v $PWD/files/openvpn:/etc/openvpn kylemanna/openvpn:2.4 ovpn_genconfig -u udp://<FQDN> -N -d -c -p "route <docker net IP> <docker net range>" -e "topology subnet"

Bu, aşağıdakine benzer bir sunucu yapılandırma dosyası oluşturmalıdır:

server 192.168.255.0 255.255.255.0
verb 3
key /etc/openvpn/pki/private/vpn.example.com.key
ca /etc/openvpn/pki/ca.crt
cert /etc/openvpn/pki/issued/vpn.example.com.crt
dh /etc/openvpn/pki/dh.pem
tls-auth /etc/openvpn/pki/ta.key
key-direction 0
keepalive 10 60
persist-key
persist-tun

proto udp
# Rely on Docker to do port mapping, internally always 1194
port 1194
dev tun0
status /tmp/openvpn-status.log

user nobody
group nogroup
client-to-client

### Push Configurations Below
push "dhcp-option DNS 8.8.8.8"
push "route 172.20.20.0 255.255.255.0"

### Extra Configurations Below
topology subnet

Somut örnek

Şimdi somut bir örnek alacağım. Bu örnekte, yukarıda belirtilen OpenVPN sunucusunu vpn.example.com ana bilgisayarındaki Docker içinde çalıştıracağım. Bu kap Docker ağ docker-net-vpn'ye eklenir. İşte komutlar (bu örnekte sunucu yapılandırmasını doğrudan sunucuda oluşturuyorum ve CA nesnesini atlıyorum, lütfen yukarıda belirtilen projenin paranoid belgelerini izleyin):

$ docker network create --attachable=true --driver=bridge --subnet=172.20.20.0/24 --gateway=172.20.20.1 docker-net-vpn
$ docker run --rm --net=none -it -v $PWD/files/openvpn:/etc/openvpn kylemanna/openvpn:2.4 ovpn_genconfig -u udp://vpn.example.com -N -d -c -p "route 172.20.20.0 255.255.255.0" -e "topology subnet"
$ docker run --detach --name openvpn -v $PWD/files/openvpn:/etc/openvpn --net=docker-net-vpn --ip=172.20.20.2 -p 1194:1194/udp --cap-add=NET_ADMIN kylemanna/openvpn:2.4
$ sudo sysctl -w net.ipv4.ip_forward=1
$ sudo iptables -A FORWARD -i tun+ -j ACCEPT
$ sudo ip route add 192.168.255.0/24 via 172.20.20.2

İlk komut, yeni bir alt ağ tanımlayan özel bir yeni Docker ağı oluşturur. OpenVPN sunucusunu bu ağa bağlayacağız.

İkincisi, 1. komutta tanımlananla aynı alt ağı kullanarak OpenVPN yapılandırmasını oluşturur.

Üçüncüsü OpenVPN sunucusunu oluşturur. Yeni oluşturulan Docker ağına bağlıdır ve bir düzeltme IP'si kullanır.

Dördüncü ve beşinci komutlar IP yönlendirmeyi yapılandırır.

Son komut, OpenVPN konteyneri sabit IP'si üzerinden VPN istemci yapılandırmasına yeni bir yol ekler.

Not

Denemedim, ancak iptables için İLERİ kuralı kısıtlamak mümkün olmalıdır. Docker ağ oluşturma yeni bir köprü aygıtı oluşturdu. Bu köprü, br-<ID>Docker ağ kimliğinin ilk 12 karakteri olan kimlikle adlandırılır. Bu kimlik ile elde edilebilir docker network inspect -f '{{.Id}}' docker-net-vpn | cut -b-12. Bu nedenle, aşağıdaki komut daha kısıtlayıcı olabilir (güvenlik açısından daha iyi), ancak yine de trafiğimizin yönlendirilmesine izin vermelidir:

$ NET_VPN_BRIDGE="br-$(docker network inspect -f '{{.Id}}' docker-net-vpn | cut -b-12)"
$ sudo iptables -A FORWARD -i tun+ -o ${NET_VPN_BRIDGE} -j ACCEPT

Hey, bunu işe yaramıyor, 192.168.255.6'ya kadar izleyebiliyorum ve şunu elde ediyorum: 1 gnet (172.20.20.1) 1966.269 ms !H 1966.248 ms !H 1966.239 ms !Hama açık portlara ping atılamıyorum ya da ulaşamıyorum.
GuySoft

Merhaba @GuySoft traceroute rapor ne son hop (172.20.20.1) ev sahibi 192.168.255.6 ulaşamıyor olmasıdır. Bu, yönlendirme tablonuzun muhtemelen yanlış olduğu anlamına gelir. Sorunun nerede olduğunu görmek için sohbet edebilir miyiz?
Huygens

Çalışmaya başladı, bence ne oldu her iki makinede docker yüklü ve her ikisi de bir alt ağa sahipti 172.20.20.1, şeyleri çatıştıran, docker'ı istemci makinede çatışacak bir alt ağ oluşturmamanın bir yolunu bulmam gerekiyor .
GuySoft

Docker Compose kullanıyorsanız, ağın kullanması gereken IP adresi aralığını belirleyebilirsiniz. Oluştur belgelerine bakın. Bunu komut satırından ile yapmak da mümkündür docker network….
Huygens

Ben ev sahibi (host ip + openvpn port) bir bağlantı openvpn konteyner (172.20.20.2) yönlendiriliyor parçası almıyorum düşünüyorum
jtomasrl
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.