Networking

Docker macvlan 丟棄 UDP (DNS) 流量,TCP 工作

  • July 12, 2021

我正在嘗試使用macvlan創建一個容器,它是我的 lan 上的一等公民

我使用的是靜態 IP(儘管我知道使用一些“技巧”也可以使用 DHCP)。

我知道它可以通過host網路來完成,但我計劃執行 2 個單獨的 DNS 容器,並且我希望它們每個都有不同的 IP,所以host不是我正在尋找的解決方案。

我的設置

有關我的網路和主機設置的詳細資訊:

  • Unifi UGS 路由器,內部 IP:192.168.1.254
  • 網路遮罩:192.168.1.0/24
  • 主機作業系統:Ubuntu 20.04 LTS(Focal Fossa)
  • Docker 版本 20.10.2,建構 20.10.2-0ubuntu1~20.04.2
  • docker-compose 版本 1.28.5,建構 c4eb3a1f
  • br-lan主機 IP 通過連接到我的乙太網埠的橋接介面(名為 )接收。

[adguard-home][2]用作測試容器的圖像,下面是 docker-compose 配置輸出:

version: '3.7'
networks:
 br-lan:
   driver: macvlan
   driver_opts:
     parent: br-lan
   ipam:
     config:
     - gateway: 192.168.1.254
       subnet: 192.168.1.0/24
     driver: default

services:
 adguard:
   dns: # adguards default upstream DNS servers
   - 9.9.9.10
   - 149.112.112.10
   - 2620:fe::10
   - 2620:fe::fe:10
   image: adguard/adguardhome
   mac_address: '00:01:02:03:04:05:06:07' # Some randomized MAC address
   mem_limit: 500mb
   networks:
     br-lan:
       ipv4_address: 192.168.1.53
   restart: unless-stopped
   volumes:
   - /etc/localtime:/etc/localtime:ro
   - /srv/adguard/data/conf:/opt/adguardhome/conf:rw
   - /srv/adguard/data/work:/opt/adguardhome/work:rw

什麼有效

這實際上適用於 TCP,我可以訪問 WebUI(埠 3000 和 80),並且只要通過 TCP 完成 DNS 查詢它就可以工作(tcp 埠 53)。

容器本身可以訪問網路,反過來容器可以被主機以及區域網路上的機器訪問。

什麼不起作用

UDP DNS 查詢失敗。

我怎麼測試?

在網路中的 Windows 10 機器上,我正在執行以下 PowerShell 命令:

# Default (UDP) DNS Query - Fails
❯ Resolve-DnsName -DnsOnly -Server 192.168.1.53 -Name stackoverflow.com # Test regular UDP DNS Query
<# The Error output is
Resolve-DnsName : stackoverflow.com : DNS name does not exist
At line:1 char:1
+ Resolve-DnsName -DnsOnly -Server 192.168.1.53 -Name stackoverflow.c ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   + CategoryInfo          : ResourceUnavailable: (stackoverflow.com:String) [Resolve-DnsName], Win32Exception
   + FullyQualifiedErrorId : DNS_ERROR_RCODE_NAME_ERROR,Microsoft.DnsClient.Commands.ResolveDnsName
#>

# TCP DNS Query - works
❯ Resolve-DnsName -DnsOnly -Server 192.168.1.53 -Name stackoverflow.com -TcpOnly

Name                                           Type   TTL   Section    IPAddress
----                                           ----   ---   -------    ---------
stackoverflow.com                              A      2507  Answer     151.101.65.69
stackoverflow.com                              A      2507  Answer     151.101.129.69
stackoverflow.com                              A      2507  Answer     151.101.193.69
stackoverflow.com                              A      2507  Answer     151.101.1.69

我的問題是什麼,為什麼我在這裡發帖?

我不明白為什麼在 TCP 工作時 UDP 會失敗。我對 UDP 的搜尋並macvlan沒有取得成果,我希望這裡的人能夠指導我如何解決這個問題,以便我可以辨識我的設計中的缺陷,或者解釋我可以做些什麼來解決這個問題。

看起來這個問題與我的網路設置有關。

重新啟動後,UDP 通信開始工作。

注意(與問題無關,但可能感興趣),預設情況下容器和主機之間的通信預設被阻止。

只是更多細節:我最終改用 ipvlan,效果更好。為了連接到主機(ipvlan 和 macvlan 塊),我添加了一個網橋並使用本地 ip(本地機器上的 hosts 文件解決了這個問題)。

原始問題沒有正確描述,因此稍後我將刪除此答案。

重啟不是解決方案。

我猜你的問題在重啟後解決了,因為防火牆服務的自動啟動沒有啟用,現在你的防火牆沒有啟動。

在 ubuntu 20 中,您可以使用 ufw 管理防火牆,並且必須將埠 53 添加到防火牆

sudo systemctl start ufw # start firewall service
sudo systemctl enabled ufw # enable automatically start firewall service
sudo ufw allow 53 # open tcp/udp dns port
sudo ufw reload # apply firewall rule

引用自:https://serverfault.com/questions/1068807