
내 iptables DNAT 규칙은 재부팅할 때까지 작동하지 않습니다. 서버를 재부팅하면 모든 규칙이 작동합니다.
아키텍처 설명:
수십 개의 호스트(발신자)가 일부 UDP 패킷(특정 포트 9999의 단방향)을 내 Linux 라우터로 보냅니다. 이 Linux 라우터는 iptables를 사용하여 해당 패킷을 여러 호스트(수신기)에 전달합니다.
senderX 10.0.0.X ====> iptables가 있는 Linux 라우터 ====> receiveY 10.0.1.Y
Linux 라우터에는 eth1 10.0.0.1/24(송신자 측) 및 eth0 10.0.1.1/24(수신자 측)라는 두 개의 네트워크 카드가 있습니다.
IPtables 설정:
- ip_forwarding이 활성화되었습니다
- 모든 기본 정책은 ACCEPT로 설정되어 있습니다.
- 발신자당 하나의 iptables 규칙이 존재합니다. 예는 다음과 같습니다.
iptables -t nat -A PREROUTING -s 10.0.0.2 -i eth1 -j DNAT --대상 10.0.1.123
네트워크 설정:
ip addr show
:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
link/ether 54:9f:35:0a:16:38 brd ff:ff:ff:ff:ff:ff
inet 10.0.1.1/24 brd 10.0.1.255 scope global eth0
inet6 fe80::569f:35ff:fe0a:1638/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
link/ether 54:9f:35:0a:16:3a brd ff:ff:ff:ff:ff:ff
inet 10.0.0.1/24 brd 10.0.0.255 scope global eth1
inet6 fe80::569f:35ff:fe0a:163a/64 scope link
valid_lft forever preferred_lft forever
증상:
규칙 세트를 추가한 후 일부 규칙이 작동하지 않습니다. 그리고 tcpdump를 통해 UDP 패킷이 더 이상 라우팅되지 않고 패킷이 거부되는 것을 확인할 수 있습니다.
tcpdump -n -i eth1 host 10.0.0.2
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
16:12:58.241225 IP 10.0.0.2.56859 > 10.0.0.1.9999: UDP, length 1464
16:12:58.241285 IP 10.0.0.1 > 10.0.0.2: ICMP 10.0.0.1 udp port 9999 unreachable, length 556
- 모든 규칙을 플러시하고 iptables에 다시 주입하면 작동하지 않았던 규칙이 여전히 작동하지 않습니다.
- 서버를 재부팅하면 모든 규칙이 제대로 작동합니다.
분석 완료:
작동하지 않는 특정 발신자를 기록하는 규칙을 추가했습니다.
iptables -t nat -A PREROUTING -s 10.0.0.2 -i eth1 -j LOG --log-prefix='PREROUTING LOG :'
하지만 이 규칙은 아무 것도 기록하지 않습니다. tcpdump에서 패킷을 볼 수 있지만 기록되지 않기 때문에 패킷이 오고 있습니다. 또한 -v
iptables의 옵션을 사용하면 이 규칙에 대해 카운터가 증가하는 것을 볼 수 없습니다.
작동이 중지되기 전에 동일한 규칙을 적용하면 일부 로그가 생성됩니다.
질문 :
- iptables의 UDP 전달에 제한이 있습니까?
- 이 문제를 해결하려면 어떻게 해야 합니까?
답변1
설명하는 증상은 NAT 규칙과 연결 추적 항목 간에 충돌이 있을 때 나타나는 증상과 일치합니다.
예를 들어 패킷이 다음과 일치하는 경우
-A PREROUTING -s 10.0.0.2 -i eth1 -j DNAT --to-destination 10.0.1.123
새로운 연결 추적 항목을 생성해야 합니다. 그러면 들어오는 쪽의 소스 및 대상 IP와 포트의 튜플이 나가는 쪽의 유사한 튜플에 매핑됩니다.
들어오는 쪽과 일치하는 기존 연결 추적 항목이 있을 수 없습니다. 만약 있었다면 규칙 대신 사용되었을 것이기 때문입니다. 그러나 나가는 쪽의 튜플을 구성하기 위해 튜플의 대상 IP가 대체되면 튜플이 기존 연결 추적 항목과 충돌할 수 있습니다.
유틸리티 를 설치하는 경우 입력하여 기존 연결 추적 항목 목록을 볼 conntrack
수 있습니다 . conntrack -L
해당 유틸리티에는 특정 기준과 일치하는 연결 추적 항목만 나열하고 선택한 항목을 제거하는 기능도 있습니다.
이것이 실제로 직면한 문제인 경우 문제가 되는 연결 추적 항목을 제거하면 문제가 해결됩니다. 영구적인 수정에는 일반적으로 양방향 패킷에 대한 관련 NAT 규칙을 구성하는 작업이 포함됩니다. 이렇게 하면 첫 번째 패킷이 일반적인 경우보다 반대 방향으로 전송되는 경우에도 항상 원하는 연결 추적 항목을 얻을 수 있습니다.