act_connmark

act_connmark

네트워크 토폴로지가 있습니다.

Server <-> router1 <-> router2 <-> router3 <-> edgeRouter <-> "internet"

모든 라우터는 Linux 기반이며 iptables를 지원합니다.

서버는 iptables( --set class X:Y)를 사용하여 트래픽 카테고리를 설정하고, 라우터는 설정된 카테고리에 따라 일부 "라우팅"을 수행합니다. (카테고리는 원래 응용 프로그램에 따라 다릅니다).

에지 라우터는 ISP를 통해 인터넷으로 패킷을 전달하고 반환(응답) 패킷을 수신합니다. 수신된 응답은 확실히 트래픽 카테고리를 설정하지 않았습니다.

iptables반환 패킷(NAT 스타일, "ESTABLISHED" 연결의 패킷)을 추적하고 원래 패킷과 동일한 트래픽 클래스로 반환 패킷에 태그를 지정하기 위해 에지 라우터에서 규칙(mangle 또는 이와 유사한 것)을 사용할 수 있습니까 ? 에지 라우터에서 NAT를 활성화하는 것은 문제가 되지 않습니다.

TLDR: iptables를 사용하여 동일한 연결에 대한 동일한 클래스의 수신 패킷을 송신 패킷으로 분류하는 방법.

답변1

TLDR: iptables를 사용하여 동일한 연결에 대한 동일한 클래스의 수신 패킷을 송신 패킷으로 분류하는 방법.

tc귀하의 질문에서 어떤 분류 방법을 언급하고 있는지 완전히 명확하지는 않지만 일반적으로 트래픽 조절 및 대기열 규칙 에 대해 이야기하는 경우 다음이 적용됩니다.

act_connmark

수신 qdisc 처리는 netfilter 이전에 수행되므로 iptables를 사용하여 수신 트래픽을 직접 분류할 수 없습니다(IMQ로 커널을 다시 컴파일하지 않고 아래 참조). 그러나 연결 추적을 사용하여 간접적으로 분류할 수 있습니다. 커널에서 사용할 수 있는 경우 이 목적으로 설계되고 이를 지원하는 필터에 작업을 추가하는 act_connmark 모듈을 사용할 수 있습니다 connmark.tc

# 0. Load modules and IFB device
modprobe act_connmark
modprobe ifb
ip link set ifb0 up

# 1. Classify packets by marking them
iptables -t mangle -A POSTROUTING -p tcp --sport 22 -j MARK --set-mark 1

# 2. Append rule to save the packet mark to the connection mark
iptables -t mangle -A POSTROUTING -j CONNMARK --save-mark

# 3. Restore the connection mark to the packet mark with 'action connmark'
#    before redirecting to the ifb-device
tc qdisc add dev eth0 handle ffff: ingress
tc qdisc add dev ifb0 handle 1: root
tc filter add dev eth0 parent ffff: prio 1 \
   protocol ip u32 match u32 0 0 flowid ffff:1 \
   action connmark \
   action mirred egress redirect dev ifb0

# 4. Apply filters to classify packets based on their mark
# ... setup qdiscs and classes as usual on ifb0... then
tc filter add dev ifb0 parent 1: prio 1 protocol ip handle 1 fw classid 1:01

IMQ

내가 이해한 바로는 IMQ(Intermediate Queue Device)는 netfilter에 의해 처리된 후 가상 장치를 통해 다시 루프하여 커널의 일반 트래픽을 우회합니다. 이는 커널 트리와 병합되지 않으므로 대부분의 배포판에 포함되지 않으며 사용자가 직접 커널을 패치하고 컴파일해야 합니다. 이렇게 하면 다음과 같이 작동합니다.

# classify and save mark in POSTROUTING as before... then
iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -j IMQ --todev 0

# ... setup qdiscs and classes as usual on imq0 ... then
tc filter add dev imq0 parent 1: prio 1 protocol ip handle 1 fw classid 1:01

또한 iptables를 사용하여 수신에 대한 고급 분류를 수행할 수 있습니다. 이는 일반 u32 필터(예: 임의의 포트 범위)를 사용하면 매우 번거로울 수 있습니다. 하지만 이 솔루션의 성능이나 우아함에 대해서는 말할 수 없으며, 이 솔루션이 병합되지 않은 데에는 이유가 있을 것 같습니다.

답변2

송신 패킷에는 애플리케이션 기반 범주 세트가 있으므로(그리고 각 애플리케이션이 특정 TCP/UDP 포트 세트를 사용하는 것으로 추측됩니다) 해당 포트를 기반으로 수신 패킷을 재분류할 수 있습니다.

예를 들어. EdgeRouter에서 설정된(아웃바운드) HTTP 세션을 재분류합니다.

iptables -t mangle -A INPUT -i [WANIF] -m state --state ESTABLISHED,RELATED -p tcp -m tcp --sport 80 -j DSCP --set-dscp-class cs3

참고: INPUT 대신 FORWARD 테이블을 사용해야 할 수도 있습니다...

그러나 송신 패킷을 추적하고 나가는 중에 어떤 범주가 있는지 확인한 다음 동일한 흐름의 수신 패킷에 동일한 범주를 적용하는 것은 여전히 ​​가능하지만 많은 작업이 필요하며 conntrack 인터페이스의 사용자 정의가 필요할 수 있습니다. 필터 모듈.

답변3

어떤 설정을 사용하셨나요 --set class X:Y? 정확히 무엇입니까? iptables에 대한 매뉴얼 페이지를 검색했지만 설명하는 것과 유사한 것을 찾지 못했습니다. 내 생각에는 다음과 같은 작업을 수행하고 싶을 수도 있습니다.

  1. "Server"에서 IP 패킷의 TOS 필드를 표시합니다.
  2. 라우터가 패킷에 대해 특수 처리를 수행하도록 합니다.
  3. "edgeRouter"에서 다음을 수행합니다.

      # If a packet arrives from LAN, is marked and we know nothing about the
      #+ connection, then mark the connection
    iptables -t mangle -A PREROUTING -i $LAN_IF -m tos --tos $TOS_VAL -m \
      connmark \! --mark $TOS_VAL -j CONNMARK --set-xmark $TOS_VAL
    
      # Reset the TOS value when going out to prevent strange interpretation
    iptables -t mangle -A POSTROUTING -o $WAN_IF -m tos --tos $TOS_VAL \
      -j TOS --set-tos 0x00
    
      # If a packet arrives from WAN and the connection is marked, then mark
      #+ the packet so that the routers in LAN know how to deal with it
    iptables -t mangle -A PREROUTING -i $WAN_IF -m connmark --mark $TOS_VAL \
      -j TOS --set-tos $TOS_VAL
    

관련 정보