有哪些选项可用于枚举Linux上特定IP的所有侦听端口?
我正在寻找的函数的原型是这样的:
enumerateListeners : IP -> [Port]
内核API或C库真的很有趣。
答案 0 :(得分:3)
/proc
文件系统是可用于获取此信息的内核接口。特别是TCP套接字列在/proc/net/tcp
和/proc/net/tcp6
中。第二列将本地地址作为IP:端口对。要选择那些处于LISTEN状态的套接字,您必须查看0A
(套接字状态)列中st
的那些套接字。这是我所得到的一个例子:
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
0: 00000000:3E81 00000000:0000 0A 00000000:00000000 00:00000000 00000000 1000 0 18064 1 0000000000000000 100 0 0 10 0
1: 00000000:1269 00000000:0000 0A 00000000:00000000 00:00000000 00000000 1000 0 18056 1 0000000000000000 100 0 0 10 0
2: 0100007F:0CEA 00000000:0000 0A 00000000:00000000 00:00000000 00000000 117 0 13084 1 0000000000000000 100 0 0 10 0
3: 00000000:008B 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 9097 1 0000000000000000 100 0 0 10 0
4: 0100007F:0050 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 14349 1 0000000000000000 100 0 0 10 0
在C中阅读此文件很简单:打开它并使用fscanf
覆盖它。
如果有另一种获取此信息的方式,我不知道;这是netstat
使用的界面,因为您可以使用strace
轻松验证。
答案 1 :(得分:1)
<强>更新强>
#include <stdio.h> // printf, fopen, fclose
#include <stdlib.h> // free
#include <arpa/inet.h> // in_addr*
#define OK(x) ((x) > -1)
#define LISTENING (0x0A)
#define port u_int16_t
int listening(in_addr_t addr, port* ports, size_t nPorts) {
char* line = NULL; size_t n = 0;
u_int32_t locaddr; u_int32_t locport; u_int32_t state; int i = 0;
FILE* tcp = fopen("/proc/net/tcp", "r");
if (!OK(getline(&line, &n, tcp))) goto f;
while (OK(getline(&line, &n, tcp)) && i < nPorts) {
int r = sscanf(line, "%*d: %8x:%4x %*8x:%*4x %2x", &locaddr, &locport, &state);
if (r == 3 && addr == locaddr && state == LISTENING) ports[i++] = (port)locport;
}
f: fclose(tcp); free(line); return i;
}
int main(int c, char* a[]) {
struct in_addr ipv4; inet_pton(AF_INET, a[1], &ipv4); printf("%i = ", ipv4.s_addr);
char str[512]; inet_ntop(AF_INET, &ipv4, str, 512); printf("%s\n" , str);
port pts[65536]; printf("{ listening: [ "); c = listening(ipv4.s_addr, pts, 65536);
int i; for (i = 0; i < c; i++) printf("%i, ", pts[i]); printf("] }\n");
}
答案 2 :(得分:0)
那么,您是否要求使用PortScanner? 我所知道的最好的PortScanner是Nmap。
您可以查看其源代码,否则编写简单函数枚举为特定IP打开的TCP端口不是一个难题,您可以使用 connect 与for循环一起使用。