我必须连接两个 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
我不确定它是否存在于所有内核中,但你可能正在寻找的是网络地图目标。
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。