Birkaç özdeş LAN ile 1: 1 NAT


13

Uzak binalarda bulunan birkaç LAN bağlamak istiyorum.
"Merkezi" site OpenVPN çalıştıran bir Linux bilgisayara sahiptir. Her uzak site de OpenVPN çalıştırır.

  1. merkezi sitenin 192.168.0.0/24 numaralı bir LAN'ı vardır.
  2. birkaç uzak site de 192.168.0.0/24 olarak numaralandırılmıştır.
  3. LAN numaralandırmasını değiştiremiyorum / istemiyorum / istemiyorum / ne olursa olsun
  4. Çoğu uzak OpenVPN'de kontrolüm yok

Daha sonra yapmam
gerekenler : 1. sanal LAN'ları tanımlamak
2. her site
için 1: 1 NAT yapılandırmak 3. 1: 1 NAT merkezi yönlendiricide yapılandırılmalıdır

LAN haritası .
Yani her sitenin 10.10.x.0 / 24 LAN'ı olduğu görülüyor.
Bir bilgisayar diyelim ki, 192.168.0.44 sitesinde 12'ye ulaşmak istediğinde, 10.10.12.44'e bir paquet göndermesi yeterlidir.

VPN kullanmak benim için sorun değil. Şu anda 60+ siteye bağlanıyorum. Ama bunu yapmanın basit bir yolunu bulamıyorum 1: 1 NAT.

Merkezi siteden uzak bir siteye gönderilen paket ve yanıt paketine bir örnek:

resim açıklamasını buraya girin

Ben iptables NETMAP ile bazı testler yaptım ama yönlendirme kararından sonra kaynak + hedef değiştirmek için bir yol bulamadım çünkü çalışmasını başaramıyorum.
Yeni --client-natOpenVPN'in özelliğinden kaçınmayı tercih ediyorum .
Belki de yönlendirmeyi zorlamak zorundayım ip route? Veya ile iki kez ağ yığınına döngü veth?

Not: Maskeli balo kullanmak istemiyorum. Sadece 1/1 NAT.

EDIT:
Düzenli bir openVPN kurulumu ile mümkün değildir. Uzak bir sitedeki bir paket başka bir sitedeki bir paketten ayırt edilemez olduğundan: her ikisi de benzer kaynak ve hedef adreslere sahiptir ve her ikisi de aynı ayar (veya dokunma) arayüzünden gelir. Bu yüzden NAT kaynaklamak mümkün değildir.

Çözüm 1: Uzak sitelerde NAT yapın. Benim durumumda mümkün değil. Bunu sadece merkezi sitede yapmak zorundayım.

Çözüm 2: Her uzak site için bir VPN kurun. Yani her biri için bir ayar yapacağım. Bence bu iyi olabilir. Çok bellek verimli ama Tamam.

Çözüm 3: Her site için VPN'nin içine (şifrelenmemiş) bir tünel kurun. Bu, her biri için bir arayüz verecektir. Basit tüneller çapraz platform değildir (benim knoledge'e). Örneğin, GRE veya ipip veya sit Linux için uygundur, ancak bazı uzak siteler yalnızca bir Windows bilgisayarı çalıştırır, bu nedenle üzerine openVPN yüklüdür. Basit bir tünel kurmak imkansız. Diğer seçenek daha karmaşık bir tünel (hangisi?) Kullanmaktır, ancak sistemdeki ve sistemadmin üzerindeki yük, birden fazla VPN'den daha büyük olabilir

Çözüm 4: En son openVPN'i derleyin, çünkü 1: 1 NAT özelliği içerir. Bunu bu hafta test ediyorum.


1
Çözüm 4 için derlemek zorunda değilsiniz. Çoğu büyük Linux dağıtımı resmi openVPN web sitesinde paketleri derlemiştir. Ancak bu sizin için işe yaramaz çünkü --client-nat özelliği itilebilir bir seçenektir. Bu nedenle, müşterilerinizin en son RC sürümünü de kullanması gerekir (ve uzak siteler üzerinde kontrolünüz olmadığını söylersiniz).
Gregory MOUSSAT

1
Şey, yanılıyorum: --client-nat özelliği% 100 OpenVPN (ipfilter kullandığını düşündüm) içinde. Az önce test ettim: Windows üzerinde de çalışıyor. Aşağıdaki çözümüme bakın.
Gregory MOUSSAT

Hiç çalışıp çalışmadığınızı ve ne yaptığınızı bilmek istiyorum.
Michael Grant

Yanıtlar:


2

Çok temel bir çözüm şudur:
1. sunucu + istemciler için OpenVPN 2.3 veya daha fazlasını kullanın (şu anda en son 2.3-alfa)
2. aşağıdaki OpenVPN yapılandırma seçeneğini
kullanın 3. başka bir şey kullanmayın (ipfilter yok, hile yok)

Sunucu tarafında, VPN adreslerini manuel olarak dağıtmanız gerekir (bu nedenle serverseçenek yok , ifconfigveya kullanmanız gerekir ifconfig-push):

# /etc/openvpn/server.conf
ifconfig 10.99.99.1 10.99.99.2
route 10.99.99.0 255.255.255.0
push "route 10.99.99.0 255.255.255.0"
push "client-nat dnat 10.99.99.11 255.255.255.255 10.10.111.11"
push "client-nat dnat 10.99.99.12 255.255.255.255 10.10.112.12"
push "client-nat dnat 10.99.99.13 255.255.255.255 10.10.113.13"

routeVe push routeve client-natsen yönlendiriciler arasında doğrudan iletişim kurmak istiyorsanız satırları gereklidir ( ping 10.99.99.1uzak sitesinden VPN atlatmamı). Yoksa onları atabilirsin.

.

.

Şimdi bir sanal ağ adresi seçmelisiniz. Örneğinizde kullandığınızla aynı tuttum: 10.10.0.0/16
Bunun için yönlendirmeye izin veriyorsunuz:

# /etc/openvpn/server.conf
route 10.10.0.0 255.255.0.0
push "route 10.10.0.0   255.255.0.0"

.

.

Şimdi istemciye 1: 1 NAT kullanmasını bildirmelisiniz:

# /etc/openvpn/ccd/client_11
ifconfig-push 10.99.99.11 10.99.99.1
push "client-nat snat 10.99.99.11 255.255.255.255 10.10.111.11"
push "client-nat snat 192.168.0.0 255.255.255.0 10.10.11.0"
push "client-nat dnat 10.10.10.0 255.255.255.0 192.168.0.0"
iroute 10.10.11.0 255.255.255.0
iroute 10.10.111.0 255.255.255.0

İlk satır, uzak yönlendirici adresini ayarlar. Özel adresler gerektiren Windows sürücüsüne dikkat edin.
İkinci ve son satırlar uzak yönlendiricinin 10.99.99.x arabiriminden iletişim kurmasını sağlar.
Üçüncü ve dördüncü satırlar kaynak ve hedef 1: 1 NAT yapar
Beşinci satır, OpenVPN'e karşılık gelen paketlerle ne yapılacağını söyler.

Bu yöntem aynı (veya değil) LAN adreslerine sahip sitelerin gölgeli ana bilgisayar olmadan bağlanmasına izin verir.


1
Basit, parlak.
Bertrand SCHITS

Bunu denedim ama işe yaramadı. Her iki tarafta Linux kullanıyorum. Bazı şeyler tuhaf ya da bir şeyi tam olarak anlamıyorum. Client_11 dosyasındaki (ilk satır) ifconfig-push'unuz, 10.99.99.1 yerine ikinci bağımsız değişken için bir ağ maskesi olmamalı mı? İkincisi, bu üçüncü ağı neden 10.10.111.0/24 kullanıyorsunuz? Görünüşe göre siteler arasında iletişim için 111 ağını kullanmaya çalışıyorsunuz, 10.10 ağı doğrudan bunun için kullanılamıyor mu? Son olarak, ne denersem deneyim, istemcideki paketleri etkileyen snat ve dnat'ı görmüyorum (tcpdump'ta).
Michael Grant

Gerçekten basit değil ama yine de parlak.
Nörotransmitter

4

Gerçek arayüzlerle benzer bir şey yaptım, ama neden VPN arayüzleriyle çalışmadığını göremiyorum.

Fikir şu ki, o yönlendiricinin farklı arabirimlerinde aynı alt ağa sahip olduğunuz için, yönlendirmeyi karmaşık hale getirir. Temel olarak, 10.10.13.123 için bir paket yönlendiriciye girdiğinde, 192.168.0.123'e yönlendirilmeden önce DNAT'tır, bu nedenle yönlendirmeye VPN13 arabirimindeki 192.168.0.123 için tasarlandığını söyleyebilmeniz gerekir .

Bu, güvenlik duvarı işaretleri ve bu işaretleri kullanan yönlendirme kuralları kullanılarak yapılabilir. SNAT ve DNAT, NETMAP güvenlik duvarı hedefi ile yapılacaktır. SNAT için aynı sorun, POSTROUTING uygulamasında, paketin bu arayüzden veya bu arayüzden geldiği bilgisini kaybettiniz ve hepsinin kaynak adresi 192.168.0.x. Yani bu bilgileri mangle-PREROUTING'den nat-POSTROUTING'e taşımak için de bir işarete ihtiyacınız var. Aynı işareti kullanabilirsiniz, ancak bu, bu paketlerin bu alternatif yönlendirme tablosunu kullanacağı anlamına gelir, bu nedenle genel yönlendirme tablosunu çoğaltmanız gerekir.

Her ağ için şunları yaparsınız:

lnet=192.168.0.0/24
if10=eth0 if11=tun0 if12=tun1 if13=tun2

n=0
for site in 10 11 12 13; do
  table=$site
  net=10.10.$site.0/24
  n=$(($n + 1))
  eval "interface=\$if$site"
  inmark=$(($n * 2)) outmark=$(($n * 2 + 1))

  iptables -t nat -A PREROUTING -d "$net" -j NETMAP --to "$lnet"
  iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -m mark --mark "$inmark"/0xf -j NETMAP --to "$net"
  iptables -t mangle -A PREROUTING -i "$interface" -j MARK --set-mark "$inmark"/0xf
  iptables -t mangle -A PREROUTING -d "$net" -j MARK --set-mark "$outmark"/0xf
  ip rule add fwmark "$outmark"/0xf table "$table"
  ip route add "$lnet" dev "$interface" table "$table"
done

Yukarıda, 7 ağın bu şekilde yönlendirilmesine izin vermek için işaretin ilk 4 bitini kullanıyoruz .


1
Cevabınız için teşekkürler. Test ettim ama işe yaramıyor. Sadece bir LAN ile test ettim, sonuç yok. Paketleri izlemek için tcpdump kullanıyorum ve uzak bir merkezden merkez siteye bir paket gönderdiğimde, hiçbir şey görmüyorum (?! Nasıl mümkün?). Yönlerinizle, adım adım yanıtımı oluşturmaya çalışıyorum. Başarılı olacağımdan emin değilim.
Bertrand SCHITS

2
Cevabım sadece merkezi sitede ne yapılacağını kapsar. Diğer sitelerde yönlendirmeyi doğru şekilde yapılandırdığınızı varsayıyorum. Örneğin, muhtemelen uzak sitelerdeki VPN tüneli üzerinden 10.10.0.0/16 adresine bir rota eklemeniz gerekir. Bu paketlere izin vermek için openvpn'ye de söylemeniz gerekebilir. Her neyse, hangi paketlerin nereye ulaştığını ve nasıl doğru yaklaşım olduğunu görmek için tcpdump kullanma. iptables LOG hedefi de arkadaşın.
Stéphane Chazelas

2
Paket görmüyorsanız, openvpn günlüğünüze bakmanız gerekir. Muhtemelen bırakılan paketler bulacaksınız. Bu durumda, istemci-config-
dir'nizde
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.