接下來我們利用_buildEthHeader、_buildIPHeader和_buildUDPHeader來建構一個完整的DNS server
首先,在監聽到packet後,我們可以得到對方的MAC(dMAC),對方的IP(dIP),對方的port(dPort),我們就能夠根據這三個資料確定目的地位址
data = getIPFromData(udp_data)
packet = _buildEthHeader() + _buildIPHeader() + _buildUDPHeader() + data
sock.send(packet)
完整的程式碼可見:https://gist.github.com/kaichiachen/9409e9aa327827da4df36f553389c4e0
接下來是實驗的部分,在client端一樣用nc連接,由於DNS不像TCP需要先確認連接,所以直接跑nc -u 172.17.0.2 20
Server端的部分
># iptables -t filter -I OUTPUT -p icmp --icmp-type 3 -j DROP
># python3 udp.py --port 20
然後在client端,可以輸入dns name,以“,”分割,例如abc.com
,def.com
,ghi.com
在server端可以看到如下結果
2020-09-19 03:45:42 PM INFO Listen on Port: 20
2020-09-19 03:45:48 PM INFO From 172.17.0.5 ====> abc.com > 1.2.3.4
2020-09-19 03:45:48 PM INFO From 172.17.0.5 ====> def.com > 2.3.4.5
2020-09-19 03:45:48 PM INFO From 172.17.0.5 ====> ghi.com > Unexisting dns name