我想每个源IP(我有很多)将永远是相同的SNAT(我有两个,这对我来说可以第一次randomaly)。
例如:
10.0.0.1 > 8.0.0.1 10.0.0.2 > 8.0.0.2 10.0.0.3 > 8.0.0.1 10.0.0.4 > 8.0.0.2 10.0.0.1 > 8.0.0.1 10.0.0.2 > 8.0.0.2
等。
有可能的?
显然-j SNAT --persistent
工作只有一个src / dst对,所以当连接到不同的目的地时,不能保证使用相同的源。
相反,从man iptables-extensions
:
U32
U32testing从数据包中提取的最多4个字节的数量是否具有指定的值。 什么提取的规范是足够一般的,以find从tcp标头或有效载荷给定的偏移量的数据。
只要你想要转换后的2 ^ n个IP(在这里你想要2,所以没问题),那么通过检查原始IP模2 ^ n的结尾并且只做2 ^ n(这里是2)从结果中select性的SNAT。 解决scheme是:
iptables -t nat -I POSTROUTING -s 10.0.0.0/16 ! -d 10.0.0.0/16 -m u32 --u32 '12 & 0x1 = 0x1' -j SNAT --to-source 8.0.0.1 iptables -t nat -I POSTROUTING -s 10.0.0.0/16 ! -d 10.0.0.0/16 -m u32 --u32 '12 & 0x1 = 0x0' -j SNAT --to-source 8.0.0.2
12是数据包中源IP地址的位置
如果需要的话,请用-A和所有/ 16(你说的很多!
如果您事先不知道目标IP(8.0.0.1和8.0.0.2),那么您当然必须在脚本中使用一些variables来replace值(8.0.0.1和8.0.0.2)
如果你有4个可用的公有IP地址,你可以将掩码& 0x1
更改为& 0x3
并且总共使用4个SNAT,对于4个可能的结果中的每一个,都会有一个1 2 3 0。 等等…
由于没有等效的目标扩展规则,使用iptables对目标IP进行“通用”转换似乎是不可能的,以便直接在独特的规则中使用testing的结果。
我使bpf匹配使mod操作除以任何数量的外部ip
像这样ip % 3 == 2
这个bash代码
#!/bin/bash mod=7 src_ip_mod (){ eq=$1 echo "15,48 0 0 0,84 0 0 240,21 0 11 64,32 0 0 12,2 0 0 1,52 0 0 ${mod},7 0 0 5,0 0 0 ${mod},44 0 0 0,7 0 0 5,96 0 0 1,28 0 0 0,21 0 1 ${eq},6 0 0 65535,6 0 0 0" } mod=3 iptables -t nat -A POSTROUTING -m bpf --bytecode "`src_ip_mod 0`" -j SNAT --to-source 8.0.0.1 iptables -t nat -A POSTROUTING -m bpf --bytecode "`src_ip_mod 1`" -j SNAT --to-source 8.0.0.2 iptables -t nat -A POSTROUTING -m bpf --bytecode "`src_ip_mod 2`" -j SNAT --to-source 8.0.0.3