Здравствуйте!
Для начала ситуация, чтобы избежать вопросов "а зачем тебе"?
Есть сеть, шлюз у неё DSL 2500, на котором был проброшен VNC (5900) для доступа к машинам "снаружи". Сейчас на компьютерах установлено ПО, которое блокирует весь трафик кроме "доверенной" подсети (которой является внутренняя подсеть). Получается так, что удалённый доступ по VNC утерян, т.к. source IP теперь внешний (белый) адрес модема. Выход из ситуации такой, что нужно "подменять" source IP у VNC пакета.
Для этого, как я думаю, нужно изменить конфигурацию iptables на устройстве (2500).
Опять же, как я думаю, нужно использовать SNAT для замены адреса, но его можно применять только в POSTROUTING
Мой алгоритм таков:
1) iptables -t nat -A POSTROUTING -p tcp -o $EXT_IFACE --sport 5900 -j SNAT --to-source $IP_адрес_модема (т.е. я предполагаю что он будет "стучать" по VNC от "своего имени")
2) iptables -t filter -A INPUT -p tcp --dport 5900 -j ACCEPT (таким образом я предполагаю что далее пакет попадает на локальный интерфейс модема и его надо разрешить)
3) iptables -t filter -A FORWARD -p tcp --s 192.168.1.1 --sport 5900 -j REDIRECT -d 192.168.1.2 (и вот тут проблема, я думаю, что 3м шагом должна быть отправка пакета по заданному адресу, но действие REDIRECT доступно только для в цепочках PREROUTING и OUTPUT таблицы nat)
Объясните где я не прав в прохождении пакета, и если прав - как отправить его на нужный хост.
Ну и если кто напишет готовые правила и прокомментирует буду признателен!
Спасибо!
>[оверквотинг удален]
> (таким образом я предполагаю что далее пакет попадает на локальный интерфейс
> модема и его надо разрешить)
> 3) iptables -t filter -A FORWARD -p tcp --s 192.168.1.1 --sport 5900
> -j REDIRECT -d 192.168.1.2 (и вот тут проблема, я думаю, что
> 3м шагом должна быть отправка пакета по заданному адресу, но действие
> REDIRECT доступно только для в цепочках PREROUTING и OUTPUT таблицы nat)
> Объясните где я не прав в прохождении пакета, и если прав -
> как отправить его на нужный хост.
> Ну и если кто напишет готовые правила и прокомментирует буду признателен!
> Спасибо!iptables -t nat -A PREROUTING -i EXT_IP -p tcp --dport 5900 -j DNAT --to-destination LAN_IP:5900
iptables -t nat -A POSTROUTING -o INT_IP -p tcp -d LAN_IP --drort 5900 -j SNAT --to-source INT_IPiptables -A FORWARD -i EXT_IP -p tcp -d LAN_IP --dport 5900 -j ACCEPT
iptables -A FORWARD -o EXT_IP -p tcp -s LAN_IP --sport 5900 -j ACCEPT
>[оверквотинг удален]
>> (таким образом я предполагаю что далее пакет попадает на локальный интерфейс
>> модема и его надо разрешить)
>> 3) iptables -t filter -A FORWARD -p tcp --s 192.168.1.1 --sport 5900
>> -j REDIRECT -d 192.168.1.2 (и вот тут проблема, я думаю, что
>> 3м шагом должна быть отправка пакета по заданному адресу, но действие
>> REDIRECT доступно только для в цепочках PREROUTING и OUTPUT таблицы nat)
>> Объясните где я не прав в прохождении пакета, и если прав -
>> как отправить его на нужный хост.
>> Ну и если кто напишет готовые правила и прокомментирует буду признателен!
>> Спасибо!чуть опечатался в предыдущем сообщении. в качестве искупления вины пишу с комментариями ).
EXT_IP - внешний адрес шлюза (WAN)
INT_IP - внутренний адрес шлюза (LAN)
LAN_IP - целевой адрес в локальной сети (к которому подключиться надо)
EXT_IF - название внешнего интерфейса шлюза (WAN)
INT_IF - название внутреннего интерфейса шлюза (LAN)пробрасываем порт с внешнего интерфейса шлюза внутрь локальной сети
iptables -t nat -A PREROUTING -i EXT_IF -p tcp --dport 5900 -j DNAT --to-destination LAN_IP:5900
подменяем адрес источника пакета на внутренний адрес шлюза (это гарантирует нам, что запрос на целевую машину придет от адреса из локальной сети и ответ от нее будет послан на шлюз)
iptables -t nat -A POSTROUTING -o INT_IF -p tcp -d LAN_IP --drort 5900 -j SNAT --to-source INT_IP
разрешаем форвард пакетов в обеих направлениях. в первом правиле указан LAN_IP, поскольку правило в цепочке PREROUTING выполниться раньше цепочки FORWARD и адрес получателя пакета к этому времени уже будет сменен (с EXT_IP на LAN IP)
iptables -A FORWARD -i EXT_IF -p tcp -d LAN_IP --dport 5900 -j ACCEPT
iptables -A FORWARD -o EXT_IF -p tcp -s LAN_IP --sport 5900 -j ACCEPT
>[оверквотинг удален]
> iptables -t nat -A POSTROUTING -o INT_IF -p tcp -d LAN_IP --drort
> 5900 -j SNAT --to-source INT_IP
> разрешаем форвард пакетов в обеих направлениях. в первом правиле указан LAN_IP, поскольку
> правило в цепочке PREROUTING выполниться раньше цепочки FORWARD и адрес получателя
> пакета к этому времени уже будет сменен (с EXT_IP на LAN
> IP)
> iptables -A FORWARD -i EXT_IF -p tcp -d LAN_IP --dport 5900 -j
> ACCEPT
> iptables -A FORWARD -o EXT_IF -p tcp -s LAN_IP --sport 5900 -j
> ACCEPTСпасибо за ответ, не работает!
Вот вывод:iptables --list
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT udp -- 192.168.1.0/24 anywhere udp dpt:30006
ACCEPT tcp -- anywhere anywhere tcp dpt:30005
ACCEPT tcp -- anywhere anywhere tcp dpt:telnet
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
ACCEPT udp -- anywhere anywhere udp dpt:snmp
ACCEPT icmp -- anywhere anywhere icmp echo-request
ACCEPT tcp -- anywhere anywhere tcp dpt:www
ACCEPT tcp -- anywhere anywhere tcp dpt:ftp
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
LOG tcp -- anywhere anywhere tcp flags:SYN,RST,ACK/SYN limit: avg 6/hour burst 5 LOG level alert prefix `Intrusion -> '
DROP all -- anywhere anywhereChain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere 192.168.1.2 tcp dpt:2642
ACCEPT tcp -- anywhere 192.168.1.2 tcp dpt:6769
ACCEPT udp -- anywhere 192.168.1.2 udp dpt:6769
ACCEPT udp -- 192.168.1.0/24 anywhere udp dpt:30006
ACCEPT tcp -- anywhere anywhere tcp dpt:30005
ACCEPT tcp -- anywhere 192.168.1.2 tcp dpt:3389
TCPMSS tcp -- anywhere anywhere tcp flags:SYN,RST/SYN TCPMSS clamp to PMTU
TCPMSS tcp -- anywhere anywhere tcp flags:SYN,RST/SYN TCPMSS clamp to PMTU
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
LOG tcp -- anywhere anywhere tcp flags:SYN,RST,ACK/SYN limit: avg 6/hour burst 5 LOG level alert prefix `Intrusion -> '
DROP all -- anywhere anywhere
ACCEPT tcp -- anywhere 192.168.1.1 tcp dpt:5900
ACCEPT tcp -- 192.168.1.1 anywhere tcp spt:5900Chain OUTPUT (policy ACCEPT)
target prot opt source destination
DROP all -- anywhere 239.255.255.250
> iptables -t nat --listChain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT udp -- anywhere 192.168.1.1 udp dpt:domain to:94.255.29.122
DNAT tcp -- anywhere anywhere tcp dpt:3389 to:192.168.1.2
DNAT udp -- anywhere anywhere udp dpt:6769 to:192.168.1.2:6769-0
DNAT tcp -- anywhere anywhere tcp dpt:6769 to:192.168.1.2:6769-0
DNAT tcp -- anywhere anywhere tcp dpt:2642 to:192.168.1.2:2642-0
DNAT tcp -- anywhere anywhere tcp dpt:5900 to:192.168.1.2:5900Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 192.168.1.0/24 anywhere
SNAT tcp -- anywhere 192.168.1.2 tcp dpt:5900 to:192.168.1.1Chain OUTPUT (policy ACCEPT)
target prot opt source destination
>
>[оверквотинг удален]
> MASQUERADE all -- 192.168.1.0/24
> anywhere
> SNAT tcp -- anywhere
>
> 192.168.1.2 tcp
> dpt:5900 to:192.168.1.1
> Chain OUTPUT (policy ACCEPT)
> target prot opt source
> destination
>>добавлять к FORWARD нужно было через -I, а то у вас разрешения стали после DROP, и они там уже не сработают
iptables-save
>[оверквотинг удален]
>>
>> 192.168.1.2 tcp
>> dpt:5900 to:192.168.1.1
>> Chain OUTPUT (policy ACCEPT)
>> target prot opt source
>> destination
>>>
> добавлять к FORWARD нужно было через -I, а то у вас разрешения
> стали после DROP, и они там уже не сработают
> iptables-saveзапущено все... внятной схемы подключения нет, существующих правил нет. даю пример для чистых цепочек, а там походу и мысли нет, чтобы подумать - тупой копипаст (
PS
2: 2<4 ESTABLISED,CONNECTED в начало правил перенеси - соединение один раз устанавливается, после этого оно уже ESTABLISED,CONNECTED. так какого хрена для уже принятых соединений десяток правил на ACCEPT перед этим пробегать?
>[оверквотинг удален]
> MASQUERADE all -- 192.168.1.0/24
> anywhere
> SNAT tcp -- anywhere
>
> 192.168.1.2 tcp
> dpt:5900 to:192.168.1.1
> Chain OUTPUT (policy ACCEPT)
> target prot opt source
> destination
>>посмотрите iptables -L -n -v , чтобы счетчики попадания в правила видеть
PS
там еще и маскарад в построутинге.
>[оверквотинг удален]
> чуть опечатался в предыдущем сообщении. в качестве искупления вины пишу с
> комментариями ).
> EXT_IP - внешний адрес шлюза (WAN)
> INT_IP - внутренний адрес шлюза (LAN)
> LAN_IP - целевой адрес в локальной сети (к которому подключиться надо)
> EXT_IF - название внешнего интерфейса шлюза (WAN)
> INT_IF - название внутреннего интерфейса шлюза (LAN)
> пробрасываем порт с внешнего интерфейса шлюза внутрь локальной сети
> iptables -t nat -A PREROUTING -i EXT_IF -p tcp --dport 5900 -j
> DNAT --to-destination LAN_IP:5900адрес получателя забыл еще:
iptables -t nat -A PREROUTING -i EXT_IF -p tcp -d EXT_IP --dport 5900 -j DNAT --to-destination LAN_IP:5900
>[оверквотинг удален]
> iptables -t nat -A POSTROUTING -o INT_IF -p tcp -d LAN_IP --drort
> 5900 -j SNAT --to-source INT_IP
> разрешаем форвард пакетов в обеих направлениях. в первом правиле указан LAN_IP, поскольку
> правило в цепочке PREROUTING выполниться раньше цепочки FORWARD и адрес получателя
> пакета к этому времени уже будет сменен (с EXT_IP на LAN
> IP)
> iptables -A FORWARD -i EXT_IF -p tcp -d LAN_IP --dport 5900 -j
> ACCEPT
> iptables -A FORWARD -o EXT_IF -p tcp -s LAN_IP --sport 5900 -j
> ACCEPT