Убедитесь, что TCP-соединение с той же машины по MAC-адресу - PullRequest
4 голосов
/ 03 августа 2011

Пожалуйста, не критикуйте решение. Это не мой дизайн и да, это отстой.

На компьютере под управлением Linux и с использованием C нам необходимо убедиться, что TCP-соединение с процессом установлено на той же машине. Делать это по IP-адресу проблематично, так как ОС генерирует два IP-адреса, а процесс знает только один. В любом случае, проверка по IP-адресу немного плоха.

Мы хотим выполнить проверку, сравнив «удаленный» MAC-адрес с локальным MAC-адресом. Мы уже получили локальный MAC-адрес. Все, что мне нужно знать, это как получить «удаленный» MAC-адрес. Он находится в пакете, который отправляется при формировании соединения (и во всех последующих). Как мы вытаскиваем его из слоя Ethernet?

Прежде чем кто-либо скажет это снова, я ЗНАЮ, что вы не можете получить MAC-адрес удаленного хоста, если он не находится в той же подсети / локальной сети. Все в порядке. Предположительно, мы получим что-то вроде 00: 00: 00: 00: 00: 00, и, поскольку он отличается от локального MAC-адреса, он будет другим - именно то, что мы хотим.

-

Итак, подведем итог: у нас есть сокет TCP-соединения fd, мы получили пакет данных, как нам найти MAC-адрес удаленного хоста, MAC-адрес, который был в заголовке пакета?

Ответы [ 4 ]

10 голосов
/ 03 августа 2011

Если я правильно понимаю, вы не пытаетесь отделить удаленные машины, а используете идею, что MAC-адрес источника и назначения будет совпадать с трафиком, отправленным с машины на себя , чтобы разрешить только местный трафик.

Это кажется довольно окольным, и было указано, небезопасно.

Несколько лучшей идеей может быть прослушивание TCP-клиента только через интерфейс обратной связи (127.0.0.1), а не INADDR_ANY. Или перейдите на шаг дальше и используйте сокет unix-домена вместо TCP-сокета (распространенный метод, используемый сегодня X-серверами для предотвращения возможности удаленных подключений)

3 голосов
/ 03 августа 2011

MAC-адрес действующего TCP-соединения из той же подсети почти наверняка будет в кэше ARP.

В Linux вы можете проверить ARP-кеш, посмотрев в /proc/net/arp. Вот как это выглядит на моей коробке с Ubuntu:

aix@aix:~$ cat /proc/net/arp
IP address       HW type     Flags       HW address            Mask     Device
10.0.0.32        0x1         0x2         00:1e:4f:f5:be:dc     *        eth0
10.10.10.1       0x1         0x2         00:1f:6c:3e:02:e3     *        eth0

Вероятно, существует некоторый вызываемый API, который вы могли бы использовать для доступа к тем же данным, если вы не хотите разбирать псевдофайл.

0 голосов
/ 03 августа 2011

Соединение с обратной связью (независимо от того, осуществляется ли оно через интерфейс обратной связи или какой-либо другой интерфейс), оно не маршрутизируется через какое-либо устройство Ethernet, и поэтому не имеет MAC-адрес , связанный с ним.Предлагаем вам просто использовать getsockname и getpeername, чтобы получить локальный и удаленный IP-адрес и сравнить, что они равны.Это будет работать без какого-либо априорного знания настроенных IP-адресов вашей системы.

Кроме того, если вы хотите быть независимым от IPv4 / v6, вы можете использовать getnameinfo с флагом NI_NUMERIC для преобразования обоихадреса числовых строковых представлений и strcmp их.

0 голосов
/ 03 августа 2011

Как насчет настройки брандмауэра (внутреннего или внешнего) для блокировки или MAC-фильтра внешнего трафика на рассматриваемом порту?

...