vlan 으로 가상 인터페이스 설정시 arp 문제

sacredone의 이미지

데스크탑 ip : 10.0.0.150
데스크탑 VM 에 탑재된 centos : eth0 10.0.0.151 MAC : 00:00:00:00:00:01

이상태에서 centos 에서

$vconfig add eth0 1

로 가상 인터페이스 생성하고

$ifconfig eth0.1 hw ether 00:00:00:00:00:02

로 맥주소 eth0의 01에서 02로 바꿔주고

$ifconfig eth0.1 10.0.0.152 netmask 255.255.255.0 up

으로 ip 설정해준 상태에서

데스크탑에서 10.0.0.152 로 핑때리면 핑 날라갑니다

그리고 cmd 창 띄워서

arp -a

로 arp 보면 vlan 으로 나눈 eth0.1 의 맥주소인 00:00:00:00:00:02 로 브로드캐스팅을 바랬지만

10.0.0.152     00:00:00:00:00:01   dynamic

으로 eth0 맥주소로 arp 받았고 ipv4 는 vlan으로 가상 설정한 10.0.0.152 로 되있더라구요...

왜이런거죠

핑은 날라가는데...

맥주소도 새로 설정한 02로 되길 바랬는데 왜안될까요

익명 사용자의 이미지

엄밀하게는 vlan 자체가 링크계층으로 pc 에서는 각 랜카드에 심어진 롬바이어스,스위칭 장비에서는 이더넷 모듈 에서 다루는 것으로 pc 에서 커널과 장비에서의 수퍼바이저 엔진의 ios 는 비록 장비의 경우 짬뽕 경향을 좀 갖고 있지만 근본적으로 제3계층에서는 쓰잘데없는 값입니다.
뭔 말씀이냐 하면
vlan 자체가 802.1q 로 특별한 ethertype 값이 주소 다음 맥헤더 필드 16 비트로 들어오는 패킷인데 이는 802 안에서,즉 랜카드나 이더넷모듈 안에서 처리되어야 하는 것이며 처리된 후 비로소 커널 skb 에 패킷이 복사되어야 하는 것이지요.
사실 랜카드는 처리없이 그냥 복사하고 장비는 처리후 복사합니다만 일단 복사되면 이 패킷은 시스템 커널영역에서 "vlan 처리가 아니라 쓸모없는 것들 버리기" 의 루틴으로 들어가기 때문에 쓰잘데없는 것입니다.
왜냐 ethertype 가 ip를 의미하는 0x0800 (지금 스마트폰으로 기억에 의존해 쓰는거라 세부적 오류기능성 있음) 값이면 바로 최초의 ip 루틴로 skb 분석하면 되는데 이게 아니므로 vlan 루틴 호출해서 맥데이타에 들어있는 vlan 관련 헤더를 전부 찾아서 버리고 실제 ip데이타를 건져내는 작업을 해야하기 때문에 쓰잘데없다고 표현한 것입니다.
일단 커널안에 브릿지고 vlan 이고 여러 링크계층 코드들은 하나같이
*링크계층 작동을 위한게 아니라 실제 데이타를 찾기위한 버리기수순의 코드들입니다.커널이 링크계층 작동을 할 수는 없기 때문이죠

설명이 좀 그렇지만 이 말은 매우 중요합니다. 인터넷에 있는 맥어레스 관련 오류답변들의 상당수가 이를 오해한 경우를 자주 보는 입장에서 무례하게 들릴지 모르는 말씀을 드립니다 이해를....

이더넷일 경우 맥어드레스는 IEEE 표준에 따라 규정되는데 룸바이어스가 실제 롬으로 구워진 장치일 경우 변할 수 없고 설령 플래쉬 메모리로 부착된 경우라도 롬라이터 또는 공장에서 사용하는 프로그램으로 특정 메모리를 덮어쓰지 않는 한 맥어드레스는 바뀌지 않습니다.
만약 이를 허용하는 드라이버를 제조사에서 공급한다면 맥어드레스 충돌문제뿐만 아니라 맥주소의 oui 번호만 보고도 연결된 장치가 자기회사의 x 모델일 경우 숨겨진 루틴을 바이어스에 심어서 부가적인 링크계층 동작을 드라이버와 관계없이 동작하게끔도 할 수 있는 루틴도 포기하는 것이니 이런 제조사는 없을겁니다.
실제 스위치의 경우 같은회사 장비를 스택하면 oui 만으로도 반타작은 하며 oui 가 다르면 다음단계로 802.1d 프로토콜 루틴으로 넘어가게 되어 있죠.

이런 구구절절한 집설의 요약은
맥어드레스는 바뀌지 않으며 바뀌는 것은 커널 주소공간에 복사된 사본변수일 뿐이다.따라서 송신시 패킷헤더는 커널이 만들기 때문에 이 사본으로 맥헤더를 집어넣는건 얼마든지 가능하나
수신시는 이 사본과 아무 관련이 없고 랜카드의 링크계층을 통과하여 DMA 에 최초 올려지고 랜카드 드라이버에 의해 커널 skb 로 포인트된 패킷 원본은 커널에 있는 수정된 맥주소와 아무 관계가 없는 패킷이죠.
이 skb 한 블럭을 가지고 이제 커널 최초의 ip 루틴으로 진입을 하게 됩니다.만약 vlan 이든 netfilter든 그것이 뭐가 되었든 커널에 설정/부가된 기능이 있다면 이 skb 를 가지고 드랍할까/전송으로 올릴까/다른 인터페이스 영역으로 복사할까
를 결정하는 과정에서 커널에서 갖고 있는 갖가지 변수가 참조됩니다
eth0.1 또는 커널 맥주소도 이 단계에서 사용할 수 있지요.

질문에 답변을 드리자면
a 가 b 의 arp 캐시를 유지하고 있어야 한다면 그 이유는
a의 커널이 패킷헤더를 만들 때 arp 요구를 하지 않고 이 캐시의 맥주소를 목적지 주소로 사용하겠다는 말이지요.
그럼 그런 패킷이 스위칭허브에 도작하면 허브는
목적지 맥 : 포트번호
를 보고 그 포트버퍼에 패킷을 복사하지요.

이 말을 뒤집으면
해킹이나 설벙오류가 아닌 한
b 시스템은 a와 통신을 하려면
스위치에 올바른 캐시를 갖고 있어야 하는데 스위치와 스위치 혹은 스위치와 랜카드 연결에서는 기본적으로 앞서 말씀드린 링크계층에서 IEEE 규정에 의해 oui 또는 802.1d 에 의해 자동으로 맥어드레스 : 포트번호 테이블이 생성됩니다.
즉 b 의 커널내에 있는 값과는 아무 관려이 없게 되죠.
좀 확깨게 말씀드리면 랜카드 이상없고 전기신호 이상없고 롬바이어스 코딩에서 커널호출이 없는 시점이라면 b 시스템이 다운된 경우라도 관계없이 802.3 802.1 802.2 는 동작합니다.
물론 대부분 마지막 커널호출에서 블락되지만서도....
참고로 대형 스위칭의 경우 이더넷모듈과 ios 기능을 딱 부러지게 구분하는건 좀 곤란할 수 있고 이더넷 모듈이 장착된 슬롯 각각이 ios 통합 qos 에 먼저 걸리면 제가 말씀드린 것과 좀 다르게 보일 수 있으나 원리는 변치 않습니다.

이 질문에서 ifconfig 이하의 모든 값은 커널 메모리값일 뿐입니다.

익명 사용자의 이미지

잠시 약국에 다녀와서 라면끓여먹고 다시 씁니다.
질문에서 VM 이라 말씀하셨는데 가상시스템환경일 경우 guest OS 가 리눅스든 윈도우든 또 몇개의 os 가 설치되었든 시스템의 커널은
하이퍼바이저(또는 이 기능이 임베디드된 os) 단 하나 뿐입니다.
즉 게스트운영체제는 하이퍼바이즈가 생성한 task 자료구조안에서 pid 를 받아 사용자영역 메모리 안 특정 공간에서 동작하는 하나의 응용프로그램일 뿐입니다.
이런 구조에서는 게스트 운영체제에서 보는 모든 정보는 복사된 것이거나 왜곡된 것이거나 걸러진 것이므로 변수가 너무 많아
저는 그냥 a b 시스템으로 예를 듭니다.
원리는 같습니다.

스위치 맥 : 포트번호 테이블에
01 맥 : 1번포트
이게 원래 맞는건데 질문하신 의문은 이 테이블이
02 맥 : 1번포트
로 바뀌든가 아니면
1번 포트에 2개 이상의 맥주소가 추가되어야 가능하겠지요
바꾸는 것은
b 랜카드의 맥주소를 실제로 바꾸든가 스위치 설정에서 정적으로 리스트를 집어넣든가 해야 하는데 맥주소는 못바꾼다 했으니 결론 났죠.
추가하는 것은 스위칭허브를 2대 이상 연결할 때 나타나는 현상인데 802.1d 에 의해 자동으로 이루어지는 것이지 스위칭 os 로 설정하는 것 역시 아닙니다.

엉뚱하게 역발상을 하면
어떤 랜카드가 메모리나 파일로부터 수십개의 맥주소를 읽어서 자신의 플래시에 업데이트하고 이를 IEEE 802.1D 프로토콜로 구현해 낸다면 이 랜카드를 꽂은 리눅스 시스템은 완벽하게 시스코 카탈시리즈나 라우터에 연결하여 이더넷 모듈로 동작하게 할 수 있겠죠....

현재의 대부분 랜카드는 1 개의 정적코딩된 맥주소만 갖고 있다는 것을 이해하기 쉽게 하려고 잡설을 늘어놓았습니다.

스마트폰 타이핑 연습도 되고요 치매예방도 되고...
오타 죄송요

sacredone의 이미지

정말 감사합니다

큰도움되었습니다

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.