Назад | Перейти на главную страницу

iptables: перенаправление портов ssh

У меня есть сервер с двумя сетевыми адаптерами: eth4 - слушает во внешней сети. eth1 - находится в той же сети, что и машина Y.

Я хочу иметь возможность подключиться к машине Y по ssh, выполнив: ssh server -p 1234 из внешней сети.

Я придумал следующие правила:

iptables -A PREROUTING -i eth4 -t nat -p tcp --dport 1234 -m state --state NEW,ESTABLISHED,RELATED -j DNAT --to-destination $MACHINE_Y_IP:22

и

iptables -A FORWARD -i eth4 -o eth1 -p tcp --dport 22 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

Когда я пытаюсь использовать ssh, соединение не отклоняется сразу, но такое ощущение, что iptables не пересылает пакеты обратно. Есть какие-нибудь подсказки относительно того, что я делаю неправильно? ОС - это SLES, если это имеет значение для синтаксиса.

Редактировать: sysctl net.ipv4.ip_forward отчеты net.ipv4.ip_forward = 1

iptables-save генерировать:

`# Generated by iptables-save v1.4.2-rc1 on Fri Nov 12 10:28:26 2010
*mangle
:PREROUTING ACCEPT [48787:5748712]
:INPUT ACCEPT [48725:5742333]
:FORWARD ACCEPT [29:1740]
:OUTPUT ACCEPT [25938:4009532]
:POSTROUTING ACCEPT [25967:4011272]
COMMIT
# Completed on Fri Nov 12 10:28:26 2010
# Generated by iptables-save v1.4.2-rc1 on Fri Nov 12 10:28:26 2010
*nat
:PREROUTING ACCEPT [68959:12817029]
:POSTROUTING ACCEPT [19579:1207747]
:OUTPUT ACCEPT [19566:1206967]
-A PREROUTING -i eth4 -p tcp -m tcp --dport 1234 -m state --state NEW,RELATED,ESTABLISHED -j DNAT --to-destination x.x.x.x:22 
COMMIT
# Completed on Fri Nov 12 10:28:26 2010
# Generated by iptables-save v1.4.2-rc1 on Fri Nov 12 10:28:26 2010
*filter
:INPUT ACCEPT [60982622:59727981305]
:FORWARD ACCEPT [10:600]
:OUTPUT ACCEPT [32438834:64059260511]
-A FORWARD -i eth4 -o eth1 -p tcp -m tcp --dport 22 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT 
COMMIT
# Completed on Fri Nov 12 10:28:26 2010`

Правила должны выглядеть примерно так.

iptables -t nat -I PREROUTING -p tcp -i eth4 --dport 1234 -j DNAT --to server:22
iptables -A FORWARD -i eth4 -o eth1 -p tcp --dport 22 -j ACCEPT

Не беспокойтесь о смешивании в модуле состояния. Скорее всего, это причина ваших проблем. Модуль NAT сохранит нужные вам состояния.

О, убедитесь, что у вас также включен ip_forwarding;)

Ниже приведены мои рабочие правила, но я использую модуль состояния:

*nat
:PREROUTING ACCEPT [101:9081]
:POSTROUTING ACCEPT [89:5340]
:OUTPUT ACCEPT [209:13346]

# DNAT to local ip
#-A PREROUTING -p tcp --dport $FW_EXTERNAL_PORT -d $FW_EXTERNAL_IP -j DNAT --to-destination $INTERNAL_MACHINE_IP:$INTERNAL_MACHINE_PORT

# ssh to server 192.168.0.3
-A PREROUTING -p tcp --dport 1234 -d 10.10.10.10 -j DNAT --to-destination 192.168.0.3:22
...
COMMIT

*filter
:INPUT ACCEPT [5583:2021142]
:FORWARD DROP [24:2378]
:OUTPUT ACCEPT [6291:2229990]

#rules for DNAT
#-A FORWARD -p tcp --dport $INTERNAL_MACHINE_PORT -d $INTERNAL_MACHINE_IP -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
# SSH to 192.168.0.3
-A FORWARD -p tcp --sport 22 -s 192.168.0.3 -j ACCEPT
-A FORWARD -p tcp --dport 22 -d 192.168.0.3 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
... 
COMMIT

Я надеюсь, что в вашей конфигурации iptables есть нечто большее, чем то, что вы нам показываете. В таблице фильтров * INPUT по умолчанию принимает значение. Люди, которые плохо знакомы с iptables, могут взять его и запустить с ним, оставив свою систему открытой. Вы можете установить для цепочек по умолчанию в фильтре значение DROP, а затем открывать только те порты, которые вы хотите получить в вашем ящике, иначе у вас будет «забор из цепочки» вместо брандмауэра. С вашим правилом POSTROUTING это будет работать, но вам нужно будет создать аналогичное правило для каждого открытого порта. Что-то вроде этого [iptables -A POSTROUTING -t nat -o eth4 -j SNAT --to pu.bl.ic.ip] будет работать для всех портов, идущих на внешний интерфейс. В цепи FORWARD рекомендуется использовать «пояс и подтяжки» для защиты вашей коробки. Вы можете добавить -s yo.ur.ext.ip, чтобы, если кто-то еще попытается получить доступ к этому порту, он будет удален. Я надеюсь, что это поможет кому-то.