1: 1 NAT ที่มี LAN เหมือนกันหลายตัว


13

ฉันต้องการเชื่อมต่อ LAN หลายตัวที่อยู่ในอาคารระยะไกล
ไซต์ "ส่วนกลาง" มีคอมพิวเตอร์ Linux ที่ใช้ OpenVPN ไซต์ระยะไกลแต่ละแห่งยังเรียกใช้ OpenVPN

  1. ไซต์กลางมีหมายเลข LAN 192.168.0.0/24
  2. ไซต์ระยะไกลหลายแห่งยังมีหมายเลข 192.168.0.0/24
  3. ฉันไม่สามารถ / ไม่ / ไม่ต้องการ / ไม่ว่าจะปรับเปลี่ยนหมายเลข LAN อย่างไร
  4. ฉันไม่สามารถควบคุม OpenVPN ระยะไกลส่วนใหญ่ได้

ฉันต้อง:
1. กำหนด LAN เสมือน
2. กำหนดค่า NAT 1: 1 สำหรับแต่ละไซต์
3. ต้องกำหนดค่า NAT 1: 1 บนเราเตอร์ส่วนกลาง

แผนที่ LAN .
ดังนั้นแต่ละไซต์จะมี 10.10.x.0 / 24 LAN
เมื่อคอมพิวเตอร์ต้องการเข้าถึงพูดว่า 192.168.0.44 ในไซต์ 12 มันแค่ต้องส่ง paquet ไปที่ 10.10.12.44

การใช้งาน VPN ไม่ใช่ปัญหาสำหรับฉัน ขณะนี้ฉันเชื่อมต่อไซต์มากกว่า 60 แห่ง แต่ฉันไม่พบวิธีง่ายๆในการทำ NAT 1: 1 นี้

นี่คือตัวอย่างของแพ็กเก็ตที่ส่งจากไซต์กลางไปยังไซต์ระยะไกลและแพคเก็ตตอบกลับ

ป้อนคำอธิบายรูปภาพที่นี่

ฉันทำการทดสอบด้วย iptables NETMAP แต่ฉันไม่สามารถจัดการเพื่อให้ทำงานได้เนื่องจากฉันไม่พบวิธีแก้ไขต้นทาง + ปลายทางหลังจากการตัดสินใจกำหนดเส้นทาง
ฉันชอบที่จะหลีกเลี่ยงคุณสมบัติใหม่--client-natของ OpenVPN
บางทีฉันต้องบังคับเส้นทางด้วยip route? หรือจะวนซ้ำสองครั้งในเครือข่ายสแต็คด้วยveth?

หมายเหตุ: ฉันไม่ต้องการใช้หน้ากากปลอม NAT 1/1 เท่านั้น

แก้ไข:
มันเป็นไปไม่ได้ด้วยการตั้งค่า openVPN ปกติ เนื่องจากแพ็กเก็ตจากไซต์ระยะไกลแยกไม่ได้จากแพคเก็ตจากไซต์อื่น: ทั้งคู่มีที่อยู่ต้นทางและปลายทางที่คล้ายกันและทั้งคู่มาจากอินเทอร์เฟซ Tun (หรือ Tap) เดียวกัน ดังนั้นจึงเป็นไปไม่ได้ที่จะ NAT-source

โซลูชันที่ 1: ทำ NAT บนไซต์ระยะไกล เป็นไปไม่ได้ในกรณีของฉัน ฉันต้องทำมันบนไซต์กลางเท่านั้น

โซลูชันที่ 2: ตั้งค่าหนึ่ง VPN สำหรับแต่ละไซต์ระยะไกล ดังนั้นฉันจะมีหนึ่งเสียงสำหรับแต่ละ ฉันคิดว่ามันก็โอเค หน่วยความจำไม่ค่อยมีประสิทธิภาพ แต่ก็โอเค

โซลูชันที่ 3: ตั้งค่าอุโมงค์ (ไม่เข้ารหัส) ภายใน VPN สำหรับแต่ละไซต์ นี่จะให้หนึ่งอินเทอร์เฟซสำหรับแต่ละรายการ อุโมงค์เรียบง่ายไม่ได้ข้ามแพลตฟอร์ม (สำหรับ knoledge ของฉัน) ตัวอย่างเช่น GRE หรือ ipip หรือ sit นั้นใช้ได้สำหรับ Linux แต่บางไซต์ที่อยู่ห่างไกลใช้คอมพิวเตอร์ Windows เพียงเครื่องเดียวดังนั้นจึงติดตั้ง openVPN ไว้ ดังนั้นจึงเป็นไปไม่ได้ที่จะตั้งค่าอุโมงค์ง่าย ๆ ตัวเลือกอื่นคือการใช้ช่องทางที่ซับซ้อนมากขึ้น (ซึ่ง?) แต่ค่าใช้จ่ายในระบบและดูแลระบบอาจมีขนาดใหญ่กว่าการมี VPN หลายตัว

โซลูชันที่ 4: รวบรวม openVPN ล่าสุดเนื่องจากมีคุณลักษณะ NAT 1: 1 ฉันทดสอบสัปดาห์นี้


1
สำหรับโซลูชัน 4 คุณไม่จำเป็นต้องคอมไพล์ ลีนุกซ์รุ่นใหญ่ ๆ ส่วนใหญ่ได้รวบรวมแพ็คเกจบนเว็บไซต์ทางการของ openVPN แต่สิ่งนี้จะไม่ทำงานสำหรับคุณเพราะคุณสมบัติ --client-nat เป็นตัวเลือกที่สามารถผลักดันได้ ดังนั้นลูกค้าของคุณต้องใช้เวอร์ชัน RC ล่าสุด (และคุณบอกว่าคุณไม่สามารถควบคุมไซต์ระยะไกลได้)
เกรกอรี่ MOUSSAT

1
ฉันผิด: คุณสมบัติ --client-nat คือ 100% ใน OpenVPN (ฉันคิดว่ามันใช้ ipfilter) ฉันเพิ่งทดสอบ: มันทำงานบน Windows ได้เช่นกัน ดูโซลูชันของฉันด้านล่าง
เกรกอรี่ MOUSSAT

ฉันอยากจะรู้ว่าถ้าคุณได้งานนี้และสิ่งที่คุณทำ
Michael Grant

คำตอบ:


2

วิธีแก้ปัญหาพื้นฐานมากคือ:
1. ใช้ OpenVPN 2.3 หรือมากกว่า (ปัจจุบันล่าสุดคือ 2.3-alpha) สำหรับเซิร์ฟเวอร์ + ไคลเอนต์
2. ใช้ตัวเลือกการกำหนดค่า OpenVPN ด้านล่าง
3. ไม่ใช้สิ่งอื่น (ไม่มี ipfilter ไม่มีลูกเล่น)

ในฝั่งเซิร์ฟเวอร์คุณต้องแจกจ่ายที่อยู่ VPN ด้วยตนเอง (ดังนั้นจึงไม่มีserverตัวเลือกคุณต้องใช้ifconfigหรือ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"

routeและpush routeและclient-natสายจะต้องถ้าคุณต้องการที่จะสื่อสารโดยตรงระหว่างเราเตอร์ ( ping 10.99.99.1จากเว็บไซต์ที่ห่างไกล throught VPN ที่) มิฉะนั้นคุณสามารถละทิ้งมันได้

.

.

ตอนนี้คุณต้องเลือกที่อยู่เครือข่ายเสมือน ฉันใช้ชื่อเดิมในตัวอย่างของคุณ: 10.10.0.0/16
คุณอนุญาตเส้นทางสำหรับสิ่งนี้:

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

.

.

ตอนนี้คุณต้องสั่งให้ลูกค้าใช้ 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

บรรทัดแรกตั้งค่าที่อยู่เราเตอร์ระยะไกล ระวังเกี่ยวกับไดรเวอร์ Windows ที่ต้องการที่อยู่พิเศษ
บรรทัดที่สองและบรรทัดสุดท้ายช่วยให้เราเตอร์ที่อยู่ห่างไกลสามารถสื่อสารได้จากส่วนต่อประสาน 10.99.99.x
บรรทัดที่สามและสี่ทำต้นทางและปลายทาง 1: 1 NAT
บรรทัดที่ห้าบอก OpenVPN ว่าจะทำอย่างไรกับแพ็กเก็ตที่เกี่ยวข้อง

วิธีนี้อนุญาตให้เชื่อมต่อไซต์ที่มีที่อยู่ LAN เหมือนกัน (หรือไม่) โดยไม่มีโฮสต์ที่มีเงา


1
เรียบง่ายยอดเยี่ยม
Bertrand SCHITS

ฉันลองสิ่งนี้ แต่ไม่สามารถใช้งานได้ ฉันใช้ Linux ทั้งสองด้าน บางสิ่งแปลกหรือฉันไม่เข้าใจบางสิ่งบางอย่างเต็มที่ ifconfig-push ของคุณในไฟล์ client_11 (บรรทัดแรก) นั่นควรเป็น netmask สำหรับอาร์กิวเมนต์ที่สองแทนที่จะเป็น 10.99.99.1 ใช่หรือไม่ ประการที่สองทำไมคุณใช้เครือข่ายที่สามนี้ 10.10.111.0/24 ดูเหมือนว่าคุณกำลังพยายามใช้เครือข่าย 111 เพื่อการสื่อสารระหว่างไซต์ไม่สามารถใช้เครือข่าย 10.10 สำหรับสิ่งนั้นโดยตรง สุดท้ายไม่ว่าฉันจะพยายามอะไรฉันไม่เห็น snat และ dnat (ใน tcpdump) ที่ส่งผลกระทบต่อแพ็กเก็ตบนไคลเอ็นต์
Michael Grant

ไม่ง่ายจริงๆ แต่ก็ยังยอดเยี่ยม
สารสื่อประสาท

4

ฉันได้ทำสิ่งที่คล้ายกับอินเทอร์เฟซจริง แต่ฉันไม่เห็นว่าทำไมมันไม่ทำงานกับอินเทอร์เฟซ VPN

แนวคิดก็คือเมื่อคุณมีซับเน็ตเดียวกันที่มีอินเตอร์เฟสที่แตกต่างกันบนเราเตอร์นั้นจะทำให้การกำหนดเส้นทางยุ่งยาก โดยทั่วไปเมื่อแพ็คเก็ตสำหรับ 10.10.13.123 เข้าเราเตอร์ก็จะ DNATed ก่อนที่จะกำหนดเส้นทางที่จะ 192.168.0.123 ดังนั้นคุณจะต้องมีความสามารถที่จะบอกเส้นทางที่ก็ตั้งใจสำหรับ 192.168.0.123 ใน VPN13

สามารถทำได้โดยใช้เครื่องหมายไฟร์วอลล์และกฎการกำหนดเส้นทางที่ใช้เครื่องหมายเหล่านั้น SNAT และ DNAT จะทำกับเป้าหมายไฟร์วอลล์ NETMAP สำหรับ SNAT มันเป็นปัญหาเดียวกันใน POSTROUTING คุณได้สูญเสียข้อมูลที่แพ็กเก็ตมาจากที่นี่หรืออินเทอร์เฟซนั้นและพวกเขาทั้งหมดได้รับที่อยู่แหล่งที่มา 192.168.0.x ดังนั้นคุณต้องมีเครื่องหมายเช่นกันในการส่งข้อมูลจาก mangle-PREROUTING ไปยัง nat-POSTROUTING คุณสามารถใช้เครื่องหมายเดียวกันได้ แต่นั่นหมายความว่าแพ็กเก็ตเหล่านั้นจะใช้ตารางเส้นทางอื่นดังนั้นคุณต้องทำซ้ำตารางเส้นทางทั่วโลกในทุกเส้นทาง

สำหรับแต่ละเครือข่ายคุณจะทำ:

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

ข้างต้นที่เรากำลังใช้ครั้งแรก 4 บิตของเครื่องหมายเพื่อให้ได้ถึง 7 เครือข่ายที่จะถูกส่งไปที่วิธีการ


1
ขอบคุณสำหรับคำตอบ. ฉันทดสอบแล้ว แต่ใช้งานไม่ได้ ฉันทดสอบกับ LAN เดียวเท่านั้นไม่มีผลลัพธ์เพิ่มเติม ฉันใช้ tcpdump เพื่อตรวจสอบแพ็คเก็ตและเมื่อฉันส่งแพ็คเก็ตจากระยะไกลไปยังไซต์กลางฉันไม่เห็นอะไรเลย (?! เป็นไปได้อย่างไร?) ด้วยทิศทางของคุณฉันพยายามสร้างคำตอบทีละขั้นตอน ไม่แน่ใจว่าฉันจะประสบความสำเร็จ
Bertrand SCHITS

2
คำตอบของฉันครอบคลุมเฉพาะสิ่งที่ต้องทำในไซต์ส่วนกลาง ฉันถือว่าคุณกำหนดค่าการกำหนดเส้นทางอย่างถูกต้องในเว็บไซต์อื่น ๆ ตัวอย่างเช่นคุณอาจต้องเพิ่มเส้นทางไปที่ 10.10.0.0/16 ผ่านอุโมงค์ VPN บนไซต์ระยะไกล คุณอาจต้องบอก openvpn เพื่อให้แพ็กเก็ตเหล่านั้นผ่าน ในทุกกรณีโดยใช้ tcpdump เพื่อดูว่าแพ็กเก็ตใดได้รับตำแหน่งและวิธีการที่เหมาะสม iptables LOG target เป็นเพื่อนของคุณเช่นกัน
Stéphane Chazelas

2
หากคุณไม่เห็นแพ็คเก็ตคุณต้องมองเข้าไปในบันทึก openvpn ของคุณ คุณอาจจะพบแพ็กเก็ตที่ถูกทิ้ง หากเป็นกรณีนี้ให้ใช้ "iroute 192.168.0.0 255.255.255.0" สำหรับลูกค้าแต่ละรายใน client-config-dir ของคุณ
Gregory MOUSSAT
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.