nf_conntrack_sip이 작동하지 않는 경우가 있습니다. iptables를 다시 시작하면 일반적으로 문제가 해결됩니다.

nf_conntrack_sip이 작동하지 않는 경우가 있습니다. iptables를 다시 시작하면 일반적으로 문제가 해결됩니다.

Asterisk를 실행하는 상자에서 nf_conntrack_sip을 사용하려고 합니다. 즉, 트래픽을 다른 VoIP 상자로 라우팅하지 않습니다. 설치 프로그램은 재부팅할 때까지 작동합니다. 재부팅 후에는 nf_conntrack_sip이 거의 항상 작동을 멈추고 미디어 트래픽이 삭제됩니다.

conntrack --dump | grep -E 'sip|helper'
# No output matching 'sip' nor 'helper' while a call is in progress (albeit no audio)

iptables 규칙이 올바르게 로드되고 iptables-save.

그런 다음 그렇게 했고 systemctl restart iptables문제가 9/10번 해결되었습니다. 그렇지 않은 경우 재부팅하고 iptables 재부팅을 반복합니다.

conntrack --dump | grep -E 'sip|helper'
conntrack v1.4.4 (conntrack-tools): 9 flow entries have been shown.
udp      17 3597 src=10.7.0.38 dst=10.47.1.11 sport=5063 dport=5060 src=10.47.1.11 dst=10.7.0.38 sport=5060 dport=5063 [ASSURED] mark=0 secctx=system_u:object_r:unlabeled_t:s0 helper=sip use=2

단순히 규칙을 다시 로드하는 것은 iptables-restore < /etc/sysconfig/iptables도움이 되지 않습니다. conntrack 또는 일부 모듈을 언로드/로드하면 문제가 해결될 것으로 생각됩니다.

때로는 시작 시 작동하지만 아주 드물게 작동합니다. 별표는 빠르게 시작됩니다. "시작한 일을 끝내기" 위해 더 많은 시간을 주는 것은 도움이 되지 않습니다.

업데이트: nf_conntrack_sip이 예상대로 작동하는 동안 iptables를 다시 시작하면 거의 중단되지 않습니다.

설정:

업데이트: 처음에는 문제가 가상 머신에서 발생하는 것으로 설명되었지만 그 이후로 실제 하드웨어(8Gb RAM이 포함된 i5-6500 CPU @ 3.20GHz)에 다시 설치했지만 여전히 똑같은 문제가 발생합니다. 초기 VM과 동일한 패키지(동일한 구성 스크립트)

운영 체제는 CentOS-7.4 Minimal + 업데이트, 커널 3.10.0-693.21.1.el7.x86_64입니다. 사용자 정의 커널이나 모듈이 아닌 RPM에서 모두 설치됩니다. 업데이트: 또한 yum update2018년 8월 10일 CentOS에서 제공되는 최신 안정 패키지 및 커널을 사용하여 이 작업을 수행했습니다. 문제는 여전히 존재합니다.

나는 yum autoremove firewalld그랬고 yum install iptables-services.

차이점 /etc/sysconfig/iptables-config(다른 값은 RPM 기본값임)

-IPTABLES_MODULES=""
+IPTABLES_MODULES="nf_conntrack_sip"

추가된 파일 /etc/modprobe.d/nf_conntrack.conf:

options nf_conntrack nf_conntrack_helper=0

전체 과정은 /etc/sysconfig/iptables매우 간단합니다.

*raw
-A PREROUTING -p udp --dport 5060 -j CT --helper sip
COMMIT

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport 5060 -j ACCEPT
-A INPUT -j LOG --log-level 7 --log-prefix "REJECT in filter.INPUT:"
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

업데이트: options nf_conntrack nf_conntrack_helper=1iptables 규칙을 사용하지 않고 모듈 옵션을 설정해 ... -j CT --helper sip도 문제가 해결되지 않으며 동작이 아직 정의되지 않았습니다.

질문과 관련이 없으며 NAT 문제가 아닌 패킷이 삭제되었는지 확인하기 위해/etc/rsyslog.d/kern-debug.conf

kern.=debug /var/log/kernel-debug

PBX에 전화를 걸어 음악을 대기시키는 Cisco SPA504G 전화를 사용하여 테스트했습니다. 미디어를 가지고 복잡한 일을 하려고 하지 마세요. SIP 신호 및 미디어는 동일한 IPv4 주소를 사용하여 교환됩니다. 테스트 통화는 전화기와 PBX 사이에서만 이루어집니다. 다른 당사자는 참여하지 않습니다.

나는 그것을 진단하려고 노력합니다 :

비교를 위해 iptables를 다시 시작하여 수정 전후의 다양한 상태를 캡처하려고 시도하는 짧은 스크립트를 만들었습니다 diff. 스크립트:

for f in $( find /proc/sys/net/netfilter -type f ); do
  echo f=${f}
  cat "${f}"
done

echo cat /sys/module/nf_conntrack/parameters/*
cat /sys/module/nf_conntrack/parameters/*

echo ls /sys/module/nf_conntrack/holders/
ls /sys/module/nf_conntrack/holders/

echo cat /sys/module/nf_conntrack_sip/parameters/*
cat /sys/module/nf_conntrack_sip/parameters/*
echo ls /sys/module/nf_conntrack_sip/holders/
ls /sys/module/nf_conntrack_sip/holders/

echo ls /sys/module/ip*/holders/
ls /sys/module/{ip,nf_}*/holders/

echo sysctl -a
sysctl -a

echo lsmod
lsmod

echo iptables-save
iptables-save

유일하게 제가 알아차린 점은 모듈이 nf_conntrack_netlink시작 후 로드되는 것으로 나열되는 경우가 많지만 문제가 있다는 것입니다. 때로는 lsmod부팅 후 목록에 표시되지 않지만 문제가 지속되는 경우가 있습니다. 내가 아는 한, iptables를 다시 시작한 후에는 로드된 것으로 표시되지 않습니다. 로딩과 문제 발현 사이에 직접적인 연관성이 없기 때문에 관련이 없는 것으로 생각됩니다.

답변1

해결책

해결책은 conntrack sip 도우미가 처리할 나가는 패킷을 표시하는 것입니다.

iptables -t raw -A OUTPUT -p udp -m udp --sport 5060 -j CT --helper sip

이유

문제는 방화벽 규칙이 conntrack sip helper에 대해 들어오는 패킷만 표시한다는 것입니다.

iptables -t raw -A PREROUTING -p udp -m udp --dport 5060 -j CT --helper sip

PBX는 첫 번째 패킷을 전화기로 보낼 때 sip 도우미 없이 conntrack 항목을 설정합니다. 항목은 SIP 도우미를 포함하지 않고 SIP 대화와 계속 일치합니다.

[root@test ~]# conntrack -L | grep -E '5060|sip'
conntrack v1.4.4 (conntrack-tools): 13 flow entries have been shown.
udp      17 159 src=10.47.1.11 dst=10.7.0.38 sport=5060 dport=1024 src=10.7.0.38 dst=10.47.1.11 sport=1024 dport=5060 [ASSURED] mark=0 secctx=system_u:object_r:unlabeled_t:s0 use=1

전화기가 첫 번째 패킷을 PBX로 보내면 위에 나열된 "-j CT --helper sip" 규칙과 일치하고 sip 도우미를 사용하여 conntrack 항목이 생성됩니다.

[root@test ~]# conntrack -L | grep -E '5060|sip'
conntrack v1.4.4 (conntrack-tools): 9 flow entries have been shown.
udp      17 3588 src=10.7.0.38 dst=10.47.1.11 sport=1024 dport=5060 src=10.47.1.11 dst=10.7.0.38 sport=5060 dport=1024 [ASSURED] mark=0 secctx=system_u:object_r:unlabeled_t:s0 helper=sip use=2

항목 끝에 있는 "helper=sip"을 참고하세요. 첫 번째 예의 부재와 비교해 보세요.

PBX와 전화기는 서로의 존재를 확인하기 위해 SIP 패킷을 서로 보내기 때문에 타이밍이 불확실해 보입니다.

Asterisk는 재부팅 시 피어 상태를 유지하고 재부팅 시 이를 조사하므로 나가는 패킷이 먼저 전송되어 conntrack에 SIP가 아닌 도우미 항목이 발생할 가능성이 높아집니다.

댓글에서 올바른 방향을 알려준 사용자 AB에게 큰 감사를 드립니다.

미스터리는 남아있다

설명할 수 없는 것은 modprobe 옵션이 있는 이유입니다.

options nf_conntrack nf_conntrack_helper=0

여전히 같은 방식으로 손상되어 "고정"되어 있습니다. 보조 자동 트리거에 많은 시간을 소비하지 않았으므로 뭔가 잘못하고 있는 것 같습니다. 더 많은 정보를 찾으면 이 답변을 업데이트할 수 있습니다. 활성화된 자동 지원을 사용하지 않을 예정입니다.

관련 정보