추가 읽기

추가 읽기

도메인 목록에서 메일 서버의 IP 주소를 확인하여 IP 주소와 일치하는지 확인해야 합니다. 구체적으로:

  1. 쿼리하려는 도메인 목록 작성
  2. 도메인별 MX 레코드 발굴
  3. IP 주소 MX 레코드 쿼리 결과에 대한 A 레코드 마이닝
  4. IP가 특정 IP와 일치하는 경우 "예" 또는 "아니요"를 반환합니다.

3단계에서 막혔어요.

지금까지 내 스크립트의 관련 부분은 다음과 같습니다.

#!/bin/bash
# Bulk DNS Lookup
#
# File name/path of domain list:
domain_list='domains.txt' # One FQDN per line in file.

# File name of output text
output='ns_output.txt'

# Clears previous output
> $output

# IP address of the nameserver used for lookups:
ns_ip='192.168.250.67'
#
# Seconds to wait between lookups:
loop_wait='1' # Is set to 1 second.

for domain in `cat $domain_list` # Start looping through domains
do
    echo $domain "Mail servers" >> $output
    MX=$(dig @$ns_ip MX $domain +short) #query MX records from domain list and store it as varial $MX
    echo $MX >> $output;
    echo " " >> $output
    echo " " >> $output
    sleep $loop_wait # Pause before the next lookup to avoid flooding NS
done;

문제는 또 다른 A 레코드 마이닝을 실행할 수 있도록 출력을 변수로 변환하는 방법을 모른다는 것입니다.

c****s.com Name Servers
c****s.com. 14400 IN NS ns1.a****l.com. yes

c****s.com Mail servers
10 mail.c*****s.com. 20 mail2.c****s.com.

MX 쿼리에서 반환된 각 서버의 IP 주소를 반환하기 위해 결과를 쿼리할 수 있는 방법이 있습니까?

편집: 나는 모든 사람의 답변을 시도했고 모두 작동하지만 Giles가 구현하기 가장 쉬운 것으로 나타났습니다. 이것이 내 최종 코드입니다.

    MX=$(dig @$ns_ip MX $domain +short) #query MX records from domain list and store it as variable $MX
    arr=( $MX ) #creates array variable for the MX record answers
    for ((i=1; i<${#arr[@]}; i+=2)); #since MX records have multiple answers, for loop goes through each answer
      do
        echo ${arr[i]} >> $output; #outputs each A record from above MX dig
        dig A +short "${arr[i]}" >> $output #queries A record for IP and writes answer
        MX_IP=$(dig A +short "${arr[i]}") #sets IP address from the dig to variable MX_IP
        if [[ "${arr[i]}" == *"a****d"* ]] #if the mail server host name contains a***d
          then
            echo "yes - spam filter" >> $output
          else
          if [[ $MX_IP == $CHECK_IP ]] #if not, check to see if the mail server's IP matches ours.
            then
              echo "yes - mail server"  >> $output
            else
              echo "no" >> $output
          fi
        fi

다음은 샘플 출력입니다(편집증을 위해 검열된 도메인 이름 및 IP).

a***l.com Mail servers  lastmx.a****d.net. 
85.x.x.x 
209.x.x.x
95.x.x.x yes - spamfilter
....
mail.b***c.com.
72.x.x.x yes - mail server

backup.b***c.com.
50.x.x.x no

mail2.b***c.com.
50.x.x.x no

답변1

가는 길 :

arr=( $MX )
for ((i=1; i<${#arr[@]}; i+=2)); do dig A +short "${arr[i]}"; done

 산출:

108.177.15.26
209.85.233.27
172.253.118.27
108.177.97.26
173.194.202.26

답변2

dig물론 BIND가 존재하는 유일한 도구는 아닙니다.

Daniel J. Bernstein의 djbdns 도구 세트를 사용하면 다음과 같은 간단한 문장이 됩니다.

%고양이 도메인.txt
freebsd.org.
%
%xargs dnsmx < domain.txt | sed -E -e 's/[[:digit:]]+ //' |
96.47.72.85
96.47.72.80
%

추가 읽기

  • 다니엘 J. 번스타인(1999).dnsmx.DJB웨어.
  • 다니엘 J. 번스타인(1999).dnsip.DJB웨어.

답변3

다음 명령은 호스트 이름 목록만 반환합니다(가중치와 후행 마침표는 제거됨).

MX_HOSTS=$(dig MX google.com +short | sed 's/.* \(.*\)\.$/\1/')

그런 다음 for 루프를 수행할 수 있습니다.

for h in ${MX_HOSTS} ; do
  MX_IPS="${MX_IPS} $(dig $h +short)"
done

그리고 테스트하세요:

[[ "${MX_IPS}" =~ "${CHECK_IP}" ]] && echo "yes" || echo "no"

답변4

IP 대신 MX 레코드 URL을 확인하기 위해 일부 변경을 수행했지만 다른 사람들이 이익을 얻을 경우를 대비해 공유하겠다고 생각했습니다.

#!/usr/bin/env bash
# Bulk DNS Lookup

# File name/path of domain list:
domain_list='domains.txt' # One FQDN per line in file.

# File name of output text
output='ns_output.txt'

# Clears previous output
> $output

# IP address of the nameserver used for lookups:
ns_ip='192.168.85.54'
#
# Seconds to wait between lookups:
loop_wait='1' # Is set to 1 second.

for domain in `cat $domain_list` # Start looping through domains
  do
    MX=$(dig @$ns_ip MX $domain +short) #query MX records from domain list and store it as variable $MX
    #echo $MX >> $output;
    #echo $domain >> $output;
    arr=( $MX ) #creates array variable for the MX record answers
    echo ${arr[1]} >> $output; #outputs only one record from above MX dig
    
    : '
    for ((i=1; i<${#arr[@]}; i+=2)); #since MX records have multiple answers, for loop goes through each answer
      do
        #echo $domain >> $output;
        echo ${arr[i]} >> $output; #outputs each A record from above MX dig
        #dig A +short "${arr[i]}" >> $output #queries A record for IP and writes answer
      done
    '

  done;

관련 정보