많은 사람들이 방화벽 규칙을 다시 로드하려고 할 때 conntrack 테이블을 지우지 않습니다. 일부 ESTABLISHED 연결이 있는 경우 일부 관련 연결을 차단하는 규칙을 추가하면(NEW 상태) 모든 세션이 영향을 받지 않습니다. 이런 일이 발생하지 않도록 하는 유일한 방법은 conntrack 테이블을 지워 모든 세션을 종료하는 것입니다. 이 경우 모든 패킷은 INVALID 규칙과 일치하므로 새 연결을 설정해야 합니다. 그러면 이제 새 규칙이 전달됩니다 iptables
.
OpenWRT에서는 간단히 다음을 수행할 수 있습니다.
# echo f > /proc/net/nf_conntrack
하지만 불행하게도 이 솔루션은 데비안에서는 작동하지 않습니다.
# echo f > /proc/net/nf_conntrack
echo: write error: Input/output error
이유는 다음과 같습니다.
# ls -al /proc/net/nf_conntrack
-r--r----- 1 root root 0 2016-06-05 10:45:52 /proc/net/nf_conntrack
Debian에서는 conntrack
패키지를 설치하고 다음 명령을 입력해야 합니다.
# conntrack -F
conntrack v1.4.3 (conntrack-tools): connection tracking table has been emptied.
데비안에서는 왜 echo f
작동하지 않나요? 어떻게든 작동하게 하는 방법이 있나요? 아니면 강제로 해당 conntrack
도구를 사용해야 하나요?
답변1
OpenWRT는 몇 가지 특정 커널 패치를 유지 관리합니다. 그중에는 데비안에는 없지만 귀하가 불평하는 기능을 제공하는 특정 패치가 있습니다. 실제로 사용 가능합니다오직OpenWRT에서.
커널 4.4의 경우 질문의 타임라인에 가까운 git 기록을 선택하세요.
600-netfilter_conntrack_flush.patch
:
static const struct file_operations ct_file_ops = { .owner = THIS_MODULE, .open = ct_open, .read = seq_read, + .write = ct_file_write, .llseek = seq_lseek, .release = seq_release_net, }; @@ -393,7 +450,7 @@ static int nf_conntrack_standalone_init_ { struct proc_dir_entry *pde; - pde = proc_create("nf_conntrack", 0440, net->proc_net, &ct_file_ops); + pde = proc_create("nf_conntrack", 0660, net->proc_net, &ct_file_ops); if (!pde) goto out_nf_conntrack;
f
위의 코드 조각 외부에서 특정 구문이 처리되는 위치를 파악할 수는 없지만 위의 조각은 OpenWRT가 /proc/net/nf_conntrack
일반 코어에서 읽기 전용인 항목에 쓸 수 있도록 패치를 추가했음을 명확하게 보여줍니다.
아직현재 커널 5.4에서 사용 가능그러나 그 내용은 훨씬 덜 명확합니다.
임베디드 환경과 제한된 크기를 처리하도록 만들어졌다고 상상할 수 있습니다. 커널 패치로 conntrack 도구 제공을 피할 수 있다면 다른 기능을 위한 공간이 생길 수 있습니다.
이것은 해킹입니다. 예상되는 현대적인 상호 작용연결하다하위 시스템이 통과되었습니다.conntrack
도구와인터넷 연결커널 API는 지속적으로 발전하고 있습니다. (읽기 전용) /proc/net/nf_conntrack
더 간단한 도구와의 호환성을 위해서만 예약되어 있습니다.
이 기능을 얻기 위해 이 추가 패치(다른 관련 패치가 필요할 수 있음)를 사용하여 데비안 소스 트리를 컴파일할 수 있지만 이것이 실제로 일반 시스템에서 유용할지는 잘 모르겠습니다.