ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: connect() failed (1: Operation not permitted) while connecting to upstream



Hello!

On Sun, Jul 27, 2008 at 03:39:52PM +0300, andrey@xxxxxxxxxxxxxxxxxxxxxxxxx 
wrote:

Проблема временно решилась использование юникс-сокета.

pf -vsi показал при кратковременном включении проксирования через
tcp.

 state-mismatch                     16733          109.4/s

О чем это может говорить?

Это говорит о том что надо *выключить* keep state между nginx'ом и бекендами.

Происхождение указанных state-mismatch вероятнее всего - из-за коллизий src-портов новых соединений со старыми соединениями, находящимися в TIME_WAIT.

Если в отсутствие pf-а ядро такие коннекции нормально обрабатывает (удалив старые в TIME_WAIT), то pf обнаружив у себя соответствующий state - считает что случился state mismatch и возвращает EPERM. Боротся - в первую очередь отключением keep state для коннекций между nginx'ом и бекендом. Если по каким-то причинам отключить keep state нельзя - то в первую очередь отключить рандомизацию src-портов, а во вторую - растянуть portrange. Как то так:

sysctl net.inet.ip.portrange.randomized=0
sysctl net.inet.ip.portrange.first=1024

Есть ещё ручки в pf'е, но на память я их не помню. В любом случае - в первую очередь добиться чтобы для соответствующих коннекций state'ы не создавались вообще. Если не получается написать грамотно правила - имеет смысл попробовать банальный "set skip on lo0" в конфиге pf'а.

Maxim Dounin


Вы писали Sunday, July 27, 2008, 1:57:56 PM:

no state работает с 7.0 (у меня 6.3)
За 4 часа без pf не было ошибок, после минуты работы -- есть. Может надо что-то 
потюнить?

nginx/0.6.31

# uname -a
FreeBSD flybb.ru 6.3-RELEASE-p1 FreeBSD 6.3-RELEASE-p1 #0: Wed Feb
13 02:56:56 UTC 2008 root@xxxxxxxxxxxxxxxxxxxxxxxxxxxx:/usr/obj/usr/src/sys/SMP i386


Вы писали Sunday, July 27, 2008, 9:26:45 AM:

On Sun, Jul 27, 2008 at 09:19:52AM +0300,
andrey@xxxxxxxxxxxxxxxxxxxxxxxxx wrote:

Актуальный конфиг pf. Проблема воспроизводится.

pass  in  proto tcp from any to any port 80 keep state
pass  in  proto tcp from 127.0.0.1 to port 9000
pass  out  proto tcp from 127.0.0.1 to port 9000
pass  in  proto tcp from 127.0.0.1 to port 25 keep state
pass  in  proto tcp from 127.0.0.1 to port 3306 keep state
pass  in  proto icmp from 213.186.114.123 to any keep state
pass in proto {tcp, udp} from ****  to any port 22 keep state
pass in proto {tcp, udp} from ****  to any port 22 keep state
pass out all keep state

В pf из OpenBSD 4.1, keep state делается по умолчанию.
Соответственно, нужно либо явно выключать его - "no state", либо
увеличивать число states - set limit { states XXXXX }.

Для 127.0.0.1 я бы без сомнений выключил:

 pass  in  proto tcp from 127.0.0.1 to port 9000 no state
 pass  out  proto tcp from 127.0.0.1 to port 9000 no state

Вы писали Friday, May 16, 2008, 3:56:20 PM:

> On Fri, May 16, 2008 at 03:05:33PM +0300, Vladimir Rekshta wrote:

>> используется pf с такими правилами:
>> >> pass in quick on $ext_if proto tcp from < > to { } port { } flags S/SA
>> modulate state

> Нужно убрать modulate и keepstate между nginx'ом и бэкендами.








--
С уважением,
Andrey                          mailto:andrey@xxxxxxxxxxxxxxxxxxxxxxxxx





 




Copyright © Lexa Software, 1996-2009.