1: 1 NAT với nhiều mạng LAN giống hệt nhau


13

Tôi muốn kết nối một số mạng LAN nằm trên các tòa nhà từ xa.
Trang web "trung tâm" có máy tính Linux chạy OpenVPN. Mỗi trang web từ xa cũng chạy OpenVPN.

  1. trang trung tâm có mạng LAN được đánh số 192.168.0.0/24
  2. một số trang web từ xa cũng được đánh số 192.168.0.0/24
  3. Tôi không thể / sẽ không / không muốn / sửa đổi đánh số mạng LAN
  4. Tôi không có quyền kiểm soát trên hầu hết các OpenVPN từ xa

Sau đó tôi cần:
1. xác định mạng LAN ảo
2. định cấu hình NAT 1: 1 cho mỗi trang web
3. NAT 1: 1 phải được định cấu hình trên bộ định tuyến trung tâm

Bản đồ mạng LAN .
Vì vậy, mỗi trang web được xem là có 10.10.x.0 / 24 LAN.
Khi một máy tính muốn tiếp cận, giả sử, 192.168.0.44 trên trang 12, nó chỉ cần gửi một paquet đến 10.10.12.44

Vận hành VPN không phải là vấn đề đối với tôi. Tôi hiện đang kết nối hơn 60 trang web. Nhưng tôi không tìm thấy một cách đơn giản để làm điều này 1: 1 NAT.

Dưới đây là ví dụ về gói được gửi từ trang trung tâm đến trang từ xa và gói phản hồi của nó:

nhập mô tả hình ảnh ở đây

Tôi đã thực hiện một số thử nghiệm với iptables NETMAP nhưng tôi không thể quản lý để làm cho nó hoạt động vì tôi không tìm cách sửa đổi nguồn + đích sau khi quyết định định tuyến.
Tôi muốn tránh --client-nattính năng mới của OpenVPN.
Có lẽ tôi phải buộc định tuyến với ip route? Hoặc để lặp hai lần vào ngăn xếp mạng với veth?

Lưu ý: Tôi không muốn sử dụng hóa trang. Chỉ 1/1 NAT.

EDIT:
Không thể với thiết lập openVPN thông thường. Bởi vì một gói từ một trang web từ xa không thể phân biệt được với một gói từ một trang web khác: cả hai đều có địa chỉ nguồn và đích giống nhau và cả hai đều đến từ cùng một giao diện điều chỉnh (hoặc nhấn). Vì vậy, nó không thể nguồn NAT.

Giải pháp 1: làm NAT trên các trang web từ xa. Không thể trong trường hợp của tôi. Tôi phải làm điều đó chỉ trên trang web trung tâm.

Giải pháp 2: thiết lập một VPN cho mỗi trang web từ xa. Vì vậy, tôi sẽ có một điều chỉnh cho mỗi. Tôi nghĩ rằng điều này có thể là ok. Không hiệu quả lắm bộ nhớ nhưng ok.

Giải pháp 3: thiết lập một đường hầm (không được mã hóa) bên trong VPN cho mỗi trang web. Điều này sẽ cung cấp một giao diện cho mỗi. Các đường hầm đơn giản không phải là nền tảng chéo (theo sở trường của tôi). Ví dụ: GRE hoặc ipip hoặc sit đều ổn đối với Linux, nhưng một số trang web ở xa chỉ chạy một máy tính Windows, vì vậy openVPN được cài đặt trên nó. Vì vậy, không thể thiết lập một đường hầm đơn giản. Tùy chọn khác là sử dụng một đường hầm phức tạp hơn (wich?) Nhưng chi phí hoạt động trên hệ thống và trên sysadmin có thể lớn hơn so với việc có nhiều VPN

Giải pháp 4: biên dịch openVPN mới nhất, bởi vì nó bao gồm tính năng NAT 1: 1. Tôi kiểm tra tuần này.


1
Đối với giải pháp 4 bạn không phải biên dịch. Hầu hết các bản phân phối Linux lớn đã biên dịch các gói trên trang web openVPN chính thức. Nhưng điều này sẽ không phù hợp với bạn vì tính năng --client-nat là một tùy chọn có thể đẩy được. Vì vậy, khách hàng của bạn cũng phải sử dụng phiên bản RC mới nhất (và bạn nói rằng bạn không có quyền kiểm soát các trang web từ xa).
Gregory MOUSSAT

1
Chà, tôi đã nhầm: tính năng --client-nat có 100% bên trong OpenVPN (tôi nghĩ rằng nó đang sử dụng ipfilter). Tôi vừa thử nghiệm: nó cũng hoạt động trên Windows. Xem giải pháp của tôi dưới đây.
Gregory MOUSSAT

Tôi muốn biết nếu bạn đã từng làm việc này và những gì bạn đã làm.
Michael Grant

Câu trả lời:


2

Một giải pháp rất cơ bản là:
1. sử dụng OpenVPN 2.3 trở lên (hiện tại, mới nhất là 2.3-alpha) cho máy chủ + máy khách
2. sử dụng tùy chọn cấu hình OpenVPN bên dưới
3. không sử dụng bất cứ thứ gì khác (không có ipfilter, không có thủ thuật)

Về phía máy chủ, bạn cần phân phối thủ công các địa chỉ VPN (vì vậy không có servertùy chọn nào , bạn phải sử dụng ifconfighoặc 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"

Các routepush routeclient-natđược yêu cầu nếu bạn muốn giao tiếp trực tiếp giữa các bộ định tuyến ( ping 10.99.99.1từ một trang web xa thông qua VPN). Khác, bạn có thể loại bỏ chúng.

.

.

Bây giờ bạn phải chọn một địa chỉ mạng ảo. Tôi giữ nguyên như bạn đã sử dụng trong ví dụ của mình: 10.10.0.0/16
Bạn cho phép định tuyến cho việc này:

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

.

.

Bây giờ bạn có để hướng dẫn khách hàng sử dụng 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

Dòng đầu tiên đặt địa chỉ bộ định tuyến từ xa. Cẩn thận với trình điều khiển Windows yêu cầu địa chỉ đặc biệt.
Các dòng thứ hai và cuối cùng cho phép bộ định tuyến ở xa giao tiếp từ giao diện 10.99.99.x của nó.
Dòng thứ ba và thứ tư thực hiện nguồn và đích 1: 1 NAT
Dòng thứ năm cho OpenVPN biết phải làm gì với các gói tương ứng.

Phương pháp này cho phép kết nối các trang web có địa chỉ LAN giống hệt (hoặc không), mà không có bất kỳ máy chủ bị che khuất nào.


1
Đơn giản, rực rỡ.
HỌC BỔNG Bertrand

Tôi đã thử điều này nhưng không thể làm cho nó hoạt động. Tôi đang sử dụng Linux ở cả hai phía. Đôi khi là kỳ lạ hoặc tôi không hiểu một số điều đầy đủ. Ifconfig-push của bạn trong tệp client_11 (dòng đầu tiên), không nên là một mặt nạ mạng cho đối số thứ hai thay vì 10.99.99.1? Thứ hai, tại sao bạn sử dụng mạng thứ ba này 10.10.111.0/24? Có vẻ như bạn đang cố gắng sử dụng mạng 111 để liên lạc giữa các trang web, mạng 10.10 có thể được sử dụng trực tiếp cho điều đó không? Cuối cùng, bất kể tôi cố gắng gì, tôi không thấy (trong tcpdump) snat và dnat ảnh hưởng đến các gói trên máy khách.
Michael Grant

Không thực sự đơn giản nhưng vẫn rực rỡ.
Chất dẫn truyền thần kinh

4

Tôi đã làm một cái gì đó tương tự với các giao diện thực, nhưng tôi không thể hiểu tại sao nó không hoạt động với giao diện VPN.

Ý tưởng là, khi bạn có cùng một mạng con có sẵn tại các giao diện khác nhau trên bộ định tuyến đó, nó sẽ làm phức tạp việc định tuyến. Về cơ bản, khi một gói cho 10.10.13.123 vào bộ định tuyến, nó được DNATed trước khi định tuyến tới 192.168.0.123, do đó bạn phải có khả năng định tuyến rằng nó được dành cho 192.168.0.123 trên giao diện VPN13 .

Điều đó có thể được thực hiện bằng cách sử dụng các nhãn hiệu tường lửa và quy tắc định tuyến sử dụng các nhãn hiệu đó. SNAT và DNAT sẽ được thực hiện với mục tiêu tường lửa NETMAP. Đối với SNAT, đó là cùng một vấn đề, trong POSTROUTING, bạn đã mất thông tin rằng gói đến từ giao diện này hoặc giao diện đó và tất cả họ đều có địa chỉ nguồn 192.168.0.x. Vì vậy, bạn cũng cần một dấu hiệu để mang thông tin đó từ mangle-PREROUTING sang nat-POSTROUTING. Bạn có thể sử dụng cùng một nhãn hiệu, nhưng điều đó có nghĩa là các gói đó sẽ sử dụng bảng định tuyến thay thế đó, vì vậy bạn cần phải nhân đôi bảng định tuyến toàn cầu.

Đối với mỗi mạng, bạn sẽ làm:

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

Ở trên, chúng tôi đang sử dụng 4 bit đầu tiên của nhãn hiệu , để cho phép tối đa 7 mạng được định tuyến theo cách đó.


1
Cảm ơn câu trả lời của bạn. Tôi đã thử nó nhưng nó không hoạt động. Tôi đã thử nghiệm chỉ với một mạng LAN, không có kết quả nữa. Tôi sử dụng tcpdump để giám sát các gói và khi tôi gửi một gói từ xa đến trang trung tâm, tôi thậm chí không nhìn thấy gì (?! Làm sao có thể?). Với chỉ dẫn của bạn, tôi cố gắng xây dựng câu trả lời từng bước của mình. Không chắc chắn tôi sẽ thành công.
HỌC BỔNG Bertrand

2
Câu trả lời của tôi chỉ bao gồm những gì cần làm trên trang web trung tâm. Tôi giả sử bạn định cấu hình định tuyến chính xác trên các trang web khác. Chẳng hạn, có lẽ bạn cần thêm một tuyến đường đến 10.10.0.0/16 thông qua đường hầm VPN trên các trang web từ xa. Bạn cũng có thể cần nói với openvpn để cho các gói đó đi qua. Trong mọi trường hợp, sử dụng tcpdump để xem gói nào nhận được ở đâu và cách tiếp cận đúng. mục tiêu LOG ​​của iptables cũng là bạn của bạn.
Stéphane Chazelas

2
Nếu bạn thấy không có gói nào, bạn phải xem nhật ký openvpn của mình. Bạn có thể sẽ tìm thấy các gói bị rơi. Nếu đây là trường hợp, hãy sử dụng "iroute 192.168.0.0 255.255.255.0" cho mỗi máy khách vào máy khách-config-dir của bạn
Gregory MOUSSAT
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.