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

Maxim Dounin mdounin at mdounin.ru
Mon Jul 28 00:58:57 MSD 2008


Hello!

On Sun, Jul 27, 2008 at 03:39:52PM +0300, andrey at mail.anti-aging-drugs.com 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 at i386-builder.daemonology.net:/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 at mail.anti-aging-drugs.com 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 at mail.anti-aging-drugs.com
>
>





More information about the nginx-ru mailing list