-
Type:
Question
-
Resolution: Works as Designed
-
Priority:
Unknown
-
None
-
Affects Version/s: None
-
Component/s: None
-
None
-
None
-
None
-
None
-
None
-
None
-
None
-
None
My company uses WireGuard to secure connection to our MongoDB. Some time ago I got troubles with connecting to it from my Windows system using pymongo. I still was able to connect to it via mongosh or MongoCompass.
Connection is done via
MongoClient(
f'mongodb+srv://user:password@'
f'13.mongodb.db.domain',
tls=True,
tlsCAFile=ca_file,
)
Error received:
Traceback (most recent call last):
File "E:\REDACTED\.venv\lib\site-packages\pymongo\srv_resolver.py", line 89, in _resolve_uri
results = _resolve(
File "E:\REDACTED\.venv\lib\site-packages\pymongo\srv_resolver.py", line 43, in _resolve
return resolver.resolve(*args, **kwargs)
File "E:\REDACTED\.venv\lib\site-packages\dns\resolver.py", line 1367, in resolve
return get_default_resolver().resolve(
File "E:\REDACTED\.venv\lib\site-packages\dns\resolver.py", line 1231, in resolve
(answer, done) = resolution.query_result(response, None)
File "E:\REDACTED\.venv\lib\site-packages\dns\resolver.py", line 768, in query_result
raise NoAnswer(response=answer.response)
dns.resolver.NoAnswer: The DNS response does not contain an answer to the question: _mongodb._tcp.13.mongodb.db.domain. IN SRV
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "E:\REDACTED\main.py", line 27, in <module>
MongoClient(
File "E:\REDACTED\.venv\lib\site-packages\pymongo\mongo_client.py", line 736, in __init__
res = uri_parser.parse_uri(
File "E:\REDACTED\.venv\lib\site-packages\pymongo\uri_parser.py", line 542, in parse_uri
nodes = dns_resolver.get_hosts()
File "E:\REDACTED\.venv\lib\site-packages\pymongo\srv_resolver.py", line 121, in get_hosts
_, nodes = self._get_srv_response_and_hosts(True)
File "E:\REDACTED\.venv\lib\site-packages\pymongo\srv_resolver.py", line 101, in _get_srv_response_and_hosts
results = self._resolve_uri(encapsulate_errors)
File "E:\REDACTED\.venv\lib\site-packages\pymongo\srv_resolver.py", line 97, in _resolve_uri
raise ConfigurationError(str(exc))
pymongo.errors.ConfigurationError: The DNS response does not contain an answer to the question: _mongodb._tcp.13.mongodb.db.domain. IN SRV
I looked into the order of nameservers.
>>> import dns.resolver >>> dns_resolver = dns.resolver.Resolver() >>> print(dns_resolver.nameservers) ['192.168.100.1', '10.103.0.2']
192.168.100.1 is name server of my local Ethernet, 10.103.0.2 is nameserver specified in WireGuard configuration.
By default dnspython uses registry to get available nameservers. I found registry entries responsible for this and cleared some obsolete ones. After that the order changed.
>>> import dns.resolver >>> dns_resolver = dns.resolver.Resolver() >>> print(dns_resolver.nameservers) ['10.103.0.2', '192.168.100.1']
And then I was able to connect to MongoDB with no issues.
pymongo uses dns.resolver.resolve to resolve SRV queries. This function uses default resolver which is created with the same approach as I used above.
Current workaround is to setup default resolver manually.
import dns.resolver dns.resolver.default_resolver = dns.resolver.Resolver(configure=False) dns.resolver.default_resolver.nameservers = ['10.103.0.2']
But I do not like such approach because it affects the whole project rather than only this specific connection.
Overall, if such behavior is a bug, then it should be fixed. If this behavior is intended or the issue is not related to pymongo, then I would like to have an option to specify resolver in MongoClient constructor.
I also posted this issue in dnspython repository. Library maintainer answered that order of nameservers matters.
Versions
pymongo 4.3.3
dnspython 2.3.0.
- related to
-
CSHARP-2518 Dns resolver only uses first DNS server.
-
- Closed
-