저는 Linux ping
명령과 해당 옵션에 대해 배우고 있으며 -m
나가는 패킷을 표시하는 옵션에 대해 읽고 있습니다. 수신 시 먼저 표시된 패킷 결과를 필터링할 수 있습니다.
패킷에 대한 태그를 설정하려고 하는데 다음과 같은 경고 메시지가 나타납니다.
$ ping -m 10 server
PING server (192.168.2.2) 56(84) bytes of data.
Warning: Failed to set mark 10
64 bytes from server (192.168.2.2): icmp_req=1 ttl=64 time=0.182 ms
64 bytes from server (192.168.2.2): icmp_req=2 ttl=64 time=0.201 ms
그렇다면 마킹이 실패하는 이유는 무엇입니까? 이 옵션을 사용하여 -m
패킷을 어떻게 표시 할 수 있습니까?
답변1
짧은 답변:일반 사용자로는 할 수 없습니다.
긴 답변:패킷에 태그를 지정하려면 루트이거나 최소한 SO_MARK
다음 기능을 갖춘 사용자여야 합니다(루트로 설정해야 함).
SO_MARK가 있음소켓(7):
SO_MARK (since Linux 2.6.25) Set the mark for each packet sent through this socket (similar to the netfilter MARK target but socket-based). Changing the mark can be used for mark-based routing without netfilter or for packet filtering. Setting this option requires the CAP_NET_ADMIN capability.
이것코드 조각iputils의 ping_common.c는 이 이론을 확인합니다.
#ifdef SO_MARK
if (options & F_MARK) {
int ret;
enable_capability_admin();
ret = setsockopt(sock->fd, SOL_SOCKET, SO_MARK, &mark, sizeof(mark));
disable_capability_admin();
if (ret == -1) {
/* we probably dont wanna exit since old kernels
* dont support mark ..
*/
fprintf(stderr, "Warning: Failed to set mark %d\n", mark);
}
}
#endif
함수에 대해 더 알아보려면: man능력(7)그리고 능력(7)개요.
시스템의 다른 모든 바이너리가 수행하는 작업에 대해 더 자세히 알고 싶다면,이것은그들을 탐험할 수 있는 좋은 방법입니다. 커널 컴파일이 포함되므로 프로덕션 환경에는 적합하지 않습니다.
ICMP 태그의 목적:
설명대로매뉴얼 페이지:
-m mark
use mark to tag the packets going out. This is useful for variety of reasons
within the kernel such as using policy routing to select specific outbound processing.
위에서 설명했듯이뿌리문제는 ICMP 패킷이 특정 "흐름"을 통과하도록 강제해야 하는 다중 링크/다중 경로 네트워크 환경을 조사할 때 이 기능이 유용할 수 있다는 것입니다.
실제 사례. 호스트 1:
$ ping -m 10 <host>
호스트 2. 기본 정책을 변경 하고 호스트 1에서 10으로 표시된 특정 경로의 소스 IP에서만 패킷을 허용하도록 INPUT
변경 합니다.DROP
# iptables -P INPUT DROP
# iptables -A INPUT -s <IP_SOURCE_MARK_10> -p icmp -j ACCEPT
이것은 이미 설명되었습니다.여기. 또한 tcpdump -nevvv -i <interface> src host <source_host>
"icmp 패킷 도착"을 감지하는 데 충분하므로 라우팅 결정을 디버깅하는 데 더 적합합니다(두 호스트 사이에 둘 이상의 경로가 있는 경우).