우정 업무 재택 근무를 위한 VPN 설정
PPTP(VPN) 홈    넷미팅 ILS 서버    라이브라     리눅스랩 홈

본인은 예전에 석유공사 근무때 원유 비축용 땅굴 공사에 많이 참여했다.(주로 자금 관리를 담당했지만..) 또 지금 가스전을 개발하고 있는 동해에서 대륙붕에 시추공을 뚫을 때도 맨 처음 시추선에 승선해서 핸드폰에 모뎀을 연결해서 본사로 데이타를 송신하는 통신망을 설치하기도 했다. 그게 인연이 되어서인지 요즘은 인터넷에 터널(tunnelling)을 뚫는 작업을 많이 하고 있다.

아래 터널 공사는 발주자의 요구도 까다롭고 지형도 험해(?) 최고 난공사 중의 하나였다. 요즘은 중국으로 터널을 뚫는 공사를 많이 수주하고 있다.(이니진지 뭔지 하는 게임 때문에..) 근데 대륙붕에 시추공 하나 뚫는데 30 ~ 60억 드는데 난 중국까지 터널 뚫어 주는데 월 만원(?)도 못 받는다...

혹시 집에서 재택근무를 하는 경우 아래 설정이 도움이 될것이다. 단 집 인터넷 라인이 유동 IP라면 GRE를 사용할 수 없다. pptp를 사용하는게 좋다.

    ♣ [1] 구축 배경

  • 라이브라를 설치한 전남의 모 우체국에서 어느 직원이 병으로 인해 휴직을 하게 되었다. 그런데 갑작 스럽게 휴직을 하게되어 미처 그 직원이 담당하던 업무를 인수할 직원이 없었다. 그런데 그 직원은 수술을 하고서 집에서 요양중었으므로 직원이 집에서 우정업무를 처리할수 있도록 직원 집과 우체국을 VPN으로 연결하는 작업을 하게 되었다.

    *. 우정망은 인터넷과는 연결되어 있지 않은 폐쇄망이다. Frame Relay 라인을 이용해서 전국의 우체국을 연결하고 있다. 사용하는 프로토콜은 인터넷과 같은 TCP/IP 이고 10.0.0.0/8 사설 IP를 사용한다.

    ♣ [2] 장 비

  • 그 우체국에는 이미 우체국 직원들이 우정망과 인터넷(ADSL)을 동시에 사용할 수 있도록 라이브라-500 모델이 설치되어있으므로 VPN 서버는 이 장비를 그대로 사용하고 직원 집에 추가로 라이브라-250을 설치하였다. (전국의 모든 우체국에는 아직 인터넷이 연결되어 있지 않다. 우정망 보안 때문이라고 한다. 단지 민원실에만 일반인들 사용을 위해 인터넷이 연결되어 있다.)

    ♣ [3] VPN 프로토콜

  • VPN 프로토콜은 시스코사에서 개발한 GRE 를 사용했다. 속도도 빠르고 안정성이 좋기 때문이다.

    ♣ [4] 인터넷 라인

  • VPN 구축을 위해 우체국의 라이브라-500에 ADSL-MyIP 를 연결했고 직원집은 케이블 모뎀을 사용했다. 단 직원 집의 IP 주소는 미리 고정시켰다.
[그림 1]

[설명]

*. 아래에서 sun 은 우체국 라이브라 VPN 인터페이스명이고 moon 은 직원집 라이브라 VPN 인터페이스명이다.

우체국 라이브라 네트워크 설정

  1. ①(LOCAL) : 우정망에 접속된 PC(10.0.0.0/8)들이 연결된 허브에 연결하였다. IP는 10.x.32.5
  2. ③(Primary) : 우정망 라우터와 연결하였다.IP는 ① 번과 같다.
  3. ②번(Secondary) : 우체국 민원실에 연결된 T-1 인터넷 전용선에 연결하였다. 이 T-1 전용선은 우체국을 방문한 일반인들이 인터넷을 사용하도록 민원실의 피시에만 연결돼어 있다.

    이 라인은 VPN 연결과는 무관하다. 물론 이 라인을 VPN 연결에 사용해도 된다. 당초에는 우체국 내의 직원들이 우정망과 인터넷을 동시에 사용할 수 있도록 이 라인을 라이브라에 연결하였다. 그러나 다른 문제로 이 라인은 연결을 끊었다.
    (상부에서 감사를 나오면 문제가 된다나요... 글쎄 첨단을 달리는 우체국 직원들 피시에서 인터넷을 쓸수 없다는게 말이 되는지..)

  4. ④(Tertiary) : ADSL-MyIP 를 연결하였다. IP=210.W.253.211. 이 라인이 VPN 연결에 사용된다.
  5. default gateway = 10.x.32.31

아래는 터널 설정 과정이다.

  1. policy routing

    1. ip ru add from 210.w.253.211 table 6 prio 160
    2. ip ro add table 6 default via 210.w.253.254 dev eth3
    3. route add -host 61.y.52.251 dev eth3

    설명]

    우체국 라이브라의 디폴트게이트웨이는 우정망 라우터의 주소인 10.x.32.31이다. 우정망은 사설 IP인 10.0.0.0/8 을 사용하고있고 인터넷과는 연결이 되어 있지 않다. 우체국 직원들 PC도 모두 10. 대 IP를 사용한다.

    그래서 moon 으로부터 VPN 연결 트래픽 응답 패킷을 ADSL MyIP 라인으로 보내려면 1. 과 2. 명령으로 policy routing 으로 ADSL 라인의 게이트웨이를 지정해야 한다.(rp_filter 을 0으로 해야 한다.) 만약 이 부분이 없다면 moon 으로부터 들어온 VPN 연결 요청에 대한 응답이 10.x.32.31 로 간다.

    3. 은 우체국 라이브라에서 직원집 라이브라를 연결할 때 eth3에 연결된 ADSL 라인으로 라우팅 되게 한다. 이 부분은 VPN 과는 관련은 없지만 이 부분이 없으면 우체국 라이브라에서 직원집 라이브라로 telnet 61.y.52.251 명령이 안된다.

    확인]

    1. ip ru sh(일부)

      60:     from all fwmark  6 lookup 6
      160:    from 210.w.253.211 lookup 6
    2. ip ro sh table 6

      default via 210.w.253.254 dev eth3

    *. ip ru 의 "60: from ..." 은 VPN 과는 무관하다. 이는 우체국 내의 PC에서 인터넷을 사용하기 위해 필요하다. 즉 "ip ru add fwmark 6 table 6 prio 60" 명령을 필요로 한다. 그리고서 "iptables -t mangle -A PREROUTING -i eth0 -s $IP_PC -d ! 10.0.0.0/8 -j MARK --set-mark 6" 명령을 주면 $IP_PC(PC의 IP 주소) IP를 사용하는 PC는 ADSL 을 통해 인터넷을 사용할 수 있다. 물론 우정업무도 동시에 사용 가능하다.(아래 설명)

  2. 터널 인터페이스 주소 및 라우팅

    1. ip tunnel add sun mode gre local 210.w.253.211 remote 61.y.52.251 ttl 255
    2. ip link set sun up
    3. ip link set sun mtu 1500
    4. ip addr add 10.x.32.5/32 dev sun
    5. ip ro add 10.x.32.40 dev sun
    6. arp -s 10.x.32.40 -D eth1 pub

    설명]

    • 1 ~ 4 부분은 gre 터널을 생성한다. 터널 이름은 sun이다. iproute2 매뉴얼에 잘 나와 있다. 주의할 점은 우체국측 gre 터널 IP 주소가 10.x.32.5로서 eth0 주소와 같다. 터널 상대방 주소는 10.x.32.40 이다. P-t-P 연결에서는 내 주소는 라우팅에서 고려하지 않는다. 그래서 eth0(eth1) 의 주소를 사용했다.

      터널 입구 주소 = 210.w.253.211(터널 주소와는 다르다.)
      터널 출구 주소 = 61.y.52.251

    • 5. 은 moon 으로 가는 라우트 명령이다. (route add -host 10.x.32.40 dev sun)

    • 6. arp -s 명령은 proxy arp를 생성하는 명령으로서 10.x.32.40 IP가 eth1에 직접 연결된 것처럼 보이게 한다.

    확인]

    1. ip add sh(일부)

      sun@NONE:  mtu 1500 qdisc noqueue
          link/gre 210.w.253.211 peer 61.y.52.251
          inet 10.x.32.5/32 scope global sun

    2. arp -an

      ? (10.x.32.40) at * PERM PUP on eth1

    3. netstat -nr

      Destination     Gateway         Genmask         Flags   Iface
      10.xxx.32.40    0.0.0.0         255.255.255.255 UH      sun
      61.xxx.52.251   0.0.0.0         255.255.255.255 UH      eth3
      10.xxx.32.31    0.0.0.0         255.255.255.255 UH      eth1
      210.xxx.253.192 0.0.0.0         255.255.255.192 U       eth3
      10.xxx.32.0     0.0.0.0         255.255.255.0   U       eth0
      127.0.0.0       0.0.0.0         255.0.0.0       U       lo
      0.0.0.0         10.xxx.32.31    0.0.0.0         UG      eth1
      

      (일부 생략)

  3. 기 타(NAT)

    /sbin/iptables -t nat -A POSTROUTING -o eth3 -j SNAT --to 210.w.253.211

    iptables -t nat -vnL

    SNAT all -- * eth3 0.0.0.0/0 0.0.0.0/0 to:210.w.253.211

    *. 우체국 내부 PC에서 인터넷을 사용하기 위해 필요하다.

[작동 과정]
직원이 집 PC에서(10.x.32.41) 서울에 있는 우정망 서버(10.x.y.z)를 연결하면 우정망 서버가 보낸 데이타는 우체국 우정망 라우터(10.x.32.31)로 온다. 우정망 라우터는 10.x.32.40 을 찾는 arp 요청 패킷을 eth1 에 연결된 모든 호스트에 브로드캐스트한다.

[주의]
우정망 서버에서 오는 응답 패킷의 목적지 주소는 10.x.32.41 가 아니고 10.x.32.40 이다. 터널 클라이언트 moon의 주소가 10.x.32.40 이고 10.x.32.41 에서 나오는 데이타는 실제는 10.x.32.40 로 NAT가 걸린다.

그러면 라이브라의 ③(Primary) 랜카드(eth1)는 그 요청에 응답하고 데이타를 가져온다.(proxy arp) 10.x.32.40 로 가는 데이타가 라이브라에 들어오면 그 다음에는 라우팅 테이블에 따라 VPN 인터페이스인 sun 으로 데이타가 보내진다.(10.xxx.32.40 0.0.0.0 255.255.255.255 UH sun) 즉 arp -s 명령이 중요한 역할을 한다. 데이타가 sun으로 보내 진 후에 직원 집의 라이브라로 가는 과정은 gre 터널의 몫이다.

서울의 우정망 서버에서 볼때 10.x.32.40 IP 주소를 갖는 피시 (실제 IP는 10.x.32.41)는 우체국 내에 있는 것으로 보인다. 실제 사용에서도 아무런 차이가 없다. 단지 우체국 내의 피시와 파일 공유 및 프린터 공유만 할 수 없다. 그러나 이것도 VPN 구성을 변경하면 가능하다.

[참고]
10.x.y.z IP를 사용하는 우체국 PC에서 ADSL을 통해 인터넷을 사용하려면 라이브라에 아래 명령이 추가되야 한다. 우체국의 일부 피시는 아래 방법으로 우정망과 인터넷을 동시에 사용하고 있다.(대외비임. 보안 감사가 나오면 문제가 된다나요. 그래서 감사가 나오면 라이브라를 제거하고 라우터를 허브에 직결한답니다.)

  • iptables -t mangle -A PREROUTING -i eth0 -s 국장님_PC_IP -d ! 10.0.0.0/8 -j MARK --set-mark 6
  • iptables -t mangle -vnL
    175K 18M MARK all -- eth0 * 10.xxx.32.55 !10.0.0.0/8 MARK set 0x6

조금 더 골치 아픈 문제

iptables 의 mangle table 에 아래 라인이 들어 있다.

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
MARK       all  --  0.0.0.0/0           !10.0.0.0/8         MARK set 0x6

이 부분이 없다면 리눅스랩에서 우체국 라이브라의 ADSL IP 주소로 telnet 을 할 수 없다. 왜? 끝까지 읽으면 답이 있슴.

 

집 라이브라 설정

  1. ①②(LOCAL) : 192.168.1.1/24(eth0), 와 10.x.32.8/32(eth0:1) 두 개의 주소를 갖는다. 왜 두개가 필요한지는 아래에 나온다.
  2. (Primary) : 케이블 모뎀을 연결했다. IP는 61.y.52.251
  3. default gateway = 61.y.52.1

     libra:/etc/rc.boot# ip add sh
    
     3: eth0:  mtu 1500 qdisc pfifo_fast qlen 100
        link/ether 00:10:0b:01:0c:5d brd ff:ff:ff:ff:ff:ff
        inet 192.168.1.1/24 brd 192.168.1.255 scope global eth0
        inet 10.245.32.8/32 brd 10.255.255.255 scope global eth0:1
     4: eth1:  mtu 1500 qdisc pfifo_fast qlen 100
        link/ether 00:90:0b:01:0c:5e brd ff:ff:ff:ff:ff:ff
        inet 222.102.39.222/24 brd 222.102.39.255 scope global eth1
    

터널 설정 과정

  • routing table 및 policy routing

    1. ip ru add fwmark 4 table 4 prio 40
    2. ip ru add from 61.y.52.251 table 2 prio 120
    3. ip ro add table 2 default via 61.y.52.1 dev eth1
    4. ip ro add 10.x.32.41 dev eth0

    설명]
    2. 3. 는 sun과 같다.(여기서는 default gateway가 61.y.52.1 이므로 이 둘은 필수는 아니다. 단지 정확성을 위해서다) 1. 은 아래에 설명이 나온다.

    그런데 왜 4. 가 필요한가? 위에서 eth0:1 에 왜 10.x.32.8/32 주소를 하나 더 부여했는가?

    이 두가지는 터널과는 무관한 사유로 추가되었다. 우정업무는 클라이언트/서버 방식으로 설계되어서 피시에 클라이언트 프로그램을 설치해야 한다. 그런데 개발업체가 이 프로그램을 함부로 아무 피시에서나 설치하지 못하게 프로그램을 사용하는 피시의 IP 주소가 10.0.0.0/8 인 경우만 실행되게 설계하였다. (원시적인 방법이지만)

    그래서 직원 집의 터널 IP 주소를 10.x.32.40 으로 부여하고 라이브라의 local 주소를 192.168.1.1, 직원 PC 주소를 192.168.1.2로 부여해서 10.x으로 가는 데이타를 10.x.32.40로 NAT를 걸어 주었으나 클라이언트 프로그램이 일부가 실행이 안되었다. 그래서 직원의 PC의 IP 주소를 10.x.32.41로 부여하기 위해 이 두가지가 필요하다.

  • 터널 생성

    1. ip tunnel add moon mode gre local 61.y.52.251 remote 210.w.253.211 ttl 255
    2. ip link set moon up
    3. ip link set moon mtu 1500
    4. ip addr add 10.x.32.40/32 dev moon
    5. ip ro add table 4 default via 10.x.32.5 dev moon onlink

    설명]
    1. ~ 4. 은 sun 과 같다. 5. 는 왜 필요한가?

    라이브라의 default gateway가 61.y.52.1(케이블모뎀 회사의 라우터)이므로 직원 피시(10.x.32.41)에서 우정망 서버(10.x.y.z : 서울에 있음)를 연결하면 그 데이타는 터널(10.x.32.40)로 들어가지 않고 케이블 모뎀의 라우터로 들어간다. 그래서 목적지가 10.0.0.0/8 인 데이타를 터널로 유도하기 위해 필요하다.

    방법은 간단하다. 직원 피시에서 라이브라의 로칼포트(eth0)로 들어오는 데이타 중 목적지 주소가 10.x.y.z 인 데이타에 대해서만 빨간색으로 표시를한다. (fwmark 4) 그러면 라우팅을 담당하는 교통 순경이 빨간색이 칠해진 데이타만 터널 쪽으로 보낸다.

    즉 직원 PC(10.x.32.41)에서 우정망 서버를 연결하기 위해서는 아래 둘이 더 필요하다.(머리가 빙빙 돌죠?)

    1. iptables -t mangle -A PREROUTING -i eth0 -d 10.0.0.0/8 -j MARK --set-mark 4
    2. iptables -t nat -A POSTROUTING -o moon -j SNAT --to 10.x.32.40

    1. 은 일반인들이 거의 쓰지 않는 명령이지만 위의 "ip rule add fwmark 4 ..." 및 " ip ro add table 4 default via ..." 과 관련되어 목적지가 10.0.0.0/8 인 데이타를 터널(moon)로 보낸다.

    2. 는 설명이 필요 없겠죠. 우체국에서는 10.x.32.40 주소만 터널로 보내므로 직원 집에서 우정망으로 가는 모든 데이타는 이 주소만 사용해야 한다. 터널에도 NAT를 거는건 첨 봤다구요? 윈도에서도 터널에 NAT가 걸려요...(인터넷 공유요.)

    그럼 직원 PC(10.x.32.41)에서는 인터넷은 사용할 수 없나요? 리눅스랩 홈페이지(211.217.x.y)를 연결하는 경우도 데이타가 터널(moon)로 가나요?

    직원 피시에서 목적지가 인터넷 주소인 데이타가 터널로 들어간다면 인터넷 연결이 되지 않겠죠.(우정망에는 인터넷 게이트웨이가 없죠. 라이브라 빼고는)

    목적지가 10.0.0.0/8 이 아닌 데이타는 default gateway 인 61.y.52.251 로 보내지죠. (우정망 재택근무용인 10.x.32.41 피시에서 인터넷을 사용해도 마찬가지다.) 그래서 아래 NAT 만 추가하면 당연히 인터넷도 연결이 돼겠죠. 인터넷을 사용하는 경우는 데이타가 우체국에 설치된 라이브라-500을 경유하지 않고 케이블모뎀으로 바로 나간다. 즉 VPN을 연결하지 않은것과 똑 같다.

    iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to 61.y.52.251
    (-s 192.168.1.0/24 을 넣으면 안된다. 이 옵션을 넣으면 10.x.32.41 피시는 우정망만 사용할 수 있고 인터넷은 사용하지 못한다.)

  • ip ru sh

    40:     from all fwmark        4 lookup 4
    120:    from 61.y.52.251 lookup 2

  • ip ro sh table 4

    default via 10.x.32.5 dev moon onlink

  • ip add sh

    moon@NONE:  mtu 1500 qdisc noqueue
        link/gre 61.y.52.251 peer 210.w.253.211
        inet 10.x.32.40/32 scope global moon

  • netstat -nr

    10.x.32.41      0.0.0.0         255.255.255.255 UH       eth0
    61.y.52.1       0.0.0.0         255.255.255.255 UH       eth1
    192.168.1.0     0.0.0.0         255.255.255.0   U        eth0
    127.0.0.0       0.0.0.0         255.0.0.0       U        lo
    0.0.0.0         61.y.52.1       0.0.0.0         UG       eth1
    

  • iptables -t nat -vnL

    Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
    SNAT    all  --  *   moon  0.0.0.0/0  0.0.0.0/0 to:10.x.32.40
    SNAT    all  --  *   eth1  0.0.0.0/0  0.0.0.0/0 to:61.y.52.251

  • iptables -t mangle -vnL

    Chain PREROUTING (policy ACCEPT 10M packets, 3383M bytes)
    MARK   all  --  eth0   *    0.0.0.0/0     10.0.0.0/8 MARK set 0x4

    [주]
    iptables 에서 mangle 을 사용하려면 커널을 컴파일해야 한다.

[참고]
직원 집의 라이브라 NAT 테이블에는 아래 두 개가 더 추가되었다. 이 부분은 터널과는 무관하다.

  1. iptables -t nat -A PREROUTING -i eth1 -d 61.y.52.251 -p tcp --dport 80 -j DNAT --to 192.168.1.2:80
  2. iptables -t nat -A POSTROUTING -o eth0 -d 192.168.1.2 -j SNAT --to 192.168.1.1

인터넷에서 http://61.y.52.251 명령을 주면 직원 집의 192.168.1.2 웹서버가 응답을 하겠죠? 그런데 2번은 왜 필요하죠? 2 번은 쓸모가 없다고요?

우정망 연결 PC의 IP는 10.x.32.41 인데 이 PC에서 192.168.1.2 웹서버를 연결할 수 있을 까요? 당연 안되죠. 그런데 2번이 이를 가능하게 합니다. 10.x 피시에서 192.168.1.2 를 연결할 때 라이브라의 로칼 주소인 192.168.1.1 로 NAT를 걸어 줍니다. (첫번 설명에서 이 부분 설명이 틀렸읍니다.)

여기까지 전부 읽고 이해한 독자에게 서비스로 하나 더

라이브라를 라우터로 사용할 때 디폴트 게이트웨이가 아닌 인터페이스로 데이타를 내 보내는 방법입니다.

  1. 데이타가 라이브라를 거쳐 갈때 : fwmark 와 ip ru add fwmark ... 를 사용
  2. 라이브라가 클라이언트 즉 라이브라에서 외부의 서버를 연결할 때 (ftp sunsite.org) : ip ro add
  3. 라이브라가 서버 즉 외부에서 라이브라의 서버를 접근 할 때 (라이브라에 웹서버가 설치되어 있다면): ip ru add from 또는 iptables -t mangle -A OUTPUT 에서 fwmark 사용

    주의 : 라이브라에 인터넷 라인이 둘 이상일 때만 해당된다. 한 개라면 차이가 없다.

 작성자 : 배철수 <churl_nospam@linuxlab.co.kr>

혹시 이 글에 잘못이 있거나 의심스러운 부분이 있으면
위 주소로 메일 보내시길(스팸 메일 절대 사절)

리눅스랩(LinuxLab)

http://www.linuxlab.co.kr
Tel: 02)456-4551