netscan_os/
setting.rs

1use std::net::{IpAddr, Ipv4Addr};
2use std::time::Duration;
3use xenet::net::mac::MacAddr;
4use xenet::packet::tcp::TcpOption;
5
6/// Listener thread wait time (milliseconds)
7pub(crate) const LISTENER_WAIT_TIME_MILLIS: u64 = 100;
8
9/// Probes for fingerprinting
10#[derive(Clone, Copy, Debug, PartialEq)]
11pub enum ProbeType {
12    IcmpEchoProbe,
13    IcmpTimestampProbe,
14    IcmpAddressMaskProbe,
15    IcmpInformationProbe,
16    IcmpUnreachableProbe,
17    TcpProbe,
18    TcpSynAckProbe,
19    TcpRstAckProbe,
20    TcpEcnProbe,
21}
22
23/// TCP Options
24#[derive(Clone, Copy, Debug)]
25pub enum TcpOptionKind {
26    Eol,
27    Nop,
28    Mss,
29    Wscale,
30    SackParmitted,
31    Sack,
32    Timestamp,
33}
34
35impl TcpOptionKind {
36    pub fn number(&self) -> u8 {
37        match *self {
38            TcpOptionKind::Eol => 0,
39            TcpOptionKind::Nop => 1,
40            TcpOptionKind::Mss => 2,
41            TcpOptionKind::Wscale => 3,
42            TcpOptionKind::SackParmitted => 4,
43            TcpOptionKind::Sack => 5,
44            TcpOptionKind::Timestamp => 8,
45        }
46    }
47    pub fn name(&self) -> String {
48        match *self {
49            TcpOptionKind::Eol => String::from("EOL"),
50            TcpOptionKind::Nop => String::from("NOP"),
51            TcpOptionKind::Mss => String::from("MSS"),
52            TcpOptionKind::Wscale => String::from("WSCALE"),
53            TcpOptionKind::SackParmitted => String::from("SACK_PERMITTED"),
54            TcpOptionKind::Sack => String::from("SACK"),
55            TcpOptionKind::Timestamp => String::from("TIMESTAMPS"),
56        }
57    }
58}
59
60/// Target host and required port information
61#[derive(Clone, Debug)]
62pub struct ProbeTarget {
63    pub ip_addr: IpAddr,
64    pub open_tcp_port: u16,
65    pub closed_tcp_port: u16,
66    pub open_udp_port: u16,
67    pub closed_udp_port: u16,
68}
69
70impl ProbeTarget {
71    pub fn new() -> Self {
72        Self {
73            ip_addr: IpAddr::V4(Ipv4Addr::LOCALHOST),
74            open_tcp_port: 80,
75            closed_tcp_port: 20,
76            open_udp_port: 53,
77            closed_udp_port: 33435,
78        }
79    }
80}
81
82/// Probe setting
83#[derive(Clone, Debug)]
84pub struct ProbeSetting {
85    /// Index of network interface
86    pub if_index: u32,
87    /// Name of network interface
88    pub if_name: String,
89    /// Source MAC Address
90    pub src_mac: MacAddr,
91    /// Destination MAC Address
92    pub dst_mac: MacAddr,
93    /// Source IP Address  
94    pub src_ip: IpAddr,
95    /// Source port
96    pub src_port: u16,
97    /// Probe Target
98    pub probe_target: ProbeTarget,
99    /// Probe Types
100    pub probe_types: Vec<ProbeType>,
101    /// Timeout setting    
102    pub timeout: Duration,
103    /// Wait time after send task is finished
104    pub wait_time: Duration,
105    /// Packet send rate
106    pub send_rate: Duration,
107    /// Use TUN interface
108    pub tunnel: bool,
109    /// Use loopback interface
110    pub loopback: bool,
111}
112
113#[derive(Copy, Clone, Debug)]
114pub enum TcpProbeKind {
115    Syn1,
116    Syn2,
117    Syn3,
118    Syn4,
119    Syn5,
120    Syn6,
121    Ecn,
122}
123
124impl TcpProbeKind {
125    pub const VALUES: [Self; 7] = [
126        Self::Syn1,
127        Self::Syn2,
128        Self::Syn3,
129        Self::Syn4,
130        Self::Syn5,
131        Self::Syn6,
132        Self::Ecn,
133    ];
134    pub fn ipv4_total_length(&self) -> u16 {
135        match *self {
136            TcpProbeKind::Syn1 => 60,
137            TcpProbeKind::Syn2 => 60,
138            TcpProbeKind::Syn3 => 60,
139            TcpProbeKind::Syn4 => 56,
140            TcpProbeKind::Syn5 => 60,
141            TcpProbeKind::Syn6 => 56,
142            TcpProbeKind::Ecn => 52,
143        }
144    }
145    pub fn ipv6_payload_length(&self) -> u16 {
146        match *self {
147            TcpProbeKind::Syn1 => 40,
148            TcpProbeKind::Syn2 => 40,
149            TcpProbeKind::Syn3 => 40,
150            TcpProbeKind::Syn4 => 36,
151            TcpProbeKind::Syn5 => 40,
152            TcpProbeKind::Syn6 => 36,
153            TcpProbeKind::Ecn => 32,
154        }
155    }
156    pub fn tcp_options(&self) -> Vec<TcpOption> {
157        match *self {
158            TcpProbeKind::Syn1 => vec![
159                TcpOption::wscale(10),
160                TcpOption::nop(),
161                TcpOption::mss(1460),
162                TcpOption::timestamp(u32::MAX, u32::MIN),
163                TcpOption::sack_perm(),
164            ],
165            TcpProbeKind::Syn2 => vec![
166                TcpOption::mss(1400),
167                TcpOption::wscale(0),
168                TcpOption::sack_perm(),
169                TcpOption::timestamp(u32::MAX, u32::MIN),
170            ],
171            TcpProbeKind::Syn3 => vec![
172                TcpOption::timestamp(u32::MAX, u32::MIN),
173                TcpOption::nop(),
174                TcpOption::nop(),
175                TcpOption::wscale(5),
176                TcpOption::nop(),
177                TcpOption::mss(640),
178            ],
179            TcpProbeKind::Syn4 => vec![
180                TcpOption::sack_perm(),
181                TcpOption::timestamp(u32::MAX, u32::MIN),
182                TcpOption::wscale(10),
183            ],
184            TcpProbeKind::Syn5 => vec![
185                TcpOption::mss(536),
186                TcpOption::sack_perm(),
187                TcpOption::timestamp(u32::MAX, u32::MIN),
188                TcpOption::wscale(10),
189            ],
190            TcpProbeKind::Syn6 => vec![
191                TcpOption::mss(265),
192                TcpOption::sack_perm(),
193                TcpOption::timestamp(u32::MAX, u32::MIN),
194            ],
195            TcpProbeKind::Ecn => vec![
196                TcpOption::wscale(10),
197                TcpOption::nop(),
198                TcpOption::mss(1460),
199                TcpOption::sack_perm(),
200                TcpOption::nop(),
201                TcpOption::nop(),
202            ],
203        }
204    }
205}