1: 1 NAT dengan beberapa LAN identik

13

Saya ingin menghubungkan beberapa LAN yang terletak di bangunan terpencil.
Situs "pusat" memiliki komputer Linux yang menjalankan OpenVPN. Setiap situs jarak jauh juga menjalankan OpenVPN.

  1. situs pusat memiliki nomor 192.168.0.0/24 LAN
  2. beberapa situs jarak jauh juga diberi nomor 192.168.0.0/24
  3. Saya tidak bisa / tidak mau / tidak mau / apa pun memodifikasi penomoran LAN
  4. Saya tidak memiliki kontrol pada OpenVPNs paling terpencil

Saya kemudian perlu:
1. mendefinisikan LAN virtual
2. mengkonfigurasi NAT 1: 1 untuk setiap situs
3. NAT 1: 1 harus dikonfigurasi pada router pusat

Peta LAN .
Jadi setiap situs terlihat memiliki LAN 10.10.x.0 / 24.
Ketika sebuah komputer ingin mencapai, katakanlah, 192.168.0.44 di situs 12, ia hanya perlu mengirim paquet ke 10.10.12.44

Mengoperasikan VPN bukan masalah bagi saya. Saat ini saya menghubungkan 60+ situs. Tapi saya tidak menemukan cara sederhana untuk melakukan NAT 1: 1 ini.

Berikut adalah contoh paket yang dikirim dari situs pusat ke situs jarak jauh, dan paket responsnya:

masukkan deskripsi gambar di sini

Saya melakukan beberapa tes dengan iptables NETMAP tapi saya tidak bisa membuatnya bekerja karena saya tidak menemukan cara untuk mengubah sumber + tujuan setelah keputusan routing.
Saya lebih suka menghindari fitur --client-natOpenVPN yang baru .
Mungkin saya harus memaksa routing ip route? Atau untuk mengulang dua kali ke tumpukan jaringan dengan veth?

Catatan: Saya tidak ingin menggunakan topeng. Hanya 1/1 NAT.

EDIT:
Tidak mungkin dengan pengaturan openVPN biasa. Karena paket dari situs jarak jauh tidak dapat dibedakan dari paket dari situs lain: keduanya memiliki sumber dan alamat tujuan yang sama, dan keduanya berasal dari antarmuka tun (atau ketuk) yang sama. Jadi tidak mungkin untuk sumber-NAT itu.

Solusi 1: lakukan NAT di situs remote. Tidak mungkin dalam kasus saya. Saya harus melakukannya hanya di situs pusat.

Solusi 2: siapkan satu VPN untuk setiap situs jarak jauh. Jadi saya akan memiliki satu lagu untuk masing-masing. Saya pikir ini bisa baik-baik saja. Memori tidak terlalu efisien tapi ok.

Solusi 3: mengatur terowongan (tidak terenkripsi) di dalam VPN untuk setiap situs. Ini akan memberikan satu antarmuka untuk masing-masing. Terowongan sederhana bukanlah platform silang (ke knoledge saya). Misalnya GRE atau ipip atau duduk ok untuk Linux, tetapi beberapa situs yang jauh hanya menjalankan satu komputer Windows, jadi openVPN diinstal di dalamnya. Jadi mustahil untuk memasang terowongan sederhana. Pilihan lain adalah menggunakan terowongan yang lebih rumit (yang?) Tetapi overhead pada sistem dan pada sysadmin mungkin lebih besar daripada memiliki beberapa VPN

Solusi 4: kompilasi openVPN terbaru, karena termasuk fitur NAT 1: 1. Saya menguji ini minggu ini.

SCHITS Bertrand
sumber
1
Untuk solusi 4 Anda tidak perlu mengkompilasi. Sebagian besar distribusi Linux utama telah mengkompilasi paket di situs web openVPN resmi. Tetapi ini tidak akan berhasil untuk Anda karena fitur --client-nat adalah opsi yang dapat ditekan. Jadi klien Anda juga harus menggunakan versi RC terbaru (dan Anda mengatakan Anda tidak memiliki kendali atas situs jarak jauh).
Gregory MOUSSAT
1
Yah, saya salah: fitur --client-nat adalah 100% di dalam OpenVPN (saya pikir itu menggunakan ipfilter). Saya baru saja menguji: itu bekerja pada Windows juga. Lihat solusi saya di bawah ini.
Gregory MOUSSAT
Saya ingin tahu apakah Anda pernah berhasil dan apa yang Anda lakukan.
Michael Grant

Jawaban:

2

Solusi yang sangat mendasar adalah:
1. gunakan OpenVPN 2.3 atau lebih (saat ini, yang terbaru adalah 2.3-alpha) untuk server + klien
2. gunakan opsi konfigurasi OpenVPN di bawah
3. jangan gunakan hal lain (tidak ada ipfilter, tidak ada trik)

Di sisi server, Anda perlu mendistribusikan alamat VPN secara manual (jadi tidak ada serverpilihan, Anda harus menggunakan ifconfigatau 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"

The routedan push routedan client-natgaris diperlukan jika Anda ingin berkomunikasi secara langsung antara router ( ping 10.99.99.1dari sebuah situs yang jauh pikir VPN). Lain Anda bisa membuangnya.

.

.

Sekarang Anda harus memilih alamat jaringan virtual. Saya tetap sama dengan yang Anda gunakan dalam contoh Anda: 10.10.0.0/16
Anda mengizinkan perutean untuk ini:

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

.

.

Anda sekarang harus menginstruksikan klien untuk menggunakan NAT 1: 1:

# /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

Baris pertama mengatur alamat router jarak jauh. Waspadai driver Windows yang membutuhkan alamat khusus.
Baris kedua dan terakhir memungkinkan router yang jauh untuk berkomunikasi dari antarmuka 10.99.99.x.
Baris ketiga dan keempat melakukan sumber dan tujuan 1: 1 NAT
Baris kelima memberi tahu OpenVPN apa yang harus dilakukan dengan paket yang sesuai.

Metode ini memungkinkan untuk menghubungkan situs dengan alamat LAN yang identik (atau tidak), tanpa host yang dibayangi.

Gregory MOUSSAT
sumber
1
Sederhana, brilian.
Bertrand SCHIT
Saya mencoba ini tetapi tidak berhasil. Saya menggunakan Linux di kedua sisi. Sesuatu yang aneh atau saya tidak mengerti sesuatu sepenuhnya. Ifconfig-push Anda di file client_11 (baris pertama), bukankah itu harus menjadi netmask untuk argumen kedua alih-alih 10.99.99.1? Kedua, mengapa Anda menggunakan jaringan ketiga ini 10.10.111.0/24? Sepertinya Anda mencoba menggunakan jaringan 111 untuk komunikasi antar situs, bukankah jaringan 10.10 dapat digunakan untuk itu secara langsung? Terakhir, tidak peduli apa yang saya coba, saya tidak melihat (dalam tcpdump) snat dan dnat mempengaruhi paket pada klien.
Michael Grant
Tidak terlalu sederhana namun tetap cemerlang.
Neurotransmitter
4

Saya telah melakukan sesuatu yang mirip dengan antarmuka nyata, tetapi saya tidak bisa melihat mengapa itu tidak bekerja dengan antarmuka VPN.

Idenya adalah bahwa, karena Anda memiliki subnet yang sama tersedia di antarmuka yang berbeda pada router itu, itu mempersulit perutean. Pada dasarnya, ketika sebuah paket untuk 10.10.13.123 memasuki router, itu adalah DNAT sebelum melakukan routing ke 192.168.0.123, jadi Anda harus bisa memberi tahu routing bahwa itu ditujukan untuk 192.168.0.123 pada antarmuka VPN13 .

Itu bisa dilakukan dengan menggunakan tanda firewall dan aturan perutean yang menggunakan tanda itu. SNAT dan DNAT harus dilakukan dengan target firewall NETMAP. Untuk SNAT, itu masalah yang sama, dalam POSTROUTING, Anda telah kehilangan informasi bahwa paket berasal dari antarmuka ini atau itu dan mereka semua mendapatkan alamat sumber 192.168.0.x. Jadi Anda perlu tanda juga untuk membawa informasi itu dari mangle-PREROUTING ke nat-POSTROUTING. Anda dapat menggunakan tanda yang sama, tetapi kemudian itu berarti paket-paket itu akan menggunakan tabel rute alternatif itu, jadi Anda harus menduplikasi tabel routing global pada semua.

Untuk setiap jaringan, Anda akan melakukan:

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

Di atas, kami menggunakan 4 bit pertama dari tanda tersebut , untuk memungkinkan hingga 7 jaringan untuk dirutekan dengan cara itu.

Stéphane Chazelas
sumber
1
Terima kasih atas jawaban anda. Saya mengujinya tetapi tidak berhasil. Saya diuji dengan hanya satu LAN, tidak ada hasil lagi. Saya menggunakan tcpdump untuk memonitor paket-paket, dan ketika saya mengirim paket dari jarak jauh ke situs centrale, saya bahkan tidak melihat apa-apa (?! Bagaimana mungkin?). Dengan arahan Anda, saya mencoba menyusun jawaban langkah demi langkah saya. Tidak yakin saya akan berhasil.
Bertrand SCHIT
2
Jawaban saya hanya mencakup apa yang harus dilakukan di situs pusat. Saya berasumsi Anda mengkonfigurasi perutean dengan benar di situs lain. Misalnya, Anda mungkin perlu menambahkan rute ke 10.10.0.0/16 melalui terowongan VPN di situs jarak jauh. Anda mungkin juga perlu memberi tahu openvpn untuk membiarkan paket-paket itu lewat. Di anycase, gunakan tcpdump untuk melihat paket apa yang didapat di mana dan bagaimana pendekatan yang tepat. target LOG iptables juga teman Anda.
Stéphane Chazelas
2
Jika Anda tidak melihat paket, Anda harus melihat log openvpn Anda. Anda mungkin akan menemukan paket yang dijatuhkan. Jika demikian, gunakan "iroute 192.168.0.0 255.255.255.0" untuk setiap klien ke dalam klien-config-dir Anda
Gregory MOUSSAT