So geht es fast. Mein Anwendungsfall ist, ich muss mich mit Devices verbinden mit
192.168.x.x/24
172.225.12.x/24
10.x.x.x/28
Wie läuft das jetzt:
Der Laptop verbindet ich per WLAN mit dem Gateway und bekommt eine IP zugewiesen, die merke ich mir: 192.168.0.17 ip_source
Das Device hängt an eth0 mit fester IP, zB 173.225.12.150 ip_dest
Die Applikation versucht jetzt mit dem Device zu reden, das sehe ich und merke mir die Adresse 173.225.12.150 ip_dest:
Dann erstelle ich ein Netzwerkadapter mit der Adresse ip_dest und ändere die letzte Zahl auf die letzte mögliche Adresse von der Broadcast: 173.225.12.254 ip_adapter
Das geht alles prima
Was bis jetzt nicht funktioniert ist das Nat.
iptables -t nat -A POSTROUTING -o eth0 -s ip_source/24 -j SNAT --to-source ip_dest
Das Device müsste den Adapter eth0 zB 173.225.12.254 sehen und dahin Antworten und das soll dann auf die zB wlan0 192.168.0.17 geroutet werden.
klappt aber nicht.
Code: Alles auswählen
#!/usr/bin/python3
#import os
import subprocess
#file="/home/pi/check.sh"
#output = popen(/home/pi/check.sh)
#output = p.open([tcpdump -i wlan0 -n 'tcp[tcpflags]& (tcp-syn)!=0' and 'port 21 or port 80 or port 9090 or port 9091 or port 20 or port 22 -c1])
cmd="tcpdump -i wlan0 -n -c1 'tcp[tcpflags]& (tcp-syn)!=0' and port 21 or port 80 or port 9090 or port 9091 or port 20 or port 22"
def subnet(snet):
if snet >0 and snet < 15:
return "14"
if snet > 16 and snet < 31:
return "30"
if snet >0 and snet < 15:
return "14"
if snet > 32 and snet < 47:
return "46"
if snet >48 and snet < 63:
return "62"
if snet > 64 and snet < 79:
return "78"
if snet >80 and snet < 95:
return "94"
if snet > 96 and snet < 111:
return "110"
if snet >112 and snet < 127:
return "126"
if snet > 128 and snet < 143:
return "142"
if snet >144 and snet < 159:
return "158"
if snet > 160 and snet < 175:
return "174"
if snet >176 and snet < 191:
return "190"
if snet > 192 and snet < 207:
return "206"
if snet >208 and snet < 223:
return "222"
if snet > 224 and snet < 239:
return "238"
if snet > 240 and snet < 255:
return "254"
while True:
output=""
output=subprocess.check_output(cmd,shell=True, universal_newlines=True)
if output.find("FLAG"):
output=output.split(" ")
print (output)
ip_source=((output[2].split("."))[0:4])
ip_source=ip_source[0]+"."+ip_source[1]+"."+ip_source[2]+"."+ip_source[3]
ip_dest= ((output[4].split("."))[0:4])
print ("IP_dest0 "+ip_dest[0])
if ip_dest[0]=="192" or ip_dest[0]=="173":
ip_net=24
ip_adapter=ip_dest[0]+"."+ip_dest[1]+"."+ip_dest[2]+"."+"254"
ip_dest=ip_dest[0]+"."+ip_dest[1]+"."+ip_dest[2]+"."+ip_dest[3]
print ("IP-Source "+ip_source)
print ("IP-Dest "+ip_dest)
# print (ip_net)
print ("IP-Adapter "+ip_adapter)
output=""
cmd="ip address add "+ ip_adapter+"/24 dev eth0"
subprocess.run(cmd,shell=True, universal_newlines=True)
cmd="iptables -t nat -A POSTROUTING -o eth0 -s "+ip_source+"/24 -j SNAT --to-source "+ip_dest
subprocess.run(cmd,shell=True, universal_newlines=True)
if ip_dest[0]=="10":
ip_net=28
ip_adapter_offset=str(subnet(int(ip_dest[3])))
print ("Offset "+ip_adapter_offset)
ip_adapter=ip_dest[0]+"."+ip_dest[1]+"."+ip_dest[2]+"."+ip_adapter_offset
ip_dest=ip_dest[0]+"."+ip_dest[1]+"."+ip_dest[2]+"."+ip_dest[3]
print (ip_source)
print (ip_dest)
# print (ip_net)
print (ip_adapter)
output=""
ip_dest=""
ip_source=""
output=""