OpenVPN ผ่าน TLS
VPN ของคุณใช้ TCP เป็นโปรโตคอลการขนส่ง อินสแตนซ์ stunnel ใช้เพื่อสรุปเนื้อหาของสตรีม TCP ใน TLS / TCP คุณได้รับโปรโตคอลสแต็กนี้:
[IP] <------------------------> [IP]
[OpenVPN] <------------------------> [OpenVPN]
[TLS] <~~~~~> [TLS]
[TCP] <-> [TCP] <-----> [TCP] <-> [TCP]
[IP] <-> [IP] <-----> [IP] <-> [IP]
[] [] [] []
เซิร์ฟเวอร์ stunnel ทำให้มึนงงไคลเอ็นต์
ระหว่างอินสแตนซ์ stunnel คุณมีโปรโตคอลสแต็กนี้บน wire:
[IP]
[OpenVPN]
[TLS]
[TCP (443)]
[IP]
[... ]
เมื่อ TLS เข้ารหัสส่วนของข้อมูลผู้โจมตีจะเห็นเฉพาะ:
[??? ]
[TLS]
[TCP (443)]
[IP]
[... ]
ดังนั้นใช่มันเป็นการรับส่งข้อมูล TLS ธรรมดา (อาจเป็น HTTP / TLS, SMTP / TLS, POP / TLS หรืออย่างอื่นสำหรับคนที่ดูการรับส่งข้อมูล แต่มันดูเหมือน HTTP / TLS มากเนื่องจากใช้พอร์ต TCP 443) คุณสามารถตรวจสอบสิ่งนี้ได้โดยใช้ wireshark: บันทึกการรับส่งข้อมูลระหว่างอินสแตนซ์ stunnel ใน wireshark UI (ปุ่มขวาบนแพ็คเก็ตของสตรีม) คุณสามารถขอ wireshark เพื่อตีความปริมาณการใช้ข้อมูลเป็น TLS: มันจะรับรู้ว่าเป็นการรับส่งข้อมูล TLS (คุณจะเห็นข้อความ TLS ที่แตกต่างกัน แต่ไม่ใช่ payload ของเซสชัน TLS) .
คุณอาจต้องการใช้SNIในไคลเอนต์เพื่อให้ดูเหมือนว่าเบราว์เซอร์สมัยใหม่จะทำอะไร คุณอาจต้องการใช้ALPNด้วยเช่นกัน แต่ stunnel ในปัจจุบันไม่สามารถจัดการได้
OpenVPN พร้อม TLS ในตัว
ในการเปรียบเทียบหากคุณใช้ OpenVPN คุณจะมีดังนี้:
[IP]
[OpenVPN]
[TCP]
[IP]
[... ]
ซึ่งมีลักษณะเช่นนี้:
[??? ]
[OpenVPN]
[TCP]
[IP]
[... ]
เลเยอร์ TLS ในตัวไม่ได้ห่อหุ้มแพ็กเกจ (IP, Ethernet) แต่ใช้สำหรับตั้งค่าเซสชันและตรวจสอบสิทธิ์เท่านั้น:
[TLS]
[OpenVPN]
[TCP]
[IP]
[... ]
ในกรณีนี้การรับส่งข้อมูลของคุณจะไม่เหมือนการรับส่งข้อมูล TLS ธรรมดา แต่เห็นได้ชัดว่าเป็น OpenVPN หากคุณตีความการรับส่งข้อมูลนี้เป็น OpenVPN ใน wireshark คุณจะจดจำข้อความ OpenVPN และภายในข้อความ TLS (แต่ไม่ใช่เพย์โหลด)
คำเตือน
คุณควรทราบว่าหากผู้โจมตีแฝงจะไม่สามารถบอกได้ว่าเซิร์ฟเวอร์ระยะไกลของคุณเป็นเซิร์ฟเวอร์ OpenVPN ผู้โจมตีที่ใช้งานจะสามารถค้นพบสิ่งนี้ได้ง่ายๆเพียงเชื่อมต่อกับเซิร์ฟเวอร์ของคุณผ่าน TLS เขาจะสามารถ เพื่อยืนยันว่าไม่ใช่เซิร์ฟเวอร์ HTTP / TLS โดยพยายามพูดโปรโตคอล OpenVPN เขาจะสามารถตรวจพบว่าเซิร์ฟเวอร์ของคุณเป็นเซิร์ฟเวอร์ OpenVPN / TLS
OpenVPN บน TLS ด้วยการตรวจสอบสิทธิ์ลูกค้า
คุณกังวลเกี่ยวกับสิ่งนี้ว่าคุณสามารถเปิดใช้งานการตรวจสอบความถูกต้องของไคลเอนต์ TLS: ผู้โจมตีจะไม่สามารถเริ่มเซสชัน TLS ที่ใช้งานได้และจะไม่สามารถเดาได้ว่าเพย์โหลดใดถูกห่อหุ้มบน TLS
* คำเตือน: ** ฉันไม่ได้พูดถึงการสนับสนุน TLS ในตัวใน OpenVPN (ดูคำอธิบายด้านบนเกี่ยวกับสาเหตุที่ไม่สามารถช่วยคุณได้)
มัลติเพล็กซ์ OpenVPN / TLS และ HTTP / TLS
อีกวิธีคือให้บริการทั้ง HTTP และ OpenVPN ผ่านเซสชัน TLS sslhสามารถใช้เพื่อตรวจหา payload ของโปรโตคอลโดยอัตโนมัติและส่งไปยังเซิร์ฟเวอร์ HTTP / TCP ธรรมดาหรือเซิร์ฟเวอร์ OpenVPN / TCP ของคุณ เซิร์ฟเวอร์จะมีลักษณะเหมือนเซิร์ฟเวอร์ HTTP / TLS มาตรฐาน แต่มีคนพยายามพูด OpenVPN / TLS ด้วยเซิร์ฟเวอร์นี้จะสามารถตรวจพบว่าในความเป็นจริงแล้วเซิร์ฟเวอร์ OpenVPN / TLS เช่นกัน
ทั้ง OpenVPN / TCP
หรือ HTTP / TCP
[1] .--------- .------. โปรโตคอล HTTP / TCP .-------------
-> | stunnel | ----> | sslh | -------> | เซิร์ฟเวอร์ HTTP
'---------' '------' | '-------------'
| .----------------
'------> | เซิร์ฟเวอร์ OpenVPN
OpenVPN / TCP '----------------'
[1] = อาจเป็น OpenVPN / TLS / TCP หรือ HTTP / TLS / TCP
OpenVPN ผ่าน HTTP CONNECT ผ่าน TLS
อีกวิธีคือใช้เซิร์ฟเวอร์ HTTP / TLS มาตรฐานและใช้ HTTP CONNECT / TLS เพื่อเชื่อมต่อกับเซิร์ฟเวอร์ OpenVPN: มันจะดูเหมือนเซิร์ฟเวอร์ HTTP มาตรฐาน คุณสามารถแม้แต่ต้องการการรับรองความถูกต้องของไคลเอนต์เพื่ออนุญาตการร้องขอ HTTP CONNECT (ปลาหมึกควรทำเช่นนี้)
OpenVPN มีตัวเลือกให้ใช้ HTTP Proxy:
http-proxy proxy.example.com
คุณควรจะสามารถรวมสิ่งนี้กับอินสแตนซ์ stunnel ที่เชื่อมต่อกับ HTTPS PROXY ระยะไกล:
http-proxy 127.0.0.1 8443
remote vpn.example.com
ซึ่งจะใช้โปรโตคอลสแต็กนี้:
[IP] <------------------------> [IP]
[OpenVPN] <------------------------> [OpenVPN]
[HTTP] <-------------> [HTTP]
[TLS] <~~~~~> [TLS]
[TCP] <-> [TCP] <-----> [TCP] <-> [TCP]
[IP] <-> [IP] <-----> [IP] <-> [IP]
[] [] [] []
เซิร์ฟเวอร์ HTTPS PROXY สตันลูกค้า