응답을 보내는 것(또는 응답을 보내지 않는 것) 외에도 Linux 시스템이 다른 장치에서 ping을 보낼 때 반응하거나 작업을 수행하도록 하는 방법이 있습니까?
답변1
Linux netfilter를 사용하여 들어오는 핑을 가로채서 사용자 공간으로 보낼 수 있습니다. 이렇게 하면 됩니다:
iptables -I INPUT -p icmp --icmp-type echo-request -j NFLOG
-s
특정 핑만 차단하고 다른 핑은 차단하지 않도록 (source) 와 같은 모든 종류의 iptables 기준을 추가할 수 있습니다 .
이는 원래 ping의 커널 처리를 취소하지 않는다는 점에 유의하십시오. 사용자 공간에만 복사본을 보냅니다. 사용자 공간의 ping에 응답할 계획이라면 커널이 이를 처리하지 못하도록 방지하여 2개의 응답이 없도록 해야 합니다. 이를 달성하려면 위의 다른 iptables 규칙을 따라 원래 규칙을 제거하세요.
iptables -I INPUT -p icmp --icmp-type echo-request -j DROP
사용자 공간에서 ping을 수신하려면 일부 C 코드를 작성해야 합니다. 이것libnetfilter_log 라이브러리그게 당신이 필요한 전부입니다. 다음은 제가 몇 년 전에 작성한 몇 가지 예제 코드입니다.
#include <libnetfilter_log/libnetfilter_log.h>
[...]
struct nflog_handle *h;
struct nflog_g_handle *qh;
ssize_t rv;
char buf[4096];
h = nflog_open();
if (!h) {
fprintf(stderr, "error during nflog_open()\n");
return 1;
}
if (nflog_unbind_pf(h, AF_INET) < 0) {
fprintf(stderr, "error nflog_unbind_pf()\n");
return 1;
}
if (nflog_bind_pf(h, AF_INET) < 0) {
fprintf(stderr, "error during nflog_bind_pf()\n");
return 1;
}
qh = nflog_bind_group(h, 0);
if (!qh) {
fprintf(stderr, "no handle for group 0\n");
return 1;
}
if (nflog_set_mode(qh, NFULNL_COPY_PACKET, 0xffff) < 0) {
fprintf(stderr, "can't set packet copy mode\n");
return 1;
}
nflog_callback_register(qh, &callback, NULL);
fd = nflog_fd(h);
while ((rv = recv(fd, buf, sizeof(buf), 0)) && rv >= 0) {
nflog_handle_packet(h, buf, rv);
}
callback
각 수신 패킷에 대해 호출되는 함수입니다. 그 정의는 다음과 같습니다.
static int
callback(struct nflog_g_handle *gh, struct nfgenmsg *nfmsg, struct nflog_data *ldata, void *data)
{
payload_len = nflog_get_payload(ldata, (char **)(&ip));
....
/* now "ip" points to the packet's IP header */
/* ...do something with it... */
....
}
답변2
내가 사용하는 간단한 방법은 모든 유틸리티(wireshark, tcpdump, iptables 등)를 통해 ICMP 트래픽을 스니핑하는 것입니다.
예를 들어 다음 방법을 사용할 수 있습니다.협회