-
Notifications
You must be signed in to change notification settings - Fork 56
/
dnsleaktest.sh
executable file
·138 lines (110 loc) · 3.14 KB
/
dnsleaktest.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#!/usr/bin/env bash
#usage: ./dnsleaktest.sh [-i interface_ip|interface_name]
#example: ./dnsleaktest.sh -i eth1
# ./dnsleaktest.sh -i 10.0.0.2
RED='\033[0;31m'
BOLD='\033[1m'
NC='\033[0m'
api_domain='bash.ws'
error_code=1
getopts "i:" opt
interface=$OPTARG
function echo_bold {
echo -e "${BOLD}${1}${NC}"
}
if [ -z "$interface" ]; then
curl_interface=""
ping_interface=""
else
curl_interface="--interface ${interface}"
ping_interface="-I ${interface}"
echo_bold "Interface: ${interface}"
echo ""
fi
function increment_error_code {
error_code=$((error_code + 1))
}
function echo_error {
(>&2 echo -e "${RED}${1}${NC}")
}
function require_command {
command -v $1 > /dev/null
if [ $? -ne 0 ]; then
echo_error "Please, install \"$1\""
exit $error_code
fi
increment_error_code
}
function check_internet_connection {
curl --silent --head ${curl_interface} --request GET "https://${api_domain}" | grep "200 OK" > /dev/null
if [ $? -ne 0 ]; then
echo_error "No internet connection."
exit $error_code
fi
increment_error_code
}
require_command curl
require_command ping
check_internet_connection
if command -v jq &> /dev/null; then
jq_exists=1
else
jq_exists=0
fi
id=$(curl ${curl_interface} --silent "https://${api_domain}/id")
for i in $(seq 1 10); do
ping -c 1 ${ping_interface} "${i}.${id}.${api_domain}" > /dev/null 2>&1
done
function print_servers {
if (( $jq_exists )); then
echo ${result_json} | \
jq --monochrome-output \
--raw-output \
".[] | select(.type == \"${1}\") | \"\(.ip)\(if .country_name != \"\" and .country_name != false then \" [\(.country_name)\(if .asn != \"\" and .asn != false then \" \(.asn)\" else \"\" end)]\" else \"\" end)\""
else
while IFS= read -r line; do
if [[ "$line" != *${1} ]]; then
continue
fi
ip=$(echo $line | cut -d'|' -f 1)
code=$(echo $line | cut -d'|' -f 2)
country=$(echo $line | cut -d'|' -f 3)
asn=$(echo $line | cut -d'|' -f 4)
if [ -z "${ip// }" ]; then
continue
fi
if [ -z "${country// }" ]; then
echo "$ip"
else
if [ -z "${asn// }" ]; then
echo "$ip [$country]"
else
echo "$ip [$country, $asn]"
fi
fi
done <<< "$result_txt"
fi
}
if (( $jq_exists )); then
result_json=$(curl ${curl_interface} --silent "https://${api_domain}/dnsleak/test/${id}?json")
else
result_txt=$(curl ${curl_interface} --silent "https://${api_domain}/dnsleak/test/${id}?txt")
fi
dns_count=$(print_servers "dns" | wc -l)
echo_bold "Your IP:"
print_servers "ip"
echo ""
if [ ${dns_count} -eq "0" ];then
echo_bold "No DNS servers found"
else
if [ ${dns_count} -eq "1" ];then
echo_bold "You use ${dns_count} DNS server:"
else
echo_bold "You use ${dns_count} DNS servers:"
fi
print_servers "dns"
fi
echo ""
echo_bold "Conclusion:"
print_servers "conclusion"
exit 0