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