Мне нужно подключить две локальные сети: LAN1: 10.10.0.0/16 и LAN2: 192.168.0.0/16. Я не могу выполнить простую маршрутизацию, потому что сеть 192.168.0.0/16 запрещена в LAN1, поэтому я думаю об использовании Full cone nat (1: 1) для преобразования 192.168.x.y / 16 в 10.11.x.y / 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 правил, что, я думаю, приведет к огромному снижению производительности. Итак, есть ли способ написать такой индивидуальный перевод с минимальным количеством правил?
Я не уверен, присутствует ли он во всех ядрах, но, возможно, вы ищете NETMAP цель.
Из страница руководства 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.
Как сказано в первом ответе, используйте -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
Вероятно, неплохо также добавить -d 10.10.0.0/16 в строку POSTROUTING.
Вы можете сделать это с помощью небольшого сценария оболочки
#!/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.