Як перевірити, що демон на якому інтерфейсі слухає?


28

Наприклад: sshd налаштований на прослуховування лише на wlan0. Так. Окрім перевірки sshd_config, як я можу перевірити, що демон виконує прослуховування за якою інтерфейсом? netstat може це зробити? як? (ОС: openwrt або науковий Linux або openbsd)

ОНОВЛЕННЯ:

Я думав, що sshd може бути обмежений інтерфейсом ... але ні ... (192.168.1.5 знаходиться на wlan0 ...)

# grep ^ListenAddress /etc/ssh/sshd_config 
ListenAddress 192.168.1.5:22
# 
# lsof -i -n -P
COMMAND     PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
sshd      23952 root    3u  IPv4 1718551      0t0  TCP 192.168.1.5:22 (LISTEN)
#
# ss -lp | grep -i ssh
0      128              192.168.1.5:ssh                           *:*        users:(("sshd",23952,3))
# 
# netstat -lp | grep -i ssh
tcp        0      0 a.lan:ssh                   *:*                         LISTEN      23952/sshd          
#

Відповіді:


37

(можливо, доведеться встановити пакет ipна openwrt (v12 / коригування позиції)

ifconfig / netstat і т.д. вважаються застарілими , тому слід використовувати (як root)

ss -nlput | grep sshd

показати сокети TCP / UDP, на яких sshdпрослуховується запущена програма, що містить рядок

  • -n
    Немає порту для вирішення імені
  • -l
    тільки розетки для прослуховування
  • -p
    показати процеси слухання
  • -u
    показати udp розетки
  • -t
    показати розетки tcp

Потім ви геть такий список, як цей:

tcp    LISTEN     0      128                    *:22                    *:*      users:(("sshd",3907,4))
tcp    LISTEN     0      128                   :::22                   :::*      users:(("sshd",3907,3))
tcp    LISTEN     0      128            127.0.0.1:6010                  *:*      users:(("sshd",4818,9))
tcp    LISTEN     0      128                  ::1:6010                 :::*      users:(("sshd",4818,8))

Цікавим є 5-й стовпець, який показує поєднання IP-адреси та порту:

  1. *:22
    слухати на порту 22 на кожну доступну адресу IPv4
  2. :::22
    слухати на порту 22 на кожну доступну IP-адресу (я не пишу IPv6, оскільки IP - IPv6 на RFC 6540 )
  3. 127.0.0.1:6010
    прослухати адресу IPv4 127.0.0.1 (localhost / loopback) та порт 6010
  4. ::1:6010
    прослухати IP-адресу :: 1 (0: 0: 0: 0: 0: 0: 0: 1 в повному обсязі, також localhost / loopback) та порт 6010

Потім ви хочете дізнатися, які інтерфейси мають адресу IPv4 (для покриття 1.)

ip -4 a
# or "ip -4 address"
# or "ip -4 address show"

або IP-адресу (для покриття 2.)

ip -6 a
# or "ip -6 address
# or "ip -6 address show

(якщо ви не додали параметр для IP ( -6) або IPv4 ( -4), відображаються обидва)

Ви також можете мати вигляд, який виводить і шукає, наприклад, 127.0.0.1або будь-який інший IP / IPv4-адресу

# here a demo where i show all addresses of the device "lo" (loopback)
ip a show dev lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever

Рядки, що починаються з inetі inet6показують, що ці IP-адреси пов'язані з цим інтерфейсом, у вас може бути багато таких рядків на інтерфейс:

he-ipv6: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1480 qdisc noqueue state UNKNOWN
    link/sit 192.0.2.1 peer 192.0.2.3
    inet6 2001:db8:12::1/64 scope global
       valid_lft forever preferred_lft forever
    inet6 2001:db8::2/64 scope global
       valid_lft forever preferred_lft forever
    inet6 fe80::1111:1111/128 scope link
       valid_lft forever preferred_lft forever

та в сценарії:

address="127.0.0.1"
for i in $(grep ':' /proc/net/dev | cut -d ':' -f 1 | tr -d ' ') ; do
        if $(ip address show dev $i | grep -q "${address}") ; then
                echo "${address} found on interface ${i}"
        fi
done

(замінити "127.0.0.1")


ви маєте на увазі, що немає точного способу визначити, що демон прослуховує в якому інтерфейсі, оскільки його можна було визначити лише за IP-адресою?
gasko peter

так, правильно. ви (або я) можете розширити сценарій, який я опублікував, щоб зробити кроки раніше ...
Олуф Лоренцен

1
А як щодо SO_BINDTODEVICE?
Павло Шимерда

20

Використання lsof(як корінь):

# lsof -i -n -P
COMMAND    PID        USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd      3028        root    3u  IPv4   7072      0t0  TCP *:22 (LISTEN)
sshd      3028        root    4u  IPv6   7074      0t0  TCP *:22 (LISTEN)

iproute2«S ssможе зробити це, теж (як корінь):

# ss -lp
State      Recv-Q Send-Q      Local Address:Port          Peer Address:Port   
LISTEN     0      128                    :::ssh                     :::*        users:(("sshd",3028,4))
LISTEN     0      128                     *:ssh                      *:*        users:(("sshd",3028,3))

... і, нарешті, netstat(як корінь):

# netstat -lp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 *:ssh                   *:*                     LISTEN      3028/sshd  

3
Зокрема, *:sshабо 0.0.0.0:22означає, що це прослуховування в інтерфейсі підстановки (тобто всі вони). Щось на кшталт host-eth1:sshабо 10.0.0.4:22означає, що він слухає цей специфічний інтерфейс
Марно

почекайте хвилинку .. Я подумав, що це хороша відповідь: D, але ні, в ньому немає інтерфейсу .. Як я дізнався, що програма слухає лише даний інтерфейс? чи не існує рішення на це питання? : O
gasko peter

@gaskopeter Ви можете побачити інтерфейс із ip-адреси, яка відображається ( 192.168.1.5або a.lanу вашому запитанні). Якщо *в цьому місці є, то він слухає всі інтерфейси ( *:sshу відповіді sr_).
Філіп Вендлер

@Useless: Це стосується лише систем BSD.
BatchyX

@BatchyX Як так? Я бачу, що Useless говорить щонайменше для Arch Linux та Debian.
x-yuri

9

Наскільки я знаю, ви не можете (за винятком систем BSD, де рішення Фінкрега справно працює). Це може бути можливим, але вам все одно, адже більшість додатків прослуховують кожен інтерфейс, навіть коли він прив’язаний до IP-адреси.

У Linux (і openwrt) єдиний спосіб, коли програма може слухати лише певний інтерфейс, - це SO_BINDTODEVICEопція socket. Небагато додатків насправді підтримує це, оскільки це специфічно для ОС. Це або вони використовують пакетний сокет, але це для протоколів низького рівня (як dhcp-сервери).

У Linux, який використовує слабку модель хоста, кожна програма за замовчуванням прослуховує всі інтерфейси, навіть прив’язуючи сокет до IP-адреси. Єдиний виняток - прив'язування до 127.0.0.1, що забезпечує, що програма слухає лише loінтерфейс.

Ви правильно це почули: якщо у вас є два інтерфейси (скажімо eth0і eth1) з двома різними IP-адресами (скажімо, 192.0.2.1 для eth0та 198.51.100.1 для eth1), і ви скажете програмі прив’язатись до 192.0.2.1, програма все одно слухатиме обох інтерфейсів, але відповідатиме лише якщо IP-адреса призначення 192.0.2.1. Отже, хтось із eth1інтерфейсу, якщо його таблиця маршрутизації визначена належним чином, може отримати доступ до вашої програми, відкривши її через адресу 192.0.2.1 (але не через 198.51.100.1) в eth1інтерфейсі.

Якщо припустити, що прив’язка до IP-адреси є такою ж, як прив'язка до мережевого інтерфейсу, то в Linux абсолютно неправдиво. Якщо це вас турбує, використовуйте маршрутизацію політики та / або iptables.


-1

Також з netstat, але конкретними аргументами є:

netstat -lp -i wlan0

1
ви можете, будь ласка, пояснити вихід цієї команди трохи довше? : D
gasko peter

Чесно кажучи, я не знаю. Мені довелося б man netstat. Я пропоную різницю в зміні "запиту", який ви виконуєте, щоб явно вказати інтерфейс, який ви хочете перевірити.
frogstarr78

"netstat -lp -i wlan0" та "netstat -i" дають однакову відповідь у моїй системі Ubuntu
Брюс Барнетт

1
netstat -iперерахує інтерфейси, не слухаючи порти, -1 для відповіді, яка не відображає реальність
Mikko Rantalainen
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.