Ubuntu 24.04 の環境では初期状態で53番ポートが開いています。
127.0.0.XXX と表示されているとおり、ローカル環境でしかアクセスできない状態ではありますが、ローカルでDNSサーバーを動かす必要もないので、こちらの記事では Ubuntu 24.04 環境における53番ポートの閉じ方について示します。
$ grep PRETTY_NAME /etc/os-release
PRETTY_NAME="Ubuntu 24.04.3 LTS"
$ ss -l sport = :53 2>/dev/null
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
udp UNCONN 0 0 127.0.0.54:domain 0.0.0.0:*
udp UNCONN 0 0 127.0.0.53%lo:domain 0.0.0.0:*
tcp LISTEN 0 4096 127.0.0.53%lo:domain 0.0.0.0:*
tcp LISTEN 0 4096 127.0.0.54:domain 0.0.0.0:*
関係している設定ファイルは /etc/systemd/resolved.conf なので、対象の設定値である「DNSStubListener」を確認するとコメント状態となっています。
つまり、デフォルト値の「yes」として動作しているようです。
$ grep 'DNSStubListener=' /etc/systemd/resolved.conf
#DNSStubListener=yes
以下のように「DNSStubListener」を「no」に修正します。
$ sudo cp /etc/systemd/resolved.conf /etc/systemd/resolved.conf.orig
$ sudo vim /etc/systemd/resolved.conf
$ diff /etc/systemd/resolved.conf /etc/systemd/resolved.conf.orig
33c33
< DNSStubListener=no
---
> #DNSStubListener=yes
他に関連するファイルについても確認しておきます。
/run/systemd/resolve ディレクトリ配下に2つのconfファイル(いずれも通常ファイル)が存在します。
$ ls -l /run/systemd/resolve/*.conf
-rw-r--r-- 1 systemd-resolve systemd-resolve 786 2月 5 16:42 /run/systemd/resolve/resolv.conf
-rw-r--r-- 1 systemd-resolve systemd-resolve 920 2月 5 16:42 /run/systemd/resolve/stub-resolv.conf
/run/systemd/resolve/*.conf の内容は /etc/netplan 配下のファイルや /etc/systemd/resolved.conf などを元に「systemd-resolved」により自動生成する仕組みになっています。
$ cat /run/systemd/resolve/resolv.conf |grep -v '^#' |grep -v '^\s*$'
nameserver 192.168.0.1
search .
$ cat /run/systemd/resolve/stub-resolv.conf |grep -v '^#' |grep -v '^\s*$'
nameserver 127.0.0.53
options edns0 trust-ad
search .
この状態で「systemd-resolved」を再起動します。
$ sudo systemctl restart systemd-resolved
以下のコマンドを実行すると何も表示されないので、53番ポートを閉じることができたようです。
$ ss -l sport = :53 2>/dev/null
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
しかし、sudoコマンド実行時に以下のエラーが発生してしまいます。
$ sudo ls -l |wc -l
sudo: ホスト akase244-lemur-pro の名前解決ができません: 名前またはサービスが不明です
13
sudoコマンドは「自分が今どのホストで実行されているか」をチェックするようです。
どうやら「DNSStubListener=yes」の状態だと、ローカル環境のホスト名の名前解決を担っていたようなので、 /etc/hosts を以下のように修正します。
$ sudo cp /etc/hosts /etc/hosts.orig
$ diff /etc/hosts /etc/hosts.orig
6d5
< 127.0.1.1 akase244-lemur-pro
この状態で再度sudoコマンドを実行するとエラーが発生しないようになりました。
$ sudo ls -l |wc -l
13
ちなみに 127.0.1.1 についてはこのあたりの記事を読むとよいかと思います。
次に /etc/resolv.conf の「nameserver」の値を確認すると 192.168.0.1 となっています。
$ cat /etc/resolv.conf |grep -v '^#' |grep -v '^\s*$'
nameserver 192.168.0.1
search .
Ubuntu 24.04 のデフォルトでは /etc/resolv.conf は /run/systemd/resolve/stub-resolv.conf へのシンボリックリンクとなっています。
$ ls -l /etc/resolv.conf
lrwxrwxrwx 1 root root 39 12月 17 03:03 /etc/resolv.conf -> ../run/systemd/resolve/stub-resolv.conf
man resolv.conf を実行すると「nameserver」は最大で3件まで指定できるようです。
$ man resolv.conf
・
・
nameserver Name server IP address
Internet address of a name server that the resolver should query, either an IPv4 address (in dot nota‐
tion), or an IPv6 address in colon (and possibly dot) notation as per RFC 2373. Up to MAXNS (currently
3, see <resolv.h>) name servers may be listed, one per keyword. If there are multiple servers, the re‐
solver library queries them in the order listed. If no nameserver entries are present, the default is
to use the name server on the local machine. (The algorithm used is to try a name server, and if the
query times out, try the next, until out of name servers, then repeat trying all the name servers until
a maximum number of retries are made.)
・
・
ということで、以下のアドレスを「nameserver」として指定したいと思います。
- 1.1.1.1
- 8.8.8.8
- 9.9.9.9
上記の値は /etc/systemd/resolved.conf 内にも「Some examples of DNS servers〜」と説明が記載されています。
$ cat /etc/systemd/resolved.conf
・
・
[Resolve]
# Some examples of DNS servers which may be used for DNS= and FallbackDNS=:
# Cloudflare: 1.1.1.1#cloudflare-dns.com 1.0.0.1#cloudflare-dns.com 2606:4700:4700::1111#cloudflare-dns.com 2606:4700:4700::1001#cloudflare-dns.com
# Google: 8.8.8.8#dns.google 8.8.4.4#dns.google 2001:4860:4860::8888#dns.google 2001:4860:4860::8844#dns.google
# Quad9: 9.9.9.9#dns.quad9.net 149.112.112.112#dns.quad9.net 2620:fe::fe#dns.quad9.net 2620:fe::9#dns.quad9.net
・
・
以下のように /etc/systemd/resolved.conf の「DNS」を修正します。
$ sudo vim /etc/systemd/resolved.conf
$ diff /etc/systemd/resolved.conf /etc/systemd/resolved.conf.orig
24c24
< DNS=1.1.1.1 8.8.8.8 9.9.9.9
---
> #DNS=
33c33
< DNSStubListener=no
---
> #DNSStubListener=yes
「systemd-resolved」を再起動します。
$ sudo systemctl restart systemd-resolved
/etc/resolv.conf を確認すると、「Too many DNS servers configured〜」というエラーが表示されるようになってしまいました。
これは man resolv.conf に記載のあった「Up to MAXNS (currently 3, see )」の値を超えて、4件の「nameserver」の指定があるためと思われます。
$ cat /etc/resolv.conf
・
・
nameserver 1.1.1.1
nameserver 8.8.8.8
nameserver 9.9.9.9
# Too many DNS servers configured, the following entries may be ignored.
nameserver 192.168.0.1
search .
resolvectl status を実行すると nameserver 192.168.0.1 と表示されていることから恐らく家庭内LANのDHCPサーバーから取得したものだと予想できます。
$ resolvectl status
Global
Protocols: -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
resolv.conf mode: uplink
Current DNS Server: 1.1.1.1
DNS Servers: 1.1.1.1 8.8.8.8 9.9.9.9
Link 2 (enxXXXXXXXXXXXX)
Current Scopes: DNS
Protocols: +DefaultRoute -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
Current DNS Server: 192.168.0.1
DNS Servers: 192.168.0.1
Link 3 (wlpXXXX)
Current Scopes: none
Protocols: -DefaultRoute -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
Link 4 (docker0)
Current Scopes: none
Protocols: -DefaultRoute -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
なので、関係しそうな /etc/netplan 配下のファイルに以下の修正を加えます。
この修正によりDHCP(IPv4)用の設定を上書きして、内部IPのDNSを使用しないようにします。
$ sudo cp /etc/netplan/90-NM-XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.yaml /etc/netplan/90-NM-XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.yaml.orig
$ sudo vim /etc/netplan/90-NM-XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.yaml
$ sudo diff /etc/netplan/90-NM-XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.yaml /etc/netplan/90-NM-XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.yaml.orig
9,10d8
< dhcp4-overrides:
< use-dns: false
設定を反映します。
$ sudo netplan apply
** (generate:7526): WARNING **: 23:26:26.740: Permissions for /etc/netplan/01-network-manager-all.yaml are too open. Netplan configuration should NOT be accessible by others.
** (process:7524): WARNING **: 23:26:27.001: Permissions for /etc/netplan/01-network-manager-all.yaml are too open. Netplan configuration should NOT be accessible by others.
** (process:7524): WARNING **: 23:26:27.116: Permissions for /etc/netplan/01-network-manager-all.yaml are too open. Netplan configuration should NOT be accessible by others.
今回の修正とは直接関係はありませんが /etc/netplan/01-network-manager-all.yaml のパーミッションが緩いと警告が表示されたので、権限を変更しておきます。
$ ls -l /etc/netplan/01-network-manager-all.yaml
-rw-r--r-- 1 root root 104 8月 6 2025 /etc/netplan/01-network-manager-all.yaml
$ sudo chmod 600 /etc/netplan/01-network-manager-all.yaml
$ ls -l /etc/netplan/01-network-manager-all.yaml
-rw------- 1 root root 104 8月 6 2025 /etc/netplan/01-network-manager-all.yaml
念の為にもう一度 netplan apply を実行すると、今度は警告が表示されずに反映されたようです。
$ sudo netplan apply
「systemd-resolved」を再起動します。
$ sudo systemctl restart systemd-resolved
resolvectl status を実行すると Current DNS Server の項目は表示されなくなりましたが、まだ DNS Servers: 192.168.0.1 が表示されている状態です。
$ resolvectl status
Global
Protocols: -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
resolv.conf mode: uplink
DNS Servers: 1.1.1.1 8.8.8.8 9.9.9.9
Link 2 (enxXXXXXXXXXXXX)
Current Scopes: DNS
Protocols: +DefaultRoute -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
DNS Servers: 192.168.0.1
Link 3 (wlpXXXX)
Current Scopes: none
Protocols: -DefaultRoute -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
Link 4 (docker0)
Current Scopes: none
Protocols: -DefaultRoute -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
netplan の設定ファイルの「renderer」を確認すると「NetworkManager」と表示されます。
$ sudo grep renderer /etc/netplan/90-NM-*.yaml
/etc/netplan/90-NM-XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.yaml: renderer: NetworkManager
/etc/netplan/90-NM-ZZZZZZZZ-ZZZZ-ZZZZ-ZZZZ-ZZZZZZZZZZZZ.yaml: renderer: NetworkManager
「NetworkManager」では netplan の設定ファイル内の以下の記述が効いていないような挙動に見えます。
dhcp4-overrides:
use-dns: false
Linuxには「NetworkManager」と「systemd-networkd」というネットワーク管理ツールがあり、以下のとおり現在操作している環境では「NetworkManager」が動作しているようです。
$ sudo systemctl is-active systemd-networkd
inactive
$ sudo systemctl is-active NetworkManager
active
「NetworkManager」用のCLIである nmcli を使って、ネットワークインターフェースを表示します。
$ nmcli connection show
NAME UUID TYPE DEVICE
Wired connection 1 XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX ethernet enxXXXXXXXXXXXX
lo YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY loopback lo
docker0 ZZZZZZZZ-ZZZZ-ZZZZ-ZZZZ-ZZZZZZZZZZZZ bridge docker0
AA-AAAA_AAAA AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA wifi --
BBBBB-BBBBBB BBBBBBBB-BBBB-BBBB-BBBB-BBBBBBBBBBBB wifi --
以下のコマンドを実行してネットワークインターフェース毎に「ipv4.ignore-auto-dns」を設定します。
コマンドの引数として与えるネットワークインターフェース名には「NAME」や「UUID」の値が指定できます。
$ sudo nmcli connection modify "NAME" ipv4.ignore-auto-dns yes
$ sudo nmcli connection modify "UUID" ipv6.ignore-auto-dns yes
設定の変更作業が完了したら、ネットワークインターフェースを一旦非アクティブ化して再度アクティブ化を行います。
$ sudo nmcli connection down "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
接続 'Wired connection 1' が正常に非アクティブ化されました (D-Bus アクティブパス: /org/freedesktop/NetworkManager/ActiveConnection/3)
$ sudo nmcli connection up "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
接続が正常にアクティベートされました (D-Bus アクティブパス: /org/freedesktop/NetworkManager/ActiveConnection/4)
/etc/resolv.conf を確認すると nameserver 192.168.0.1 の行が表示されなくなり、「Too many DNS servers configured〜」のエラーも消えました。
$ cat /etc/resolv.conf |grep -v '^#' |grep -v '^\s*$'
nameserver 1.1.1.1
nameserver 8.8.8.8
nameserver 9.9.9.9
search .
resolvectl status を実行すると、家庭内LANのDNSサーバーのIPアドレス( DNS Servers: 192.168.0.1 )が表示されなくなりました。
$ resolvectl status
Global
Protocols: -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
resolv.conf mode: uplink
Current DNS Server: 1.1.1.1
DNS Servers: 1.1.1.1 8.8.8.8 9.9.9.9
Link 2 (enxXXXXXXXXXXXX)
Current Scopes: none
Protocols: -DefaultRoute -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
Link 3 (wlpXXXX)
Current Scopes: none
Protocols: -DefaultRoute -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
Link 4 (docker0)
Current Scopes: none
Protocols: -DefaultRoute -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
この作業に取り掛かった際は「使ってないポートを閉じたい」という単純な動機だったのですが、結果として以下のような知見を得ることができました。
- 「DNSStubListener」の値によって
/run/systemd/resolve/stub-resolv.confが通常ファイルになったり、シンボリックリンクになったりと切り替わる。 - sudoコマンドの実行時はローカルのホスト名の名前解決を行っている。
-
/run/systemd/resolve/*.confの内容は以下の情報を元に自動生成される。-
/etc/netplan配下のファイル /etc/systemd/resolved.conf- nmcliコマンドで設定した各ネットワークインターフェース
-
- Linuxのネットワーク管理ツールには「systemd-networkd」と「NetworkManager」が存在する。
- 「NetworkManager」では netplan の設定ファイル内の指定が効く場合と効かない場合がある。
- 「NetworkManager」用のCLIとして nmcli が準備されている。
-
resolvectl statusを実行することで、どのDNSサーバーを利用しているかといったDNSに関わる情報が把握できる。
やる前は「ちょっとした変更だろう」ぐらいに考えていたのですが、思いがけずこれまで知らなかったことを色々と知る機会になったので、結果的にはやってよかったなと。
関連リンク