OVS 작성한 conntrack 가이드

OVS 커널 함께 연결 추적 시스템 (연결 추적 시스템)을 사용할 수 있고, 작성한 conntrack 기능 수단은 OpenFlow 스트림, UDP, ICMP, 등의 TCP 접속 상태에 맞게 사용될 수있다 (연결 추적 시스템 트랙 상태 및 상태 비 저장 프로토콜을 지원합니다).

이 튜토리얼은 연결 추적 시스템 OVS 사용하는 방법을 보여줍니다. 제거 연결 TCP 세그먼트에 연결 일치하는 항목을 설정합니다. OVS와 리눅스 커널은이 프리젠 테이션에 대한 데이터 경로로 함께 모듈. (리눅스 커널 모듈의 실행 처리를 사용 Openvswitch 데이터).

이 데모는 오픈 vSwitch는의 "마스터"지점에서 테스트되었습니다.

정의

작성한 conntrack : 연결 추적 모듈. 상태 유지 패킷 검사.

파이프 라인 : 패킷 처리 파이프 라인. 패킷이 테이블을 통해 경로를 가로 지르는 동안, 메시지 스트림의 테이블에서 검색 필드와 일치해야하고,이 스트림에 소정의 동작을 수행 할 때이다.

네트워크 네임 스페이스 : 하나의 리눅스 커널에서, 다수의 가상 라우팅 도메인 방법을 만들 수 있습니다. 각 네트워크는 자체 네트워크 네임 스페이스 테이블 인스턴스 (ARP, 라우팅), 특정 인터페이스 연결이 있습니다.

흐름 :이 튜토리얼은 OpenFlow 스트림, 또는 OVS-ofctl 도구 여기에서 사용 된대로, 프로그램 명령 줄 도구 OVS OpenFlow 컨트롤러를 사용할 수 있습니다. 스트림은 일치하는 필드와 액션 필드를 가진.

작성한 conntrack 관련 분야

매칭 필드

OVS는의 작성한 conntrack과 관련된 다음과 일치하는 필드를 지원합니다 :

  1. ct_state :

가능한 값은 연결 상태 메시지를 일치 :

- *new*
- *est*
- *rel*
- *rpl*
- *inv*
- *trk*
- *snat*
- *dnat*

표현 접두사로 "+"기호와 각을 설정해야합니다, 또는 "-"접두어가 설정되지 않을 수있는 기호가 표시됩니다. 또한 여러 플래그를 지정할 수 있습니다, 예를 들어, ct_state = + TRK + 새. 여기에서 우리는 사용의 조짐을 볼 수 있습니다. 자세한 설명은 참조 문서의 OVS 필드 .

  1. ct_zone : 연결 추적 CT 영역을 설정하여 독립적으로 동작 상황이다.

16 세트 (작성한 conntrack 입구에 위치한 흐름 OpenFlow 의해) 최신 CT 액션 ct_zone값은 다른 플로우 필드에 해당하는 엔트리로서 사용될 수있다.

  1. ct_mark : 현재의 32 비트 데이터가 속하는 패킷의 연결 설정 작업에 의해 CT Exec에서 동작 파라미터.

  2. ct_label :
    현재 패킷이 속하는 간부 태그 CT 동작에 128 비트의 매개 변수에서 오퍼레이터에 의해 제출이 접속되어있다.

  3. ct_label :
    현재의 동작에 의해 CT Exec에서 동작 파라미터 (128)는 라벨에 속하는 패킷을 연결하도록 설치되어있다.

  4. ct_nw_src / ct_ipv6_src :
    연결 추적 방향 원래 튜플의 일치의 IPv4 / IPv6를 소스 주소입니다.

  5. ct_nw_dst / ct_ipv6_dst :
    일본어 튜플의 타겟 어드레스의 IPv4 / IPv6의 연결 트랙 방향과 일치하는.

  6. ct_nw_proto :
    상대 커넥터 원래 방향을 추적 IP 프로토콜 종류 튜플.

  7. ct_tp_src :
    일본어 트랙킹 방향의 일치하는 튜플 수송층 접속 소스 포트.

  8. ct_tp_dst :
    상대 커넥터 포트는 원래 수송층 트랙킹 방향 개체 튜플.

행동

OVS 연결 추적 지원과 관련 "CT"조치를 작성한 conntrack.

*ct([argument][,argument...])*

CT 액션 동작은 접속 추적기에 패킷을 전송한다.

그것은 다음과 같은 매개 변수를 지원합니다 :

  1. 커밋 :
    연결이 연결 추적 모듈에 제출, 파이프 라인의 수명주기를 초과하는이 연결 패킷의 저장 모듈.

  2. :
    상기 이외에 커밋 외측 플래그 플래그 힘 효과적으로 기존의 접속을 종료하고 현재의 방향으로 새로운 연결을 시작하기 위해 사용될 수있다.

  3. 표 = 번호 :
    두 개의 관으로 처리. 원본 메시지는 행동 추적되지 패킷의 목록의 형태로 현재의 액션을 처리 할 것입니다. 메시지의 다른 예는 추적 프로그램이 연결되어, 다음 도관 OpenFlow 테이블 주입 Re 및 계속 발송 될 것이다 number가 ct_state 코네티컷 매치 정합 상태 및 다른 필드를 설정 한 경우의 처리.

  4. 존 = 값 또는 SRC = 존 ... 시작 끝] :
    16 비트 컨텍스트 ID와 연결이 분리 영역에서 분리 될 수 있으며, 네트워크 어드레스 겹치는 다른 영역의 사용을 허용한다. 가치가없는 지역 경우 기본 영역 0이 사용됩니다.

  5. 간부 ([동작] ... 액션]) :
    연결 추적 컨텍스트 제한된 세트의 동작을 수행하는 단계를 포함한다. 에서 exec행동 목록 변경 사항 만 적용합니다 ct_mark 또는 ct_label 활동의 필드.

  6. ALG = <FTP / TFTP는> :
    ALG (응용 계층 게이트웨이 ALG)는 특정 연결 유형을 추적하기 위해 지정한다.

  7. NAT는 :
    추적 NAT 주소 변환 및 포트를 지정합니다.

예 토폴로지

이 튜토리얼은 다음과 같은 토폴로지를 사용하여 테스트를 수행합니다.

         +                                                       +
         |                                                       |
         |                       +-----+                         |
         |                       |     |                         |
         |                       |     |                         |
         |     +----------+      | OVS |     +----------+        |
         |     |   left   |      |     |     |  right   |        |
         |     | namespace|      |     |     |namespace |        |
         +-----+        A +------+     +-----+ B        +--------+
         |     |          |    A'|     | B'  |          |        |
         |     |          |      |     |     |          |        |
         |     +----------+      |     |     +----------+        |
         |                       |     |                         |
         |                       |     |                         |
         |                       |     |                         |
         |                       +-----+                         |
         |                                                       |
         |                                                       |
         +                                                       +
     192.168.0.X n/w                                          10.0.0.X n/w

     A  = veth_l1
     A' = veth_l0
     B  = veth_r1
     B' = veth_r0

위의 단계 토폴로지는 다음 만듭니다.

는 "왼쪽"네트워크 네임 스페이스를 만듭니다

$ ip netns add left

는 "권리"네임 스페이스를 만듭니다

$ ip netns add right

Veth는 인터페이스의 첫번째 쌍을 생성 :

$ ip link add veth_l0 type veth peer name veth_l1

은 "왼쪽"네트워크 네임 스페이스에 veth_l1 추가 :

$ ip link set veth_l1 netns left

veth 인터페이스 제 2 쌍의 생성 :

$ ip link add veth_r0 type veth peer name veth_r1

"올바른"네트워크 네임 스페이스에 veth_r1 추가 :

$ ip link set veth_r1 netns right

브리지 BR0 만들기 :

$ ovs-vsctl add-br br0

veth_l0 및 veth_r0 인터페이스를 추가 BR0를 해소하기 ::

$ ovs-vsctl add-port br0 veth_l0
$ ovs-vsctl add-port br0 veth_r0

상기 데이터 패킷의 네트워크 네임 생성 된 소스 / 목적지 IP 주소에 192.168.0.x / 10.0.0.X 데이터 패킷이며, "좌"로 나타난다 생성 반대 방향 "오른쪽"네트워크 네임 스페이스 OVS 스위치, 두 네트워크 (192.168.0.x를하고 10.0.0.X) 통신 호스트 경우.

이는 실질적으로 중앙 OVS 통해 두 호스트 또는 네트워크 서브넷 간의 통신을 시뮬레이트한다.

참고 :
한 쌍은 본 실시 예에만 프레젠테이션 인터페이스는 두 네트워크 네임 스페이스 간의 통신 veth.

TCP 패킷 생성 도구

Scapy는 TCP 패킷을 생성 할 수 있습니다. 우리는 우분투 16.04에서 수행이 테스트 scapy 단계를 사용했다. (Scapy이 범위를 넘어, 내부에 장착).

당신은 scapy 각 네임 스페이스에 두 개의 활성 세션을 유지할 수 있습니다 :

 $ sudo ip netns exec left sudo `which scapy`

 $ sudo ip netns exec right sudo `which scapy`

참고 : 다음과 같은 오류가 발생하는 경우 :

ifreq = ioctl(s, SIOCGIFADDR,struct.pack("16s16x",LOOPBACK_NAME))

IOError: [Errno 99] Cannot assign requested address

이 명령을 실행합니다 :

$ sudo ip netns exec <namespace> sudo ip link set lo up

TCP 패킷을 일치

TCP 연결이 설정됩니다

OVS 간단한 두 스트림에 첨가 될 수 있고, 두 개의 스트림은 공간 "오른쪽"네임 스페이스 "왼쪽"로 전송하고, "좌회전"패킷 "오른쪽"으로되어

 $ ovs-ofctl add-flow br0 \
          "table=0, priority=10, in_port=veth_l0, actions=veth_r0"

 $ ovs-ofctl add-flow br0 \
          "table=0, priority=10, in_port=veth_r0, actions=veth_l0"

밖에서 두 스트림을 추가하는 것 외에도, 우리는 또한 흐름의 상태와 일치하는 TCP 패킷을 추가합니다.

우리는 즉, TCP 연결 설정 메시지가 보내드립니다 :은 "왼쪽"네트워크 네임 스페이스 호스트 192.168.0.2의 SYN, SYN-ACK의 ACK 패킷 및 10.0.0.2에 위치를하고 "오른쪽"네임 스페이스 호스트 사이에 위치하고 있습니다.

첫째, 우리는받은 메시지에 OVS 추적 "추적"시작 스트림을 추가 할 수 있습니다.

어떻게 메시지를 추적하기 시작했다?

메시지 추적을 시작하려면 먼저 "CT"스트림과 같은 행동을 일치해야합니다. 이 작업은 추적 장치를 연결하는 메시지를 보냅니다. 메시지가 "비 추적"비 추적 패킷 스트림 일치 필드가 있는지 확인하려면 ct_state"-trk", 즉,이 추적되지 않습니다 패킷에 설정해야합니다. 메시지가 연결된 추적기에 전송되면, 유일한, 그래서 우리는 연결 상태를 추적하는 것을 발견했다. (즉, 패킷이 새로운 연결을 나타내는 지 여부 또는 패킷 등 기존 연결 또는 잘못된 패킷에 속하고).

우리는 다음과 같은 스트림을 추가 :

 (flow #1)
 $ ovs-ofctl add-flow br0 \
    "table=0, priority=50, ct_state=-trk, tcp, in_port=veth_l0, actions=ct(table=0)"

패킷이 포트 OVS veth_l0에서 입력하고 추적되지 않은으로 "왼쪽"네임 스페이스에서 보낸 TCP SYN 패킷 스트림 # 1 일치합니다. (메시지 단지 OVS 들어가 있기 때문에. OVS에 처음 모든 패킷은 "추적 된"이다).

구성 "CT"작업 이후에, 흐름은 연결 패킷 트랙커에보고한다. "코네티컷"동작 파라미터 "테이블 = 0"을 두 부분으로 처리 파이프. 은 "추적 된"메시지의 일 예로서, 원본 메시지는 현재의 작업리스트를 계속 처리한다. (그 후에 아무런 조작이 없기 때문에, 원래의 메시지가 폐기 될 것이다.).

다른 갈래 커넥터 트래커에 전송 패킷의 예는 다음 파이프 라인에 재 주입이 계속 상태 ct_state CT 값을 설정하고 있으며, 다른 필드가 일치하는 경우 지정된 OpenFlow 플로우 테이블 처리. 상기 상황에서, 정합 된 CT ct_state 상태 및 다른 필드를 갖는 패킷은리스트 0을 반환한다.

다음으로, 우리가 작성한 conntrack에서 반환 된 데이터 그램 패킷을 일치 스트림을 추가 :

(flow #2)
$ ovs-ofctl add-flow br0 \
    "table=0, priority=50, ct_state=+trk+new, tcp, in_port=veth_l0, actions=ct(commit),veth_r0"

패킷 접속 추적에서 반환되기 때문에, ct_state 상태 "TRK"을 설정한다.

또한,이 TCP 연결의 첫 번째 패킷 인 경우, ct_state 상태는 "새로운"플래그를 설정해야합니다. (192.168.0.2 및 10.0.0.2 사이에 TCP 연결이 없기 때문에 그것은, 현재의 경우) ct매개 변수 "커밋"연결 추적 모듈에 제출 연결됩니다. 이것의 의미는 상기 접속 정보의 동작은 연결 추적 모듈에 저장되고, 상기 패킷은 파이프의 수명을 초과한다는 것이다.

우리는 scapy는 (이하 "왼쪽"네임 스페이스 scapy 세션에 위치) TCP SYN 패킷을 전송 사용 (플래그 =의는 0x02이가 SYN입니다) :

$ >>> sendp(Ether()/IP(src="192.168.0.2", dst="10.0.0.2")/TCP(sport=1024, dport=2048, flags=0x02, seq=100), iface="veth_l1")

이 메시지는 흐름 # 1과 일치 # 2 흐를 것이다.

작성한 conntrack 연결 추적 모듈이 관련 항목이 있습니다 :

$ ovs-appctl dpctl/dump-conntrack | grep "192.168.0.2"
tcp,orig=(src=192.168.0.2,dst=10.0.0.2,sport=1024,dport=2048),reply=(src=10.0.0.2,dst=192.168.0.2,sport=2048,dport=1024),protoinfo=(state=SYN_SENT)

TCP SYN 패킷의 재전송, 그것은 일치하는 경우이 단계에서, 다시 # 1 (새 메시지는 항상 추적되지 않기 때문에) 흐름, 또한 스트림 # 2와 일치합니다 :합니다. 그 이유는이 연결에 대한 작성한 conntrack 정보에도 불구하고, 흐름 # 2와 일치하지만, 이렇게 일치하는 "새로운"다시는 "설립"상태에 있지 않습니다.

다음으로, TCP SYN + ACK 패킷 반대 / 서버 방향에서, 우리는 다음과 같은 OVS 스트림이 필요합니다 :

(flow #3)
$ ovs-ofctl add-flow br0 \
    "table=0, priority=50, ct_state=-trk, tcp, in_port=veth_r0, actions=ct(table=0)"
(flow #4)
$ ovs-ofctl add-flow br0 \
    "table=0, priority=50, ct_state=+trk+est, tcp, in_port=veth_r0, actions=veth_l0"

매칭 서버 (10.0.0.2) 위로 추적 된 패킷에 의해 # 3 흐름과 작성한 conntrack이 메시지를 전송한다. (또한, 우리는 # 1 흐름 # 3 병합 프로세스는 "in_port"을 제거하는 유동 할 일치 필드)

TCP SYN + ACK 패킷이 작성한 conntrack 치료 후 ct_state는 "추정"연결 설정 플래그를 설정합니다.

참고 : 작성한 conntrack 양방향 트래픽을 본 후에 "EST"상태를 연결하도록 설정 ct_state하지만이 작성한 conntrack의 단기 항목에 카운터를 재설정 구성, 클라이언트의 세 번째 ACK 패킷을 볼 수 없습니다 장치.

scapy를 사용하여 (가 ACK 플래그와 SYN로 =에 0x12를) TCP SYN + ACK 패킷 ( "올바른"네임 스페이스 scapy 세션을) 보내기 :

$ >>> sendp(Ether()/IP(src="10.0.0.2", dst="192.168.0.2")/TCP(sport=2048, dport=1024, flags=0x12, seq=200, ack=101), iface="veth_r1")

이 메시지는 흐름 # 3 일치 # 4 흐를 것이다.

작성한 conntrack 항목 :

 $ ovs-appctl dpctl/dump-conntrack | grep "192.168.0.2"

 tcp,orig=(src=192.168.0.2,dst=10.0.0.2,sport=1024,dport=2048),reply=(src=10.0.0.2,dst=192.168.0.2,sport=2048,dport=1024),protoinfo=(state=ESTABLISHED)

오직 SYN 및 SYN ACK 패킷을 수신 한 후, 작성한 conntrack 상태 "설립"된다. 그것은 (클라이언트)에서 세 번째 ACK 패킷을 수신하지 않는 경우 그러나 이번에는,이 연결은 곧 작성한 conntrack에서 제거됩니다.

다음으로, 클라이언트의 방향에서 TCP ACK 패킷, 우리는이 메시지를 일치하는 다음과 같은 흐름을 추가 할 수 있습니다 :

(flow #5)
$ ovs-ofctl add-flow br0 \
    "table=0, priority=50, ct_state=+trk+est, tcp, in_port=veth_l0, actions=veth_r0"

셋째 scapy를 사용하여 (ACK로 플래그 =의은 0x10은) (이하 "왼쪽"네임 스페이스 scapy 세션에서) TCP ACK 패킷을 전송 :

$ >>> sendp(Ether()/IP(src="192.168.0.2", dst="10.0.0.2")/TCP(sport=1024, dport=2048, flags=0x10, seq=101, ack=201), iface="veth_l1")

이 메시지는 흐름 # 1과 일치 # 5 흐를 것이다.

작성한 conntrack 항목 :

$ ovs-appctl dpctl/dump-conntrack | grep "192.168.0.2"

 tcp,orig=(src=192.168.0.2,dst=10.0.0.2,sport=1024,dport=2048), \
     reply=(src=10.0.0.2,dst=192.168.0.2,sport=2048,dport=1024), \
                                     protoinfo=(state=ESTABLISHED)

모든 데이터는이 연결에서 수신되지 않은 경우에도, 작성한 conntrack 상태 "설립"상태로 남아 있지만 지금은 클라이언트에서 ACK를받은, 그것은 오랜 시간 동안이 상태를 유지합니다.

TCP 데이터

TCP 세그먼트가 10.0.0.2에 192.168.0.2로부터 전송 된 페이로드 바이트를 운반 할 때, 데이터 패킷들을 전달하는 세그먼트는 스트림 # 1, 스트림 # 5 이후 일치한다.

(플래그 =의은 0x10이 ACK한다) (이하 "왼쪽"네임 스페이스 scapy 세션에서) TCP 세그먼트를 사용하여 바이트를 전송 Scapy ::

$ >>> sendp(Ether()/IP(src="192.168.0.2", dst="10.0.0.2")/TCP(sport=1024, dport=2048, flags=0x10, seq=101, ack=201)/"X", iface="veth_l1")

( "올바른"네임 스페이스 scapy 세션)가 ACK 응답 세그먼트를 통해 전송 scapy을 (플래그 =의은 0x10이 ACK한다)를 사용 ::

$ >>> sendp(Ether()/IP(src="10.0.0.2", dst="192.168.0.2")/TCP(sport=2048, dport=1024, flags=0X10, seq=201, ack=102), iface="veth_r1")

ACK 응답 데이터 패킷 흐름 # 3 및 # 4의 일치를 흐르게한다.

TCP 연결의 눈물

TCP 연결을 해체하는 방법에는 여러 가지가 있습니다. 우리는 클라이언트에서 "FIN"패킷을 전송, 서버는 "FIN + ACK"메시지는 다음 클라이언트는 "ACK"메시지 해체 연결의 마지막 전송 응답합니다.

서버에 클라이언트가 일치에서 모든 패킷 # 1 흐름과 # 5 흐름. 클라이언트에 서버가 일치에서 모든 패킷 # 3 흐름과 # 4 흐름. 주목할만한 점은 TCP 연결이되는 경우에도 것입니다
해체, 모든 패킷은 여전히 "+ 동부 표준시"상태 일치 (실제로 연결을 찢어). 그것이 작성한 conntrack 항목이 상태를 "설립"있는 경우 메시지가, 나, 그것은 OVS "+ 동부 표준시"기호의 ct_state에 맞게 계속해야합니다.

주 : 연결 상태가 작성한 conntrack 인 실시에서, "TIME_WAIT"상태 (모든 TCP 연결 인열 교환 FIN 원하는로부터 ACK 패킷), 재송 패킷 (> 10.0.0.2 192.168.0.2-)에서 트래픽이 여전히 # 1과 # 5를 기록했다.

TCP FIN 패킷 전송 ( "왼쪽"네임 스페이스 scapy 세션) scapy 사용합니다 (ACK와 FIN에 대한 플래그 =의 0x11을) :

$ >>> sendp(Ether()/IP(src="192.168.0.2", dst="10.0.0.2")/TCP(sport=1024, dport=2048, flags=0x11, seq=102, ack=201), iface="veth_l1")

이 패킷 매칭 흐름 1 및 흐름 # 5.

작성한 conntrack 항목 :

$ sudo ovs-appctl dpctl/dump-conntrack | grep "192.168.0.2"

  tcp,orig=(src=192.168.0.2,dst=10.0.0.2,sport=1024,dport=2048),reply=(src=10.0.0.2,dst=192.168.0.2,sport=2048,dport=1024),protoinfo=(state=FIN_WAIT_1)

TCP FIN + ACK 패킷 ( "오른쪽"네임 스페이스 scapy 세션) scapy 사용합니다 (ACK와 FIN에 대한 플래그 =의 0x11을)를 보내기 :

$ >>> sendp(Ether()/IP(src="10.0.0.2", dst="192.168.0.2")/TCP(sport=2048, dport=1024, flags=0X11, seq=201, ack=103), iface="veth_r1")

이 메시지는 흐름 # 3 명중 # 4 흐름.

작성한 conntrack 항목 :

$ sudo ovs-appctl dpctl/dump-conntrack | grep "192.168.0.2"

  tcp,orig=(src=192.168.0.2,dst=10.0.0.2,sport=1024,dport=2048),reply=(src=10.0.0.2,dst=192.168.0.2,sport=2048,dport=1024),protoinfo=(state=LAST_ACK)

TCP ACK 패킷 ( "왼쪽"네임 스페이스 scapy 세션) scapy를 사용하여 (ACK로 플래그 = 0x10입니다) 전송 :

$ >>> sendp(Ether()/IP(src="192.168.0.2", dst="10.0.0.2")/TCP(sport=1024, dport=2048, flags=0x10, seq=103, ack=202), iface="veth_l1")

이 메시지 흐름 # 1 안타 # 5 흐름.

작성한 conntrack 항목 :

$ sudo ovs-appctl dpctl/dump-conntrack | grep "192.168.0.2"

  tcp,orig=(src=192.168.0.2,dst=10.0.0.2,sport=1024,dport=2048),reply=(src=10.0.0.2,dst=192.168.0.2,sport=2048,dport=1024),protoinfo=(state=TIME_WAIT)

개요

다음 표는 TCP 패킷 스트림과 일치하는 필드 사이의 관계를 요약

  +-------------------------------------------------------+-------------------+
  |                     TCP Segment                       |ct_state(flow#)    |
  +=======================================================+===================+
  |                     **Connection Setup**              |                   |
  +-------------------------------------------------------+-------------------+
  |192.168.0.2 → 10.0.0.2 [SYN] Seq=0                     | -trk(#1) then     |
  |                                                       | +trk+new(#2)      |
  +-------------------------------------------------------+-------------------+
  |10.0.0.2 → 192.168.0.2 [SYN, ACK] Seq=0 Ack=1          | -trk(#3) then     |
  |                                                       | +trk+est(#4)      |
  +-------------------------------------------------------+-------------------+
  |192.168.0.2 → 10.0.0.2 [ACK] Seq=1 Ack=1               | -trk(#1) then     |
  |                                                       | +trk+est(#5)      |
  +-------------------------------------------------------+-------------------+
  |                     **Data Transfer**                 |                   |
  +-------------------------------------------------------+-------------------+
  |192.168.0.2 → 10.0.0.2 [ACK] Seq=1 Ack=1               | -trk(#1) then     |
  |                                                       | +trk+est(#5)      |
  +-------------------------------------------------------+-------------------+
  |10.0.0.2 → 192.168.0.2 [ACK] Seq=1 Ack=2               | -trk(#3) then     |
  |                                                       | +trk+est(#4)      |
  +-------------------------------------------------------+-------------------+
  |                     **Connection Teardown**           |                   |
  +-------------------------------------------------------+-------------------+
  |192.168.0.2 → 10.0.0.2 [FIN, ACK] Seq=2 Ack=1          | -trk(#1) then     |
  |                                                       | +trk+est(#5)      |
  +-------------------------------------------------------+-------------------+
  |10.0.0.2 → 192.168.0.2 [FIN, ACK] Seq=1 Ack=3          | -trk(#3) then     |
  |                                                       | +trk+est(#4)      |
  +-------------------------------------------------------+-------------------+
  |192.168.0.2 → 10.0.0.2 [ACK] Seq=3 Ack=2               | -trk(#1) then     |
  |                                                       | +trk+est(#5)      |
  +-------------------------------------------------------+-------------------+

참고 : 승인 일련 번호와 일련 번호가 tshark를 캡처 반대 표시됩니다.

흐름 테이블


     (flow #1)
     $ ovs-ofctl add-flow br0 \
        "table=0, priority=50, ct_state=-trk, tcp, in_port=veth_l0, actions=ct(table=0)"

    (flow #2)
    $ ovs-ofctl add-flow br0 \
        "table=0, priority=50, ct_state=+trk+new, tcp, in_port=veth_l0, actions=ct(commit),veth_r0"

    (flow #3)
    $ ovs-ofctl add-flow br0 \
        "table=0, priority=50, ct_state=-trk, tcp, in_port=veth_r0, actions=ct(table=0)"

    (flow #4)
    $ ovs-ofctl add-flow br0 \
        "table=0, priority=50, ct_state=+trk+est, tcp, in_port=veth_r0, actions=veth_l0"

    (flow #5)
    $ ovs-ofctl add-flow br0 \
        "table=0, priority=50, ct_state=+trk+est, tcp, in_port=veth_l0, actions=veth_r0"

추천

출처blog.csdn.net/sinat_20184565/article/details/94482558