Мантаванне CIFS праз VPN падае з-за парадку nsswitch
Рэсурс адказвае па адрасе і завісае па імені, таму пошук памірае раней, чым пачынаецца SMB. Параўнайце getent з host, затым прачытайце радок hosts па парадку.
Тунэль падняты. Файлавы сервер адказвае на ping па адрасе. Затым mount.cifs з іменем хоста стаіць некаторы час і паведамляе, што хост недаступны, і вы пачынаеце перабудоўваць профіль VPN, які ніколі не быў праблемай. У Linux імя разрозніваецца glibc да таго, як з’явіцца любы пакет SMB, і парадак у гэтым рэзалверы можа скончыць пошук раней, чым DNS наогул спытаюць. Вось шлях, які я праходжу, пачынаючы з каманды, што не спрацавала, а не з кліента.
Чытайце збой у правільным месцы
Дзве ўтыліты ідуць рознымі шляхамі да аднаго імені, і параўнаць іх каштуе адной каманды. getent ідзе па наладжаным стэку службы імёнаў; host і dig запытваюць DNS напрамую і ігнаруюць гэты стэк. Калі прамы запыт вяртае адрас, а getent не вяртае нічога, то DNS-сервер даступны, і падае менавіта ваша канфігурацыя рэзалвера.
getent hosts fileserver.corp.example
host fileserver.corp.example 10.61.0.1
getent -s dns hosts fileserver.corp.example
Трэцяя каманда — вырашальная: яна прымушае крыніцу DNS і прапускае рэшту стэка. Калі гэта працуе, а звычайны getent не, вы даказалі, што вінаваты парадак, а не тунэль і не сервер.
Радок hosts — гэта паслядоўнасць, якая спыняецца рана
Рэзалвер glibc чытае /etc/nsswitch.conf і ідзе па запісе hosts: злева направа. Многія дыстрыбутывы пастаўляюць радок, дзе пошук multicast ідзе першым з далучаным дзеяннем ранняга вяртання. Гэтае дзеянне не ўпрыгожванне: калі mDNS адказвае “not found”, [NOTFOUND=return] завяршае ўвесь пошук, таму карпаратыўнае імя ніколі не адпраўляецца рэзалверу, які праштурхнуў VPN. Нішто гэтага не лагуе, бо запыт не быў адпраўлены, каб рэзалвер мог яго адхіліць. Таму мантаванне выглядае як завісанне, а затым паведамляе пра недаступны хост.
cat /etc/nsswitch.conf | grep '^hosts:'
# illustrative repair: dns before the early-return action
hosts: files myhostname mdns4_minimal dns [NOTFOUND=return] wins mdns4
Пастаўце DNS перад дзеяннем ранняга вяртання, а не выдаляйце mDNS, і змяняйце гэта праз кіраванне канфігурацыяй. Ручная праўка жыве да наступнай зборкі вобраза, а потым той жа тыкет прыходзіць з іншай машыны, якая не памятае пра выпраўленне.
Рэзалвер — гэта не пошукавы дамен
Для разрознення таксама трэба, каб імя было паспрабавана. Непоўнае імя, як fileserver, робіцца fileserver.corp.example толькі тады, калі да інтэрфейса, што нясе запыт, далучаны пошукавы дамен. VPN, які праштурхвае DNS-сервер без спісу пошуку, дае вельмі канкрэтнае раздзяленне: поўнае імя разрозніваецца, а кожнае кароткае імя падае.
Праверце абедзве формы перад праўкай профілю, бо два збоі паказваюць у розныя бакі. На хосце з systemd-resolved спасылка тунэля мае свае серверы і дамены маршрутызацыі, таму чытайце спасылку, а не глабальны файл.
resolvectl status
resolvectl query fileserver.corp.example
resolvectl dns
resolvectl domain
Калі запыт аднесены да спасылкі, якая не нясе тунэль, дамен маршрутызацыі адсутнічае, хоць адрас DNS прысутнічае. Гэта праблема палітыкі ў канфігурацыі resolved, а не праблема маршрутызацыі ў тунэлі.
Кантэйнеры нясуць уласную копію адказу
Кантэйнер, пабудаваны з агульнага вобраза, звычайна пастаўляе фіксаваны resolv.conf. Змены рэзалвера на хосце да яго не даходзяць, як і пошукавы дамен, таму зборачная задача, што мантуе рэсурс праз тунэль, падае, а тая ж каманда па-за кантэйнерам працуе. Дайце кантэйнеру ўласныя налады DNS і пошуку ў файле compose або ў аргументах запуску, а не толькі ў профілі хоста.
Праверце ўнутры кантэйнера, перш чым вінаваціць вобраз. Дзве каманды аднаўляюць увесь дыягназ за некалькі секунд, а другая даказвае, які рэзалвер сапраўды адказаў.
Толькі тады глядзіце на рэсурс і фільтр
Калі імя разрознілася, астатнія збоі — звычайныя сеткавыя. SMB патрабуе TCP 445 да сервера, а прагляд спісу працоўнай групы залежыць ад службаў імёнаў, якія тунэль, хутчэй за ўсё, не перадае. Падключайце па імені хоста, а не чакайце, пакуль спіс запоўніцца, і дайце кліенту сказаць, на якой стадыі ён спыніўся. Адхіленае злучэнне і ціхі timeout таксама варта раздзяляць, бо першае звычайна значыць, што нешта адказала, а другое — што не адказала нішто.
getent hosts fileserver.corp.example
nc -vz fileserver.corp.example 445
mount -t cifs //fileserver.corp.example/share /mnt/share \
-o vers=3.1.1,username=svc_mount,uid=1000
Разрознены адрас з адхіленым або пратэрмінаваным портам 445 — гэта праблема фаеруола або listener-а на тым баку. Няразрозненае імя — гэта праблема рэзалвера. А мантаванне, якое аўтэнтыфікуецца, але вяртае памылкі правоў, — ні тое, ні другое, таму не адкрывайце сеткавае пытанне зноў, калі сесія ўсталявана.
Трымайце выснову такой вузкай, як доказы. Калі адрас працуе, а імя не, тунэль робіць сваю працу, і выпраўленне належыць парадку рэзалвера, пошукаваму дамену або ўласнай канфігурацыі кантэйнера.