Add support for IPv6 listen-on

This commit is contained in:
Jamie Cameron
2025-04-27 14:22:01 -07:00
parent 172c504abb
commit 6743d3b4c6
4 changed files with 31 additions and 11 deletions

View File

@@ -4546,7 +4546,8 @@ my ($conf, $name) = @_;
my @rv;
my $opts = &find("optons", $conf);
if ($opts) {
my @listen = &find("listen-on", $opts->{'members'});
my @listen = ( &find("listen-on", $opts->{'members'}),
&find("listen-on-v6", $opts->{'members'}) );
foreach my $l (@listen) {
my $idx = &indexof("tls", @{$l->{'values'}});
if ($idx >= 0 && $l->{'values'}->[$idx+1] eq $name) {

View File

@@ -22,7 +22,8 @@ print &ui_form_start("save_net.cgi", "post");
print &ui_table_start($text{'net_header'}, "width=100%", 4);
# Ports and addresses to listen on
my @listen = &find("listen-on", $mems);
my @listen = ( &find("listen-on", $mems),
&find("listen-on-v6", $mems) );
my $ltable = &ui_radio("listen_def", @listen ? 0 : 1,
[ [ 1, $text{'default'} ],
[ 0, $text{'net_below'} ] ])."<br>\n";
@@ -30,10 +31,17 @@ my $ltable = &ui_radio("listen_def", @listen ? 0 : 1,
my @table = ( );
push(@listen, { });
for(my $i=0; $i<@listen; $i++) {
my $port = $listen[$i]->{'value'} eq 'port' ?
$listen[$i]->{'values'}->[1] : undef;
my @vals = map { $_->{'name'} } @{$listen[$i]->{'members'}};
my $l = $listen[$i];
my $port = $l->{'value'} eq 'port' ?
$l->{'values'}->[1] : undef;
my @vals = map { $_->{'name'} } @{$l->{'members'}};
push(@table, [
&ui_select("proto_$i",
$l->{'name'} eq 'listen-on-v6' ? 'v6' :
$l->{'name'} eq 'listen-on' ? 'v4' : '',
[ [ '', $text{'net_none'} ],
[ 'v4', 'IPv4' ],
[ 'v6', 'IPv6' ] ]),
&ui_radio("pdef_$i", $port ? 0 : 1,
[ [ 1, $text{'default'} ],
[ 0, &ui_textbox("port_$i", $port, 5) ] ]),
@@ -41,7 +49,7 @@ for(my $i=0; $i<@listen; $i++) {
]);
}
$ltable .= &ui_columns_table(
[ $text{'net_port'}, $text{'net_addrs'} ],
[ $text{'net_proto'}, $text{'net_port'}, $text{'net_addrs'} ],
undef,
\@table,
undef,

View File

@@ -732,6 +732,8 @@ net_saddr=Source IP address for queries
net_ip=IP address
net_sport=Source port for queries
net_port=Port number
net_proto=Protocol
net_none=&lt;None&gt;
net_topol=Nameserver choice topology
net_recur=Allow recursive queries from
net_err=Failed to save address and topology options

View File

@@ -17,25 +17,34 @@ my $conf = &get_config();
my $options = &find("options", $conf);
my %used;
my @listen;
my @listen6;
if (!$in{'listen_def'}) {
my $addr;
for(my $i=0; defined($addr = $in{"addrs_$i"}); $i++) {
next if (!$addr);
my $l = { 'name' => 'listen-on',
'type' => 1 };
next if (!$in{"proto_$i"});
my $l = { 'name' => $in{"proto_$i"} eq 'v6' ?
'listen-on-v6' : 'listen-on',
'type' => 1 };
if (!$in{"pdef_$i"}) {
$in{"port_$i"} =~ /^\d+$/ ||
&error(&text('net_eport', $in{"port_$i"}));
$l->{'values'} = [ 'port', $in{"port_$i"} ];
}
my $port = $in{"pdef_$i"} ? 53 : $in{"port_$i"};
$used{$port}++ && &error(&text('net_eusedport', $port));
$used{$port,$l->{'name'}}++ &&
&error(&text('net_eusedport', $port));
$l->{'members'} =
[ map { { 'name' => $_ } } split(/\s+/, $addr) ];
push(@listen, $l);
if ($l->{'name'} eq 'listen-on') {
push(@listen, $l);
}
else {
push(@listen6, $l);
}
}
}
&save_directive($options, 'listen-on', \@listen, 1);
&save_directive($options, 'listen-on-v6', \@listen6, 1);
# Save query source address and port
my @qvals;