2015-06-01 2 views
3

Я пытаюсь получить исходную информацию о назначении для пакетов, перенаправленных с помощью iptables (конечная цель - перенаправить весь сетевой трафик на локальный хост, сохранив исходный IP-адрес назначения).
Я посылаю пакеты, используя следующий код:Python/iptables: Original Destination IP

import socket 
HOST = '192.168.10.1' 
PORT = 50007 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((HOST, PORT)) 
s.send(b'whatever') 
s.close() 

перенаправлять его:

iptables -t nat -A OUTPUT -d 192.168.10.1 -j DNAT --to 127.0.0.1 

А потом получать их:

import socket 
HOST = '' 
PORT = 50007 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((HOST, PORT)) 
while True: 
    s.listen(5) 
    conn, addr = s.accept() 
    print('Connected by', addr) 
    data = conn.recv(1024) 
    if(data): 
     print(data) 
conn.close() 

Я пытался использовать что-то вроде

dst = conn.getsockopt(socket.SOL_IP, socket.SO_ORIGINAL_DST, 16) 

, но это приводит к

AttributeError: 'module' object has no attribute 'SO_ORIGINAL_DST' 

ответ

2

Некоторые дальнейшего чтения и попытки привели меня к моей ошибке. Я немного смутился с различными подходами, о которых я читал, и потерял трек. Подсказка заключалась в определении SO_ORIGINAL_DST (в данном случае для TCP).
Этот код (из here) делает именно то, что я хочу:

SO_ORIGINAL_DST = 80 
sockaddr_in = conn.getsockopt(socket.SOL_IP, 
           SO_ORIGINAL_DST, 16) 
(proto, port, a, b, c, d) = struct.unpack('!HHBBBB', sockaddr_in[:8]) 
print('Original destination was: %d.%d.%d.%d:%d' % (a, b, c, d, port))