feat: updates

This commit is contained in:
2024-03-24 20:53:50 +08:00
parent db37ba5fd3
commit 9696af7a50
6 changed files with 98 additions and 23 deletions

11
Cargo.lock generated
View File

@@ -146,6 +146,12 @@ version = "0.21.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567"
[[package]]
name = "base64"
version = "0.22.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9475866fec1451be56a3c2400fd081ff546538961565ccb5b7142cbd22bc7a51"
[[package]] [[package]]
name = "bitflags" name = "bitflags"
version = "1.3.2" version = "1.3.2"
@@ -1364,6 +1370,7 @@ name = "proxy-inspector"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"base64 0.22.0",
"http 1.1.0", "http 1.1.0",
"log", "log",
"pingora", "pingora",
@@ -1455,7 +1462,7 @@ version = "0.11.27"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62"
dependencies = [ dependencies = [
"base64", "base64 0.21.7",
"bytes", "bytes",
"encoding_rs", "encoding_rs",
"futures-core", "futures-core",
@@ -1570,7 +1577,7 @@ version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c"
dependencies = [ dependencies = [
"base64", "base64 0.21.7",
] ]
[[package]] [[package]]

View File

@@ -13,3 +13,4 @@ async-trait = "0.1"
log = "0.4" log = "0.4"
http = "1.1" http = "1.1"
structopt = "0.3" structopt = "0.3"
base64 = "0.22.0"

View File

@@ -1,2 +1,7 @@
# proxy-inspector # proxy-inspector
TODOs
* Dynamic issue certificate

View File

@@ -1,6 +1,9 @@
use async_trait::async_trait; use async_trait::async_trait;
use base64::Engine;
use base64::engine::general_purpose::STANDARD;
use http::HeaderName; use http::HeaderName;
use log::debug; use log::{debug, info};
use pingora::{Error, ErrorType};
use pingora::prelude::{HttpPeer, ProxyHttp, Result, Session}; use pingora::prelude::{HttpPeer, ProxyHttp, Result, Session};
use super::service::HostConfig; use super::service::HostConfig;
@@ -28,6 +31,10 @@ impl ProxyHttp for ProxyApp {
.expect("get host from http header failed"); .expect("get host from http header failed");
debug!("host header: {host_header}"); debug!("host header: {host_header}");
if host_header == "localhost" || host_header.starts_with("localhost:") {
return Err(Error::new(ErrorType::CustomCode("bad host", 400)));
}
let host_config = self let host_config = self
.host_configs .host_configs
.iter() .iter()
@@ -41,4 +48,34 @@ impl ProxyHttp for ProxyApp {
let peer = Box::new(proxy_to); let peer = Box::new(proxy_to);
Ok(peer) Ok(peer)
} }
async fn request_filter(&self, session: &mut Session, _ctx: &mut Self::CTX) -> Result<bool>
where Self::CTX: Send + Sync,
{
let request_header = session.req_header();
let mut req = String::with_capacity(512);
req.push_str(request_header.method.as_str());
req.push(' ');
req.push_str(&request_header.uri.to_string());
req.push(' ');
req.push_str(&format!("{:?}\n", request_header.version));
let header_len = request_header.headers.len();
request_header.headers.iter().enumerate().for_each(|(i, (n, v))| {
req.push_str(
&format!("{}: {}{}",
n.as_str(),
v.to_str().unwrap_or("ERROR!BAD-VALUE!"),
if i < header_len - 1 { "\n" } else { "" }
)
);
});
let body = match session.read_request_body().await {
Ok(Some(body_bytes)) => Some(STANDARD.encode(body_bytes)),
_ => None,
};
info!("Request:\n{}\n\n{}", req, body.unwrap_or_else(|| "<None>".into()));
Ok(false)
}
} }

View File

@@ -1,9 +1,9 @@
use log::{info, LevelFilter};
use pingora::{ use pingora::{
server::{configuration::Opt, Server}, server::{configuration::Opt, Server},
services::{listening::Service as ListeningService, Service}, services::{listening::Service as ListeningService, Service},
}; };
use pretty_env_logger::env_logger::Builder;
use service::HostConfig;
use structopt::StructOpt; use structopt::StructOpt;
mod app; mod app;
@@ -16,31 +16,39 @@ pub fn main() {
let mut my_server = Server::new(opt).unwrap(); let mut my_server = Server::new(opt).unwrap();
my_server.bootstrap(); my_server.bootstrap();
let proxy_service_tcp = service::proxy_service_tcp(
&my_server.configuration,
"0.0.0.0:8800",
vec![],
);
let proxy_service_ssl2 = service::proxy_service_tls( let proxy_service_ssl2 = service::proxy_service_tls(
&my_server.configuration, &my_server.configuration,
"0.0.0.0:4430", "0.0.0.0:4430",
vec![ vec![
HostConfig { // HostConfig {
proxy_addr: "127.0.0.1:4000".to_owned(), // proxy_addr: "127.0.0.1:4000".to_owned(),
proxy_tls: false, // proxy_tls: false,
proxy_hostname: "somedomain.com".to_owned(), // proxy_hostname: "somedomain.com".to_owned(),
cert_path: format!("{}/keys/some_domain_cert.crt", env!("CARGO_MANIFEST_DIR")), // cert_path: format!("{}/keys/some_domain_cert.crt", env!("CARGO_MANIFEST_DIR")),
key_path: format!("{}/keys/some_domain_key.pem", env!("CARGO_MANIFEST_DIR")), // key_path: format!("{}/keys/some_domain_key.pem", env!("CARGO_MANIFEST_DIR")),
}, // },
HostConfig { // HostConfig {
proxy_addr: "1.1.1.1:443".to_owned(), // proxy_addr: "1.1.1.1:443".to_owned(),
proxy_tls: true, // proxy_tls: true,
proxy_hostname: "one.one.one.one".to_owned(), // proxy_hostname: "one.one.one.one".to_owned(),
cert_path: format!("{}/keys/one_cert.crt", env!("CARGO_MANIFEST_DIR")), // cert_path: format!("{}/keys/one_cert.crt", env!("CARGO_MANIFEST_DIR")),
key_path: format!("{}/keys/one_key.pem", env!("CARGO_MANIFEST_DIR")), // key_path: format!("{}/keys/one_key.pem", env!("CARGO_MANIFEST_DIR")),
}, // },
], ],
); );
let mut prometheus_service_http = ListeningService::prometheus_http_service(); let mut prometheus_service_http = ListeningService::prometheus_http_service();
prometheus_service_http.add_tcp("127.0.0.1:6150"); prometheus_service_http.add_tcp("127.0.0.1:6150");
info!("start listen...");
let services: Vec<Box<dyn Service>> = vec![ let services: Vec<Box<dyn Service>> = vec![
Box::new(proxy_service_tcp),
Box::new(proxy_service_ssl2), Box::new(proxy_service_ssl2),
Box::new(prometheus_service_http), Box::new(prometheus_service_http),
]; ];
@@ -49,8 +57,12 @@ pub fn main() {
} }
fn init_logger() { fn init_logger() {
if std::env::var("RUST_LOG").is_err() { let mut builder = Builder::new();
std::env::set_var("RUST_LOG", "pingora_reverse_proxy=debug"); builder.filter_level(LevelFilter::Info);
} let _ = builder.try_init();
pretty_env_logger::init_timed();
// if std::env::var("RUST_LOG").is_err() {
// std::env::set_var("RUST_LOG", "pingora_reverse_proxy=debug");
// }
// pretty_env_logger::init_timed();
} }

View File

@@ -69,6 +69,19 @@ pub struct HostConfig {
pub key_path: String, pub key_path: String,
} }
pub fn proxy_service_tcp(
server_conf: &Arc<ServerConf>,
listen_addr: &str,
host_configs: Vec<HostConfig>,
) -> impl pingora::services::Service {
let proxy_app = ProxyApp::new(host_configs.clone());
let mut service = http_proxy_service(server_conf, proxy_app);
service.add_tcp(listen_addr);
service
}
pub fn proxy_service_tls( pub fn proxy_service_tls(
server_conf: &Arc<ServerConf>, server_conf: &Arc<ServerConf>,
listen_addr: &str, listen_addr: &str,