add explore
example
This commit is contained in:
parent
9d3d405af5
commit
86284cce4b
22
Cargo.lock
generated
22
Cargo.lock
generated
|
@ -88,6 +88,16 @@ version = "0.8.6"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f"
|
||||
|
||||
[[package]]
|
||||
name = "ctrlc"
|
||||
version = "3.4.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b467862cc8610ca6fc9a1532d7777cee0804e678ab45410897b9396495994a0b"
|
||||
dependencies = [
|
||||
"nix",
|
||||
"windows-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "darling"
|
||||
version = "0.20.5"
|
||||
|
@ -137,6 +147,7 @@ dependencies = [
|
|||
name = "dns-test"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"ctrlc",
|
||||
"minijinja",
|
||||
"serde",
|
||||
"serde_json",
|
||||
|
@ -303,6 +314,17 @@ dependencies = [
|
|||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nix"
|
||||
version = "0.27.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053"
|
||||
dependencies = [
|
||||
"bitflags 2.4.2",
|
||||
"cfg-if",
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-conv"
|
||||
version = "0.1.0"
|
||||
|
|
|
@ -15,3 +15,6 @@ url = "2.5.0"
|
|||
|
||||
[lib]
|
||||
doctest = false
|
||||
|
||||
[dev-dependencies]
|
||||
ctrlc = "3.4.2"
|
||||
|
|
116
packages/dns-test/examples/explore.rs
Normal file
116
packages/dns-test/examples/explore.rs
Normal file
|
@ -0,0 +1,116 @@
|
|||
use std::sync::mpsc;
|
||||
|
||||
use dns_test::client::Client;
|
||||
use dns_test::name_server::NameServer;
|
||||
use dns_test::record::RecordType;
|
||||
use dns_test::zone_file::Root;
|
||||
use dns_test::{Network, Resolver, Result, TrustAnchor, FQDN};
|
||||
|
||||
fn main() -> Result<()> {
|
||||
let network = Network::new()?;
|
||||
|
||||
println!("building docker image...");
|
||||
let mut root_ns = NameServer::new(FQDN::ROOT, &network)?;
|
||||
println!("DONE");
|
||||
|
||||
println!("setting up name servers...");
|
||||
let mut com_ns = NameServer::new(FQDN::COM, &network)?;
|
||||
|
||||
let mut nameservers_ns = NameServer::new(FQDN("nameservers.com.")?, &network)?;
|
||||
nameservers_ns
|
||||
.a(root_ns.fqdn().clone(), root_ns.ipv4_addr())
|
||||
.a(com_ns.fqdn().clone(), com_ns.ipv4_addr());
|
||||
let nameservers_ns = nameservers_ns.sign()?;
|
||||
let nameservers_ds = nameservers_ns.ds().clone();
|
||||
let nameservers_ns = nameservers_ns.start()?;
|
||||
|
||||
com_ns
|
||||
.referral(
|
||||
nameservers_ns.zone().clone(),
|
||||
nameservers_ns.fqdn().clone(),
|
||||
nameservers_ns.ipv4_addr(),
|
||||
)
|
||||
.ds(nameservers_ds);
|
||||
let com_ns = com_ns.sign()?;
|
||||
let com_ds = com_ns.ds().clone();
|
||||
let com_ns = com_ns.start()?;
|
||||
|
||||
root_ns
|
||||
.referral(FQDN::COM, com_ns.fqdn().clone(), com_ns.ipv4_addr())
|
||||
.ds(com_ds);
|
||||
let root_ns = root_ns.sign()?;
|
||||
let root_ksk = root_ns.key_signing_key().clone();
|
||||
let root_zsk = root_ns.zone_signing_key().clone();
|
||||
|
||||
let root_ns = root_ns.start()?;
|
||||
|
||||
let roots = &[Root::new(root_ns.fqdn().clone(), root_ns.ipv4_addr())];
|
||||
println!("DONE");
|
||||
|
||||
let trust_anchor = TrustAnchor::from_iter([root_ksk.clone(), root_zsk.clone()]);
|
||||
println!("building docker image...");
|
||||
let resolver = Resolver::start(dns_test::subject(), roots, &trust_anchor, &network)?;
|
||||
println!("DONE\n\n");
|
||||
|
||||
let resolver_addr = resolver.ipv4_addr();
|
||||
let client = Client::new(&network)?;
|
||||
// generate `/etc/bind.keys`
|
||||
client.delv(resolver_addr, RecordType::SOA, &FQDN::ROOT, &trust_anchor)?;
|
||||
|
||||
let (tx, rx) = mpsc::channel();
|
||||
|
||||
ctrlc::set_handler(move || tx.send(()).expect("could not forward signal"))?;
|
||||
|
||||
println!(". (root) name server's IP address: {}", root_ns.ipv4_addr());
|
||||
println!(
|
||||
"attach to this container with: `docker exec -it {} bash`\n",
|
||||
root_ns.container_id()
|
||||
);
|
||||
|
||||
println!("com. name server's IP address: {}", com_ns.ipv4_addr());
|
||||
println!(
|
||||
"attach to this container with: `docker exec -it {} bash`\n",
|
||||
com_ns.container_id()
|
||||
);
|
||||
|
||||
println!(
|
||||
"nameservers.com. name server's IP address: {}",
|
||||
nameservers_ns.ipv4_addr()
|
||||
);
|
||||
println!(
|
||||
"attach to this container with: `docker exec -it {} bash`\n",
|
||||
nameservers_ns.container_id()
|
||||
);
|
||||
|
||||
println!("resolver's IP address: {resolver_addr}");
|
||||
println!(
|
||||
"attach to this container with: `docker exec -it {} bash`\n",
|
||||
resolver.container_id()
|
||||
);
|
||||
|
||||
println!("client's IP address: {}", client.ipv4_addr());
|
||||
println!(
|
||||
"attach to this container with: `docker exec -it {} bash`\n\n",
|
||||
client.container_id()
|
||||
);
|
||||
|
||||
println!("example queries (run these in the client container):\n");
|
||||
println!("`dig @{resolver_addr} SOA .`\n");
|
||||
println!(
|
||||
"`delv -a /etc/bind.keys @{resolver_addr} SOA .` (you MUST use the `-a` flag with delv)\n\n"
|
||||
);
|
||||
|
||||
println!(
|
||||
"to print the DNS traffic flowing through the resolver run this command in
|
||||
the resolver container before performing queries:\n"
|
||||
);
|
||||
println!("`tshark -f 'udp port 53' -O dns`\n\n");
|
||||
|
||||
println!("press Ctrl+C to take down the network");
|
||||
|
||||
rx.recv()?;
|
||||
|
||||
println!("\ntaking down network...");
|
||||
|
||||
Ok(())
|
||||
}
|
|
@ -17,6 +17,10 @@ impl Client {
|
|||
})
|
||||
}
|
||||
|
||||
pub fn container_id(&self) -> &str {
|
||||
self.inner.id()
|
||||
}
|
||||
|
||||
pub fn ipv4_addr(&self) -> Ipv4Addr {
|
||||
self.inner.ipv4_addr()
|
||||
}
|
||||
|
|
|
@ -156,10 +156,6 @@ impl<'a> NameServer<'a, Stopped> {
|
|||
state: Running { child },
|
||||
})
|
||||
}
|
||||
|
||||
pub fn container_id(&self) -> &str {
|
||||
self.container.id()
|
||||
}
|
||||
}
|
||||
|
||||
const ZONES_DIR: &str = "/etc/nsd/zones";
|
||||
|
@ -245,6 +241,10 @@ kill -TERM $(cat {pidfile})"
|
|||
}
|
||||
|
||||
impl<'a, S> NameServer<'a, S> {
|
||||
pub fn container_id(&self) -> &str {
|
||||
self.container.id()
|
||||
}
|
||||
|
||||
pub fn ipv4_addr(&self) -> Ipv4Addr {
|
||||
self.container.ipv4_addr()
|
||||
}
|
||||
|
|
|
@ -77,6 +77,10 @@ impl Resolver {
|
|||
self.container.eavesdrop()
|
||||
}
|
||||
|
||||
pub fn container_id(&self) -> &str {
|
||||
self.container.id()
|
||||
}
|
||||
|
||||
pub fn ipv4_addr(&self) -> Ipv4Addr {
|
||||
self.container.ipv4_addr()
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user