У меня есть два сетевых интерфейса, eth0 и eth1. У eth0 публичный ip, у eth1 - 172.16.0.254/24.
Я хотел бы сделать следующее сопоставление:
172.16.0.1:22 -> eth0's public ip:2001
172.16.0.2:22 -> eth0's public ip:2002
172.16.0.3:22 -> eth0's public ip:2003
...
172.16.0.100:22 -> eth0's public ip:2100
Я читал, что iptables поддерживает диапазоны, но у меня это не работает.
Как я могу этого добиться?
Спасибо.
Я почти уверен, что вы не можете сделать это изначально с iptables. У вас есть диапазоны IP, многопортовый, но AFAIK вы не можете сопоставить диапазон IP с диапазоном портов.
Однако это можно довольно легко решить с помощью небольшого сценария bash:
for i in $(seq 1 100); do iptables -t nat -A PREROUTING -i eth0 -p tcp -d 172.16.0.$i --dport 22 -j REDIRECT --to-port 2`printf "%03d" $i`; done
... предполагая, что ваш сервер (ы), открывающий 2001-2100, прослушивает (привязан) ко всем интерфейсам (0.0.0.0), и вы используете TCP.
Возможно, вы захотите использовать DNAT
цель и -p udp
соответственно, если это не так.
Если имеется 100 правил в PREROUTING
цепочка - это проблема (читаемость или обслуживание), вы можете вместо этого создать свою собственную цепочку и перейти к ней из PREROUTING
.