iptables OUTPUT 체인에서 거부 정책을 사용할 수없는 이유는 무엇입니까?


11

현재 OUTPUT 체인을 DROP으로 설정했습니다. 방화벽을 거부로 변경하여 방화벽이 내가 액세스하려는 서비스에 문제가 아니라 어딘가에 도착하지 못하게한다는 단서가 있습니다 (시간 초과 대신 즉시 거부). 그러나 iptables는 이것을 신경 쓰지 않는 것 같습니다. 저장된 규칙 파일을 수동으로 편집하고 복원하려고 iptables-restore v1.4.15: Can't set policy 'REJECT' on 'OUTPUT' line 22: Bad policy name하면 규칙이로드되지 않습니다. 이것을 수동으로 설정하려고하면 ( iptables -P OUTPUT REJECT), iptables: Bad policy name. Run 'dmesg' for more information.dmesg에 출력이 없습니다.

적절한 규칙이 커널에 컴파일되어 있음을 확인한 후 다시로드하여로드되었는지 확인했습니다.

# CONFIG_IP_NF_MATCH_TTL is not set
CONFIG_IP_NF_FILTER=y
***
CONFIG_IP_NF_TARGET_REJECT=y
***
CONFIG_IP_NF_TARGET_LOG=y
CONFIG_IP_NF_TARGET_ULOG=y

(해당 규칙을 강조하기 위해 별표가 추가됨)

내가 찾을 수있는 모든 것은 REJECT가 유효한 정책 / 대상 (일반)이지만, INPUT, FORWARD 또는 OUTPUT 체인에 유효하지 않다는 것을 찾을 수는 없습니다. 내 Google-fu가 도와주지 않습니다. 차이가 있다면 젠투에 있습니다. 여기 아무도 통찰력이 있습니까?


iptables문제 의 규칙 을 보여줄 수 있습니까 ?
bahamat

답변:


15

REJECT체인 정책은 대상 이어야하는 반면 대상 확장 은 입니다. 매뉴얼 페이지는 (실제로 명확하지는 않지만) 말하지만, 어떤 내용은 평평하지 않습니다.

이 정책은 오직 할 수 있습니다 ACCEPT또는 DROP에 내장 된 체인. 이전 규칙과 일치하지 않는 모든 패킷을 거부하는 효과를 원하면 마지막 규칙이 모든 항목과 일치하는지 확인하고 REJECT대상 확장명을 가진 규칙을 추가하십시오 . 즉, 모든 관련 규칙을 추가 한 후을 수행하십시오 iptables -t filter -A OUTPUT -j REJECT.

자세한 내용은 netfilter 목록의 "가능한 체인 정책"스레드 를 참조하십시오.


그것은 말이되고, 마지막에는 일반적인 거부가 작동합니다. 호기심에서 대상 확장 정의가 어딘가 분명하고 방금 놓쳤거나 문서화가 잘 안된 비트 중 하나입니까?
ND Geek

1
전체 매뉴얼 페이지를 읽으면 REJECT가 대상 확장임이 분명하지만 매뉴얼 페이지가 너무 길어서 "TL; DR"이 적용되는 경향이 있습니다. 또한 DROP, ACCEPT 및 QUEUE 가 유효한 정책 대상 임을 암시합니다 . 현재 코드에서 QUEUE는 그렇지 않습니다!
StarNamer

4

문서화 된 것을 찾을 수 없지만 여기에 언급 된 유일한 정책은 수락 또는 거부입니다. 이것은 2429 행 주위의 (규칙 조작을 담당하는) 소스 를 보면 확인됩니다.libiptc

2429         if (strcmp(policy, LABEL_ACCEPT) == 0)
2430                 c->verdict = -NF_ACCEPT - 1;
2431         else if (strcmp(policy, LABEL_DROP) == 0)
2432                 c->verdict = -NF_DROP - 1;
2433         else {
2434                 errno = EINVAL;
2435                 return 0;
2436         }

원래 스레드 는 가장 좋은 방법은 체인의 끝에 REJECT를 추가하는 것 iptables -A OUTPUT -j REJECT입니다.

이 직전의 코드는 다음과 같습니다.

2423         if (!iptcc_is_builtin(c)) {
2424                 DEBUGP("cannot set policy of userdefinedchain `%s'\n", chain);
2425                 errno = ENOENT;
2426                 return 0;
2427         }
2428 

따라서 사용자 정의 체인에서 정책을 전혀 설정할 수 없습니다.


스레드의 해당 명령이 올바르지 않습니다. -p프로토콜에서 일치하기위한 것입니다. 그는 -A내 대답이 말하는 것처럼 의미했다 .
Shawn J. Goff

꽤 흥미 롭습니다. 저의 호기심은 그 뒤에 이유가 있는지, 또는 그것이 단순화를 위해 일이 어떻습니까? 내가 적당한 개발자라면 로컬에서 해킹하고 싶은 유혹에 빠질 수도 있지만, 보안이 취약하기 때문에 다루지 않을 것입니다.
ND Geek

2

REJECTOUTPUT의미가 없습니다; a REJECT는 네트워크를 통과해야하는 ICMP 패킷 을 반환 합니다.

-j LOG마지막 규칙 으로 새 규칙을 추가하여 ( DROP정책 이전에 ) OUTPUT체인 에서 그 범위를 넓히는 것을 확인하십시오 .


1
REJECTlo 인터페이스 에서 ICMP 패킷을 반환 할 수 없습니까? 나는 a LOG가 문제 해결에 유용하다는 데 동의 하지만 실제로 기대하고있는 것은 5 분 동안 문제를 해결하는DROP 대신 "아, 그래 ... 아마 iptables 기본값 으로 차단되었을 것입니다. "라고 동료에게 요청합니다. 액세스 XYZ 서버 는 아마도 그것이 로컬이라는 것을 알고 있습니다. 이것이 나의 가장 일반적인 접근법입니다. 나의 전형적인 근무일은 이미 구멍을 뚫지 않은 것들에 거의 영향을 미치지 않기 때문입니다. 물론 더 잘 생각해야 할 수도 있지만 평평한 것이 더 분명합니다. REJECT
ND Geek

여러 가지 이유로 인터페이스가 인터페이스에서 ethX트래픽을 생성하기를 원한다고 생각하지 않습니다 lo. 그들은 매우 독립적입니다. 체인을 다른 체인이 아닌 다른 체인에 쉽게 적용 할 수 있습니다.
Aaron D. Marasco
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.