Iptables 大规模 1:1 NAT

Iptables 大规模 1:1 NAT

我必须连接两个 LAN:LAN1:10.10.0.0/16 和 LAN2:192.168.0.0/16。我无法进行简单的路由,因为 192.168.0.0/16 网络在 LAN1 中被禁止,因此我考虑使用全锥形 nat (1:1) 将 192.168.xy/16 转换为 10.11.xy/16。每个转换都按照以下规则完成:

iptables -t nat -A PREROUTING -d 10.11.0.0/16 -j DNAT --to-destination 192.168.0.0/16
iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -j SNAT --to-source 10.11.0.0/16

但我必须输入 254*254*2 条规则,我认为这将导致性能大幅下降。那么,有没有办法用最少的规则编写这种一对一的翻译?

答案1

我不确定它是否存在于所有内核中,但你可能正在寻找的是网络地图目标。

来自iptables 手册页

NETMAP
 This target allows you to statically map a whole network of 
 addresses onto another network of addresses. It can only be 
 used from rules in the nat table. 

 --to address[/mask]
     Network address to map to. The resulting address will be 
     constructed in the following way: All 'one' bits in the 
     mask are filled in from the new 'address'. All bits that 
     are zero in the mask are filled in from the original 
     address. 

答案2

就像第一个答案所说的那样,使用-j NETMAP:

# iptables -t nat -A PREROUTING -d 10.11.0.0/16 -j NETMAP --to 192.168.0.0/16
# iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -j NETMAP --to 10.11.0.0/16

在 POSTROUTING 行中添加 -d 10.10.0.0/16 可能也是个好主意。

答案3

你可以用一个小的 shell 脚本来做到这一点

#!/bin/bash
for (( i=0 ; $i<256 ; i=$i+1 )) ; do
  for (( j=0 ; $j<256 ; j=$j+1 )) ; do
    iptables -t nat -A PREROUTING -d 10.11.$i.$j/16 -j DNAT --to-destination 192.168.$i.$j/16
    iptables -t nat -A POSTROUTING -s 192.168.$i.$j/16 -j SNAT --to-source 10.11.$i.$j/16
  done
done

但我认为有一个错误。我认为应该是/32,而不是/16。

相关内容