패킷의 패킷을 표시하려면 iptables
일반적으로 방화벽 스크립트에 다음 줄을 추가합니다.
iptables -t mangle -A POSTROUTING -p tcp -m multiport --dports 80,443 -j MARK --set-mark 2
이 주제가 다소 복잡하다는 것을 알고 있지만 한 가지 규칙에만 집중하겠습니다. 위와 같은 내용을 추가하면 /proc/net/nf_conntrack
파일의 특정 항목에 플래그가 설정됩니다.
ipv4 2 tcp 6 3706 ESTABLISHED ... mark=2
이 규칙의 문제점은 다른 일치 규칙(예: 소스 또는 대상 주소)을 추가하고 다른 태그를 설정하면 이전 태그가 사용자가 설정한 대로 다시 작성된다는 것입니다. 하지만 마커를 "추가"하는 방법이 있습니다. 따라서 하나의 규칙 세트 mark=2
와 다른 규칙 세트가 있으면 mark=5
결과 태그는 mark=7
다음과 같습니다.
나는 다음을 기반으로 한 실제 예제를 가지고 있습니다.므완 3, 하지만 잘 이해가 안 돼요. mangle
도구를 시작한 후 테이블이 어떻게 보이는지, 어떤 규칙이 추가되었는지 알고 있습니다 .
따라서 메커니즘을 이해하려면 도착하는 패킷에 실제로 무슨 일이 일어나는지 알아야 합니다. 하지만 이 예에서는 표시 규칙이 다릅니다.
두 가지 WAN 인터페이스가 있습니다. 태그에 따라 패킷은 다른 라우팅 테이블에 들어갑니다. 그렇다면 포트 443(예: 포트 1000)으로 전송된 패킷은 실제로 어떻게 되나요? 누구든지 규칙을 분석하는 데 도움을 줄 수 있나요?
답변1
대상 "-j MARK --set-mark 2"는 이전 값에 관계없이 패킷에 마크 2를 설정합니다. 태그가 제거되는 것을 방지하려면 -j ACCEPT를 사용하여 체인의 패킷 경로를 종료하면 됩니다. 예를 들어:
iptables -t mangle -A POSTROUTING -p tcp --dport 80 -j MARK --set-mark 10
iptables -t mangle -A POSTROUTING -p tcp --dport 80 -j ACCEPT
iptables -t mangle -A POSTROUTING -d 8.8.8.8 -j MARK --set-mark 20
iptables -t mangle -A POSTROUTING -d 8.8.8.8 --dport 80 -j ACCEPT
# If you open a connection to 8.8.8.8:80, the mark will be 10
그러나 메인 체인(예: POSTROUTING)이나 커스텀 체인에 있는 경우 주의해야 합니다. ACCEPT는 메인 체인을 종료하고 RETURN은 현재 체인을 종료합니다. 그것은 귀하의 필요에 따라 다릅니다.
mwan3 예와 관련하여 필터, nat 및 raw 테이블이 없고 tc 구성이 없으면 말하기가 어렵습니다.
그러나 다음과 같습니다.
- "mwan3_rules" 체인은 dport 80 또는 443의 새 연결에서 "mwan3_policy_balanced" 체인으로 패킷을 보냅니다.
- "mwan3_policy_balanced" 체인은 패킷의 40%에 플래그 200을 설정하고 다른 패킷에 100을 설정합니다.
- "mwan3_rules" 체인은 dport 80 또는 443을 사용하지 않는 새 연결의 패킷을 "mwan3_policy_wan_only" 체인으로 보냅니다.
- "mwan3_policy_wan_only" 체인 설정 플래그 100
- 100으로 표시된 패킷은 케이블을 통과하고 200으로 표시된 패킷은 LTE를 통과할 것 같습니다.
따라서 http(s) 트래픽의 40%는 LTE를 통해 이동하고, 60%는 케이블을 통해 이동하며, 그 밖의 모든 트래픽은 케이블을 통해 이동합니다.
목표가 2개의 ISP에 걸쳐 연결 로드 밸런싱을 수행하는 것이라면 mwan3 규칙은 읽기 어렵기 때문에 처음부터 자신만의 iptables 규칙을 작성해야 할 것입니다.
당신은부터 시작할 수 있습니다이것질문.
행운을 빌어요!
버전:
이것문서상태:
--set-xmark value[/mask]
Zero out the bits given by mask and XOR value into the ctmark.
0x100 표시가 있고 xmark를 0x200/0xff00으로 설정하려고 하면:
- ctmark에서 마스크에 의해 제공된 비트를 지웁니다. 0000 0001 0000 0000 AND NOT 1111 1111 0000 0000 --> 0000 0000 0000 0000
- 값을 ctmark에 XOR합니다: 0000 0000 0000 0000 XOR 0000 0010 0000 0000 --> 0000 0010 0000 0000 --> 0x200 --> 512
0x100 표시가 있고 xmark를 0x200/0xf000으로 설정하려고 하면:
- ctmark에서 마스크에 의해 제공된 비트를 지웁니다: 0000 0001 0000 0000 AND NOT 1111 0000 0000 0000 --> 0000 0001 0000 0000
- 값을 ctmark에 XOR합니다: 0000 0001 0000 0000 XOR 0000 0010 0000 0000 --> 0000 0011 0000 0000 --> 0x300 --> 768
0x100 마크가 있고 xmark 0x100/0xf000을 설정해 보십시오:
- ctmark에서 마스크에 의해 제공된 비트를 지웁니다: 0000 0001 0000 0000 AND NOT 1111 0000 0000 0000 --> 0000 0001 0000 0000
- 값을 ctmark에 XOR합니다: 0000 0001 0000 0000 XOR 0000 0001 0000 0000 --> 0000 0000 0000 0000 --> 0x000 --> 0
0x100 마크가 있고 xmark 0x100/0xff00을 설정해 보십시오:
- ctmark에서 마스크에 의해 제공된 비트를 지웁니다. 0000 0001 0000 0000 AND NOT 1111 1111 0000 0000 --> 0000 0000 0000 0000
- 값을 ctmark에 XOR합니다: 0000 0000 0000 0000 XOR 0000 0001 0000 0000 --> 0000 0001 0000 0000 --> 0x100 --> 256
mwan3 파일에서 상황은 항상 다음과 같습니다.
- 0x0 표시가 있고 xmark 0x??00/0xff00을 설정해 보세요.
- ctmark에서 마스크에 의해 제공된 비트를 지웁니다. 0000 0000 0000 0000 AND NOT 1111 1111 0000 0000 --> 0000 0000 0000 0000
- ctmark에 대한 값을 XOR합니다: 0000 0000 0000 0000
- 이 마스크와 이러한 값을 사용하여 set-xmark는 단순히 이전 값을 대체합니다.
이제 체인을 살펴보겠습니다.
- 사전 라우팅은 mwan3_hook으로 점프합니다.
- mwan3_hook 복원 connmark to mark
- mwan3_hook는 mwan3_ifaces에 새로운 연결(tag=0x0)을 보냅니다.
- mwan3_ifaces는 mwan3_iface_wan에 새로운 연결을 보냅니다.
- mwan3_iface_wan은 소스 주소가 ipset 목록 mwan3_connected에 있는 경우 인터페이스 eth0의 새 연결에 대해 플래그 0xff00을 설정합니다.
- mwan3_iface_wan은 태그 0x100을 인터페이스 eth0의 다른 새 연결로 설정합니다.
- mwan3_ifaces는 mwan3_iface_lte에 새로운 연결을 보냅니다.
- mwan3_iface_lte 소스 주소가 ipset 목록에 있을 때 인터페이스 wwan의 새 연결에 대해 플래그 0xff00을 설정합니다.
- mwan3_iface_lte 태그 0x200을 인터페이스 wwan의 다른 새 연결로 설정
- 참고: 이 시점에서 들어오는 모든 연결에는 태그가 지정됩니다.
- mwan3_hook는 mwan3_connected에 연결을 보냅니다.
- 대상 주소가 ipset 목록 mwan3_connected에 있으면 mwan3_connected는 플래그 0xff00을 설정합니다.
- mwan3_hook는 mwan3_track에 연결을 보냅니다.
- mwan3_track 대상 IP가 ipset 목록 mwan3_track_wan에 있으면 연결에 대해 마크 0xff00이 설정됩니다. 패킷은 32바이트 길이의 icmp 에코입니다.
- mwan3_track 대상 IP가 ipset 목록 mwan3_track_lte에 있는 경우 연결에 대해 마크 0xff00이 설정되고 데이터 패킷은 32바이트 길이의 icmp 에코입니다.
- mwan3_hook는 mwan3_rules에 연결을 보냅니다.
- mwan3_rules는 내부적으로 mwan3_policy_balanced에 새로운 tcp/80 또는 tcp/443 연결을 보냅니다.
- mwan3_policy_balanced는 표시 0x200을 새 연결의 40%로 설정합니다.
- mwan3_policy_balanced는 플래그 0x100을 다른 새 연결로 설정합니다.
- mwan3_hook 복원 표시를 connmark로
- mwan3_hook는 태그 0xff00을 표시되지 않은 연결로 설정합니다(내부적으로는 icmp 유형 8, tcp/80 또는 tcp/443이 아님).
- 사전 라우팅이 fwmark로 점프하지만 체인이 화면에 표시되지 않습니다.
- 정방향 복구 mss
- 출력은 mwan3_hook로 점프하고 각 단계가 반복됩니다.
마지막으로 3가지 상태가 있습니다.
- 0x100 플래그(256): WAN 연결 및 인터넷에 대한 http(s) 연결의 60%
- 0x200 플래그(512): LTE로부터의 연결 및 인터넷에 대한 http(s) 연결의 40%
- 0xff00 태그(65280): 기타 트래픽
IP 규칙이 없으므로 다음과 같이 추측할 수 있습니다.
- 0x100 표시는 wan 라우팅 테이블을 통과합니다.
- 0x200 표시는 LTE 라우팅 테이블을 통과합니다.
- 0xff00은 다른 라우팅 테이블을 통과합니다.