Mam problem z tak zwanym " DNS dostawcy internetu ".
( Nazwy i IP celowo zasłonilem xx )
$ ping -c20 (FQDN)xx.it
ping: xx.xx.it: Ta nazwa lub usługa jest nieznana
Generalnie internet działa, nie zauważyłem problemów
Korzystam z kilku darmowych DNS firm w internecie, albo jak kto woli " A fully qualified domain name (FQDN) " żeby wskazywał moje IP.
1. Jak zmienię DNS dostawcy mojego internetu na googla lub inne w /etc/resolv.conf to wtedy ping ( z własnym FQDN ) działa prawidłowo.
2. Korzystając z DNS dostawcy, mogę tak ping-ować się ( własne FQDN ) ileś razy i końcu ping dostaje odpowiedz od DNS jakie IP ping-ować i ping działa.
3. Próbowałem czytać rożne poradniki
i np. korzystając z DNS mojego dostawcy internetu
$ dig +short +trace (FQDN).xx.it
...
A moje_IP from server x.x.x.x in 43 ms.
Czyli widzi moje IP. Mogę tak próbować kilka razy i zwraca IP.
A chciałbym uzyskać przybliżoną nazwę serwera lub IP z którym mam problem żeby zgłosić usterkę.
Ale nie wiem jak.
Zastanawia mnie także w " dig +trace xx.xx.it " linie która zawiera chyba klucz --> RRSIG , czy istnieje możliwość jego sprawdzenia.
Zapytanie moje: dyn.en --> DNS dostawcy internetu
moje <-- Odpowiedz DNS dostawcy internetu: IP do dyn.en
Zapytanie moje: moja _strona --> dyn.en
moje <-- Odpowiedz dyn.en: IP do moja _strona.
Nie.
0/ Program X próbuje się dostać do mojastrona.example.com
1/ Twój komputer -> twój domyślny serwer DNS "jaką zawartość ma pole A dla wpisu mojastrona.example.com"
2/ Są 3 możliwe odpowiedzi:
a) mojastrona.example.com ma wpis 1.2.3.4 -> sukces, idź do punktu 4
b) nie wiem, i nie wiem kto może wiedzieć -> błąd "adres nie istnieje", koniec
c) nie wiem, ale serwery DNS z takimi to a takimi adresami IP mogą wiedzieć
3/ Ponawiasz pytanie, tylko że tym razem do wskazanego nowego serwera i wracasz do punktu 2
4/ Program X łączy się do 1.2.3.4
5/ Profit!
I tu ważna sprawa - to nie tak, że jak serwer A nie zna odpowiedzi to pyta serwer B, jak B nie zna to B pyta C, itd. Każdy serwer odpowiada wyłącznie klientowi i to klient odpytuje kolejne serwery. Nie ma "proszę czekać, przełączę pana do innego sekretariatu" tylko "proszę zadzwonić z pytaniem pod numer ...".
Jeżeli działa dobrze przez DNS Google'a (8.8.8.8 ) to sprawdź jeszcze CloudFlare'a (1.1.1.1). Jak też zadziała, to znaczy, że jest coś nie tak z DNS twojego operatora, najprawdopodobniej zwraca złe rekordy IN NS (to punkt 2c ze schematu).
Na ogół jeden z pierwszych etapów pośrednich to "idź pan w uj i pytaj głównych serwerów DNS" i przekierowuje na baterię serwerów root-servers.net i od nich klient wędruje w dół.
... i oszacować punkt usterki. Potem przed usterką za pomocą "whois" znaleźć usługodawcę i grzecznie poinformować go o problemie.
No niestety, w rzeczywistym świecie to tak nie działa... Wiem z pierwszej ręki...
Firma 1, w której pracuję zrobiła urządzenie dla firmy 2, która się łączy z ich IP (publicznego) Z na nasz serwer z publicznym adresem A. No i "nie bangla". To robię wszelkie mi znane tracerouty od nas do nich i każdym programem i systemem dostaję taką sekwencję hopów:
A - B - C - D - E - F - D - G - H (tu się pakiety gubią) ... Z
Jak da się w ogóle skonfigurować routing z pętelką?????? Tj mam jeden pomysł, policy based routing zależny od TTL pakietu, ale k...a JAK? I oczywiście wszyscy po drodze, nasz operator, ich operator (mają bezpośredni styk, ale pętla była już całkowicie po ich stronie), rozkładają ręce "niemożliwe". To ja im wysyłam raport. To oni "o k*a, faktycznie". Po dwóch tygodniach nieskutecznych modlitw do bogów routingu (tak to jest, jak składa się w ofierze wotum z CAT5 zamiast z CAT7E - bogom routingu robi to różnicę) klient zmienił operatora i magia, zadziałało...
1. Żeby pokazać problem i być bardziej poważnie potraktowanym
można stworzyć DDNS testowe z przekierowaniem do jakiejś popularnej strony.
I powiedzieć że dana strona Tobie / Mnie nie działa.
Moje DDNS nie prowadzi do żadnej strony, ponieważ ma inne zadanie, więc stworzyłem sobie takie testowe DDNS.
W dzisiejszych czasach coraz trudniej znaleźć IP które w przeglądarce od razu wyświetla jakąś stronę i jeszcze po angielsku dla zagranicznego serwisu /administratora DNS.
Ja znalazłem np. ubuntu.com
$ ping -c 1 ubuntu.com
PING ubuntu.com (91.189.88.180) 56(84) bytes of data.
Po wklejeniu w przeglądarkę 91.189.88.180 wyświetla się strona ubuntu.com.
Po wklejeniu mojego DDNS w przeglądarkę wyświetla się strona ubuntu.com.
PS: Czasami przeglądarka nie wyświetli strony jeśli uważa część Twojego adresu DNS / DDNS za zagrożenie.
Musisz wybrać inny adres lub zaakceptować ryzyko klikając odpowiedni przycisk lub słowo w komunikacie o zagrożeniu.
2. Może się komuś przyda skrypt.
Należy tylko wziąć pod uwagę że gdy widzisz coś takiego na wyjściu komendy mtr
Jeśli jest to linia pomiędzy to te połączenie jest albo wadliwe albo pośrednik się ukrywa i nie można stwierdzić czy te połączenie jest wadliwe.
Jeśli jest to ostatnia linia komendy mtr, to tu poprawka i przepraszam ale tego nie jestem pewien.
Mam po prostu jednocześnie kilka połączeń z nie wielką utratą danych które mogą być także winne.
Skrypt:
#!/bin/bash
# Developed for Linux
# License: GNU GPL v.3
# Version 2
# Destiny: Script for check DDNS
# Script usage: bash script name.freedns.com
# Check Dependecies
# List created automatically by find.bash.dep.sh version=7 source=https://github.com/tele1/LinuxScripts
[[ -z $(type -P awk) ]] && DEP="$DEP"$'\n'"awk"
[[ -z $(type -P dig) ]] && DEP="$DEP"$'\n'"dig"
[[ -z $(type -P echo) ]] && DEP="$DEP"$'\n'"echo"
[[ -z $(type -P grep) ]] && DEP="$DEP"$'\n'"grep"
[[ -z $(type -P mtr) ]] && DEP="$DEP"$'\n'"mtr"
[[ -z $(type -P ping) ]] && DEP="$DEP"$'\n'"ping"
[[ -z $(type -P printf) ]] && DEP="$DEP"$'\n'"printf"
[[ -z $(type -P sed) ]] && DEP="$DEP"$'\n'"sed"
[[ -z $(type -P tail) ]] && DEP="$DEP"$'\n'"tail"
[[ -z $(type -P wc) ]] && DEP="$DEP"$'\n'"wc"
[[ -z $(type -P whois) ]] && DEP="$DEP"$'\n'"whois"
# End script if exist any error
[ -z "$DEP" ] || { echo " Error: Missing dependencies, before run script please install: $DEP" ; exit 1 ;}
[ -z "$1" ] && { echo "Nie podano adresu www" ; exit 1 ;}
# Kolory
NC='\e[0m' # Reset Color
BL='\e[0;36m' # Cyan ECHO
GN='\e[0;32m' # Green ECHO
YW='\e[0;33m' # Yellow ECHO
RD='\e[0;31m' # Red ECHO
# Wydobądź wszystkie adresy | wyświetl jesli 4 kolumna zawiera NS
LISTA_ADRESOW=$(dig +trace +dnssec "$1" | awk '$4 ~ /NS$/' | awk '{ print $5 }')
echo "LISTA_ADRESOW:"
echo "$LISTA_ADRESOW"
echo "==============="
while read WEB ; do
echo "ping ${WEB}"
# Pingowanie x10 strone | pokazanie tylko liczby utraconych pakietow
LOSS=$(ping -c 10 "$WEB" | grep -oP '\d+(?=% packet loss)')
if [[ ! $LOSS -eq "0" ]]; then
printf "==> ${WEB} = ${LOSS} %%\n"
# Printf ma czasem problem i nie wiem czemu ": printf: `': nieprawidłowy znak formatujący"
# LISTA_NIEPRAWIDLOWOSCI=$(printf "${LISTA_NIEPRAWIDLOWOSCI}\n${WEB} ${LOSS} %%")
LISTA_NIEPRAWIDLOWOSCI="$LISTA_NIEPRAWIDLOWOSCI"$'\n'"${WEB} ${LOSS} %"
fi
done <<< "$LISTA_ADRESOW"
# Usuniecie pustej linii
LISTA_NIEPRAWIDLOWOSCI=$(grep -v -e '^$' <<< "$LISTA_NIEPRAWIDLOWOSCI")
echo "==============="
echo "LISTA_NIEPRAWIDLOWOSCI PING:"
echo "$LISTA_NIEPRAWIDLOWOSCI"
[ -z "$1" ] && { echo "Nie znaleziono wadliwego DNS" ; exit 0 ;}
# Wyswietlenie tylko pierwszej kolumny
LISTA_NIEPRAWIDLOWOSCI=$(awk '{ print $1 }' <<< "$LISTA_NIEPRAWIDLOWOSCI")
while read WEB ; do
echo "=================="
echo "mtr $WEB"
# Raport rozciagniety, z adresem IP, testowany x razy | bez hostname
RAPORT=$(mtr --report-wide --show-ips -c 10 "$WEB" | sed "s/HOST: `hostname`/ /g")
# Usuniecie pustych linii i policzenie
#LICZBA_LINII_RAPORTU=$(grep "\S" <<< "$RAPORT" | wc -l)
OSTATNIA_LINIA=$(tail -n 1 <<< "$RAPORT")
NR_LINII="0"
##for LINIA in `seq 1 $LICZBA_LINII_RAPORTU` ; do
while read LINIA ; do
# Wyświetl linie na zielono
echo -e "${GN}$LINIA${NC}"
NR_LINII=$[$NR_LINII+1]
# Poniżej 3 linii
if [ "$NR_LINII" -gt "3" ] ; then
WEB=$( awk '{ print $2 }' <<< "$LINIA")
# Policzenie slow jako sposob czy podano IP
LICZBA_SLOW=$(echo "$LINIA" | wc -w)
if [ "$LICZBA_SLOW" -eq "10" ] ; then
# Kolumna LOSS bez procentu i bez liczb dziesietnych
LOSS=$(awk '{ print $4 }' <<< "$LINIA" | sed -e "s/%//g" -e "s/\.[0-9]//g")
else
LOSS=$(awk '{ print $3 }' <<< "$LINIA" | sed -e "s/%//g" -e "s/\.[0-9]//g")
fi
if [ "$LOSS" -lt "100" ] ; then
# Alternatywa: https://www.whois.com/whois/
##echo "Debug: $WEB = $LOSS"
KONTAKT=$(whois -IHM "$WEB" | grep "@\|contact")
# Wyświetl kontakt w kolorze Cyan
echo -e "${BL}${KONTAKT}${NC}"
fi
fi
done <<< "$RAPORT"
##done
echo "=================="
done <<< "$LISTA_NIEPRAWIDLOWOSCI"