기본 콘텐츠로 건너뛰기

Linux로 Router 만들기

인터넷 공유기가 흔하지 않은 시절엔 리눅스로 라우터를 구성한 후 여러대의 PC를 리눅스 머신에 연결하여 사용했었다. 공유기가 흔해빠진 시대에 일반인이 리눅스로 라우터를 만들어 사용하는 것은 불필요한 시간 낭비일 것이다. 근래 클라우드에 여러개의 가상 네트워크를 생성하여 가상 머신들을 연결하는 작업을 하다보니 서로 다른 가상네트워크를 연결하기 위해서 L3 라우팅이 필요해 관련된 내용들 정리차 적어본다.

먼저 리눅스 PC는 2개 이상의 인터페이스를 가지고 있어야 한다. 인터페이스의 주소를 각각 10.0.0.1, 10.0.1.1이라고 하자. 편의상 10.0.0.1와 10.0.1.1의 인터페이스 이름을 각각 eth0, eth1로 하자. 인터페이스에 대한 주소 지정은 ifconfig 명령을 통해서나 /etc/network/interfaces(Ubuntu 경우만 해당) 파일의 수정을 통해서 가능하다.
ifconfig를 통해 IP를 지정하는 방법은 다음과 같다.

ifconfig eth0 10.0.0.1 netmask 255.255.255.0
ifconfig eth1 10.0.1.1 netmask 255.255.255.0

또는 /etc/network/interfaces를 다음과 같이 편집한다.
auto eth0
iface eth0 inet static
    address 10.0.0.1
    netmask 255.255.255.0
auto eth1
iface eth1 inet static
    address 10.0.1.1
    netmask 255.255.255.0

interfaces의 내용을 위와같이 편집한 후 /etc/init.d/networking restart를 실행한다.
networking 서비스를 재 실행한 후 ifconfig eth0 또는 ifconfig eth1을 통해 해당 인터페이스에 IP 주소가 정상적으로 설정되었는지 확인한다.

기본적인 연결을 위한 네트워크 설정을 완료했으며 이제는 라우터로 동작하기 위한 설정들을 해주어야 한다. 라우터를 간단히 설명하면 특정 인터페이스로 들어온 패킷에 대해서 목적지 주소에 따라 출력 인터페이스를 결정하여 패킷을 출력하는 시스템이라고 할 수 있다. 즉 eth0로 들어온 패킷에 대해 목적지 주소가 10.0.1.x인 경우 eth1으로 패킷을 출력하도록 한다. 목적지 주소별로 인터페이스를 미리 정해놓은 것을 라이팅 테이블이라고 하며 리눅스 상에서 라우팅 테이블 확인은 route 명령을 통해서 할 수 있다. route 명령을 통해 라우팅 테이블을 작성하기 전 먼저 해야될 작업은 라우터로 동작하기 위해 특정 인터페이스로 수신한 패킷을 다른 인터페이스로 전달할 수 있도록 해야한다. 패킷을 전달할 수 있도록 하기 위해서는 ip_forward를 활성화 해야 하면 방법은 다음과 같다.

sysctl -w net.ipv4.ip_forward=1

또는

echo 1 > /proc/sys/net/ipv4/ip_forward

/etc/sysctl.conf 파일에서
#net.ipv4.ip_forward=1
을 찾아 앞의 주석(#)을 삭제해주면 된다.

이제 인터페이스로부터 수신된 패킷을 다른 인터페이스로 전달할 수 있게 되었지만 어떤 인터페이스로 전달하여야 하는가에 대해서는 시스템은 전혀 모르는 상태로 앞서 언급한 라우팅 테이블을 지정해 주어야한다. 라우팅 테이블 지정은 route add <-net 또는 -host> <IP 주소 대역 또는 주소> gateway < gateway IP 주소> dev 인터페이스 이름순으로 지정한다.

route add -net 10.0.0.0/24 gateway 10.0.0.254 dev eth0
route add -net 10.0.1.0/24 gateway 10.0.1.254 dev eth1

위의 명령을 풀어쓰면 10.0.0.1~255의 IP 주소에 대해서는 인터페이스 eth0로 내보내며 게이트 웨이 주소는 10.0.0.254이다. 만약 게이트웨이가 없다면 게이트 웨이 주소를 생략해도 무방하다. 마찬가지로 10.0.1.1~255의 IP 주소에 대해서는 인터페이스 eth1로 지정하였다.

마지막으로 한가지 작업을 더 해주어야 하는데 그것은 iptables를 통해 리눅스에서 방화벽 규칙을 만들어 주어야한다.

iptables -A FORWARD -i eth0 -o eth1 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

위의 규칙은 인터페이스간 데이터를 전달하는 것으로 만약 여러분들이 집에서 인터넷과 내부 네트워크로 분리하여 내부 네트워크는 사설 IP 대역을 사용한다면 masqurade를 해주어야 하며 이는 사설 IP 주소를 공인 IP 주소로 변환해주는 역할을 한다.

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE




댓글

  1. route add -net 10.0.0.0/24 gateway 10.0.1.254 dev eth0
    route add -net 10.0.1.0/24 gateway 10.0.1.254 dev eth1

    이렇게 바뀌어야 하는것 같습니다만...

    답글삭제

댓글 쓰기

이 블로그의 인기 게시물

가상 자원에 대한 접근을 위한 libguestfs

libguestfs는 가상머신 디스크 이미지에 대한 접근 및 수정하기 위한 다양한 도구를 제공하는 라이브러리이다. 이 라이브러를 통해 여러분들은 게스트 OS 내부의 파일을 수정하거나 VM에 대한 스크립트 작성, 가상 머신의 디스크 / 메모리 사용량 통계 모니터링, 게스트 생성, 백업, VM 복제, 디스크 포멧, 디스크 조정 등 다양한 작업을 할 수 있다. libguestfs는 C 라이브러리로 되어 있어  C/C++ 관리 프로그램들과 연결 가능하다. 현재 최신 버전의 libguestfs는 1.31.16 (2015.10.09 기준)이다. 설치 방법은 다음과 같다. 페도라 또는 레드햇 엔터프라이즈 버전 sudo yum install libguestfs-tools 우분트 sudo apt-get install libguestfs-tools libguestfs-tools이 정상적으로 설치되었다면 다음과 같은 툴들이 설치 될 것이다. guestfish — 대화식 쉘 guestmount — 호스트에서 게스트 파일 시스템 마운트 guestunmount — 게스트 파일 시스템 마운트 해제 virt-alignment-scan — 가상 머신 파티션 alignment 검사 virt-builder — 속성 이미지 빌더 virt-cat — 파일 내용 출력 virt-copy-in — VM으로 파일 또는 디렉토리 복사 virt-copy-out — VM에서 파일 또는 디렉토리 복사 virt-customize — 가상 머신 수정 virt-df — 디스크 사용량 virt-dib —  safe diskimage-builder virt-diff — differences virt-edit — 파일 편집 virt-filesystems — 파일 시스템, 디바이스, LVM에 대한 정보 출력 virt-format — 디스크 삭제 및 빈 디스크 생성 virt-get-kernel — 디스크로 부터 커널 획득 virt-inspector — VM 이...

virsh 설치 및 VM 상태 조회

VM을 모니터링하기 위해서는 다양한 방법을 사용할 수 있지만 간편한 방법중 하나는 virsh를 통해 VM을 모니터링하는 것이다. vrish를 사용하기 위해서 관련 패키지를 설치해야하며 설치 방법은 다음과 같다. Redhat 계열 yum install qemu libvirt-client virt-manager \ virt-viewer guestfish libguestfs-tools virt-top Ubuntu sudo apt-get install ubuntu-virt virt-top virt-what virsh가 정상적으로 설치되었다면 virsh를 통해 가상 머신의 상태를 확인해 볼 수 있다. virsh를 사용하기 위해서는 root 권한을 가지거나 관련 권한을 설정해주어야 한다. 권한 설정에 대해서는 다음 posting에서 다룰 것이다. virsh의 기본적인 사용방법은 다음과 같다. virsh [option] ... <command> <domain> [arg] ... 지정 가능한 옵션은 다음과 같다. h, --help 도움말 출력 -v, --version[=short] 버전 정보 출력 -V, --version=long 컴파일된 드라이버와 옵션들을 포함한 버전 정보 출력 -c, --connect URI 지정된 URI에 연결 -d, --debug LEVEL 디버그 (레벨은 0~4까지 지정 가능) -l, --log FILE FILE로 로그 저장 . -q, --quiet 종료(?) -r, --readonly 읽기 전용으로 실행 -t, --timing 각 명령어에 대한 실행 시간 출력 -e, --escape string 콘솔 명령어에 대한 탈출 문자 지정. 기본으로 텔넷과 동일한 ^]로 지정됨 virsh 명령어들에서 대해서는 다음 posting에서 살펴보기로 하고 간단한 사용 예들은 다음과 같다. 로...

Mac에서 Wireshark 설치

맥 (OS X El Capitan)에서 Wireshark를 사용하고 싶다면 CLI를 통한 간단한 방법은 brew를 통해 설치하는 것이다. 단순히 다음과 같은 명령을 실행해 주면 된다. brew install wireshark  --with-qt --with-qt는  GUI 모드를 포함하여 설치하는 것으로 GUI 모드를 원치않는다면 해당 옵션을 삭제하면 된다. 정상적으로 설치가 완료되면 CLI를 통해 tshark 명령을 실행할 수 있다. --with-qt 옵션을 주지 않았다면 thsark만을 실행할 수 있을 것이다. tshark -i eth0 [thsark 실행화면] GUI로 실행하고 싶다면 프롬프트에서 다음과 같이 실행하면 된다. wireshark-qt [wireshark-qt 실행화면] GUI를 통해 패킷을 수집하고자 한다면 Capture 버튼 옆에 인터페이스를 선택한 후 Capture 버튼을 선택하고 상단의 왼쪽에 있는 Start capturing packets라고 툴팁이 나오는 버튼을 클릭하면 패킷 수집이 시작된다. 수집 옵션을 설정하고자 한다면 Capture Filter에 옵션을 설정하면 된다. [wireshark-qt 패킷 수집화면]