Hello,
The internet protocol version 4 could be extended with source translation/source privacy.
The idea is as follows:
The ip.source is translated into something else/arbitrary along the path's routers to it's destination.
Each router selects a random available ip from a table which is to replace the ip.source of the packet.
A bit is set in the packet indicating the privacy option. This bit could be bit 0 of the ip.flag, alternatively it could also be an add-on option, the flag bit is to be preferred because it would require little changes to simple ip implementations.
If the router does not support this new option then the ip.source is left intact.
Packets with the bit cleared are routed as normal.
Packets with the bit set indicate a special privacy packet and have to be treated in a special way.
if ip.flag.bit0 is set it indicates a privacy packet then if ip.TypeOfService.bit6 is set it indicates the ip.source is translated. if ip.TypeOfService.bit7 is set it indicates the ip.dest is translated.
Bit6 of ip.TypeOfService is used to indicate the ip.source is translated. Bit7 of ip.TypeOfService is used to indicate the ip.destination is translated.
These two bits are used to indicate if it's a regular/normal ip or a translated ip.
Based on this information the router can make a decision if the packet is to be routed freely/normally or if certain restrictions apply.
If the ip.TypeOfService.bit7 is set then a restriction applies. The router can only route the packet towards the router which had the ip.dest as an ip.source during previous transmissions/reception at the current router.
Therefore each router on reception of a privacy packet must also remember from which router it came. Therefore each ip.source (ip translated source) is unique per router and needs a seperate entry into the router's hash table/data structure.
All translated ip's remain valid for a certain period of time which needs to be standardized for example 5 minutes might be ok.
The goal of the idea is to keep the ip.source secret from end points of the internet and also of other routers. At each stage/hops/router that supports it translation happens, stages/hops/routers that don't support it should function normally and still work:
A->B->C->D->E
C does not support translation.
A sends to E along path BCD.
Packet at A looks like: ip.source = A ip.dest = E ip.flag.bit0 = 1 ip.tos.bit6 = 0 ip.tos.bit7 = 0
Packet at B looks like: ip.source = Z (z selected from ip_seen_table, (z not in ip_seen_table, z not in translation tables)) (forward_translation_table[A].replacement = Z) (backward_translation_table[Z].replacement = A) ip.dest = E ip.flag.bit0 = 1 ip.tos.bit6 = 1 ip.tos.bit7 = 0
Packet at C looks like: ip.source = Z ip.dest = E ip.flag.bit0 = 1 ip.tos.bit6 = 1 ip.tos.bit7 = 0
Packet at D looks like: ip.source = G (G selected from ip_seen_table, (G not in ip_seen_table, G not in translation tables)) (forward_translation_table[Z].replacement = G) (backward_translation_table[G].replacement = Z) ip.dest = E ip.flag.bit0 = 1 ip.tos.bit6 = 1 ip.tos.bit7 = 0
Packet at E looks like: ip.source = G ip.dest = E ip.flag.bit0 = 1 ip.tos.bit6 = 1 ip.tos.bit7 = 0
EndPoint E will believe the packet came from G.
EndPoint E wishes to communicate back to G which is actually A and proceeds as normal and sends messages back:
EndPoint E does also not support privacy option therefore Packet E will send the following:
Packet at E looks like: ip.source = E ip.dest = G ip.flag.bit0 = 0 ip.tos.bit6 = 0 ip.tos.bit7 = 0
Packet at D looks like:
Router at D detects G and knows it was a translated IP, meanwhile it could also have become the real G this is where it gets a little tricky. if the real G was received by router at D and was also transmitted to E a conflict has occured. This could be solved by translating conflicts as well... therefore the real G could get a different IP for the time being... which could further confuse E which is not desirable... so instead the privacy "connection" is lost and the real G will prevail over the fake G. The fake G can be removed and replaced with something else, resulting in a short loss of a packet possibly a tcp connection and other udp related connections... future protocols might need to be aware of suchs drops and take it into account that it might happen, if clients start supporting priacy option as well this might not be a problem anymore since the flags will indicate if it was a translated ip or a real ip.
Anyway let's go on for a moment since these conflicts could be rare in practice and might not really present that big of a problem...
As I was writing... the router at D detects G and translates it back via it's backward translation table. G is replaced with Z.
Since the router support privacy option, the E is also translated.
ip.source = Q (Q selected from ip_seen_table, (Q not in ip_seen_table, Q not in translation tables)) (forward_translation_table[E].replacement = Q) (backward_translation_table[Q].replacement = E) ip.dest = Z ip.flag.bit0 = 1 ip.tos.bit6 = 1 ip.tos.bit7 = 1
Packet at C looks like:
ip.source = Q ip.dest = Z ip.flag.bit0 = 1 ip.tos.bit6 = 1 ip.tos.bit7 = 1
Router at C does not support privacy option and ignores it and routes the packet forward to Z which came from the router at B.
Here another potential problem exists... if C does not copy over the tos bits then B could get confused... I am not sure what routers do and if they are allowed to modify tos bits from packets. If they are allowed to modify tos bits than a solution will have to be found, and some other kind of bits might have to be used. If no solution can be found then perhaps this idea could be implemented for ipv6 instead.
Packet at B looks like:
Router at B supports privacy option and applies it to the source as well... Q is replaced with L
ip.source = L (L selected from ip_seen_table, (L not in ip_seen_table, L not in translation tables)) (forward_translation_table[Q].replacement = L) (backward_translation_table[L].replacement = Q) ip.dest = A (Z is found in translation table) (Z is replaced with A via backward translation table) ip.flag.bit0 = 1 ip.tos.bit6 = 1 ip.tos.bit7 = 0
Bit7 could be turned off since it detected/found Z in table... and thus can translate it back.
ip.tos.Bit7 could there prevent confusion among routers and to make them understand if something is a real ip or a translated ip as to be able to properly route real ip's. I am not completely sure if bit7 is really required but I think so...
Further experimentation with this idea would give further insights if it's required and I would expect so.
To me this idea seems usuable and workable in practice... so far I have described two little potential problems and possible solutions... conflicts between translated ip's and real ip's which would be rare, in such case the privacy option/path could be dropped.
Copieing of the tos bits. Perhaps this is not really that big of a problem... since B will find the translated IP in it's tables... it only again becomes a problem if a translated IP and a real IP is received at B, without the proper tos bits set B might not have a way to determine if it was a translated or real ip, however it might still be able to understand it by looking at from which router it received !
So additional solutions are thinkable and might still be available/possible.
Therefore I think this idea has merit, requires no changes to the packet format itself. Only requires reinterpretation of the flag.bit0 which was marked as reserved, therefore it could be used.
Plus tos.bit6 and tos.bit7 is usually indicated as reserved/not used so also seem free to be used especially in combination with flag.bit0 set.
The motivation for this idea is to protect internet users from harrassment and lawsuits relating to copyright infringement and such.
Also to give internet users more privacy, and less snooping into their lifes, and perhaps also to enlighten the role of internet service providers so that they in all honesty can say that they don't know who sent what...
Bye, Skybuck.