iptables 규칙이 작동하지 않습니다

iptables 규칙이 작동하지 않습니다

나는 logstash라는 애플리케이션을 사용하고 있으며 UDP 포트 514에서 데이터를 수신해야 합니다. 문제는 Logstash가 포트 514에서 수신 대기하도록 허용되지 않는다는 것입니다. 이 문제를 해결하기 위해 iptables nat 테이블을 사용하기로 결정했습니다.

iptables -t nat -A PREROUTING -p udp --dport 514 -j REDIRECT --to-port 5140

그 후, 다음 명령을 사용하여 udp 포트 514로 향하는 패킷이 규칙에 의해 캡처되었는지 확인했습니다.

iptables -t nat -nxvL

출력은 다음과 같습니다

Chain PREROUTING (policy ACCEPT 608395 packets, 392277304 bytes)
    pkts      bytes target     prot opt in     out     source               destination

       1      594 REDIRECT   udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:514 redir ports 5140

       0        0 REDIRECT   tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:514 redir ports 5140

Chain INPUT (policy ACCEPT 1716 packets, 638207 bytes)
    pkts      bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 8906 packets, 538280 bytes)
    pkts      bytes target     prot opt in     out     source               destination

Chain POSTROUTING (policy ACCEPT 8906 packets, 538280 bytes)
    pkts      bytes target     prot opt in     out     source               destination

아시다시피 이 규칙은 여러 패킷이 포트에 도착하더라도 하나의 패킷만 캡처합니다.

tcpdump -nni any -port 514

위 명령의 출력은 다음과 같습니다.

12:58:22.222661 IP 100.100.200.2.8587 > 10.93.33.115.514: SYSLOG local7.notice, length: 545
12:58:22.232715 IP 100.100.200.2.10099 > 10.93.33.115.514: SYSLOG local7.notice, length: 519
12:58:22.233787 IP 100.100.200.2.8587 > 10.93.33.115.514: SYSLOG local7.info, length: 699
12:58:22.237041 IP 100.100.200.2.8587 > 10.93.33.115.514: SYSLOG local7.info, length: 550
12:58:22.237100 IP 100.100.200.2.8587 > 10.93.33.115.514: SYSLOG local7.info, length: 564
12:58:22.242670 IP 100.100.200.2.5006 > 10.93.33.115.514: SYSLOG local7.notice, length: 542
12:58:22.242722 IP 100.100.200.2.5006 > 10.93.33.115.514: SYSLOG local7.notice, length: 542
12:58:22.246941 IP 100.100.200.2.8587 > 10.93.33.115.514: SYSLOG local7.warning, length: 746
12:58:22.247627 IP 100.100.200.2.8587 > 10.93.33.115.514: SYSLOG local7.notice, length: 687
12:58:22.247654 IP 100.100.200.2.8587 > 10.93.33.115.514: SYSLOG local7.notice, length: 687
12:58:22.252840 IP 100.100.200.2.8587 > 10.93.33.115.514: SYSLOG local7.notice, length: 604
12:58:22.254676 IP 100.100.200.2.23295 > 10.93.33.115.514: SYSLOG local7.notice, length: 687
12:58:22.254704 IP 100.100.200.2.23295 > 10.93.33.115.514: SYSLOG local7.notice, length: 687
12:58:22.258491 IP 100.100.200.2.8587 > 10.93.33.115.514: SYSLOG local7.notice, length: 677
12:58:22.260588 IP 100.100.200.2.8587 > 10.93.33.115.514: SYSLOG local7.info, length: 581
12:58:22.261878 IP 100.100.200.2.23295 > 10.93.33.115.514: SYSLOG local7.notice, length: 542
12:58:22.261908 IP 100.100.200.2.10099 > 10.93.33.115.514: SYSLOG local7.notice, length: 542
12:58:22.261917 IP 100.100.200.2.23295 > 10.93.33.115.514: SYSLOG local7.notice, length: 540
12:58:22.262554 IP 100.100.200.2.5006 > 10.93.33.115.514: SYSLOG local7.notice, length: 542
12:58:22.262568 IP 100.100.200.2.8587 > 10.93.33.115.514: SYSLOG local7.notice, length: 542
12:58:22.266295 IP 100.100.200.2.5006 > 10.93.33.115.514: SYSLOG local7.notice, length: 639
^C

824 packets captured
855 packets received by filter
18 packets dropped by kernel

왜 규칙이 작동하지 않습니까? 포트 514에 도착하는 모든 UDP 패킷은 리디렉션되어야 합니다. 나는 이 문제의 원인이 무엇인지 정말로 알 수 없습니다. iptables-service가 실행 중이고 방화벽이 비활성화되어 있습니다.

답변1

ServerFault의 답변적용 가능:

nat테이블 규칙은 항상 연결의 첫 번째 패킷에만 적용됩니다. 동일한 연결에 대한 후속 패킷은 nat규칙 목록을 통과하지 않으며 conntrack 코드에서만 지원됩니다.

UDP는 본질적으로 연결이 없기 때문에 여기서 "연결"은 주소, 포트 및 시간 제한에 의해서만 정의됩니다. 따라서 동일한 소스 포트와 주소, 동일한 대상 포트와 주소를 가진 두 번째 UDP 패킷이 시간 초과 내에 도착하면 Linux는 이를 설정된 "연결"에 속하는 것으로 간주하고 nat해당 규칙 테이블을 전혀 평가하지 않고 재사용합니다. 이전 패킷에.

따라서 규칙이 귀하의 경우 하나의 패킷만 캡처하더라도 관련된 모든 패킷이 리디렉션될 수 있습니다. 패킷이 애플리케이션에 도착하지 않는 한(그러나 도착해야 함) 걱정할 것이 없습니다.

관련 정보