האצת OpenVPN בנתב Openwrt. גרסה חלופית ללא מלחם וקיצוניות חומרה

האצת OpenVPN בנתב Openwrt. גרסה חלופית ללא מלחם וקיצוניות חומרה

שלום לכולם, קראתי לאחרונה מאמר ישן על איך אתה יכול להאיץ את OpenVPN בנתב על ידי העברת הצפנה לפיסת חומרה נפרדת, המולחמת בתוך הנתב עצמו. יש לי מקרה דומה למחבר - TP-Link WDR3500 עם 128 מגה-בייט של זיכרון RAM ומעבד גרוע שממש לא מסוגל להתמודד עם הצפנת מנהרה. עם זאת, ממש לא רציתי להיכנס לנתב עם מלחם. להלן הניסיון שלי בהעברת OpenVPN לחלק חומרה נפרד עם גיבוי על הנתב במקרה של תאונה.

משימה

יש לנו נתב TP-Link WDR3500 ו-Orange Pi Zero H2. אנחנו רוצים שה-Orange Pi יטפל בהצפנת מנהרה במצב רגיל, אבל אם משהו יקרה לו, ה-Pi יעבד את התהליך. VPN הוא יוחזר לנתב. כל הגדרות חומת האש בנתב אמורות לעבוד כמקודם. בסך הכל, הוספת חומרה נוספת אמורה להיות שקופה וחלקה עבור כולם. OpenVPN פועל דרך TCP, ומתאם TAP נמצא במצב גשר שרת.

החלטה

במקום להתחבר דרך USB, החלטתי להשתמש ביציאה אחת של הנתב ולחבר את כל רשתות המשנה שיש להן גשר VPN ל-Orange Pi. מסתבר שהחומרה תתקע פיזית באותן רשתות כמו שרת ה-VPN בנתב. לאחר מכן, אנו מתקינים בדיוק את אותם שרתים על ה-Orange Pi, ובנתב הגדרנו איזשהו פרוקסי כך שהוא ישלח את כל החיבורים הנכנסים לשרת החיצוני, ואם ה- Orange Pi מת או לא זמין, אז ל- שרת חלל פנימי. לקחתי HAProxy.

מתברר כך:

  1. מגיע לקוח
  2. אם השרת החיצוני אינו זמין, כמו קודם, החיבור עובר לשרת הפנימי
  3. אם זמין, הלקוח מתקבל על ידי Orange Pi
  4. VPN ב- Orange Pi מפענח מנות ויורק אותן בחזרה לנתב
  5. הנתב מנתב אותם לאנשהו

דוגמה ליישום

אז תנו לנו שתי רשתות על הנתב - main(1) ו- guest(2), לכל אחת מהן יש שרת OpenVPN לחיבור חיצוני.

תצורת רשת

אנחנו צריכים לנתב את שתי הרשתות דרך יציאה אחת, אז אנחנו יוצרים 2 רשתות VLAN.

בנתב, בקטע רשת/מתג, צור רשתות VLAN (לדוגמה 1 ו-2) והפעל אותן במצב מתויג ביציאה הרצויה, הוסף את ה-eth0.1 ו-eth0.2 החדשים שנוצרו לרשתות המתאימות (לדוגמה, הוסף אותם לברידג').

ב- Orange Pi אנו יוצרים שני ממשקי VLAN (יש לי Archlinux ARM + netctl):

/etc/netctl/vlan-main

Description='Main VLAN on eth0'
Interface=vlan-main
Connection=vlan
BindsToInterfaces=eth0
VLANID=1
IP=no

/etc/netctl/vlan-guest

Description='Guest VLAN on eth0'
Interface=vlan-guest
Connection=vlan
BindsToInterfaces=eth0
VLANID=2
IP=no

ומיד אנו יוצרים עבורם שני גשרים:

/etc/netctl/br-main

Description="Main Bridge connection"
Interface=br-main
Connection=bridge
BindsToInterfaces=(vlan-main)
IP=dhcp

/etc/netctl/br-guest

Description="Guest Bridge connection"
Interface=br-guest
Connection=bridge
BindsToInterfaces=(vlan-guest)
IP=dhcp

אפשר הפעלה אוטומטית עבור כל 4 הפרופילים (הפעלת netctl). כעת לאחר אתחול מחדש, ה-Orange Pi יתקע בשתי הרשתות הנדרשות. אנו מגדירים את כתובות הממשק ב- Orange Pi בחכירות סטטיות בנתב.

הצגת ip addr

4: vlan-main@eth0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-main state UP group default qlen 1000
    link/ether 02:42:f0:f8:23:c8 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::42:f0ff:fef8:23c8/64 scope link 
       valid_lft forever preferred_lft forever

5: vlan-guest@eth0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-guest state UP group default qlen 1000
    link/ether 02:42:f0:f8:23:c8 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::42:f0ff:fef8:23c8/64 scope link 
       valid_lft forever preferred_lft forever

6: br-main: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 52:c7:0f:89:71:6e brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.3/24 brd 192.168.1.255 scope global dynamic noprefixroute br-main
       valid_lft 29379sec preferred_lft 21439sec
    inet6 fe80::50c7:fff:fe89:716e/64 scope link 
       valid_lft forever preferred_lft forever

7: br-guest: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether ee:ea:19:31:34:32 brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.3/24 brd 192.168.2.255 scope global br-guest
       valid_lft forever preferred_lft forever
    inet6 fe80::ecea:19ff:fe31:3432/64 scope link 
       valid_lft forever preferred_lft forever

הגדרת VPN

לאחר מכן, אנו מעתיקים את ההגדרות עבור OpenVPN ואת המפתחות מהנתב. בדרך כלל ניתן למצוא הגדרות ב /tmp/etc/openvpn*.conf

כברירת מחדל, openvpn פועל במצב TAP ושרת-bridge שומר על הממשק שלו לא פעיל. כדי שהכל יעבוד, צריך להוסיף סקריפט שפועל כאשר החיבור מופעל.

/etc/openvpn/main.conf

dev vpn-main
dev-type tap

client-to-client
persist-key
persist-tun
ca /etc/openvpn/main/ca.crt
cert /etc/openvpn/main/main.crt
cipher AES-256-CBC
comp-lzo yes
dh /etc/openvpn/main/dh2048.pem
ifconfig-pool-persist /etc/openvpn/ipp_main.txt
keepalive 10 60
key /etc/openvpn/main/main.key
port 443
proto tcp
push "redirect-gateway"
push "dhcp-option DNS 192.168.1.1"
server-bridge 192.168.1.3 255.255.255.0 192.168.1.200 192.168.1.229
status /tmp/openvpn.main.status
verb 3

setenv profile_name main
script-security 2
up /etc/openvpn/vpn-up.sh

/etc/openvpn/vpn-up.sh

#!/bin/sh

ifconfig vpn-${profile_name} up
brctl addif br-${profile_name} vpn-${profile_name}

כתוצאה מכך, ברגע שהחיבור מתרחש, ממשק vpn-main יתווסף ל-br-main. עבור רשת האורח - באופן דומה, עד לשם הממשק והכתובת בשרת-bridge.

ניתוב בקשות חיצוני ו-proxy

בשלב זה, Orange Pi כבר מסוגל לקבל חיבורים ולחבר לקוחות לרשתות הנדרשות. כל מה שנותר הוא להגדיר פרוקסי של חיבורים נכנסים בנתב.

אנו מעבירים את שרתי ה-VPN של הנתב ליציאות אחרות, מתקינים את HAProxy על הנתב ומגדירים:

/etc/haproxy.cfg

global
        maxconn 256
        uid 0
        gid 0
        daemon

defaults
        retries 1
        contimeout 1000
        option splice-auto

listen guest_vpn
        bind :444
        mode tcp
        server 0-orange 192.168.2.3:444 check
        server 1-local  127.0.0.1:4444 check backup

listen main_vpn
        bind :443
        mode tcp
        server 0-orange 192.168.1.3:443 check
        server 1-local  127.0.0.1:4443 check backup

תהנה

אם הכל יתנהל לפי התוכנית, הלקוחות יעברו ל-Orange Pi והמעבד של הנתב לא יתחמם יותר, ומהירות ה-VPN תגדל משמעותית. יחד עם זאת, כל כללי הרשת הרשומים בנתב יישארו רלוונטיים. במקרה של תאונה ב-Orange Pi, הוא ייפול ו-HAProxy תעביר לקוחות לשרתים מקומיים.

תודה על תשומת הלב, הצעות ותיקונים יתקבלו בברכה.

מקור: www.habr.com

הוספת תגובה