WEB상에서 Client Mac Address (맥어드레스)를 알수 없을 까요?

Linux + Apache에서요
WEB사이트에 접근하는 Client들의 ip는 쉽게 알아 낼수 있지만,
Macaddress는 저의 실력으로는 알수가 없군요.
고수님들의 조언 부탁 드립니다.
검색을 하다보니 Server의 Macaddress는 알수 있는 방법이 있더군요
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
int Macaddress () {
struct ifreq *iflist;
struct sockaddr *sa;
int fd;
char *out;
iflist = malloc (sizeof (struct ifreq));
fd = socket (PF_INET, SOCK_STREAM, 0);
strncpy (iflist->ifr_name, "eth0", 4);
if (ioctl (fd, SIOCGIFHWADDR, iflist) == -1) {
perror ("ioctl failed");
return -1;
}
sa = &(iflist->ifr_hwaddr);
out = ether_ntoa ((struct ether_addr *) sa->sa_data);
printf ("%s\n", out);
return 0;
}
int main (int argc, char *argv []) {
printf ("Content-type text/html%c%c", 10, 10);
Macaddress ();
exit (0);
}
하지만 Client의 Macaddress는 가져 오기가 너무 힘이 들군요..
C고수들의 조언 많이 부탁 드립니다.
간단한 sample 프로그램 부탁하면 너무나 큰 욕심 일까요?
Re: WEB상에서 Client Mac Address (맥어드레스)를 알수 없을 까
<?
exec("arp -H ether -n -a $REMOTE_ADDR",$values);
$parts = explode(' ',$values[0]);
print $parts[3];
?>
이런식으로 php 프로그래밍 하면 나오긴 하는데요.
다른 라우터..MAC 같은 건 알 수 없지 않을까 합니다..
Re^2: WEB상에서 Client Mac Address (맥어드레스)를 알수 없을
옙. 답변에 감사 드립니다.
Server와는 다른 Gateway, Route를 쪽의 Mac address를 구하는
것이 주목적 인데.. ~~~ ^.^;;
요즘은 방화벽이나 아이피 공유기 때문에 아이피가 곂치는
현상을 피하기 위하여 Mac address를 알고 싶은데..
정녕 방법이 없을까요?
Re: WEB상에서 Client Mac Address (맥어드레스)를 알수 없을 까
#include
#include
#include
#include
#include
#include
int mac (char *ip) {
struct sockaddr_in sin = { 0 };
struct arpreq myarp = { { 0 } };
int sockfd;
unsigned char *ptr;
sin.sin_family = AF_INET;
if (inet_aton (ip, &sin.sin_addr) == 0) {
printf ("IP address '%s' not valid\n",ip );
exit (0);
}
memcpy (&myarp.arp_pa, &sin, sizeof myarp.arp_pa);
strcpy (myarp.arp_dev, "eth0");
if ((sockfd = socket (AF_INET, SOCK_DGRAM, 0)) == -1) {
printf ("cannot open socket\n");
exit (0);
}
if (ioctl (sockfd, SIOCGARP, &myarp) == -1) {
printf(" no entry in arp_cache for '%s'\n",ip);
exit (0);
}
ptr = &myarp.arp_ha.sa_data [0];
printf(" MAC address for '%s' is ",ip);
printf("%x%x%x%x%x%x\n",*ptr, *(ptr+1),*(ptr+2),
*(ptr+3),*(ptr+4),*(ptr+5));
return 1;
}
int main (int argc, char *argv []) {
char buffer [128 + 1];
printf ("Content-type text/html%c%c", 10, 10);
sprintf (buffer, "%s", getenv ("REMOTE_ADDR"));
mac (buffer);
}
위와 같이 작성하면 같은 gateway를 사용하는 Client의 Macaddress
값은 알아 낼수가 있습니다..
gateway, route가 다른 Client의 Macaddress를 알수 있는 방법은
없을까요?
Re: WEB상에서 Client Mac Address (맥어드레스)를 알수 없을 까
클라이언트가 자발적으로 자기 mac address를 알려 주지 않는 이상,
다시 말해서 패킷의 헤더만을 가지고는 알수가 없다가 답입니다.
다음의 예를 보죠.
host ip mac
A client 1 a
B router 2 b
C server 3 c
라고 가정을 하죠.
A가 C에게 데이터를 보냅니다.
헤더의 보내는 호스트에 대한 정보는 다음과 같겠죠.
a1 (보내는 호스트 A의 mac address와 ip address)
그럼 헤더의 받는 호스트에 대한 정보는 다음과 같겠죠?
c3 (받을 호스트 C의 mac address와 ip address)
유감스럽게도 아닙니다. ^^
b3입니다.
A는 C의 mac address를 알 방법이 없습니다.
따라서 router의 mac address를 destination 헤더에 붙이게 됩니다.
이 패킷은 이제 router인 B에게 가겠죠?
B는 C에게 보내려는 패킷임을 알고
패킷의 헤더를 다음과 같이 수정합니다.
source header
b1
destination header
c3
최종적으로 서버인 C에게 도착하는 패킷의 헤더는 바로
위와 같은 구성을 하게 됩니다.
다시 말해서 C의 입장에서는 중간 라우터를 거친
호스트 A에서 보낸 패킷의 헤더만을 보고는
A의 mac address를 절대 알 방법이 없습니다.
클라이언트 뿐만 아니라 자신과 바로 이웃하지 않은,
한 단계만이라도 더 건너 떨어져 있는 호스트의 mac address는
헤더만을 가지고는 알 수가 없습니다.
포기하시길... ^^
Re^2: WEB상에서 Client Mac Address (맥어드레스)를 알수 없을
답변 정말 감사히 받았습니다.
제가 Network에 관한 지식이 짧았나 봅니다.
하지만 많은 아쉬움을 남기는 부분이군요.
그럼 결과 적으로 알아 수 있는 방법은 active X등을 사용 하여
Client에서 정보를 가져오는 밥법뿐이 없다고 보면 되겠군요.
^.^;;
Re^2: 웹상은 아니어도 라우터 건너 맥어드레스 아는법
음 저는 상대편 맥어드레스를 알고 싶을때 이렇게 하거든요
단 상태편이 windows 계열일때만 가능합니다;
C\>nbtstat -A 210.207.X.X
ADSL
Node IpAddress [10.0.0.2] Scope Id []
Host not found.
LOCAL
Node IpAddress [0.0.0.0] Scope Id []
Host not found.
\Device\NetBT_Tcpip_{C447619F-C8EE-4965-82AC-83E7866CAB6A}
Node IpAddress [61.83.X.X] Scope Id []
NetBIOS Remote Machine Name Table
Name Type Status
---------------------------------------------
CHOISSI <00> UNIQUE Registered
CHOISSI <20> UNIQUE Registered
INTERDEV_XXXXXX<00> GROUP Registered
CHOISSI <03> UNIQUE Registered
INTERDEV_XXXXXX<1E> GROUP Registered
MAC Address = 00-D0-B7-3B-E6-22
C\>
Re^3: 웹상은 아니어도 라우터 건너 맥어드레스 아는법
말씀하신 방법 역시
일반적인 패킷의 헤더를 보고 아는 건 아니지 않습니까?
netbios 프로토콜 역시 application layer의 프로토콜에 불과하니까요.
즉 어플리케이션에서 보내 준 정보이지 패킷 헤더에 있는 내용이 아니니까요.
여담입니다만,
탐색기의 네트워크 환경에서 나타나는 동일 서브넷 상의 호스트들에
대한 정보도 netbios 프로토콜을 이용하는 것으로 알고 있습니다.
예전에 한번 137번(138번이었던가) 포트를 바인드하여
UDP로 서버를 만들어 보았습니다.
동일 서브넷 상의 윈도우 머신들이 제가 만든 서버로
주기적으로 일정시간마다 자신의 ip와 컴퓨터 이름(윈도우의)을
보내 주더군요.
탐색기의 네트워크 환경에 다른 호스트들이 어떻게 나타나는지 궁금해서
초보시절 호기심에 한번 만들어 보았었죠.
아뭏든 결론은 보내주지 않으면 모른다입니다.
Re^3: WEB상에서 Client Mac Address (맥어드레스)를 알수 없을
그렇습니다 가능한 방법입니다.
ActiveX는 클라이언트 상에서 동작하므로
자신의 mac address가 곧 클라이언트의 mac address 이니
이를 알아내어 서버로 보내주면 되죠.
다만 ActiveX로 구현하면 클라이언트가 윈도우 머신이어야만 한다는 제약이 있는데
자바에서 이를 구현할 수 있다면 금상첨화겠죠.
자바 애플릿으로 자신의 mac address를 알아 낼 수 있는지는 모르겠습니다.
참고로 처음 질문에서
"서버의 mac address를 알아내는 방법은 있는데..."
라고 하셨는데 이는
"자신의 mac address는 알 수 있는데..."
로 바꾸어야 정확한 표현이겠죠. ^^
멋지다!
멋진... 질문과
멋진 답변 입니다.
좋은 것 배우고 갑니다.
넷트웍 잘 모르지만, 알고 싶어 졌어요!
댓글 달기