네트워크 필터 후크: NF_IP_FORWARD
프로그램은 5개의 netfilter 후크를 등록할 수 있습니다. 패킷이 스택을 통과할 때 이러한 후크를 등록한 커널 모듈을 트리거합니다. 그런 다음 패킷은 삭제, 거부 또는 조작됩니다.
NF_IP_FORWARD
패킷이 다른 호스트로 전달될 경우 수신 패킷을 라우팅한 후 후크가 트리거됩니다.
NF_IP_FORWARD 후크는 어떤 상황에서 트리거됩니까? 실제 사용 사례를 제공해 주실 수 있나요?
인용하다
답변1
이 기사예가 제공됩니다: 라우터.
FORWARD는 다른 유형의 체인입니다. 컴퓨터 외부에서 발생하는 모든 트래픽을 가져와서 iptables를 설정한 곳을 제외하고 네트워크의 다른 컴퓨터로 보냅니다. 라우터가 할 일처럼 들리지 않나요?
소스가 우리 서버의 IP 주소가 아니고 목적지가 우리 서버의 IP 주소가 아닌 경우, 패킷은 애초에 어떻게 우리 서버에 도달했을까요? 이것이 허용되는 두 가지 시나리오를 생각해 볼 수 있습니다.
네트워크 인터페이스가 무차별 모드에 있습니다. 이는 네트워크 허브의 경우입니다(사용하지 마세요). 무차별 모드의 네트워크 카드(자세한 내용은 다른 문서 참조)는 LAN에서 전송되는 모든 이더넷 프레임을 허용합니다(LAN 트래픽을 스니핑하는 방법). 무차별 모드가 비활성화되면(NIC의 기본 상태) 네트워크 카드는 대상 MAC가 카드의 MAC 주소와 일치하는 이더넷 프레임만 허용합니다. 따라서 이더넷 프로토콜 수준에서 프레임의 주소는 서버로 지정되지만 해당 프레임의 IP 프로토콜 패킷은 다른 대상 주소 집합을 갖습니다.
이더넷 프레임의 Destination_mac은 라우터의 Destination_mac과 일치합니다. 게이트웨이의 경우도 마찬가지입니다.
패킷이 라우터에 도달하면 ARP 및 라우팅 테이블은 패킷의 다음 홉을 찾아야 하며 conntrack 모듈은 패킷을 원래 요청자에게 반환하는 방법을 알아야 합니다. 따라서 우리 서버와 관련이 없는 src_address 및 dst_address를 포함하는 수신된 IP 패킷은 FORWARD 체인에 들어갑니다.
서버를 라우터로 전환하려면 먼저 커널 수준에서 라우팅을 활성화해야 합니다. 쉽고 재부팅도 필요하지 않습니다. /etc/sysctl.conf 파일을 편집하고 다음 줄을 추가하세요.
net.ipv4.ip_forward = 1
그런 다음 sysctl -p 명령을 실행하여 커널 설정을 다시 로드합니다. 이제 라우팅 자체가 활성화되어야 합니다. 컴퓨터를 라우터로 전환하기 위해 방화벽을 잘못 구성하거나 기본 설정을 사용하기 쉽기 때문에 보안상의 이유로 기본적으로 비활성화되어 있습니다. 네트워크의 모든 컴퓨터가 라우터라면 익명 공격을 전파하기가 매우 쉽습니다.
이제 라우팅이 활성화되었으므로 설정을 계속할 수 있습니다.
1. iptables -I FORWARD -s 192.168.0.0/24 -d 10.10.7.0/24 -j ACCEPT
2. iptables -I FORWARD -s 10.10.7.0/24 -d 192.168.0.0/24 -m conntract --ctstate ESTABLISHED -j ACCEPT
그게 다야. 이 두 규칙은 두 네트워크(192.168.0.0/24 및 10.10.7.0/24)를 연결합니다. 게이트웨이로서 192.168.0.1을 통해 10.10.7.0/24로 전달된 모든 쿼리는 올바른 대상으로 라우팅되고 응답이 반환됩니다. 그러나 이 규칙은 10.10.7.0/24 네트워크가 192.168.0.0/24에 액세스하는 것을 제한합니다. 이것이 ctstate의 작업입니다. Netfilter의 모든 연결이 추적됩니다(conntrack). Netfilter가 ESTABLISHED 연결만 일치시키도록 지시되면 --ctstate
새 연결 요청을 무시합니다. 이 규칙은 설정된 연결에만 적용됩니다.
즉, Netfilter는 192.xxx 네트워크의 새 연결만 허용하고 설정된 연결만 10.10.xx에서 192.168.xx로 데이터를 전송할 수 있습니다. 두 네트워크가 서로 볼 수 있도록 하려면 -m conntrack --ctstate ESTABLISHED
규칙의 이 부분을 제거하세요.
하지만이 라우팅을 위해서는 두 네트워크 모두에서 라우팅 테이블을 업데이트해야 한다는 점에 유의하세요. 이는 10.10.7.0/24의 장치가 라우팅 테이블에 명시적인 경로를 추가해야 하며 장치가 192.168.0.0/24 네트워크를 쿼리하는 데 사용되도록 지정해야 함을 의미합니다. 그 반대의 경우: 192.168.0.0/24에는 192.168.0.1을 통해 10.10.7.0/24 네트워크에 연결할 수 있음을 지정하는 라우팅 테이블의 경로가 있어야 합니다. 그렇지 않으면 수신 네트워크의 서버는 응답을 반환하는 방법을 알 수 없습니다. 수신된 IP 패킷의 SRC_ADDR 헤더에는 다른 네트워크의 IP 주소가 포함되어 있으며 서버는 이에 도달하는 방법을 알 수 없습니다.
특정 네트워크에서 라우팅 테이블을 직접 편집할 수 없거나 편집하고 싶지 않은 경우 NAT 유형인 SNAT를 시도해 볼 수 있습니다.