Skip to content

feat: support comp-lzo for OpenVPN#2841

Merged
wwqgtxx merged 4 commits into
MetaCubeX:Alphafrom
zhangzqs:feat/comp-lzo
May 30, 2026
Merged

feat: support comp-lzo for OpenVPN#2841
wwqgtxx merged 4 commits into
MetaCubeX:Alphafrom
zhangzqs:feat/comp-lzo

Conversation

@zhangzqs

Copy link
Copy Markdown

Summary

  • Add comp-lzo config option for OpenVPN proxy to support LZO compression
  • Fix data packets not being routed through OpenVPN servers with comp-lzo enabled

Problem

When connecting to OpenVPN servers with comp-lzo enabled, the handshake succeeds but data transfer fails. The server expects all data packets to include a 1-byte LZO compression header, but mihomo was sending raw IP packets without it.

Root Cause

  1. Sending: No LZO header prepended to outgoing packets → server drops them
  2. Receiving: Cannot decompress LZO-compressed packets from server → responses lost

Changes

  • transport/openvpn/config.go: Add CompLZO field to ClientConfig struct
  • transport/openvpn/lzo.go: New file - pure Go LZO1X decompression using github.com/rasky/go-lzo
  • transport/openvpn/data.go: Add LZO header (0xfa) to outgoing packets when comp-lzo is enabled; decompress incoming LZO-compressed packets (0x66)
  • transport/openvpn/keymethod.go: Add IV_LZO=1 to peer info and comp-lzo to options string when enabled
  • transport/openvpn/client.go: Use new comp-lzo aware functions
  • transport/openvpn/push.go: Parse route and route-ipv6 from server push reply
  • adapter/outbound/openvpn.go: Add comp-lzo config option, convert string to bool

Config Example

proxies:
  - name: my-openvpn
    type: openvpn
    server: vpn.example.com
    port: 1194
    proto: tcp
    username: user
    password: pass
    comp-lzo: "yes"  # "yes", "no", or "adaptive"
    ca: |
      -----BEGIN CERTIFICATE-----
      ...
      -----END CERTIFICATE-----

Testing

Verified against a real OpenVPN server with comp-lzo enabled:

  • Handshake: ✅ succeeds
  • Health check: ✅ alive, 73-284ms
  • HTTP request through tunnel: ✅ returns valid response

Dependencies

Pure Go, no CGO required. Uses github.com/rasky/go-lzo for LZO decompression.

- Add `comp-lzo` config option for OpenVPN proxy (values: "yes", "no", "adaptive")
- Send LZO header (0xfa) with outgoing packets when comp-lzo enabled
- Use github.com/rasky/go-lzo (pure Go, no CGO) for LZO decompression
- Parse server-pushed routes from PUSH_REPLY
- Add IV_LZO=1 to peer info when enabled
- Add comp-lzo to OpenVPN options string
@wwqgtxx wwqgtxx changed the title feat(openvpn): add comp-lzo support feat: support comp-lzo for OpenVPN May 30, 2026
@wwqgtxx wwqgtxx merged commit fc8c5a2 into MetaCubeX:Alpha May 30, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants