Nat 테이블에서 세션을 재설정하는 방법은 무엇입니까?

Nat 테이블에서 세션을 재설정하는 방법은 무엇입니까?

두 개의 가상 머신(라우터와 클라이언트) 우분투 서버 18 04가 있는데, 라우터는 클라이언트의 게이트웨이입니다. Nftables는 라우터에 설치되며 두 개의 체인을 사용하여 라우팅 전후에 NAT 테이블을 생성하고 클라이언트에 대한 규칙을 설정합니다.

table ip nat {
    chain prerouting {
        type nat hook prerouting priority -100; policy accept;
    }

    chain postrouting {
        type nat hook postrouting priority 100; policy accept;
        oif "enp0s3" ip saddr 192.168.2.100 snat to 192.168.1.10 comment "STATIC" # handle 4
    }
}

클라이언트에서 인터넷으로의 핑을 켰습니다. 모든 것이 잘 작동합니다.

root@router:/home/router# conntrack -L -n
icmp     1 29 src=192.168.2.100 dst=8.8.8.8 type=8 code=0 id=13006 src=8.8.8.8 dst=192.168.1.10 type=0 code=0 id=13006 mark=0 use=1

그러나 규칙을 제거하면 세션이 중단되지 않고 ping이 계속됩니다.

root@router:/home/router# nft delete rule nat postrouting handle 4
root@router:/home/router# nft list ruleset
table ip nat {
    chain prerouting {
        type nat hook prerouting priority -100; policy accept;
    }

    chain postrouting {
        type nat hook postrouting priority 100; policy accept;
    }
}
root@router:/home/router# conntrack -L -n
icmp     1 29 src=192.168.2.100 dst=8.8.8.8 type=8 code=0 id=13006 src=8.8.8.8 dst=192.168.1.10 type=0 code=0 id=13006 mark=0 use=1
conntrack v1.4.4 (conntrack-tools): 1 flow entries have been shown.

규칙이 변경되거나 삭제되면 클라이언트의 현재 세션이 종료되기를 원합니다.

어떻게 얻을 수 있나요?

답변1

Linux 네트워크 스택 외에도 동작을 변경하지만 가능한 한 네트워크 스택과 분리되도록 설계된 추가 "스택"이 있습니다. 바로 Netfilter입니다. 이 도구를 사용하면 클라이언트(여전히 커널에 있음)가 네트워크 스택의 수명 주기 동안 다양한 전략적 지점(방화벽 및 NAT 수행)에서 패킷을 가로채기 위해 이 도구에 연결할 수 있습니다. 이러한 고객 중에는 그뿐만 아니라iptables그리고nftables. 이는 다음에 해당합니다.일반 네트워크의 Netfilter 및 패킷 흐름개략도:

일반 네트워크의 Netfilter 및 패킷 흐름
통과제인 엔젤하트- 자신의 작품, 유래정적 변수 생성기 파푸아 뉴기니,CC-SA 3.0,협회

이 회로도는 다음을 사용하여 생성되었지만iptables기억하세요.nftables. 이 답변에서는nftables같은 효과가 있다iptables. 여기서 가장 많이 이야기되는 것은nftables적용 대상iptables(레거시 또는 nft 버전) 또는 그 반대의 경우도 마찬가지입니다.

보시다시피 클라이언트(실제로 Netfilter의 일부로 간주됨)에 대한 또 다른 중요한 점은 클라이언트가 conntrack보는 모든 흐름을 추적하고 동일한 흐름 기록을 사용하여 많은 NAT 처리를 수행한다는 것입니다. NAT는 실제로 만들어지지 않았습니다.nftables: 회로도 중앙에 표시된 것처럼 단일 패킷이 아닌 전체 흐름의 운명을 결정하는 변경 규칙을 제공할 수 있도록 각 흐름의 첫 번째 패킷만 수신합니다. 정보가 저장되면 conntrack조회 항목 에서는 conntrack독립적으로 처리되며 후크 유형 체인은 nat해당 흐름의 후속 패킷을 볼 수 없습니다.

따라서 문제가 되지 않습니다. 스트림이 처리되면 더 이상 규칙이 없더라도 해당 규칙이 더 이상 사용되지 않기 때문에 규칙 변경 conntrack의 영향을 받지 않습니다 .nat

이 프로세스에 영향을 미치기 위해 취할 수 있는 조치 중 하나는 시설에 직접 쿼리하는 것입니다 conntrack. 이와 관련된 도구를 이라고 합니다.conntrack(에서https://conntrack-tools.netfilter.org/).

OP가 쓴 것처럼 항목에 대한 정보를 읽는 데 사용할 수 있지만 conntrack항목을 업데이트, 생성, 삭제 또는 새로 고치는(모두 삭제) 데에도 사용할 수 있습니다.

세분성을 선택할 수 있습니다.

  • 모든 항목 삭제:

    conntrack -F
    
  • 납치된 모든 항목을 제거합니다(기술적으로 응답 대상 주소가 조회 테이블의 원래 소스 주소와 다르다는 의미).

    conntrack -D --src-nat
    
  • 모든 요소, 심지어 정확한 ICMP ID를 지정하는 OP 항목의 외과적 삭제까지 가능합니다. 따라서 ID가 확실히 다르기 때문에 NAT 규칙을 삭제하기 전에 시작된 동일한 ping 명령이 중단되지 않습니다.

    # conntrack -D -p icmp --orig-src 192.168.2.100  --orig-dst 8.8.8.8 --reply-src 8.8.8.8 --reply-dst 192.168.1.10 --icmp-type 8 --icmp-code 0 --icmp-id 13006
    icmp     1 28 src=192.168.2.100 dst=8.8.8.8 type=8 code=0 id=13006 src=8.8.8.8 dst=192.168.1.10 type=0 code=0 id=13006 mark=0 use=1
    conntrack v1.4.6 (conntrack-tools): 1 flow entries have been deleted.
    

    conntrack(Ubuntu 18.04LTS의 1.4.4가 여기서 다르게 동작해야 할 이유는 없습니다 )

이 항목이 제거되면 이전에 이 흐름에 속했던 다음 패킷은 새 패킷으로 간주됩니다. 상태새로운nat, 체인을 변경하고 순회할 또 다른 기회를 얻게 됩니다 . 더 이상 변경 사항이 없으므로 송신인 경우 NAT가 지정되지 않은 다음 라우터를 통과하고 해당 라우터는 이를 삭제하거나 이를 삭제할 라우터로 전달합니다(엄격한 역방향 경로 전달로 인해). 또는 특정 라우팅 규칙을 대상으로 함) RFC1918 주소), 8.8.8.8의 지연된 수신 응답인 경우 로컬로 라우팅되고 네트워크 스택에 의해 무시됩니다. ping 명령이 중단되고 이제 시간 초과됩니다.

관련 정보