리눅스 트래픽 마킹을 이용한 라우팅 조작

(Last Updated On: May 31, 2020)

리눅스의 netfilter에는 fwmark라고 트래픽에 마킹을 하는 것이 있다. 리눅스는 라우팅 테이블을 여러 개 정의할 수 있고 원하는 패킷을 마킹 한 후에 다른 라우트 테이블을 참조해 출구 인터페이스를 조작할 수 있다.

 

라우팅 테이블

명령을 입력하면 기본으로 사용하는 라우팅 테이블을 확인할 수 있다.

그런데 리눅스의 라우팅 테이블은 1개만 있는 것이 아니다.

n번의 라우팅 테이블 생성하기

라우팅 테이블에 꼭 default 라우트만 있으란 법은 없지만 나는 한번 default 라우트를 추가 해 보겠다.
내 경우 GRE로 한국서버에서 일본서버로 연결하여 이런 인터페이스가 하나 생긴 상태다.

 

이 명령을 수행하면 500 번 라우팅테이블에 라우트 엔트리가 생성된다.
사실 이 테이블 이름은 문자로도 가능하지만 문자로 쓰면 리눅스 명령어의 키워드와 혼동되서 나에겐 헷갈린다.

라우팅 테이블은 메모리에 캐싱되는 경우가 있는지 캐시 플러시 명령을 입력 해야할지도 모른다.

 

0.0.0.0/0 으로 적었더니 default 라우팅으로 알아서 인식되었다.

트래픽 마킹 (fwmark) 값에 라우팅 테이블 일치 시키기

netfilter의 fwmark 는 라우팅 외에도 다른 용도로 사용하기 때문에 기본적으로 라우팅 테이블과는 별도의 시스템으로 보인다.

라우팅 테이블의 최대 번호는 2^31 이라서 거의 무한정에 가깝고 fwmark 또한 마찬가지기 때문에 마음내키는 대로 쓰면 될 것 같다.

이 예제에서는 500번의 라우트 테이블과 5번의 fwmark를 사용할 것 이다.

이러면 iproute 모듈이 fwmark 5번 마킹 되어있는 패킷은 500번 테이블을 참조한다고 한다.

실제로 그런 rule이 추가 되었다.  방금 내가 입력한 명령의 원래 이름은 ip rule add from all fwmark 0x5 lookup 500  이었나 보다.

iptables을 이용한 패킷 마킹

라우팅 변경을 위한 패킷 마킹은 라우팅 결정이 끝나기 전에 수행해야한다.

보통 mangle 테이블의 PREROUTING 체인에 넣는다고 한다.

나는 tap_sevpn_kr 인터페이스 에서 온 트래픽은 gre_kr1_jp1 인터페이스로 보내고 싶다. 할 때

이렇게만 적어주면 끝이다.

이렇게 하면 gre_kr1_jp1 로 라우팅이 된다. 물론 리눅스 및 netfilter 정책에 FORWARD , ip forward기능이 기본적으로 비활성화 되어 있기 때문에 이것 저것 설정해야 작동한다.

fwmark 기능을 사용하려면 커널 설정이 필요하다

마치며

이 마킹기능은 특정 트래픽을 좋은 라인으로 보내고 싶을 때도 쓸 수 있고 검색해보면 default 라우트 추가가 아닌 0.0.0.0/4 128.0.0.0/4 이런 식으로 두 개 이상 추가해서 1/n 분산은 아니지만 트래픽을 분산할 수 있다고 한다. 물론 인터페이스마다 IP가 다르기 때문에 특수한 상황에나 가능하겠지만.

Leave a Reply

Your email address will not be published. Required fields are marked *