我知道netstat
、和其他一些显示所有连接的工具,但如果我想查看与特定服务器建立的特定连接,我应该使用什么工具ncat
?tcpdump
例如:我正在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
。