Skip to content

Commit 9e7ee97

Browse files
authored
Merge pull request #547 from rancher-sandbox/no-ipv6
HostResolver shouldn't return IPv6 addresses by default
2 parents 356988d + eaeee31 commit 9e7ee97

File tree

9 files changed

+79
-25
lines changed

9 files changed

+79
-25
lines changed

cmd/limactl/debug.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,22 +27,27 @@ func newDebugDNSCommand() *cobra.Command {
2727
Args: cobra.RangeArgs(1, 2),
2828
RunE: debugDNSAction,
2929
}
30+
cmd.Flags().BoolP("ipv6", "6", false, "lookup IPv6 addresses too")
3031
return cmd
3132
}
3233

3334
func debugDNSAction(cmd *cobra.Command, args []string) error {
35+
ipv6, err := cmd.Flags().GetBool("ipv6")
36+
if err != nil {
37+
return err
38+
}
3439
udpLocalPort, err := strconv.Atoi(args[0])
3540
if err != nil {
3641
return err
3742
}
3843
tcpLocalPort := 0
39-
if len(args) > 2 {
44+
if len(args) > 1 {
4045
tcpLocalPort, err = strconv.Atoi(args[1])
4146
if err != nil {
4247
return err
4348
}
4449
}
45-
srv, err := dns.Start(udpLocalPort, tcpLocalPort)
50+
srv, err := dns.Start(udpLocalPort, tcpLocalPort, ipv6)
4651
if err != nil {
4752
return err
4853
}

pkg/cidata/cidata.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ func GenerateISO9660(instDir, name string, y *limayaml.LimaYAML, udpDNSLocalPort
138138
if err != nil {
139139
return err
140140
}
141-
if *y.UseHostResolver {
141+
if *y.HostResolver.Enabled {
142142
args.UDPDNSLocalPort = udpDNSLocalPort
143143
args.TCPDNSLocalPort = tcpDNSLocalPort
144144
args.DNSAddresses = append(args.DNSAddresses, qemu.SlirpDNS)

pkg/hostagent/dns/dns.go

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ const truncateSize = 512
1818
type Handler struct {
1919
clientConfig *dns.ClientConfig
2020
clients []*dns.Client
21+
IPv6 bool
2122
}
2223

2324
type Server struct {
@@ -43,7 +44,7 @@ func newStaticClientConfig(ips []net.IP) (*dns.ClientConfig, error) {
4344
return dns.ClientConfigFromReader(r)
4445
}
4546

46-
func newHandler() (dns.Handler, error) {
47+
func newHandler(IPv6 bool) (dns.Handler, error) {
4748
cc, err := dns.ClientConfigFromFile("/etc/resolv.conf")
4849
if err != nil {
4950
fallbackIPs := []net.IP{net.ParseIP("8.8.8.8"), net.ParseIP("1.1.1.1")}
@@ -60,6 +61,7 @@ func newHandler() (dns.Handler, error) {
6061
h := &Handler{
6162
clientConfig: cc,
6263
clients: clients,
64+
IPv6: IPv6,
6365
}
6466
return h, nil
6567
}
@@ -78,7 +80,12 @@ func (h *Handler) handleQuery(w dns.ResponseWriter, req *dns.Msg) {
7880
Ttl: 5,
7981
}
8082
switch q.Qtype {
81-
case dns.TypeCNAME, dns.TypeA, dns.TypeAAAA:
83+
case dns.TypeAAAA:
84+
if !h.IPv6 {
85+
break
86+
}
87+
fallthrough
88+
case dns.TypeCNAME, dns.TypeA:
8289
cname, err := net.LookupCNAME(q.Name)
8390
if err != nil {
8491
break
@@ -212,8 +219,8 @@ func (h *Handler) ServeDNS(w dns.ResponseWriter, req *dns.Msg) {
212219
}
213220
}
214221

215-
func Start(udpLocalPort, tcpLocalPort int) (*Server, error) {
216-
h, err := newHandler()
222+
func Start(udpLocalPort, tcpLocalPort int, IPv6 bool) (*Server, error) {
223+
h, err := newHandler(IPv6)
217224
if err != nil {
218225
return nil, err
219226
}

pkg/hostagent/hostagent.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ func New(instName string, stdout io.Writer, sigintCh chan os.Signal, opts ...Opt
9292
}
9393

9494
var udpDNSLocalPort, tcpDNSLocalPort int
95-
if *y.UseHostResolver {
95+
if *y.HostResolver.Enabled {
9696
udpDNSLocalPort, err = findFreeUDPLocalPort()
9797
if err != nil {
9898
return nil, err
@@ -248,8 +248,8 @@ func (a *HostAgent) Run(ctx context.Context) error {
248248
a.emitEvent(ctx, exitingEv)
249249
}()
250250

251-
if *a.y.UseHostResolver {
252-
dnsServer, err := dns.Start(a.udpDNSLocalPort, a.tcpDNSLocalPort)
251+
if *a.y.HostResolver.Enabled {
252+
dnsServer, err := dns.Start(a.udpDNSLocalPort, a.tcpDNSLocalPort, *a.y.HostResolver.IPv6)
253253
if err != nil {
254254
return fmt.Errorf("cannot start DNS server: %w", err)
255255
}

pkg/limayaml/default.yaml

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -236,9 +236,14 @@ propagateProxyEnv: null
236236
# The host agent implements a DNS server that looks up host names on the host
237237
# using the local system resolver. This means changing VPN and network settings
238238
# are reflected automatically into the guest, including conditional forward,
239-
# and mDNS lookup:
240-
# Default: true
241-
useHostResolver: null
239+
# and mDNS lookup. By default only IPv4 addresses will be returned. IPv6 addresses
240+
# can only work when using a vmnet network interface and the host has working
241+
# IPv6 configured as well.
242+
hostResolver:
243+
# Default: true
244+
enabled: null
245+
# Default: false
246+
ipv6: null
242247

243248
# If useHostResolver is false, then the following rules apply for configuring dns:
244249
# Explicitly set DNS addresses for qemu user-mode networking. By default qemu picks *one*

pkg/limayaml/defaults.go

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -217,14 +217,36 @@ func FillDefault(y, d, o *LimaYAML, filePath string) {
217217
// After defaults processing the singular HostPort and GuestPort values should not be used again.
218218
}
219219

220-
if y.UseHostResolver == nil {
221-
y.UseHostResolver = d.UseHostResolver
220+
// If both `useHostResolved` and `HostResolver.Enabled` are defined in the same config,
221+
// then the deprecated `useHostResolved` setting is silently ignored.
222+
if y.HostResolver.Enabled == nil {
223+
y.HostResolver.Enabled = y.UseHostResolver
222224
}
223-
if o.UseHostResolver != nil {
224-
y.UseHostResolver = o.UseHostResolver
225+
if d.HostResolver.Enabled == nil {
226+
d.HostResolver.Enabled = d.UseHostResolver
225227
}
226-
if y.UseHostResolver == nil {
227-
y.UseHostResolver = pointer.Bool(true)
228+
if o.HostResolver.Enabled == nil {
229+
o.HostResolver.Enabled = o.UseHostResolver
230+
}
231+
232+
if y.HostResolver.Enabled == nil {
233+
y.HostResolver.Enabled = d.HostResolver.Enabled
234+
}
235+
if o.HostResolver.Enabled != nil {
236+
y.HostResolver.Enabled = o.HostResolver.Enabled
237+
}
238+
if y.HostResolver.Enabled == nil {
239+
y.HostResolver.Enabled = pointer.Bool(true)
240+
}
241+
242+
if y.HostResolver.IPv6 == nil {
243+
y.HostResolver.IPv6 = d.HostResolver.IPv6
244+
}
245+
if o.HostResolver.IPv6 != nil {
246+
y.HostResolver.IPv6 = o.HostResolver.IPv6
247+
}
248+
if y.HostResolver.IPv6 == nil {
249+
y.HostResolver.IPv6 = pointer.Bool(false)
228250
}
229251

230252
if y.PropagateProxyEnv == nil {

pkg/limayaml/defaults_test.go

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,10 @@ func TestFillDefault(t *testing.T) {
6767
Video: Video{
6868
Display: pointer.String("none"),
6969
},
70-
UseHostResolver: pointer.Bool(true),
70+
HostResolver: HostResolver{
71+
Enabled: pointer.Bool(true),
72+
IPv6: pointer.Bool(false),
73+
},
7174
PropagateProxyEnv: pointer.Bool(true),
7275
}
7376

@@ -186,7 +189,10 @@ func TestFillDefault(t *testing.T) {
186189
Video: Video{
187190
Display: pointer.String("cocoa"),
188191
},
189-
UseHostResolver: pointer.Bool(false),
192+
HostResolver: HostResolver{
193+
Enabled: pointer.Bool(false),
194+
IPv6: pointer.Bool(true),
195+
},
190196
PropagateProxyEnv: pointer.Bool(false),
191197

192198
Mounts: []Mount{
@@ -298,7 +304,10 @@ func TestFillDefault(t *testing.T) {
298304
Video: Video{
299305
Display: pointer.String("cocoa"),
300306
},
301-
UseHostResolver: pointer.Bool(false),
307+
HostResolver: HostResolver{
308+
Enabled: pointer.Bool(false),
309+
IPv6: pointer.Bool(false),
310+
},
302311
PropagateProxyEnv: pointer.Bool(false),
303312

304313
Mounts: []Mount{

pkg/limayaml/limayaml.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ type LimaYAML struct {
2525
Network NetworkDeprecated `yaml:"network,omitempty" json:"network,omitempty"` // DEPRECATED, use `networks` instead
2626
Env map[string]string `yaml:"env,omitempty" json:"env,omitempty"`
2727
DNS []net.IP `yaml:"dns,omitempty" json:"dns,omitempty"`
28-
UseHostResolver *bool `yaml:"useHostResolver,omitempty" json:"useHostResolver,omitempty"`
28+
HostResolver HostResolver `yaml:"hostResolver,omitempty" json:"hostResolver,omitempty"`
29+
UseHostResolver *bool `yaml:"useHostResolver,omitempty" json:"useHostResolver,omitempty"` // DEPRECATED, use `HostResolver.Enabled` instead
2930
PropagateProxyEnv *bool `yaml:"propagateProxyEnv,omitempty" json:"propagateProxyEnv,omitempty"`
3031
}
3132

@@ -132,6 +133,11 @@ type Network struct {
132133
Interface string `yaml:"interface,omitempty" json:"interface,omitempty"`
133134
}
134135

136+
type HostResolver struct {
137+
Enabled *bool `yaml:"enabled,omitempty" json:"enabled,omitempty"`
138+
IPv6 *bool `yaml:"ipv6,omitempty" json:"ipv6,omitempty"`
139+
}
140+
135141
// DEPRECATED types below
136142

137143
// Types have been renamed to turn all references to the old names into compiler errors,

pkg/limayaml/validate.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -194,8 +194,8 @@ func Validate(y LimaYAML, warn bool) error {
194194
// processed sequentially and the first matching rule for a guest port determines forwarding behavior.
195195
}
196196

197-
if y.UseHostResolver != nil && *y.UseHostResolver && len(y.DNS) > 0 {
198-
return fmt.Errorf("field `dns` must be empty when field `useHostResolver` is true")
197+
if y.HostResolver.Enabled != nil && *y.HostResolver.Enabled && len(y.DNS) > 0 {
198+
return fmt.Errorf("field `dns` must be empty when field `HostResolver.Enabled` is true")
199199
}
200200

201201
if err := validateNetwork(y, warn); err != nil {

0 commit comments

Comments
 (0)