From 2bfee6653a5aa8ec038f8d873607823ddc087342 Mon Sep 17 00:00:00 2001 From: ljf Date: Mon, 13 Mar 2023 03:02:36 +0100 Subject: [PATCH] [fix] Fakedns doesn't need ip in args --- sources/captiveportal_fakedns | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/sources/captiveportal_fakedns b/sources/captiveportal_fakedns index c634bfd..e6304b5 100644 --- a/sources/captiveportal_fakedns +++ b/sources/captiveportal_fakedns @@ -3,8 +3,24 @@ use strict; use warnings; use Net::DNS::Nameserver; +use IO::Socket::INET; -my $ip4_addr = shift @ARGV; +# This idea was stolen from Net::Address::IP::Local::connected_to() +sub get_local_ip_address { + my $socket = IO::Socket::INET->new( + Proto => 'udp', + PeerAddr => '198.41.0.4', # a.root-servers.net + PeerPort => '53', # DNS + ); + + # A side-effect of making a socket connection is that our IP address + # is available from the 'sockhost' method + my $local_ip_address = $socket->sockhost; + + return $local_ip_address; +} + +my $ip4_addr = get_local_ip_address(); sub reply_handler { my ($qname, $qclass, $qtype, $peerhost,$query,$conn) = @_; @@ -25,7 +41,7 @@ sub reply_handler { my $ns = new Net::DNS::Nameserver( LocalPort => 4253, - LocalAddr => $ip4_addr, + LocalAddr => '0.0.0.0', ReplyHandler => \&reply_handler, Verbose => 0 ) || die "Couldn't create fake nameserver object.\n";