Skip to content

Instantly share code, notes, and snippets.

@fqrouter
Created February 5, 2013 16:07
Show Gist options
  • Save fqrouter/4715432 to your computer and use it in GitHub Desktop.
Save fqrouter/4715432 to your computer and use it in GitHub Desktop.
probe if the router is dropping tcp packet for specific source port
import socket
import dpkt
import sys
dst = sys.argv[1]
sport1 = 8080
sport2 = 8081
icmp_socket = sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)
icmp_socket.settimeout(2)
trace = []
for ttl in range(1, 20):
def send_syn_and_get_icmp_exceeded_src(sport):
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP)
tcp_socket.bind(('', sport))
tcp_socket.setsockopt(socket.SOL_IP, socket.IP_TTL, ttl)
tcp_socket.settimeout(2)
try:
tcp_socket.connect((dst, 80))
print('destination reached')
sys.exit(1)
except socket.error:
pass
finally:
tcp_socket.close()
try:
return socket.inet_ntoa(dpkt.ip.IP(icmp_socket.recv(1024)).src)
except socket.error:
return '*'
if len(trace) >= 4:
if '*' == trace[-1][1] and '*' == trace[-2][1] and '*' == trace[-3][1]:
print('filtered by %s' % trace[-4][1])
sys.exit(0)
router1_ip = send_syn_and_get_icmp_exceeded_src(sport1)
router2_ip = send_syn_and_get_icmp_exceeded_src(sport2)
print('via %15s\t%15s' % (router1_ip, router2_ip))
trace.append((router1_ip, router2_ip))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment