Решено: linux nat + вечное ожидание ответа

Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС.

Модератор: SLEDopit

Ответить
Аватара пользователя
gr3m1in
Сообщения: 27
ОС: Gentoo x86_64 Linux

Решено: linux nat + вечное ожидание ответа

Сообщение gr3m1in »

имеется шлюз на gentoo 2.6.32 между локалкой и провайдером.
на внешнем интерфейсе маскарад.
провайдер выдаёт серый адрес вида 10.151.х.х (йота).
явление не зависит от конкретного провайдера, на скайлинке и кубтелекоме аналогично.
тем более, что проблема только в локалке, с шлюза всё ходит ровно.
все модули и примочки iptables и iproute2, включая conntrack, вкомпилены в ядро.
всё работает, исключая отдельные целевые адреса, например www.fixunix.com (174.129.213.10).
при попытке обратиться браузером по http соединение устанавливается неполностью.

вывод tcpdump на шлюзе на внешнем интерфейсе:

Код: Выделить всё

23:26:41.088605 IP 10.151.175.232.40346 > 174.129.213.10.80: Flags [S], seq 3781115474, win 5840, options [mss 1460,sackOK,TS val 16804233 ecr 0,nop,wscale 7], length 0
23:26:41.347409 IP 174.129.213.10.80 > 10.151.175.232.40346: Flags [S.], seq 1211327233, ack 3781115475, win 5840, options [mss 1460], length 0
23:26:41.347618 IP 10.151.175.232.40346 > 174.129.213.10.80: Flags [.], ack 1, win 5840, length 0
23:26:41.347697 IP 10.151.175.232.40346 > 174.129.213.10.80: Flags [P.], seq 1:357, ack 1, win 5840, length 356
23:26:41.637781 IP 174.129.213.10.80 > 10.151.175.232.40346: Flags [.], ack 357, win 6432, length 0
23:27:24.540319 IP 10.151.175.232.40346 > 174.129.213.10.80: Flags [F.], seq 357, ack 1, win 5840, length 0
23:27:25.061866 IP 174.129.213.10.80 > 10.151.175.232.40346: Flags [.], ack 358, win 6432, length 0


и всё.
браузер "соединение установлено", "ожидается ответ".

telnet из локалки:

Код: Выделить всё

# telnet www.fixunix.com 80
Trying 174.129.213.10...
Connected to www.fixunix.com.
Escape character is '^]'.
GET / <enter>
<enter>

Connection closed by foreign host.


при этом вывод tcpdump:

Код: Выделить всё

23:29:22.760976 IP 10.151.175.232.40363 > 174.129.213.10.80: Flags [S], seq 2014851259, win 5840, options [mss 1460,sackOK,TS val 16820403 ecr 0,nop,wscale 7], length 0
23:29:23.145506 IP 174.129.213.10.80 > 10.151.175.232.40363: Flags [S.], seq 1503627209, ack 2014851260, win 5840, options [mss 1460], length 0
23:29:23.145761 IP 10.151.175.232.40363 > 174.129.213.10.80: Flags [.], ack 1, win 5840, length 0
23:29:26.530014 IP 174.129.213.10.80 > 10.151.175.232.40363: Flags [S.], seq 1503627209, ack 2014851260, win 5840, options [mss 1460], length 0
23:29:26.530224 IP 10.151.175.232.40363 > 174.129.213.10.80: Flags [.], ack 1, win 5840, length 0
23:29:27.628771 IP 10.151.175.232.40363 > 174.129.213.10.80: Flags [P.], seq 1:8, ack 1, win 5840, length 7
23:29:28.090764 IP 174.129.213.10.80 > 10.151.175.232.40363: Flags [.], ack 8, win 5840, length 0
23:29:28.340752 IP 10.151.175.232.40363 > 174.129.213.10.80: Flags [P.], seq 8:10, ack 1, win 5840, length 2
23:29:28.608385 IP 174.129.213.10.80 > 10.151.175.232.40363: Flags [.], ack 10, win 5840, length 0
23:29:32.092515 IP 10.151.175.232.40363 > 174.129.213.10.80: Flags [P.], seq 10:12, ack 1, win 5840, length 2
23:29:32.326805 IP 174.129.213.10.80 > 10.151.175.232.40363: Flags [R], seq 1503627210, win 0, length 0


при этом точно такой же телнет на шлюзе с последующим вводом

Код: Выделить всё

GET / <enter>
<enter>

добросовестно возвращает html-потроха страницы.

нат выполняется корректно, выводы tcpdump на внутреннем и внещнем интерфейсах шлюза идентичны, разница только в подмене адресов.

пересобирал ядро, iptables, iproute2, выносил conntrack из ядра в модуль - разницы нет.

собственно вопрос - почему это происходит и чем вызвано?
а самое главное куда копать и как бороться?

ПРОШУ ПОМОЩИ!
Спасибо сказали:
Аватара пользователя
Frank
Сообщения: 1059
ОС: Ubuntu, Debian
Контактная информация:

Re: Решено: linux nat + вечное ожидание ответа

Сообщение Frank »

Приведите-ка ifconfig со шлюза. Подозреваю, что MTU на интерфейсе от провайдера меньше, чем на интерфейсе локалки.
Изображение
Спасибо сказали:
Аватара пользователя
Alex2ndr
Сообщения: 443
ОС: Debian Lenny

Re: Решено: linux nat + вечное ожидание ответа

Сообщение Alex2ndr »

Скорее всего опять проблема с pmtu
http://www.opennet.ru/base/net/pppoe_mtu.txt.html
Спасибо сказали:
Аватара пользователя
gr3m1in
Сообщения: 27
ОС: Gentoo x86_64 Linux

Re: Решено: linux nat + вечное ожидание ответа

Сообщение gr3m1in »

Frank писал(а):
10.12.2009 14:00
Приведите-ка ifconfig со шлюза. Подозреваю, что MTU на интерфейсе от провайдера меньше, чем на интерфейсе локалки.


ifconfig смогу привести вечером.
похоже, Вы правы... на провайдерском интерфейсе mtu 1386.
но разве при этом не должен был прийти icmp-пакет с требованием снижения размера пакета?
Спасибо сказали:
Аватара пользователя
gr3m1in
Сообщения: 27
ОС: Gentoo x86_64 Linux

Re: Решено: linux nat + вечное ожидание ответа

Сообщение gr3m1in »

Alex2ndr писал(а):
10.12.2009 14:23
Скорее всего опять проблема с pmtu
http://www.opennet.ru/base/net/pppoe_mtu.txt.html


спасибо за ссыль!

из man iptables

Код: Выделить всё

--clamp-mss-to-pmtu
              Automatically clamp MSS value to (path_MTU - 40 for IPv4; -60 for IPv6)


на внешнем интерфейсе mtu 1386, на внутреннем традиционная величина 1500.
что именно произойдёт с размером пакета при применении данного правила?
Спасибо сказали:
Аватара пользователя
Frank
Сообщения: 1059
ОС: Ubuntu, Debian
Контактная информация:

Re: Решено: linux nat + вечное ожидание ответа

Сообщение Frank »

NAT делается форвардингом пакетов. Никто не будет требовать уменьшения MTU, т.к. на каждом отдельно взятом интерфейсе всё хорошо. Чего не зкажешь о пакетах, которые из "толстого" интерфейса будут пытаться запихнуть в "тонкий". При несовпадении MTU будет производиться фрагментация пакетов. Боюсь, этого никто не ожидает :)
Изображение
Спасибо сказали:
Аватара пользователя
Alex2ndr
Сообщения: 443
ОС: Debian Lenny

Re: Решено: linux nat + вечное ожидание ответа

Сообщение Alex2ndr »

gr3m1in писал(а):
10.12.2009 14:34
ifconfig смогу привести вечером.
похоже, Вы правы... на провайдерском интерфейсе mtu 1386.
но разве при этом не должен был прийти icmp-пакет с требованием снижения размера пакета?

Должен должен. Вот только он иногда в провайдерской же сети и блокируется - по пути к вам. Как раз та самая пролема с path mtu.

gr3m1in писал(а):
10.12.2009 14:42
из man iptables

Код: Выделить всё

--clamp-mss-to-pmtu
              Automatically clamp MSS value to (path_MTU - 40 for IPv4; -60 for IPv6)


на внешнем интерфейсе mtu 1386, на внутреннем традиционная величина 1500.
что именно произойдёт с размером пакета при применении данного правила?

Вы бы полностью тот самый ман прочитали

Код: Выделить всё

   TCPMSS
       This target allows to alter the MSS value of TCP SYN packets,  to  con‐
       trol  the maximum size for that connection (usually limiting it to your
       outgoing interface’s MTU minus 40).  Of course, it can only be used  in
       conjunction with -p tcp.  It is only valid in the mangle table.
       This  target  is  used to overcome criminally braindead ISPs or servers
       which block ICMP Fragmentation Needed packets.  The  symptoms  of  this
       problem are that everything works fine from your Linux firewall/router,
       but machines behind it can never exchange large packets:
        1) Web browsers connect, then hang with no data received.
        2) Small mail works fine, but large emails hang.
        3) ssh works fine, but scp hangs after initial handshaking.
       Workaround: activate this option  and  add  a  rule  to  your  firewall
       configuration like:
        iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN \
                    -j TCPMSS --clamp-mss-to-pmtu

       --set-mss value
              Explicitly set MSS option to specified value.

       --clamp-mss-to-pmtu
              Automatically clamp MSS value to (path_MTU - 40).

       These options are mutually exclusive.

Т е как я понимаю это правило установит pmtu в 1386-40=1346
Спасибо сказали:
Аватара пользователя
gr3m1in
Сообщения: 27
ОС: Gentoo x86_64 Linux

Re: Решено: linux nat + вечное ожидание ответа

Сообщение gr3m1in »

получилось!

Код: Выделить всё

iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu


огромное спасибо! ))
Спасибо сказали:
Ответить