단순히 Ethernet card를 여러 개 있는 것 처럼 하는 거나 loopback 장치를 여러 개 만드는 것은 "ifconfig" 명령 만으로 간단히 할 수 있지만 내가 원하는 것은 진짜로 여러 개의 인터페이스가 있는 것 처럼 동작하게 하는 것이다. 시나리오는 이렇다. 특정한 고정 포트에서 수신을 기다리는 데몬 프로세스가 있는데 이런 데몬 프로세스가 컴퓨터마나 한 개씩 떠 있고 이들 간의 통신을 통해서 뭔가 일을 처리하는 프로그램을 만들었다고 하자. 그것을 여러 대의 컴퓨터가 아니라 한대의 컴퓨터에서 실험을 하고 싶은데 한 컴퓨터에서 띄우면 두번 째 데몬부터는 해당 포트를 잡을 수가 없다. (이미 처음의 데몬이 그 포트를 잡고 있으니까.)

네트워크 카드가 여러 개 있다면 각 네트워크 카드를 지정해서 데몬을 띄우게 함으로써(자바의 경우 NetworkInterface.getByName 메쏘드로 이것을 구현할 수 있다.) 해결이 되지만 컴퓨터에 네트워크 카드도 하나 뿐이다. 그럼 어떻게 해야 하나?

자세히 알지도 못하고 자세히 쓸 힘도 안 남아 있으므로 간단히 요약한다. 리눅스에서는 가짜 인터페이스를 만드는 기능이 있는데 이를 tap 이라 한다. tap을 하나 만들고 또 브리지를 만들고 이 브리지에 tap과 진짜 네트워크 카드를 연결한 뒤 한 데몬은 tap 인터페이스에서 다른 데몬은 진짜 네트워크 카드 위에서 실행하면 된다. 설정하는 과정은 다음과 같다. (tap은 여러 개 만들 수 있으므로 여러 개의 데몬으로도 가능할 것 같다. 안해봤음.)
$ sudo tunctl -u newcat -t tap0
Set 'tap0' persistent and owned by uid 1000
$ sudo ifconfig eth0 <주소> up promisc
$ sudo ifconfig tap0 <주소> up promisc
$ sudo brctl addbr br0
$ sudo brctl addif br0 eth0
$ sudo brctl addif br0 tap0
eth0 (진짜 네트워크 카드)의 주소를 DHCP로 받아온다면 ifconfig에서 주소를 주지말고 대신
$ sudo dhclient eth0
라고 해주면 된다. 이 상태에서 만약 데몬이 자신이 동작할 네트워크 인터페이스 이름을 인자로 가지고 실행된다고 하면 다음고 같이 실행하면 된다.
$ daemon eth0
$ daemon tap0
(주의: 무슨 이유에서인지 이렇게 해 놓으면 외부 네트워크와는 연결이 안되는 증세가 나타났다. 뭘 잘못 한건지... 실험이 끝나면 다음과 같이 브리지에서 인터페이스를 떼내어 주면 되살아 난다.)
$ sudo brctl delif br0 eth0
신고
posted by 신묘군