Я хотел бы перенаправить порт ssh на другой хост, а также на другой порт и интерфейс.
сервер1: 22 -> сервер1: 22
общедоступный интернет -> eth0 -> server1: 23 -> eth1 -> server2: 22
я включил пересылку ipv4
sysctl -p
net.ipv4.ip_forward = 1
и создал следующие правила таблицы IP
iptables -t nat -I PREROUTING -p tcp -i eth0 --dport 23 -j DNAT --to-destination 192.168.0.3:22
iptables -A FORWARD -i eth0 -o eth0 -p tcp --dport 23 -j ACCEPT
но я не могу заставить его работать, что мне не хватает?
наконец с помощью haukes я получил его работать
iptables -t mangle -A PREROUTING -d <Server1_eth0> -p tcp --dport 2223 -j MARK --set-mark 1 -i eth0
iptables -t nat -A PREROUTING -p tcp -m mark --mark 1 -j DNAT --to-destination <Server2>:2222 -i eth0
iptables -t nat -A POSTROUTING -m mark --mark 1 -j SNAT --to-source <Server1_eth1> -o eth1
iptables -A FORWARD -m mark --mark 1 -j ACCEPT -o eth1
where Server1_eth0 is my public ip
Если server1 не является шлюзом для server2, вам также понадобится SNAT. В противном случае server2 отправит ответ клиенту, который не распознает пакет, поскольку у него не server1 в качестве исходного адреса, а server2.
iptables -t nat -A POSTROUTING -p tcp -m conntrack --ctstate DNAT --ctorigdst server1 --ctorigdstport 23 -j SNAT --to-source server1
Точным и простым для понимания критерием фильтрации для правил в FORWARD, PREROUTING и POSTROUTING может быть метка пакета:
iptables -t mangle -A PREROUTING -d $server1_ip -p tcp --dport 23 -j MARK --set-mark 22
iptables -t nat -A PREROUTING -p tcp -m mark --mark 22 -j DNAT --to-destination $server2_ip:22
iptables -t nat -A POSTROUTING -m mark --mark 22 -j SNAT --to-source $server1_ip
iptables -A FORWARD -m mark --mark 22 -j ACCEPT
Обратите внимание: если server1 имеет более одного интерфейса и пакеты с DNAT маршрутизируются с одного интерфейса на другой (как это выяснилось в этом случае), то IP-адрес назначения соответствует IP-адресу и IP-адрес SNAT различны.
"-p tcp" не обязательно во второй строке, но iptables или Netfilter требует этого. Может быть полезно добавить, например, -m comment --comment "DNAT SSH from port 23 to server2"
во всех строках, чтобы сделать выборку iptables -L -nv
легче понять.