如何查看具体建立的连接?

如何查看具体建立的连接?

我知道netstat、和其他一些显示所有连接的工具,但如果我想查看与特定服务器建立的特定连接,我应该使用什么工具ncattcpdump

例如:我正在www.google.com port 80从一个简单的 Web 客户端连接到 ;我需要一个仅显示我与 的连接的命令"www.google.com port 80"

答案1

您需要解析 的输出netstat。在我的系统上,netstat列出主机时不显示字符串“Google”。因此,netstat -t | grep -i Google您需要查找主机的名称,而不是简单地使用 。例如:

$ sudo netstat -tn | awk '/EST/{print $5}' | sed 's/:.*//' | 
    while read ip; do 
        whois $ip | grep -qi google && echo "$ip"; 
    done
173.194.67.189
74.125.140.105
216.58.209.5

解释

  • sudo netstat -tn:运行netstat仅显示 tcp 连接(-t)和数字 IP(-n);
  • awk '/EST/{print $5}':如果此行匹配,则打印第5个字段(IP)EST(仅显示已建立的连接);
  • sed 's/:.*//':删除端口,只留下IP;
  • while read ip; do ...; done:对找到的每个 IP 进行迭代;
  • whois $ip | grep -qi google:查找 IP 并搜索 的输出google-i表示不区分大小写的搜索, 表示-q抑制输出。
  • && echo "$ip":如果grep成功,则打印该IP。

答案2

netstat在 Ubuntu 上运行带有标志的命令-tanp将列出每个连接的所有 PID(进程标识号)和端口。

笔记:要查看所有 PID,您应该以sudo权限运行该命令,因此sudo netstat -tanp

例如

在此处输入图片描述

答案3

我编写了一个名为 addressid 的 C++ 程序,该程序将 netstat 命令与 whois 实用程序结合使用。在 14.04 上,whois 实用程序不是“开箱即用”,因此您必须通过命令行进行安装,并将build-essential类文件编译为二进制文件。

:~$ sudo apt-get install build-essential -y

:~$ sudo apt-get install whois -y  

该程序还期望另外两个目录存在,/usr/local/addressId因此/var/log/addressid您必须创建这些目录:

:~$ sudo mkdir -p -m0755 /usr/local/addressId

:~$ sudo mkdir -p -m0755 /var/log/adressid

将程序复制到 gedit 文本编辑器中,然后编译程序,如下所示:

:~$ g++ -o adressid addressId.cpp

接下来将程序移动到/usr/bin(已经在您的中$PATH)并从命令行使用新的实用程序,如下所示

:~$ sudo mv addressid /usr/bin/

:~$ sudo addressid

您必须以 root 身份运行该程序,因为 netstat 实用程序需要 root 权限才能显示系统的所有 TCP 信息。

//*******************************************************************

// This addressId.cpp class is created to input the output from   
// the netstat -tanp command and create a shell script that will be         
// executed performing the ip address (a dotted quad) look up on the   
// whois server (with whois utility).  
// author:GeoWade
//*******************************************************************

#include <iostream>
#include <fstream>
#include <string>
#include <list>
#include <cstdlib>
#include <cstring>
#include <locale>

using namespace std;

const int MAX_INDY = 300;

int main()
{

    // create string variables
    string line;
    string holdWord = "";

    // create a string array to hold the ip addresses
    string holdArry[MAX_INDY];

    // create string variables to be used as test vars in regexs
    string theTcp = "tcp";
    string firstLn = "0.0.0.0";
    string theSix = "tcp6"; 

    // create list<string> container object to hold input strings
    list<string> addressList;

    // create integer variables
    int index;
    int cardex;
    int count = 0;

    // use the system function to execute the netstat command and the data
    system("sudo netstat -tanp > /usr/local/addressId/Ntstat.txt");

    // create an ifstream object 
    ifstream inFile("/usr/local/addressId/Ntstat.txt");

    while ( getline( inFile, line ) ) {
    
        if ( !line.compare(44,7,firstLn) == 0 ) {
        
            if ( line.compare(0,3,theTcp) == 0 ) {
        
                if ( !line.compare(0,4,theSix) == 0 ) {

                    // find the index position of the line at which point it ends 
                    cardex = line.find('\0');

                    // store the substring of the line based on index positions
                    string intermStr = line.substr(44,cardex);

                    // locate the index position of the substring at which a colon
                    // resides
                    index = intermStr.find(":");

                    // create a second substr out of the first substring.
                    holdWord = intermStr.substr(0,index);
                    addressList.push_back(holdWord);

                }
                // null the holdWord var and increment the count integer
                holdWord = "";              
                count++;
                            
            }
    
        }       
    
    }

    inFile.close();
    cout << "The data has been inputted to the program!" << endl;

    for (int i = 0; i < count; i++) {
    
        string outStack = addressList.front();
        addressList.pop_front();

        holdWord = outStack;

        holdArry[i] = holdWord;
        holdWord = "";      
    
    }

    // create an ofstream object
    ofstream outOne;    
    outOne.open("/usr/local/addressId/myWhois.sh");
    outOne << "#! /bin/bash\n\nMYWH=\"whois\"\nUPD=\"updatedb\"\n"
           << "TDTD=\"date\"\n\n$TDTD >> "
           << "/var/log/addressid/addressid.log\n" << endl;

    for (int j = count-1; j >= 0; j--) {
    
        string outHold = holdArry[j];
        holdArry[j] = "";
        holdWord = outHold;
    
        outOne << "$MYWH " << holdWord << " >> "
               << "/var/log/addressid/addressid.log" 
               << "\n" << endl;
        holdWord = "";      
    
    }

    outOne << "$UPD\n\nexit\n" << endl;

    outOne.close();

    system("chmod +x /usr/local/addressId/myWhois.sh");

    system("/usr/local/addressId/myWhois.sh");

    // delete the previously created and executed my
    system("rm -rf /usr/local/addressId/myWhois.sh");

    count = 0;
    addressList.clear();

    // output a statement to the user of the binary
    cout << "The operation has completed successfully!" << endl;
    return 0;

}

我大约在 3 年前编写了这个程序,当时是 12.04,是我创建的安全和日志套件的一部分。尽管如此,它在运行时会记录每个地址和这些地址的信息,每次运行时它还会将日期添加到日志中。您可以使用 cat 命令查看日志,也可以进行备份,如下所示

:~$ cat /var/log/addressid/addressid.log

或者

:~$ cat /var/log/addressid/addressid.log >> $HOME/addressid.log.bak

该程序是合法的,我只是删除了我的/usr/bin/addressid,从该网页复制了程序(以验证没有错误),对其进行了编译,并执行了必要的操作sudo mv addressid /usr/bin/并将其作为运行sudo addressid

相关内容