Tampilkan koneksi jaringan dari suatu proses

25

Ada cara untuk menunjukkan koneksi dari suatu proses? Sesuatu seperti itu:

show PID

di mana showadalah perintah untuk melakukan ini, dan PIDmerupakan pid dari proses. Output yang saya inginkan terdiri dari semua koneksi proses (secara real-time). Misalnya, jika proses mencoba menghubungkan ke 173.194.112.151 hasilnya adalah 173.194.112.151.

Contoh yang lebih spesifik dengan Firefox:

show `pidof firefox`

dan dengan firefox saya mulai pada awalnya di google.com , kemudian di unix.stackexchange.com dan akhirnya 192.30.252.129 . Outputnya, ketika saya menutup browser, harus:

google.com
stackexchange.com
192.30.252.129

(Tentunya dengan browser output ini tidak realistis, karena ada banyak koneksi lain yang terkait, tetapi ini hanya sebuah contoh.)

ᴜsᴇʀ
sumber
Di bawah varian Unix yang mana? Sebagian besar memiliki alat untuk melakukan ini, tetapi berbeda.
Gilles 'SANGAT berhenti menjadi jahat'
Jadi intinya Anda ingin log semua koneksi?
Sergiy Kolodyazhnyy
Saya pikir tcpdump atau Wireshark harus melakukan pekerjaan itu.
Sergiy Kolodyazhnyy
Beberapa cara yang mungkin untuk melakukan ini: askubuntu.com/questions/11709/…
Mark Plotnick
@Gilles Ubuntu 14.04.3 LTS
ᴇʀsᴇʀ

Jawaban:

23

Anda sedang mencari strace! Saya menemukan jawaban ini di askubuntu , tetapi ini valid untuk Unix:

Untuk memulai dan memantau proses baru:

strace -f -e trace=network -s 10000 PROCESS ARGUMENTS

Untuk memantau proses yang ada dengan PID yang dikenal:

strace -p $PID -f -e trace=network -s 10000

Jika tidak, tetapi itu khusus untuk Linux, Anda dapat menjalankan proses di namespace jaringan yang terisolasi dan menggunakan wireshark untuk memantau lalu lintas . Ini mungkin akan lebih nyaman daripada membaca stracelog:

  • buat namespace jaringan uji:

    ip netns add test
    
  • buat sepasang antarmuka jaringan virtual (veth-a dan veth-b):

    ip link add veth-a type veth peer name veth-b
    
  • ubah namespace aktif dari antarmuka veth-a:

    ip link set veth-a netns test
    
  • konfigurasikan alamat IP dari antarmuka virtual:

    ip netns exec test ifconfig veth-a up 192.168.163.1 netmask 255.255.255.0
    ifconfig veth-b up 192.168.163.254 netmask 255.255.255.0
    
  • konfigurasikan perutean dalam namespace tes:

    ip netns exec test route add default gw 192.168.163.254 dev veth-a
    
  • aktifkan ip_forward dan buat aturan NAT untuk meneruskan lalu lintas yang datang dari namespace yang Anda buat (Anda harus menyesuaikan antarmuka jaringan dan alamat ip SNAT):

    echo 1 > /proc/sys/net/ipv4/ip_forward
    iptables -t nat -A POSTROUTING -s 192.168.163.0/24 -o YOURNETWORKINTERFACE -j SNAT --to-source YOURIPADDRESS
    

    (Anda juga dapat menggunakan aturan MASQUERADE jika Anda mau)

  • akhirnya, Anda bisa menjalankan proses yang ingin Anda analisis di namespace baru, dan wireshark juga:

    ip netns exec test thebinarytotest
    ip netns exec test wireshark
    

    Anda harus memantau antarmuka veth-a.

Olivier
sumber
2
stracesebenarnya khusus untuk kernel Linux, jadi itu tidak berlaku untuk semua sistem operasi mirip Unix. Seperti yang saya pahami, sistem mirip BSD memiliki utilitas serupa (DTrace dan truss). Bagaimanapun, jawaban yang bagus (jadi terunggul). Selamat datang di Stack Exchange.
Anthony G - keadilan untuk Monica
Jawabannya tampaknya titik ke arah yang benar, namun saya mengalami masalah menafsirkan dengan stracekeluaran sambil memeriksa git fetch. Saya mengharapkan untuk melihat semacam URL yang termasuk dalam output, seperti juga diminta oleh OP. Adakah yang bisa membantu?
andreee
14

Mencoba

lsof -i -a -p `pidof firefox`
alxrem
sumber
Ini sebagian berfungsi: ia mencetak beberapa koneksi saat ini dari proses, tetapi kemudian menutup secara otomatis. Untuk beberapa program, outputnya hanya peringatan ini:lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /home/user/.gvfs Output information may be incomplete.
ᴇʀsᴇʀ
Anda dapat menambahkan opsi -r1untuk mengulangi output setiap detik dan -wuntuk menekan peringatan.
alxrem
2
Ini hanya menunjukkan koneksi pada suatu titik waktu, itu tidak mencantumkan semua koneksi proses membuat selama masa pakainya. Bahkan jika Anda menempatkan perintah ini dalam satu lingkaran, itu akan kehilangan koneksi berumur pendek.
Gilles 'SANGAT berhenti menjadi jahat'
Penanya tidak meminta untuk melihat koneksi selama masa hidupnya. Orang bisa mengartikan (in real-time)sebagai from the point in time of tracking and forward.
llua
8

Inilah pendekatan lain:

ss -nap | grep $(pidof firefox)

Output sampel:

tcp    ESTAB      0      0          192.168.0.222:49050    216.58.218.164:443    users:(("firefox",3280,69))
tcp    ESTAB      0      0          192.168.0.222:48630    198.252.206.25:443    users:(("firefox",3280,106))
tcp    ESTAB      0      0          192.168.0.222:44220     216.58.217.38:443    users:(("firefox",3280,140))
tcp    ESTAB      0      0          192.168.0.222:52690    54.240.170.181:80     users:(("firefox",3280,107))
tcp    ESTAB      0      0          192.168.0.222:48744    198.252.206.25:443    users:(("firefox",3280,87))
tcp    ESTAB      0      0          192.168.0.222:48811    198.252.206.25:443    users:(("firefox",3280,73))
Sergiy Kolodyazhnyy
sumber
1
Ini hanya menunjukkan koneksi pada suatu titik waktu, itu tidak mencantumkan semua koneksi proses membuat selama masa pakainya. Bahkan jika Anda menempatkan perintah ini dalam satu lingkaran, itu akan kehilangan koneksi berumur pendek.
Gilles 'SANGAT berhenti menjadi jahat'
5

Anda bisa coba juga dengan netstat -p. Dari halaman manual:

netstat - Mencetak koneksi jaringan, tabel perutean, statistik antarmuka, koneksi menyamar, dan keanggotaan multicast

Untuk hanya menampilkan koneksi jaringan gunakan netstat -tup. Perhatikan bahwa untuk melihat proses PID Anda mungkin perlu root.

Jika Anda tidak memiliki netstatpada sistem Anda, Anda mungkin memiliki ss, yang hampir memiliki sintaks yang tepat. Anda dapat menggunakannya ss -tup(sebagai root).

abel
sumber
1
Ini hanya menunjukkan koneksi pada suatu titik waktu, itu tidak mencantumkan semua koneksi proses membuat selama masa pakainya. Bahkan jika Anda menempatkan perintah ini dalam satu lingkaran, itu akan kehilangan koneksi berumur pendek.
Gilles 'SANGAT berhenti menjadi jahat'
1
netstat -p | grep firefox | grep tcp
Philip Kirkbride
@Gilles Yang artinya ini adalah jawaban yang bagus untuk siapa pun yang ingin melihat koneksi pada suatu titik waktu. Seperti kasus saya baru-baru ini.
Jose Antonio Reinstate Monica