我正在尝试获取使用iptables重定向的数据包的原始目标信息(最终目标是将所有网络流量重定向到localhost,同时保留原始目标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'
答案 0 :(得分:3)
进一步的阅读和尝试使我误入歧途。我对我读过的各种方法和丢失的轨道感到有些困惑。线索是定义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))