Skip to content

Commit f3c13f5

Browse files
arozovykkrtab
authored andcommitted
Improve port 53 permission error messages
Add clear error messages when binding to port 53 fails due to permission denied. The new error message provides two actionable solutions: running with sudo or using setcap to grant capability. Fixes part of issue #43 - proactive detection of port 53 issues.
1 parent ed94648 commit f3c13f5

File tree

1 file changed

+23
-2
lines changed

1 file changed

+23
-2
lines changed

src/dns.rs

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,10 +168,31 @@ impl DnsWorker {
168168
let mut serv_future = ServerFuture::new(DnsRequestHandler {
169169
challenges: challenges.clone(),
170170
});
171-
let udp_socket = UdpSocket::bind(&listening_addr).await?;
171+
172+
let udp_socket = match UdpSocket::bind(&listening_addr).await {
173+
Ok(socket) => socket,
174+
Err(e) if e.kind() == std::io::ErrorKind::PermissionDenied => {
175+
return Err(std::io::Error::new(
176+
std::io::ErrorKind::PermissionDenied,
177+
"Cannot bind to port 53: Permission denied. Either run with sudo or grant capability with: setcap 'cap_net_bind_service=+ep' agnos"
178+
));
179+
}
180+
Err(e) => return Err(e),
181+
};
172182
serv_future.register_socket(udp_socket);
173-
let tcp_listener = TcpListener::bind(&listening_addr).await?;
183+
184+
let tcp_listener = match TcpListener::bind(&listening_addr).await {
185+
Ok(listener) => listener,
186+
Err(e) if e.kind() == std::io::ErrorKind::PermissionDenied => {
187+
return Err(std::io::Error::new(
188+
std::io::ErrorKind::PermissionDenied,
189+
"Cannot bind to port 53: Permission denied. Either run with sudo or grant capability with: setcap 'cap_net_bind_service=+ep' agnos"
190+
));
191+
}
192+
Err(e) => return Err(e),
193+
};
174194
serv_future.register_listener(tcp_listener, Duration::from_secs(60));
195+
175196
Ok(DnsWorker {
176197
serv_future,
177198
challenges,

0 commit comments

Comments
 (0)