Linux에서는 프로그램이 통신을 시도하는 포트를 기록하는 방법이 있습니까?

Linux에서는 프로그램이 통신을 시도하는 포트를 기록하는 방법이 있습니까?

문제: 특정 프로그램에 대해 어느 포트를 열어야 할지 결정하려고 합니다.

원격 호스트의 서비스에 액세스해야 하는 프로그램이 많이 있지만 해당 목적으로 어떤 포트를 사용하려고 하는지 모르겠습니다. 0-1024(또는 ) 까지 방화벽을 여는 것보다 0-65k프로그램이 실행되는 동안 어떤 포트를 사용하는지 확인하고 싶습니다.

가장 먼저 확인할 프로그램은 kinit. 로부터선적 서류 비치88인바운드 UDP 트래픽용 포트와 88아웃바운드 TCP 및 UDP 트래픽용 포트를 열어야 한다는 사실을 수집했습니다 . 그러나 프로그램이 다음과 같이 응답하므로 이것만으로는 충분하지 않은 것 같습니다.

kinit: Resource temporarily unavailable while getting initial credentials

모든 포트를 열면 다음에 대한 올바른 인증 흐름이 발생합니다 kinit.

Using default cache: /tmp/krb5cc_16381
Using principal: *****@******.******.***
Password for *****@******.******.***:
Authenticated to Kerberos v5

나는 포트에 장기간 바인딩하는 프로세스에 대해 열린 포트를 사용 lsof하고 검색하는 netstat방법 을 알고 있지만 특히 .sskinitwatch

편집하다: 수락된 답변은 즉시 범인을 보여주었습니다: DNS;

strace -e trace=connect kinit <user>@<kdc>
connect(3, {sa_family=AF_UNIX, sun_path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory)
connect(3, {sa_family=AF_UNIX, sun_path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory)
connect(3, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("<kdc_ip>")}, 16) = 0

이 포트를 열면 Kerberos 문제가 해결되었습니다.

답변1

strace를 시도해 볼 수 있습니다.

strace -e trace=connect your_program with arguments

다음은 출력 예입니다.

$ strace -e trace=connect ssh somehost -p 8081
connect(3, {sa_family=AF_LOCAL, sun_path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory)
connect(3, {sa_family=AF_LOCAL, sun_path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory)
connect(3, {sa_family=AF_LOCAL, sun_path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory)
connect(3, {sa_family=AF_LOCAL, sun_path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory)
connect(3, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("127.0.1.1")}, 16) = 0
connect(3, {sa_family=AF_INET, sin_port=htons(8081), sin_addr=inet_addr(<host ip address>)}, 16) = 0
connect(4, {sa_family=AF_LOCAL, sun_path="/run/user/1000/keyring/ssh"}, 110) = 0

필요한 라인은 sa_family=AF_INET.

답변2

트래픽을 기록하도록 iptables 규칙을 구성하고 특정 프로그램을 실행할 때 어떤 트래픽이 전송되었는지 정확하게 확인할 수 있습니다. 실제로 어떤 프로그램이 어떤 트래픽을 보냈는지 알려주지 않기 때문에 사용량이 많은 시스템에서는 제대로 작동하지 않지만, 부하가 적은 경우에는 무슨 일이 일어나고 있는지 종합할 수 있어야 합니다.

입력 및 출력의 예:

iptables -A INPUT -j LOG --log-prefix "INPUT:DROP:" --log-level 6
iptables -A INPUT -j DROP
iptables -A OUTPUT -j LOG --log-prefix "OUTPUT:DROP:" --log-level 6
iptables -A OUTPUT -j DROP

더 복잡해지고 싶다면 훨씬 더 많은 옵션과 기능이 있습니다.

관련 정보