LINUX.ORG.RU
ФорумAdmin

iptables PREROUTING


0

2

у меня закрыт 25 порт, но есть некая машина в интернете с которой я его могу перебросить себе.

моя машина A - 77.77.77.77, 25 блокирован провайдером, слушает порт 2525. машина в интернете B - 94.94.94.94, все открыто.

на машине B:

$IPTABLES -t nat -A OUTPUT -p tcp --dport 25 -j DNAT --to 77.77.77.77:2525
$IPTABLES -t nat -A PREROUTING -i eth0 -p tcp --dport 25 -j DNAT --to 77.7.77.77:2525

запускаю на машине B:

telnet 94.94.94.94 25
220 mail ESMTP Postfix

из интернетов:

telnet 94.94.94.94 25
Trying 94.94.94.94...
telnet: Unable to connect to remote host: Connection timed out

при соединении из интернетов, на машине A (77.77.77.77) tcpdump молчит

чядн?


Возможно, имеет место следующее:

А теперь посмотрим, что произойдет, если запрос посылается с узла, расположенного в той же локальной сети. Для простоты изложения примем адрес клиента в локальной сети равным $LAN_BOX.

Пакет покидает $LAN_BOX.

Поступает на брандмауэр.

Производится подстановка адреса назначения, однако адрес отправителя не подменяется, т.е. исходный адрес остается в пакете без изменения.

Пакет покидает брандмауэр и отправляется на HTTP сервер.

HTTP сервер, готовясь к отправке ответа, обнаруживает, что клиент находится в локальной сети (поскольку пакет запроса содержал оригинальный IP адрес, который теперь превратился в адрес назначения) и поэтому отправляет пакет непосредственно на $LAN_BOX.

Пакет поступает на $LAN_BOX. Клиент "путается", поскольку ответ пришел не с того узла, на который отправлялся запрос. Поэтому клиент "сбрасывает" пакет ответа и продолжает ждать "настоящий" ответ.

Проблема решается довольно просто с помощью SNAT. Ниже приводится правило, которое выполняет эту функцию. Это правило вынуждает HTTP сервер передавать ответы на наш брандмауэр, которые затем будут переданы клиенту.

iptables -t nat -A POSTROUTING -p tcp --dst $HTTP_IP --dport 80 -j SNAT \
--to-source $LAN_IP

http://www.opennet.ru/docs/RUS/iptables/

anonymous ()
Ответ на: комментарий от anonymous

я это читал, но пакет даже не доходит до A! что уж там говорить про обратно.

psyX ()
Ответ на: комментарий от true_admin
# Generated by iptables-save v1.4.10 on Sun Dec  4 20:01:52 2011
*mangle
:PREROUTING ACCEPT [91:8358]
:INPUT ACCEPT [91:8358]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [70:7282]
:POSTROUTING ACCEPT [70:7282]
COMMIT
# Completed on Sun Dec  4 20:01:52 2011
# Generated by iptables-save v1.4.10 on Sun Dec  4 20:01:52 2011
*nat
:PREROUTING ACCEPT [3:140]
:OUTPUT ACCEPT [1:73]
:POSTROUTING ACCEPT [1:73]
-A PREROUTING -i eth0 -p tcp -m tcp --dport 25 -j DNAT --to-destination 77.77.77.77:2525
-A OUTPUT -p tcp -m tcp --dport 25 -j DNAT --to-destination 77.77.77.77:2525
COMMIT
# Completed on Sun Dec  4 20:01:52 2011
# Generated by iptables-save v1.4.10 on Sun Dec  4 20:01:52 2011
*filter
:INPUT ACCEPT [91:8358]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [70:7282]
COMMIT
# Completed on Sun Dec  4 20:01:52 2011

[root@vds ~]# cat /proc/sys/net/ipv4//ip_forward
1

[root@vds ~]# ifconfig eth0 | grep inet 
          inet addr:94.94.94.94  Bcast:94.
psyX ()
Ответ на: комментарий от true_admin

с интернетов 85.85.85.85 запускаю телнет

на 94.94.94.94 tcpdump

20:01:55.542946 IP (tos 0x0, ttl 47, id 32204, offset 0, flags [DF], proto TCP (6), length 60)
    85.85.85.85.39892 > 94.94.94.94.25: Flags [S], cksum 0x6b55 (correct), seq 2165510021, win 14600, options [mss 1348,sackOK,TS val 544962004 ecr 0,nop,wscale 6], length 0
20:01:55.542946 IP (tos 0x0, ttl 46, id 32204, offset 0, flags [DF], proto TCP (6), length 60)
    85.85.85.85.39892 > 77.77.77.77.2525: Flags [S], cksum 0xeb83 (correct), seq 2165510021, win 14600, options [mss 1348,sackOK,TS val 544962004 ecr 0,nop,wscale 6], length 0
20:01:55.549610 IP (tos 0x0, ttl 47, id 32205, offset 0, flags [DF], proto TCP (6), length 60)
    85.85.85.85.39892 > 94.94.94.94.25: Flags [S], cksum 0x6449 (correct), seq 2165510021, win 14600, options [mss 1348,sackOK,TS val 544963808 ecr 0,nop,wscale 6], length 0
20:01:55.549610 IP (tos 0x0, ttl 46, id 32205, offset 0, flags [DF], proto TCP (6), length 60)
    85.85.85.85.39892 > 77.77.77.77.2525: Flags [S], cksum 0xe477 (correct), seq 2165510021, win 14600, options [mss 1348,sackOK,TS val 544963808 ecr 0,nop,wscale 6], length 0

tcpdump на 77.77.77.77

# tcpdump -i eth1 -vv -n port 2525
tcpdump: listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes

psyX ()
Ответ на: комментарий от psyX

а:

$IPTABLES -t nat -A OUTPUT -p tcp --dport 25 -j DNAT --to 77.77.77.77:2525
надо бы убрать, оно и так ACCEPT по умолчанию.

Acceptor ★★ ()
Ответ на: комментарий от Acceptor

я только все же не понимаю, почему в локалке такое правило не надо добавлять?!

в данном решении мы подменяем адрес отправителя, что и соответственно в логах видим всегда коннект с одного и того же ip

psyX ()
Ответ на: комментарий от psyX

И в локалке применяемо, например, если за шлюзом стоит сервис какой-то, а доступ к нему надобен по внешнему IP шлюза, вот тут это же самое правило.

Acceptor ★★ ()

Попробуй обратный SSH-тунель, если ничего не поможет.

KivApple ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.