Skip to main content

QuicMitmRelay

Struct QuicMitmRelay 

pub struct QuicMitmRelay<Issuer> { /* private fields */ }
Available on crate features quic and std only.
Expand description

Terminates a QUIC association whose ClientHello was peeked, using the egress socket the producer prepared for its origin: the QUIC counterpart of the TLS MITM relay.

The client’s attempt is admitted on the ingress socket first, by default only once a Retry validated its address, and only if it carries the ClientHello that was peeked. Then the origin handshake runs over the egress socket, with the client’s QUIC version, server name and the offered protocols the egress TLS configuration allows, in the client’s order. The origin’s certificate is mirrored by the BoringMitmCertIssuer, and the client is accepted with it and the protocol the origin selected; a failure refuses the client. No origin handshake or issuance runs for an unvalidated address. The inner service owns both established connections; this service closes them only when establishment fails. Early data is disabled on both hops, so a client’s 0-RTT is rejected and resent after the handshake. All of it shares one deadline, fixed when serve is called.

The origin sees the client’s own first flight as far as this relay can reproduce it; see Self::with_mirror_client.

An origin requesting a client certificate is answered by the TlsMitmClientAuthPolicy (a flow’s own extension overrides the relay’s): its plan configures the ingress handshake, and its credential is released to the origin only once that handshake completed, with proof of possession of any certificate the client presented. Without a policy, a certificate request fails the association.

Destination selection is the producer’s: this service dials nothing but the egress socket’s peer, and the received server name never changes where traffic goes.

Implementations§

§

impl<Issuer> QuicMitmRelay<Issuer>

pub fn new( issuer: Issuer, exec: Executor, egress_tls: TlsClientConfig, failure_code: VarInt, ) -> QuicMitmRelay<Issuer>

Verify origins with egress_tls, whose ALPN list (when set) bounds what is offered upstream, and close failed associations with application error failure_code. Datagrams are disabled on both hops until both transports enable them.

pub fn with_mirror_client(self, mirror: bool) -> QuicMitmRelay<Issuer>

Whether the origin sees the client’s own first flight instead of the egress configuration’s (default: on). The ClientHello is mirrored without values the native TLS engine cannot negotiate and with GREASE codepoints pinned, the configured egress TLS layered over it (its trust and every setting it names win); the transport parameters keep the client’s order, greased parameter, extra parameters and limits, while connection IDs stay fresh. Receive windows, stream counts and the idle timeout are lowered to Self::with_mirror_ceiling and the egress transport’s idle timeout, and a datagram parameter is dropped unless both transports carry datagrams. A ClientHello or transport profile this relay cannot reproduce (including one whose peek did not retain the Initial structure) falls back to the egress configuration for that layer. Every change is traced.

pub fn set_mirror_client(&mut self, mirror: bool) -> &mut QuicMitmRelay<Issuer>

Whether the origin sees the client’s own first flight instead of the egress configuration’s (default: on). The ClientHello is mirrored without values the native TLS engine cannot negotiate and with GREASE codepoints pinned, the configured egress TLS layered over it (its trust and every setting it names win); the transport parameters keep the client’s order, greased parameter, extra parameters and limits, while connection IDs stay fresh. Receive windows, stream counts and the idle timeout are lowered to Self::with_mirror_ceiling and the egress transport’s idle timeout, and a datagram parameter is dropped unless both transports carry datagrams. A ClientHello or transport profile this relay cannot reproduce (including one whose peek did not retain the Initial structure) falls back to the egress configuration for that layer. Every change is traced.

pub fn with_mirror_ceiling( self, ceiling: QuicMirrorCeiling, ) -> QuicMitmRelay<Issuer>

The most a mirrored client may make the relay hold on its egress connection.

pub fn set_mirror_ceiling( &mut self, ceiling: QuicMirrorCeiling, ) -> &mut QuicMitmRelay<Issuer>

The most a mirrored client may make the relay hold on its egress connection.

pub fn maybe_with_client_auth( self, policy: Option<TlsMitmClientAuthPolicy>, ) -> QuicMitmRelay<Issuer>

The client-authentication policy for origins requesting a certificate. A flow’s own TlsMitmClientAuthPolicy extension overrides it.

pub fn maybe_set_client_auth( &mut self, policy: Option<TlsMitmClientAuthPolicy>, ) -> &mut QuicMitmRelay<Issuer>

The client-authentication policy for origins requesting a certificate. A flow’s own TlsMitmClientAuthPolicy extension overrides it.

pub fn with_client_auth( self, policy: TlsMitmClientAuthPolicy, ) -> QuicMitmRelay<Issuer>

The client-authentication policy for origins requesting a certificate. A flow’s own TlsMitmClientAuthPolicy extension overrides it.

pub fn set_client_auth( &mut self, policy: TlsMitmClientAuthPolicy, ) -> &mut QuicMitmRelay<Issuer>

The client-authentication policy for origins requesting a certificate. A flow’s own TlsMitmClientAuthPolicy extension overrides it.

pub fn without_client_auth(self) -> QuicMitmRelay<Issuer>

The client-authentication policy for origins requesting a certificate. A flow’s own TlsMitmClientAuthPolicy extension overrides it.

pub fn unset_client_auth(&mut self) -> &mut QuicMitmRelay<Issuer>

The client-authentication policy for origins requesting a certificate. A flow’s own TlsMitmClientAuthPolicy extension overrides it.

pub fn with_ingress_transport( self, transport: Arc<TransportConfig>, ) -> QuicMitmRelay<Issuer>

Transport limits advertised to the client.

pub fn set_ingress_transport( &mut self, transport: Arc<TransportConfig>, ) -> &mut QuicMitmRelay<Issuer>

Transport limits advertised to the client.

pub fn with_egress_transport( self, transport: Arc<TransportConfig>, ) -> QuicMitmRelay<Issuer>

Transport limits advertised to the origin.

pub fn set_egress_transport( &mut self, transport: Arc<TransportConfig>, ) -> &mut QuicMitmRelay<Issuer>

Transport limits advertised to the origin.

pub fn with_handshake_timeout(self, timeout: Duration) -> QuicMitmRelay<Issuer>

The budget for both handshakes and certificate issuance, from serve. Defaults to DEFAULT_QUIC_MITM_HANDSHAKE_TIMEOUT.

pub fn set_handshake_timeout( &mut self, timeout: Duration, ) -> &mut QuicMitmRelay<Issuer>

The budget for both handshakes and certificate issuance, from serve. Defaults to DEFAULT_QUIC_MITM_HANDSHAKE_TIMEOUT.

pub fn with_validate_address(self, validate: bool) -> QuicMitmRelay<Issuer>

Whether a Retry validates the client’s address before any origin work runs (the default). Without it, a spoofed first flight costs an origin handshake and issuance.

pub fn set_validate_address( &mut self, validate: bool, ) -> &mut QuicMitmRelay<Issuer>

Whether a Retry validates the client’s address before any origin work runs (the default). Without it, a spoofed first flight costs an origin handshake and issuance.

Trait Implementations§

§

impl<Issuer> Clone for QuicMitmRelay<Issuer>
where Issuer: Clone,

§

fn clone(&self) -> QuicMitmRelay<Issuer>

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
§

impl<Issuer> Debug for QuicMitmRelay<Issuer>
where Issuer: Debug,

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl<Issuer, S> Layer<S> for QuicMitmRelay<Issuer>
where Issuer: Clone,

§

type Service = QuicMitmRelayService<Issuer, S>

The service produced by the layer.
§

fn layer(&self, inner: S) -> <QuicMitmRelay<Issuer> as Layer<S>>::Service

Wrap the given service with the middleware, returning a new service.
§

fn into_layer(self, inner: S) -> <QuicMitmRelay<Issuer> as Layer<S>>::Service

Same as layer but consuming self after the service was created. Read more

Auto Trait Implementations§

§

impl<Issuer> !RefUnwindSafe for QuicMitmRelay<Issuer>

§

impl<Issuer> !UnwindSafe for QuicMitmRelay<Issuer>

§

impl<Issuer> Freeze for QuicMitmRelay<Issuer>
where Issuer: Freeze,

§

impl<Issuer> Send for QuicMitmRelay<Issuer>
where Issuer: Send,

§

impl<Issuer> Sync for QuicMitmRelay<Issuer>
where Issuer: Sync,

§

impl<Issuer> Unpin for QuicMitmRelay<Issuer>
where Issuer: Unpin,

§

impl<Issuer> UnsafeUnpin for QuicMitmRelay<Issuer>
where Issuer: UnsafeUnpin,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> FromRef<T> for T
where T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
§

impl<T> FutureExt for T

§

fn with_context(self, otel_cx: Context) -> WithContext<Self> ⓘ

Attaches the provided Context to this type, returning a WithContext wrapper. Read more
§

fn with_current_context(self) -> WithContext<Self> ⓘ

Attaches the current Context to this type, returning a WithContext wrapper. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
§

impl<T> IntoRequest<T> for T

§

fn into_request(self) -> Request<T>

Wrap the input message T in a rama_grpc::Request
§

impl<L> LayerExt<L> for L

§

fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>
where L: Layer<S>,

Applies the layer to a service and wraps it in Layered.
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> PolicyExt for T
where T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
§

impl<T, U> RamaFrom<T> for U
where U: From<T>,

§

fn rama_from(value: T) -> U

§

impl<T, U, CrateMarker> RamaInto<U, CrateMarker> for T
where U: RamaFrom<T, CrateMarker>,

§

fn rama_into(self) -> U

§

impl<T, U> RamaTryFrom<T> for U
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

§

fn rama_try_from(value: T) -> Result<U, <U as RamaTryFrom<T>>::Error>

§

impl<T, U, CrateMarker> RamaTryInto<U, CrateMarker> for T
where U: RamaTryFrom<T, CrateMarker>,

§

type Error = <U as RamaTryFrom<T, CrateMarker>>::Error

§

fn rama_try_into(self) -> Result<U, <U as RamaTryFrom<T, CrateMarker>>::Error>

§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<V, F> ValueFormatter<&V> for F
where F: ValueFormatter<V> + ?Sized, V: ?Sized,

§

const SHAPE: FieldShape<'static>

Available on non-metrique_require_explicit_impls only.
The shape of values produced by this formatter. Read more
§

fn format_value(writer: impl ValueWriter, value: &&V)

Write value to writer
§

impl<V, F> ValueFormatter<Arc<V>> for F
where F: ValueFormatter<V> + ?Sized, V: ?Sized,

§

const SHAPE: FieldShape<'static>

Available on non-metrique_require_explicit_impls only.
The shape of values produced by this formatter. Read more
§

fn format_value(writer: impl ValueWriter, value: &Arc<V>)

Write value to writer
§

impl<V, F> ValueFormatter<Box<V>> for F
where F: ValueFormatter<V> + ?Sized, V: ?Sized,

§

const SHAPE: FieldShape<'static>

Available on non-metrique_require_explicit_impls only.
The shape of values produced by this formatter. Read more
§

fn format_value(writer: impl ValueWriter, value: &Box<V>)

Write value to writer
§

impl<V, F> ValueFormatter<Cow<'_, V>> for F
where V: ToOwned + ?Sized, F: ValueFormatter<V> + ?Sized,

§

const SHAPE: FieldShape<'static>

Available on non-metrique_require_explicit_impls only.
The shape of values produced by this formatter. Read more
§

fn format_value(writer: impl ValueWriter, value: &Cow<'_, V>)

Write value to writer
§

impl<V, F> ValueFormatter<Option<V>> for F
where F: ValueFormatter<V> + ?Sized,

§

const SHAPE: FieldShape<'static>

Available on non-metrique_require_explicit_impls only.
The shape of values produced by this formatter. Read more
§

fn format_value(writer: impl ValueWriter, value: &Option<V>)

Write value to writer
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more