Skip to content

Commit ced192c

Browse files
1cho1ce3np
authored andcommitted
Add Virtual DNS for IPv6
- Add IPv6 DNS if netvm has ipv6 feature enabled. For this there is a need to only add Virtual DNS servers to qubes that have netvm set and don't add DNS to every qube that provides network (sys-net/sys-usb/etc). - Add IPv6 Virtual DNS support. Also some IPv6 fixes and tests. - Remove feature supported-feature.ipv6 and add feature supported-feature.ipv6dns
1 parent ba5efc8 commit ced192c

4 files changed

Lines changed: 86 additions & 2 deletions

File tree

qubes/tests/api_admin.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,27 +243,63 @@ def test_027_vm_property_get_all(self):
243243
self.assertEqual(value, expected)
244244

245245
def test_028_vm_property_get_list(self):
246+
self.vm.features['ipv6'] = '1'
246247
self.vm.provides_network = True
247248
value = self.call_mgmt_func(
248249
b'admin.vm.property.Get',
249250
b'test-vm1',
250251
b'dns')
251252
self.assertEqual(value, 'default=True type=str 10.139.1.1 10.139.1.2')
253+
value = self.call_mgmt_func(
254+
b'admin.vm.property.Get',
255+
b'test-vm1',
256+
b'dns6')
257+
self.assertEqual(value, 'default=True type=str ')
258+
self.vm.features['supported-feature.ipv6dns'] = '1'
259+
value = self.call_mgmt_func(
260+
b'admin.vm.property.Get',
261+
b'test-vm1',
262+
b'dns6')
263+
self.assertEqual(value, 'default=True type=str fd09:24ef:4179::a8b:1 fd09:24ef:4179::a8b:2')
252264

253265
def test_029_vm_property_get_list_none(self):
266+
self.vm.features['ipv6'] = '1'
254267
value = self.call_mgmt_func(
255268
b'admin.vm.property.Get',
256269
b'test-vm1',
257270
b'dns')
258271
self.assertEqual(value, 'default=True type=str ')
272+
value = self.call_mgmt_func(
273+
b'admin.vm.property.Get',
274+
b'test-vm1',
275+
b'dns6')
276+
self.assertEqual(value, 'default=True type=str ')
277+
self.vm.features['supported-feature.ipv6dns'] = '1'
278+
value = self.call_mgmt_func(
279+
b'admin.vm.property.Get',
280+
b'test-vm1',
281+
b'dns6')
282+
self.assertEqual(value, 'default=True type=str ')
259283

260284
def test_029_vm_property_get_list_default(self):
285+
self.vm.features['ipv6'] = '1'
261286
self.vm.provides_network = True
262287
value = self.call_mgmt_func(
263288
b'admin.vm.property.GetDefault',
264289
b'test-vm1',
265290
b'dns')
266291
self.assertEqual(value, 'type=str 10.139.1.1 10.139.1.2')
292+
value = self.call_mgmt_func(
293+
b'admin.vm.property.GetDefault',
294+
b'test-vm1',
295+
b'dns6')
296+
self.assertEqual(value, 'type=str ')
297+
self.vm.features['supported-feature.ipv6dns'] = '1'
298+
value = self.call_mgmt_func(
299+
b'admin.vm.property.GetDefault',
300+
b'test-vm1',
301+
b'dns6')
302+
self.assertEqual(value, 'type=str fd09:24ef:4179::a8b:1 fd09:24ef:4179::a8b:2')
267303

268304
def test_030_vm_property_set_vm(self):
269305
netvm = self.app.add_new_vm('AppVM', label='red', name='test-net',

qubes/tests/vm/qubesvm.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1797,19 +1797,32 @@ def test_621_qdb_vm_with_network(self, mock_qubesdb, mock_urandom,
17971797
vm.create_qdb_entries()
17981798
self.assertEqual(test_qubesdb.data, expected)
17991799

1800+
test_qubesdb.data.clear()
1801+
with self.subTest('ipv6_dns'):
1802+
template.features['supported-feature.ipv6dns'] = '1'
1803+
netvm.features['ipv6'] = True
1804+
expected['/qubes-primary-dns6'] = 'fd09:24ef:4179::a8b:1'
1805+
expected['/qubes-secondary-dns6'] = 'fd09:24ef:4179::a8b:2'
1806+
vm.create_qdb_entries()
1807+
self.assertEqual(test_qubesdb.data, expected)
1808+
18001809
test_qubesdb.data.clear()
18011810
with self.subTest('ipv6_just_appvm'):
1811+
template.features['supported-feature.ipv6dns'] = '1'
18021812
del netvm.features['ipv6']
18031813
vm.features['ipv6'] = True
18041814
expected['/qubes-ip6'] = \
18051815
qubes.config.qubes_ipv6_prefix.replace(':0000', '') + \
18061816
'::a89:3'
18071817
del expected['/qubes-gateway6']
1818+
del expected['/qubes-primary-dns6']
1819+
del expected['/qubes-secondary-dns6']
18081820
vm.create_qdb_entries()
18091821
self.assertEqual(test_qubesdb.data, expected)
18101822

18111823
test_qubesdb.data.clear()
18121824
with self.subTest('proxy_ipv4'):
1825+
del template.features['supported-feature.ipv6dns']
18131826
del vm.features['ipv6']
18141827
expected['/name'] = 'test-inst-netvm'
18151828
expected['/qubes-vm-type'] = 'NetVM'
@@ -1858,6 +1871,18 @@ def test_621_qdb_vm_with_network(self, mock_qubesdb, mock_urandom,
18581871
netvm.create_qdb_entries()
18591872
self.assertEqual(test_qubesdb.data, expected)
18601873

1874+
test_qubesdb.data.clear()
1875+
with self.subTest('proxy_ipv6_dns'):
1876+
template.features['supported-feature.ipv6dns'] = '1'
1877+
netvm.features['ipv6'] = True
1878+
expected['/qubes-netvm-primary-dns6'] = 'fd09:24ef:4179::a8b:1'
1879+
expected['/qubes-netvm-secondary-dns6'] = 'fd09:24ef:4179::a8b:2'
1880+
1881+
with unittest.mock.patch('qubes.vm.qubesvm.QubesVM.is_running',
1882+
lambda _: True):
1883+
netvm.create_qdb_entries()
1884+
self.assertEqual(test_qubesdb.data, expected)
1885+
18611886
@unittest.mock.patch('qubes.utils.get_timezone')
18621887
@unittest.mock.patch('qubes.utils.urandom')
18631888
@unittest.mock.patch('qubes.vm.qubesvm.QubesVM.untrusted_qdb')

qubes/vm/mix/net.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,19 @@ def dns(self):
254254

255255
return None
256256

257+
@qubes.stateless_property
258+
def dns6(self):
259+
'''IPv6 DNS servers set up for this domain.'''
260+
if self.features.check_with_netvm('ipv6', False) and \
261+
self.features.check_with_template("supported-feature.ipv6dns", \
262+
False) and (self.netvm is not None or self.provides_network):
263+
return StrSerializableTuple((
264+
'fd09:24ef:4179::a8b:1',
265+
'fd09:24ef:4179::a8b:2',
266+
))
267+
268+
return None
269+
257270
def __init__(self, *args, **kwargs):
258271
self._firewall = None
259272
super().__init__(*args, **kwargs)
@@ -506,7 +519,7 @@ def on_property_set_ip(self, _event, name, newvalue=None, oldvalue=None):
506519
vm.fire_event(
507520
'property-reset:visible_gateway', name='visible_gateway')
508521

509-
@qubes.events.handler('property-set:ip6', 'property-reset:ipv6')
522+
@qubes.events.handler('property-set:ip6', 'property-reset:ip6')
510523
def on_property_set_ip6(self, _event, name, newvalue=None, oldvalue=None):
511524
# pylint: disable=unused-argument
512525
if newvalue == oldvalue:

qubes/vm/qubesvm.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2252,7 +2252,12 @@ def create_qdb_entries(self):
22522252
self.untrusted_qdb.write('/qubes-netvm-netmask', str(self.netmask))
22532253

22542254
for i, addr in zip(('primary', 'secondary'), self.dns):
2255-
self.untrusted_qdb.write('/qubes-netvm-{}-dns'.format(i), addr)
2255+
self.untrusted_qdb.write('/qubes-netvm-{}-dns'.format(i), \
2256+
str(addr))
2257+
if self.dns6: # pylint: disable=using-constant-test
2258+
for i, addr in zip(('primary', 'secondary'), self.dns6):
2259+
self.untrusted_qdb.write('/qubes-netvm-{}-dns6'.format(i), \
2260+
str(addr))
22562261

22572262
if self.netvm is not None:
22582263
self.untrusted_qdb.write('/qubes-mac', str(self.mac))
@@ -2270,6 +2275,11 @@ def create_qdb_entries(self):
22702275
if self.visible_gateway6: # pylint: disable=using-constant-test
22712276
self.untrusted_qdb.write('/qubes-gateway6',
22722277
str(self.visible_gateway6))
2278+
if self.dns6 and self.netvm.features.check_with_netvm('ipv6', \
2279+
False): # pylint: disable=using-constant-test
2280+
for i, addr in zip(('primary', 'secondary'), self.dns6):
2281+
self.untrusted_qdb.write('/qubes-{}-dns6'.format(i), \
2282+
str(addr))
22732283

22742284
tzname = qubes.utils.get_timezone()
22752285
if tzname:

0 commit comments

Comments
 (0)