เราเตอร์ UDP เส็งเคร็งสำหรับปี 2020 และต่อๆ ไป
ฉันกำลังเล่นกับ Roon และมีเครือข่ายในบ้านที่ซับซ้อนซึ่งทำให้ Roon วนซ้ำ ฉันเริ่มแก้ไขข้อบกพร่องต่างๆ และปรากฎว่า Roon ส่งข้อความ ออกอากาศ ไปยัง UDP/9003 ไฟร์วอลล์/เราเตอร์ของฉันจะไม่ส่งต่อข้อความเหล่านี้แน่นอน เพราะนั่นคือสิ่งที่ถูกต้องที่ต้องทำ
ขออภัย ฉันต้องการให้ส่งต่อข้อความออกอากาศเหล่านี้ไปยัง VLAN/ซับเน็ตอื่นๆ บนเครือข่ายท้องถิ่นของฉัน ฉันเริ่มใช้ udp-proxy-relay-redux ซึ่งทำงานได้ดีในตอนแรก
แต่ฉันก็ชอบข้อความเหล่านี้ที่ส่งต่อผ่านการเชื่อมต่อ OpenVPN ของฉันซึ่งใช้ไดรเวอร์ tun
ซึ่งเป็นอินเทอร์เฟซแบบจุดต่อจุดและ ความชัดเจน ไม่รองรับการออกอากาศ สิ่งนี้ใช้งานไม่ได้กับ udp-proxy-relay-redux เนื่องจาก Roon ประพฤติตัวไม่ดีและยังคงพยายามส่ง "การออกอากาศ" ไปยังที่อยู่ .255 ซึ่งจะถูกทิ้งลงบนพื้นเนื่องจากเซิร์ฟเวอร์ VPN ของฉันไม่มีที่อยู่ xxx255 โดยพื้นฐานแล้ว บนอินเทอร์เฟซแบบจุดต่อจุด "การออกอากาศ" เหล่านี้จะถูกมองว่าเป็นแพ็กเก็ตที่ส่งไปยังโฮสต์อื่นและละเว้นโดยชอบธรรม
แทนที่จะใช้ซ็อกเก็ต UDP ปกติเพื่อฟังข้อความออกอากาศ udp-proxy-2020
ใช้ libpcap เพื่อ "ดมกลิ่น" ข้อความออกอากาศ UDP ซึ่งหมายความว่าสามารถยืดหยุ่นได้มากขึ้นเกี่ยวกับแพ็กเก็ตที่ "เห็น" เพื่อให้สามารถส่งแพ็กเก็ตเหล่านั้นผ่าน libpcap/packetjection ออกจากอินเทอร์เฟซที่กำหนดค่าอื่น ๆ ทั้งหมด ถ้าสิ่งนี้ทำให้คุณ "เอ๊ะ" ก็ยินดีต้อนรับสู่ปี 2020
ฉันกำลังเขียนสิ่งนี้ใน GoLang ดังนั้นอย่างน้อยการคอมไพล์ข้ามไปยังเราเตอร์ / ไฟร์วอลล์ Linux / FreeBSD แบบสุ่มของคุณก็เป็นเรื่องง่ายพอสมควร ไม่มี C ที่น่าเกลียดหรือพยายามติดตั้ง Python/Ruby และไลบรารี่มากมาย
นอกจากนี้: ฮ่าฮ่าฮ่าฮ่าฮ่าฮ่า! ไม่มีสิ่งใดที่เป็นจริง! ความจำเป็นต้องใช้ libpcap หมายความว่าฉันต้องข้ามการคอมไพล์โดยใช้ CGO เพราะ gopacket/pcapgo รองรับเฉพาะ Linux สำหรับการอ่านและเขียนไปยังอินเทอร์เฟซเครือข่าย (อีเธอร์เน็ต?)
รองรับระบบที่คล้าย Unix เกือบทุกระบบเนื่องจากรายการอ้างอิงเป็นเพียง libpcap
และ golang
ฉันพัฒนาบน MacOS และกำหนดเป้าหมายเฉพาะ pfSense/FreeBSD และ Ubiquiti USG, EdgeRouter และ DreamMachine/Pro เนื่องจากสิ่งเหล่านี้ค่อนข้างพบได้บ่อยในชุมชนผู้ใช้ Roon
หากคุณใช้ distro ที่ใช้ Linux RedHat หรือ Debian วิธีที่ง่ายที่สุดในการติดตั้งคือการหยิบไฟล์ .rpm
หรือ .deb
ที่เหมาะสม และติดตั้งด้วยตัวจัดการแพ็คเกจของคุณ จากนั้นแก้ไข /etc/udp-proxy-2020.conf
และเริ่มผ่าน: systemctl start udp-proxy-2020
นอกจากนี้ยังมีอิมเมจนักเทียบท่าสำหรับ Linux บน AMD64 และ ARM64 (เช่น Ubiquiti UDM)
โปรดทราบว่าสำหรับการปรับใช้ Docker คุณควรใช้เครือข่ายโฮสต์
ฉันเผยแพร่ไบนารีสำหรับ Linux, FreeBSD (pfSense) และ MacOS สำหรับฮาร์ดแวร์ Intel, ARM และ MIPS
ขณะนี้มีคำแนะนำและสคริปต์เริ่มต้นใช้งานอยู่ในไดเร็กทอรีสคริปต์เริ่มต้น หากคุณทราบวิธีเพิ่มการสนับสนุนสำหรับแพลตฟอร์มอื่น โปรดส่งคำขอดึงมาให้ฉัน!
เรียกใช้ udp-proxy-2020 --help
เพื่อดูรายการตัวเลือกบรรทัดคำสั่งปัจจุบัน
นอกจากนี้ โปรดทราบว่าในระบบปฏิบัติการหลายระบบ คุณจะต้องรันระบบปฏิบัติการดังกล่าวในฐานะผู้ใช้ root
ระบบ Linux สามารถเลือกให้ความสามารถ CAP_NET_RAW
ได้
ขณะนี้มีแฟล็กเพียงไม่กี่รายการที่คุณต้องกังวล:
--interface
-- ระบุอินเทอร์เฟซเครือข่ายตั้งแต่ 2 รายการขึ้นไปเพื่อรับฟัง--port
-- ระบุพอร์ต UDP หนึ่งพอร์ตขึ้นไปเพื่อตรวจสอบ--level
-- ระบุระดับบันทึก: [trace|debug|warn|info|error]ตัวเลือกขั้นสูง:
--fixed-ip
-- Hardcode @ เพื่อส่งการรับส่งข้อมูลไปเสมอ มีประโยชน์สำหรับสิ่งต่าง ๆ เช่น OpenVPN ในโหมดไซต์ต่อไซต์--timeout
-- จำนวน ms สำหรับค่าการหมดเวลา pcap (ค่าเริ่มต้นคือ 250ms)--cache-ttl
-- จำนวนนาทีในการแคช IP (ค่าเริ่มต้นคือ 180 นาที / 3 ชั่วโมง) ค่านี้อาจจำเป็นต้องเพิ่มขึ้นหากคุณมีปัญหาในการส่งทราฟฟิกไปยังไคลเอนต์บนอุโมงค์ OpenVPN หากคุณไม่สามารถใช้ --fixed-ip
ได้ เนื่องจากไคลเอนต์ไม่มี IP คงที่--no-listen
-- อย่าฟังพอร์ต UDP ที่ระบุเพื่อหลีกเลี่ยงความขัดแย้ง--deliver-local
-- ส่งแพ็กเก็ตภายในเครื่องบนอินเทอร์เฟซแบบย้อนกลับ แน่นอนว่ายังมีแฟล็กอื่นอยู่ ให้รัน ./udp-proxy-2020 --help
เพื่อดูรายการทั้งหมด
ตัวอย่าง:
udp-proxy-2020 --port 9003 --interface eth0,eth0.100,eth1,tun0 --cache-ttl 300
จะส่งต่อแพ็กเก็ต udp/9003 บนอินเทอร์เฟซสี่อินเทอร์เฟซ: eth0, eth1, VLAN100 บน eth0 และ tun0 IP ไคลเอ็นต์บน tun0 จะถูกจดจำเป็นเวลา 5 นาทีเมื่อเรียนรู้แล้ว
หมายเหตุ: "การเรียนรู้" กำหนดให้ไคลเอนต์ส่งข้อความ udp/9003 ก่อน! หากแอปพลิเคชันของคุณต้องการให้ส่งข้อความ ถึง ไคลเอ็นต์ก่อน คุณจะต้องระบุ --fixed-ip=1.2.3.4@tun0
โดยที่ 1.2.3.4
คือที่อยู่ IP ของไคลเอ็นต์บน tun0
ฉันได้ทดสอบการกำหนดค่า VPN "road Warrior" ด้วยไคลเอ็นต์ Roon ที่ทำงานบนแล็ปท็อปของฉันและเชื่อมต่อกลับไปยังไฟร์วอลล์ที่บ้านของฉันผ่าน OpenVPN และ Wireguard ฉันใช้ Wireguard เป็นการส่วนตัวแทน OpenVPN เพราะมันปลอดภัยกว่าและมีประสิทธิภาพดีกว่า
ฉันยังได้ทดสอบ Site-to-Site VPN โดยใช้ Wireguard + pfSense ฉันทำตามคำแนะนำของ pfSense site-to-site Wireguard VPN และติดตั้ง udp-proxy-2020
บนไฟร์วอลล์ ทั้งสองตัว คุณต้องกำหนดค่าตัวเลือก --interface
เพื่อรวมทั้งอินเทอร์เฟซเครือข่าย LAN และ Wireguard
หากคุณกำลังสร้างสำหรับแพลตฟอร์มเดียวกันที่คุณตั้งใจจะรัน udp-proxy-2020
คุณเพียงแค่ต้องตรวจสอบให้แน่ใจว่าคุณมี libpcap
และส่วนหัวที่จำเป็น (คุณอาจต้องใช้แพ็คเกจ -dev
สำหรับสิ่งนั้น) และเรียกใช้ make
หรือ gmake
ตามความเหมาะสม ( เราต้องการ GNU Make ไม่ใช่ BSD Make)
หากคุณต้องการสร้างข้ามแพลตฟอร์ม หนึ่งในเป้าหมายต่อไปนี้อาจช่วยคุณได้:
make linux-amd64
ผ่าน Dockermake linux-mips64
(Linux/MIPS64 big-endian สำหรับ Ubiquiti USG/EdgeRouter) ผ่าน Dockermake linux-arm
ผ่าน Docker:make freebsd
(pfSense 2.6) ผ่าน Vagrant & VirtualBoxmake docker
คุณสามารถรับรายการเป้าหมาย make และข้อมูลพื้นฐานเกี่ยวกับเป้าหมายเหล่านั้นได้โดยการเรียกใช้: make help
เริ่มต้นด้วย v0.0.11 โดยค่าเริ่มต้น udp-proxy-2020
จะสร้างซ็อกเก็ตการฟัง UDP บน --port
ที่ระบุ สิ่งนี้จะป้องกันไม่ให้ระบบปฏิบัติการพื้นฐานออกข้อความ ICMP Port Unreachable ซึ่งสามารถทำลายไคลเอนต์บางตัวได้ (โดยเฉพาะไคลเอนต์ Roon iOS)
ครั้งเดียวที่คุณควรใช้แฟล็ก --no-listen
คือหากมีซอฟต์แวร์อื่นที่ทำงานบนโฮสต์เดียวกันกับ udp-proxy-2020
ตั้งแต่เวอร์ชัน 0.1.0 ใช่ คุณต้องระบุตัวเลือก --deliver-local
และ --no-listen
เพื่อที่จะส่งแพ็กเก็ตผ่านอินเทอร์เฟซแบบย้อนกลับ
แฟล็กเหล่านี้มีไว้สำหรับการดีบักปัญหากับ udp-proxy-2020
คุณควรใช้แฟล็กเหล่านี้เมื่อฉันสั่งให้คุณทำเช่นนั้นโดยเป็นส่วนหนึ่งของตั๋วที่คุณเปิดสำหรับ udp-proxy-2020
จากหน้าเผยแพร่บน Github
ไม่ มันไม่ใช่พร็อกซี มันเหมือนกับเราเตอร์มากกว่า คุณไม่จำเป็นต้องทำการเปลี่ยนแปลงใดๆ นอกเหนือจากการเรียกใช้บนเราเตอร์/ไฟร์วอลล์ที่บ้านของคุณ
จริงๆ แล้วฉันไม่ได้คิดมากเกี่ยวกับชื่อนี้มากนัก และนี่คือสิ่งแรกที่เข้ามาในใจฉัน อีกทั้งการตั้งชื่อก็ยากเช่นกัน
tun
อินเทอร์เฟซ เช่นเดียวกับที่ใช้โดย OpenVPNraw
เช่นเดียวกับที่ใช้โดย Wireguardvti
สำหรับ IPSec แบบไซต์ต่อไซต์โปรดทราบว่าอุโมงค์ L2TP VPN บน Linux เข้ากันไม่ได้กับ udp-proxy-2020 เนื่องจากเคอร์เนล Linux เปิดเผยอินเทอร์เฟซเหล่านั้นเป็น Linux SLL ซึ่งไม่ได้ให้การถอดรหัสแพ็กเก็ตที่แม่นยำ
ฉันไม่ได้ทำสิ่งนี้ด้วยตัวเอง แต่ Bart Verhoeven ในฟอรัม Roon Community ได้เขียนรายละเอียดวิธีการไว้อย่างละเอียด
udp-proxy-2020 สร้างขึ้นสำหรับหลายระบบปฏิบัติการและแพลตฟอร์มฮาร์ดแวร์:
darwin-amd64
linux-amd64
linux-arm64
(RasPi 2 V1.2 ขึ้นไป, Ubiquiti UniFi Dream Machine)linux-armv7
(RasPi 2 V1.1 และต่ำกว่า)linux-armv6
linux-armv5
linux-mips64
(Ubiquiti USG/EdgeRouter)freebsd-amd64
(ทำงานร่วมกับ pfSense บน x86)freebsd-arm64
(Netgate SG-1100 และ SG-2100)freebsd-armv7
(Netgate SG-3100)จริงๆ แล้ว เพียงส่งอีเมลถึงฉันเพื่อบอกว่าขอบคุณหรือ "ติดดาว" โปรเจ็กต์นี้ใน GitHub ก็เพียงพอแล้ว
บางครั้งมีคนถามว่าจะให้เงินฉันสองสามเหรียญ แต่ฉันไม่ต้องการเงินเลย หากคุณยังคงต้องการทุ่มเงินสักสองสามเหรียญให้กับฉัน ฉันอยากจะบริจาคให้กับ Second Harvest Food Bank ซึ่งเป็นท้องถิ่นของฉันมากกว่า และจะนำเงินของคุณไปใช้เพื่อการทำงานที่ดีกว่าฉัน