tun/tap/bridge 차이가 뭘까?

구글링했을 때 나오는 얘기들은 하나 마나인 듯 하고.

ifconfig 시절엔 네트워크 디바이스 다루기가 더 쉬웠던 것 아닐까 하는데, 어느 시절부터 ip라는 util을 이용해서 network device를 다루게 되었던 것 같다. 사실 ip라는 utility는 ifconfig에 비해 상당히 hierarchical해서 알아둬야 될 것들이 너무 많아서 사실 쳐다보지도 않았던 것 같다.

legacy compatibility 때문인지 요즘의 linux는 ip를 기본으로 지원하고 있고 ifconfig같은 것을 쓰려면 별도로 net-utils를 설치해야 되는 시절이라 ip를 잘 쓸 줄 몰라도 net-utils만 쓸 줄 알면 된다.

대부분의 사람들은 OS가 설치되면 자동으로 알아서 network을 설정해주니까 특별히 알아야 될 필요도 없고 알고 싶어하지도 않는다. 바닥부터 설치해야 되는 arch linux 같은 것으로 ‘바닥부터 시작하기’를 하면 여태 알아왔던 리눅스 배포판과 달리 ethernet device부터 얼른 셋업해야 다음 과정으로 진행할 수 있는데, ip를 이용해서 ethernet device를 bring up하고 있으면 ‘와 내가 이런 것도 해야하나?’ 하는 생각도 하게 된다. 어쨌든 ip라는 utility는 arch linux를 바닥부터 설치하면서 처음 대면했던 것 같다.

본론으로 돌아와서 왜 이것에 대해서 알아야하는가? 컴퓨터로 그냥 자기 일만 해야하는 사람이면 100% 알아두어야 할 이유가 없다. 뭔가 딴 짓을 해야할 때, 혹은 이런 저런 욕심을 부려야 할 때 알아둘 수 밖에 없는 지경에 이른다.

그렇다 VM을 쓴다거나 뭔가 알려지지 않은 방법으로 서비스를 제공하고자 한다고나 할 때 알아두어야 한다.

tun이란 디바이스는 한눈에 알아볼 수 있다. tunneling을 하기 위한 device이다. tunneling이란게 뭐냐? 다른 네트워크에서 돌아다녀야 할 패킷을 내 네트워크에서 돌리면 돌아다니지 못하니까 내 네트워크에서 돌릴 수 있도록 내 네트워크용 껍데기를 씌워서 (이걸 캡슐화한다 라고 하는데, 이젠 영어적인 표현이 더 진부하게 들린다) 돌리는 것을 말한다. 주고 받는 놈들이 알아서 껍데기를 씌우고 벗겨내면, 마치 내 컴퓨터가 다른 네트워크의 일원인 것인 양 동작하게 할 수 있는 것이다.

그러니까, 이 경우는 물리적으로 네트워크 디바이스가 1개인 것이지만, 가상적으로는 적어도 1개 이상 달고 있는 상태가 되는 것이다. 말이 가상이지 그것은 실재와 다를 바 없는 것이다. 그러니까 가상이면 실존하지 않는 것 이란 생각을 할지 모를텐데 실제로 기능하고 있으니 실존하고 있는 것이다. 컴퓨터 세계에는 이 ‘가상’의 개념이 점점 확대되어서 예전의 사고와 개념들을 깨고 있는데, 터널링이니 가상 네트워크니 하는 걸 접한게 90년대 중후반이었으니까 역시나 오래된 개념이지만 여전히 ‘가상’하면 ‘실존하지 않는 것’, ‘(아직)미래의’ 하는 의미가 떠오르기 때문에 ‘가상’이란 말 말고 다른 표현을 쓰는 게 맞지 않을까 싶다.

tap이란 디바이스도 한눈에 알아볼 수 있다. ‘tap’이란 게 수도 꼭지 혹은 기존의 파이프에 구멍을 뚫어 곁가지를 낸다는 의미인데, 이 역시 같은 의미를 가지고 있다. 수도관이라고 치면 물의 일부가 다른 쪽으로 흘러가는 것이지만, 이 경우는 원래 네트워크의 패킷을 그대로 복사하여 빼낸다는 것이라 의미가 완전히 같지는 않다.

bridge는 쉽게 말해서 내 네트워크의 패킷을 다른 네트워크의 패킷으로 돌리는 의미가 있다. 가상으로 bridge device를 만드는 것은 그냥 tap으로 내 네트워크의 패킷을 돌리는 게 아니라 (가상)라우터를 하나 두고 다른 네트워크로 만들어버리는 것이다.

설명이 좀 허접했는데, 예를 들어보자. 이 디바이스들은 실제 존재하는 물리적 장비가 아니라 소프트웨어적인 장비이다. 그러니까 같은 머신 안에 가상으로 이 디바이스들을 만들어놓고 가상의 호스트들끼리 서로 연결하는 것이다. 다시 말하지만 왜 이 짓을 하느냐? 그게 편리하기 때문이다. 가상으로 호스트를 만들었는데, 또 그 가상의 호스트도 가상의 네트워크 장비를 달고 있는데, 호스트의 네트워크 장비의 네트워크 포트를 그대로 쓸 수는 없는 것이다.

그러니까 가상의 호스트가 내 로컬 네트워크에 있는 것처럼 쓰려면 tap 디바이스를 쓰게 되는 것이고 아예 다른 네트워크로 보내버리면 bridge 디바이스를 쓰게 되는 것이다. tun은 뭐해 쓰냐고? 가상 머신을 쓸 때 구태여 이것을 써야 할 이유는 없지만 써야 한다면 브릿지로 다른 네트워크로 보내버린 호스트를 다시 내 로컬 네트워크로 불러들이고 싶으면 그렇게 할 수 있다. 그런데 tap이 있는데 바보같이 일부러 껍데기까지 씌워서 패이로드를 늘려가며 이런 짓을 할 이유는 없을 뿐이다.

그러면 언제 tun 디바이스를 쓰느냐? 말그대로 vpn/packet proxy할 때 쓴다. 다른데서 tun 디바이스로 캡슐링한 패킷을 받아야될 필요가 있을 때. 또 내 네트워크의 패킷을 켑슐화해서 다른 네트워크로 보내야 할 때 말이다.

그래서, 허접한 전개였지만 대충 정리하자면

1) tun: 터널링 전용 디바이스. 터널링할 때 쓴다. 2) tap: 기존 네트워크 디바이스에 곁가지를 내서 로컬넷에 기생해야 할 때 쓴다. 3) brd: 곁가지를 내는 걸로 모잘라서 다른 네트워크로 보내버릴 때 쓴다.

여기에 또 한가지 추가해서 가상랜, vlan이란 게 있다.

이게 뭐하는 거냐? 마찬가지로 가상으로 랜카드를 더 붙이는 것이다. 호스트가 1대인데 로컬넷에 주소를 여러개 받아서 주소별로 다른 서비를 하겠다든가 같은 포트를 쓰는 서비스를 여러개 만들겠다 하면 이걸 쓴다.

이것은 별도로 device의 종류란 게 없다. link라고 해서 그냥 멀쩡한 네트워크 카드 붙이듯 하는데, ‘.’을 붙여서 구분을 한다. ‘.1’이라든가 ‘.100’이라든가 해서 구분을 한다.