Linux에서 PBR (Policy Base Routing)

Cisco나 YAMAHA의 라우터라면 필터등을 이용해 정책 베이스 라우팅할 수 있다고 생각합니다.
마찬가지로 리눅스에서도 하고 싶습니다.

정책 베이스 라우팅이란, 통상의 라우팅과 달리, 호스트내에서 완결시키는 라우팅 기법.
특정 동작시 특정 라우팅 테이블을 사용합니다. 같은 느낌입니다. (설명 어렵다...)
예를 들면...
  • 멀티 홈 환경에서 특정 포트에 액세스하는 경우 게이트웨이를 변경하고 싶습니다.
  • 멀티홈 환경에서, 들어온 I/F의 액세스는 응답할 때도 같은 I/F로 내고 싶다.
    등등. . .

  • 키모는 멀티 홈 환경인 것.

    예) 특정 포트에 액세스 할 때 게이트웨이를 변경하고 싶습니다.



    어떤 상황을 생각할 수 있습니까?
    · 통상은 A 회선을 사용하고 있지만, http 액세스의 경우는 B 회선을 사용하고 싶다.

    이번 환경은
    ・호스트에 외선이 3개 꽂혀 있고(192.168.0.2,192.168.1.2,192.168.2.2), 그 앞에 게이트웨이(192.168.0.1,192.168.1.1,192.168.2.1)가 각각 있다고 한다.
    · 호스트에서 12.34.56.78의 http 액세스는 게이트웨이 A에서. 12.34.56.78의 https 액세스는 게이트웨이 B에서. 12.34.56.78의 ssh 액세스는 게이트웨이 C에서. 각각 액세스하고 싶습니다.



    이런 일을 이루기 위해 필요한 리눅스의 기능은
    * iproute2
    * iptables
    됩니다.

    iptables에서 특정 포트로 향하는 패킷을 표시(iptables), 표시가 있는 패킷은 지정된 라우팅 테이블을 사용한다(iproute2).

    1.iptables를 표하기



    패킷을 표시하려면 iptables의 mangle 테이블을 사용합니다.
    # iptables -t mangle -A OUTPUT -p tcp --dport 80 -j MARK --set-mark 1 ←tcp80に向かって出ていくパケットに「1」をマークする
    # iptables -t mangle -A OUTPUT -p tcp --dport 443 -j MARK --set-mark 2 ←tcp443に向かって出ていくパケットに「2」をマークする
    # iptables -t mangle -A OUTPUT -p tcp --dport 22 -j MARK --set-mark 3 ←tcp22に向かって出ていくパケットに「3」をマークする
    

    2. iproute2에 규칙 추가



    표시 된 패킷에 대한 규칙을 지정합니다.
    # ip rule add fwmark 1 table 10 ←「1」をマークされているパケットは「table10」を参照する
    # ip rule add fwmark 2 table 20 ←「2」をマークされているパケットは「table20」を参照する
    # ip rule add fwmark 3 table 30 ←「3」をマークされているパケットは「table30」を参照する
    

    또한 게이트웨이를 대상으로하는 인터페이스가 여러 개 있기 때문에 반환 패킷에도 지정이 포함됩니다.
    # ip rule add from 192.168.0.2 table 10 ←「192.168.0.2」に入ってきたパケットは「table10」を参照する
    # ip rule add from 192.168.1.2 table 20 ←「192.168.1.2」に入ってきたパケットは「table20」を参照する
    # ip rule add from 192.168.2.2 table 30 ←「192.168.2.2」に入ってきたパケットは「table30」を参照する
    

    3. iproute2에 경로 추가



    참조할 루트 테이블을 만듭니다.
    # ip route add default dev eth1 via 192.168.0.1 table 10 ←「table10」のデフォルトゲートウェイはeth1の先の192.168.0.1とする
    # ip route add default dev eth2 via 192.168.1.1 table 20 ←「table20」のデフォルトゲートウェイはeth2の先の192.168.1.1とする
    # ip route add default dev eth3 via 192.168.2.1 table 30 ←「table30」のデフォルトゲートウェイはeth3の先の192.168.2.1とする
    

    각 테이블에 로컬 링크를 추가하는 것이 좋으므로 적절하게 대응합시다.
    로컬 링크를 작성하는 방법은
    # ip route show table main
    

    를 참조하고 default 의외를 적용하는 것이 좋습니다!

    원라이너라면 이런 느낌
    # ip route show table main | grep -Ev ^default | while read ROUTE ; do ip route add table "table名" $ROUTE; done
    

    이상으로 설정은 끝. 실제로 검증해 보자.
    문제가 없으면 /etc/rc.local 또는 무언가 시작 스크립트에 추가하는 것이 좋습니다.

    좋은 웹페이지 즐겨찾기