У меня есть ПК с Ubuntu с двумя сетевыми картами, которые работают как маршрутизатор. Одна карта eth0 подключена к Интернету, а другая eth1 подключена к локальной сети. Я хочу открыть ssh-порты разных хостов в локальной сети для разных номеров портов для внешнего мира. т.е. "ssh user @ router -p 1234" должен перейти на ssh-порт хоста host1, а "ssh user @ router -p 3456" должен перейти по ssh на host2. Я добавил следующее правило iptable для host1, но оно не работает:
iptables -A FORWARD -i $EXTIF -o $INTIF -p tcp --dport 1234 -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A PREROUTING -t nat -p tcp -d $EXTIP --dport 1234 -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j DNAT --to-destination 10.9.0.2:22
EXTIF - это внешний интерфейс (eth0), INTIF - это внутренний интерфейс (eth1), EXTIP - это IP-адрес eth0.
Любая помощь? (Не уверен, что вопрос ясен, пожалуйста, используйте правильный жаргон, если кто-то понимает мои намерения)
Правило для цепочки FORWARD должно использовать целевой порт, потому что оно выполняется после цепочки предварительной маршрутизации, то есть после того, как DNAT был выполнен.
iptables -A FORWARD -i $EXTIF -o $INTIF -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT
Хорошая обзорная диаграмма того, как различные таблицы и цепочки связаны друг с другом, находится здесь: http://www.csie.ntu.edu.tw/~b92035/cnl/hw1/Iptables.gif