인터페이스에서 우회 패킷을 캡처하려면 다음 명령을 사용합니다 ens160
.
tcpdump -i ens160 -w test.pcap
그동안 다음 명령을 사용하여 무차별 모드가 활성화되어 있는지 확인합니다 ens160
.
ifconfig ens160 | grep -i promisc
ip a show ens160 | grep -i promisc
netstat -i | grep ens160
이 명령의 모든 출력은 무차별 모드를 가리 ens160
키지만 ens160에 속하지 않는 ens160의 패킷을 계속 볼 수 있습니다 test.pcap
.
tcpdump
무차별 모드에서는 기본값이 작동한다는 것을 알고 있지만 ens160
이 시간 동안 무차별 모드는 비활성화됩니다.
무차별 모드가 활성화되지 않은 경우에도 들어오는 모든 패킷을 캡처할 수 있는 이유는 무엇입니까?
답변1
긴 이야기 짧게
최신 Linux에서 인터페이스는 카운터를 사용하여 promiscuity
작동 상태가 무차별(> 0)인지 아닌지(= 0)를 파악합니다. 인터페이스 PROMISC
속성 플래그는 카운터를 증가시키는 한 가지 방법일 뿐입니다 promiscuity
.
tcpdump
PROMISC
인터페이스에 대한 플래그를 변경하지 않지만 이 인터페이스의 원시 패킷 소켓에서 무차별 트래픽이 수신되도록 요청하여 자동으로 카운터를 증가시켜 promiscuity
인터페이스를 무차별 모드로 설정합니다.
ifconfig
는 더 이상 사용되지 않으며(Linux에서) 카운터를 표시할 수 없습니다 promiscuity
. 그렇지 않을 것이다 netstat -i
.
대신 사용하세요:
ip -details link show dev ens160
또는 JSON을 사용하고jq
:
ip -d -j link show dev ens160 | jq '.[].promiscuity'
이벤트 스키마(JSON을 사용하지 않음) 및 기타 링크 변경 사항에서 이를 추적하는 것도 가능합니다.
ip -d monitor link dev ens160
답변이 길다
이는 Linux에서 더 이상 사용되지 않는 명령이므로 및/또는 모든 곳에서 ifconfig
대체되어야 합니다.ip link
ip addr
PROMISC
설정할 수 있는 인터페이스 속성( 예: 더 이상 사용되지 않음 ifconfig ens160 promisc
또는 사용 안 함)은 ip link set ens160 promisc on
변경되지 않으며 tcpdump
중요한 속성이 아니기 때문에 여기서는 중요합니다 . 여기에는 카운터 ifconfig
에만 사용할 수 있는 새로운 기능을 표시할 수 없습니다.ip link
promiscuity
대답은 strace
어떤 다양한 시나리오가 발생할 수 있는지 알아내는 데 달려 있습니다.
Linux에서 대체되었지만 여전히 이전 버전과의 호환성을 위해 사용 ifconfig ens160 promisc
가능한 오래된 기반 API를 사용하면 다음이 표시됩니다.ioctl(2)
strace
...
ioctl(4, SIOCGIFFLAGS, {ifr_name="ens160", ifr_flags=IFF_UP|IFF_BROADCAST|IFF_RUNNING|IFF_MULTICAST}) = 0
ioctl(4, SIOCSIFFLAGS, {ifr_name="ens160", ifr_flags=IFF_UP|IFF_BROADCAST|IFF_RUNNING|IFF_PROMISC|IFF_MULTICAST}) = 0
...
ip link set dev ens160 promisc on
교체와 함께 사용됨(rt)netlink(7)
소켓 API(가독성을 위해 단일 행이 분할됨(ARPHRD_NETROM은 strace
값 0부터 시작하는 디코딩 오류일 수 있음)):
...
sendmsg(3, {msg_name={sa_family=AF_NETLINK, nl_pid=0, nl_groups=00000000},
msg_namelen=12,
msg_iov=[{
iov_base={
{len=32, type=RTM_NEWLINK, flags=NLM_F_REQUEST|NLM_F_ACK, seq=1684784897, pid=0},
{ifi_family=AF_UNSPEC, ifi_type=ARPHRD_NETROM,
ifi_index=if_nametoindex("ens160"),
ifi_flags=IFF_PROMISC, ifi_change=0x100}},
iov_len=32}],
msg_iovlen=1, msg_controllen=0, msg_flags=0}, 0) = 32
...
둘 다 서로 다른 두 가지 API를 사용하여 활성화합니다.엔스 160인터페이스 속성 IFF_PROMISC.
tcpdump
기본적으로 무차별 모드를 사용합니다(아래 설명을 위해 "인터페이스 속성 활성화"를 쓰지 않고 "무차별 모드 사용"이라고 썼습니다). 이를 방지하려면 다음을 사용해야 합니다.-p
옵션:
-p
--no-promiscuous-mode
인터페이스를 무차별 모드로 설정하지 마십시오. 인터페이스는 다른 이유로 인해 무차별 모드일 수 있으므로
-p
의 약어로 사용할 수 없습니다ether host {local-hw-addr} or ether broadcast
.
인터페이스 속성을 무차별로 설정하는 것이 아니라 이 인터페이스에 사용된 패킷 소켓에서 무차별 트래픽을 수신하도록 요청하여 이를 수행합니다.
...
socket(AF_PACKET, SOCK_RAW, htons(0 /* ETH_P_??? */)) = 4
...
bind(4, {
sa_family=AF_PACKET,
sll_protocol=htons(0 /* ETH_P_??? */),
sll_ifindex=if_nametoindex("ens160"),
sll_hatype=ARPHRD_NETROM,
sll_pkttype=PACKET_HOST, sll_halen=0
}, 20) = 0
getsockopt(4, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
setsockopt(4, SOL_PACKET, PACKET_ADD_MEMBERSHIP, {
mr_ifindex=if_nametoindex("ens160"),
mr_type=PACKET_MR_PROMISC,
mr_alen=0, mr_address=ca:de:8a:4a:1c:38},
}, 16) = 0
...
차이점은 Linux가 이를 처리하는 방법입니다. 무차별 모드에서 각 리소스의 사용량을 계산합니다. 이러한 리소스 중 하나가 있는 한 인터페이스 작동 상태는 무차별입니다. 카운터가 0으로 떨어지면 인터페이스 작동 상태는 더 이상 무차별적이지 않습니다. 재구성 자체(실제 하드웨어 NIC에서 실제 하드웨어 재구성을 트리거함)는 0에서 >0으로 또는 >0에서 0으로 변경될 때만 발생합니다.
그러한 자원은 무엇을 위해 사용될 수 있습니까?
- 분명히 인터페이스 속성 PROMISC 설정
- 인터페이스를 브리지 포트로 설정
- 이전과 마찬가지로
tcpdump
요청은 인터페이스에서 열린 원시 패킷 소켓에서 모든/기타 트래픽을 수신합니다. 쌓아서 사용할 수 있습니다. 각 동시 사용자는 카운터를 1씩 증가시킵니다. - 이 인터페이스에 연결된 MACVLAN 인터페이스를 생성합니다.
- 다른 경우는요? ...
이러한 각 용도는 인터페이스가 나타날 때 작업 카운터에 추가됩니다. 이 카운터는 이전 ioctl API에는 적용되지 않고 새로운 개발을 위한 최신 netlink API에만 적용됩니다. ifconfig
표시할 수 없습니다 ip -details link
. 표시할 수 있습니다. 아니요-details
이 속성은 유용한 작업을 수행하는 데 거의 필요하지 않으므로 표시되지 않습니다.
가상 veth 인터페이스 예 test0
:
# ip link add name test0 up type veth
# ip -details link show dev test0
14: test0@veth0: <NO-CARRIER,BROADCAST,MULTICAST,UP,M-DOWN> mtu 1500 qdisc noqueue state LOWERLAYERDOWN mode DEFAULT group default qlen 1000
link/ether ca:de:8a:4a:1c:38 brd ff:ff:ff:ff:ff:ff promiscuity 0 allmulti 0 minmtu 68 maxmtu 65535
veth addrgenmode eui64 numtxqueues 4 numrxqueues 4 gso_max_size 65536 gso_max_segs 65535 tso_max_size 524280 tso_max_segs 65535 gro_max_size 65536
그것은 고려됩니다 : promiscuity 0
.
또는 JSON 출력을 사용하고jq
:
# ip -details -json link show dev test0 | jq '.[].promiscuity'
0
지금:
# ip link set dev test0 promisc on
# ip -d -j link show dev test0 | jq '.[].promiscuity'
1
# ip link add name br0 type bridge
# ip link set dev test0 master br0
# ip -d -j link show dev test0 | jq '.[].promiscuity'
2
# tcpdump -n -i test0 src 192.0.2.2 and dst 198.51.100.2 &
[1] 128657
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on test0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
# ip -d -j link show dev test0 | jq '.[].promiscuity'
3
# tcpdump -n -i test0 src 192.0.2.2 and dst 198.51.100.2 &
[2] 128670
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on test0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
# ip -d -j link show dev test0 | jq '.[].promiscuity'
4
따라서 이제 4개의 리소스 사용량이 있습니다. 즉, 커널에서 2개, 사용자 공간 원시 패킷 소켓에서 2개입니다.
인터페이스가 0보다 크면 promiscuity
무차별 모드로 구성됩니다. 단순 플래그에 비해 장점은 리소스 계산을 제공하므로 완료 시 인터페이스를 비무차별로 재설정해야 하는지 또는 정리할 기회를 갖기 전에 중단되는지(예:) 추측할 필요가 없다는 것입니다 kill -9 %1
. 관리자는 인터페이스가 더 이상 무차별 모드에 있어서는 안 되는지 아니면 유지되어야 하는지(예: 브리지된 포트인지) 고려해야 합니다.