
שלום לכולם, קראתי לאחרונה על איך אתה יכול להאיץ את 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.
מתברר כך:
- מגיע לקוח
- אם השרת החיצוני אינו זמין, כמו קודם, החיבור עובר לשרת הפנימי
- אם זמין, הלקוח מתקבל על ידי Orange Pi
- VPN ב- Orange Pi מפענח מנות ויורק אותן בחזרה לנתב
- הנתב מנתב אותם לאנשהו
דוגמה ליישום
אז תנו לנו שתי רשתות על הנתב - 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
