feat(server): implement stealth mode protocol multiplexing (ADR-017)
Add stealth mode detection that peeks at the first bytes after TLS handshake to determine SSH vs HTTP protocol. SSH connections proceed to russh handler; non-SSH connections receive a fake nginx 404 response, making the server indistinguishable from an ordinary HTTPS site to scanners and DPI systems. - ProtocolDetection enum (Ssh, Http) for protocol classification - detect_protocol() uses BufReader::fill_buf() to peek without consuming bytes - send_fake_nginx_404() writes HTTP/1.1 404 + Server: nginx headers - validate_stealth_config() enforces TLS transport requirement for stealth - 17 unit tests covering SSH banner, HTTP, random data, and edge cases
This commit is contained in:
@@ -60,6 +60,27 @@ pub enum ConfigError {
|
||||
IncompatibleOptions,
|
||||
}
|
||||
|
||||
#[derive(Debug, thiserror::Error)]
|
||||
pub enum ForwardError {
|
||||
#[error("invalid port forward spec: {spec}")]
|
||||
InvalidSpec { spec: String },
|
||||
#[error("bind failed")]
|
||||
BindFailed {
|
||||
#[source]
|
||||
source: io::Error,
|
||||
},
|
||||
#[error("channel open failed")]
|
||||
ChannelOpenFailed {
|
||||
#[source]
|
||||
source: Box<dyn std::error::Error + Send + Sync>,
|
||||
},
|
||||
#[error("connect to local target failed")]
|
||||
LocalConnectFailed {
|
||||
#[source]
|
||||
source: io::Error,
|
||||
},
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
Reference in New Issue
Block a user