[Masquerading이란?]
IP 마스커레이드는 리눅스의 네트워킹 기능으로, 상용 방화벽(firewall)이나
네트웍 라우터(network router)에서 흔히 볼 수 있는 1 대 다(one-to-many) 방식의
NAT(Network Address Translation: 네트웍 주소 해석)와 유사하다.
쉽게 설명하자면 REAL IP 하나로 가상아이피를 가진 여러개의 컴퓨터,네트워크를 꾸밀수있다.
※ Masquerading는 본문에서 이하 MASQ라고 부르겠다.
[MASQ의 기본동작원리]
MASQ를 자세하게 설명하자면 아래와 같다.
INTERNET-------MASQ머신-----내부내트워크
인터넷과 내부네트워크 사이에 위치하여 주소를 변환하여 패킷을 통과시키는
역할을 하는것이 바로 MASQ머신이다.
이해를 쉽게 하기위해 하나의 상황을 꾸며보자.
내부네트워크에
일단 컴퓨터가 2대밖에 없다고 가정하고, 내부 네트워크주소는 192.168.1.0을
쓴다고 하며, MASQ머신의 실제 IP는 1.1.1.1이라고 하자.
그럼 모식도는 아래와 같을것이다.
INTERNET-------MASQ머신-------------- COM1 (192.168.1.2)
------------실제(1.1.1.1)----------|
------------가상(192.168.1.1)------└----- COM2 (192.168.1.3)
MASQ머신에는 아미 마스커레이딩룰을 다 세팅한후이며
COM1,COM2역시 네트워크정보(IP와 게이트워이등)을 세팅한후다.
자세한 룰구축과 네트워크설정은 뒤에서 다룬다 다만 여기서는
먼저 MASQ의 기본개념과 상세한 동작원리를 설명하기 위해서 이렇게 한다.
이제 COM1이 웹브라우져로 어떤사이트에 접속을 한다고 하자.
COM1에서 전송을 주고받을 임이의 포트를 연다.그 포트가 10000번이라고 하자.
그리고 패킷에는 다음과 같은 정보가 들어간다
도착지:웹사이트IP 도착포트:80
출발지:192.168.1.2 출발포트:10000
그리고는 게이트워이인 192.168.1.1(MASQ머신)으로 보내어 진다.
자 이제부터 MASQ머신이 일을 할차례이다.
MASQ머신은 우선 192.168.1.2에서 보내온 패킷을 받고 살펴본다.
그리고 난후 MASQ머신의 임이의 포트(여기서 일반 임이의포트를 5000번이라고 하자)
를 192.168.1.2의 IP,10000포트에 대해 매칭한다.
※ 일반적인 포트개념과는 조금은 다르다. 그래서 통신이 될때
netstat -nat 해도 MASQ머신에서는 포트가 보이지 않는다.
그리고 패킷을 변조한다.
도착지:웹사이트IP 도착포트:80
출발지:1.1.1.1 출발포트:5000
위와 같이 변조하고 인터넷으로 보내어 버린다.
그러면 웹서버에서 응답이 온다.
어디로? 바로 1.1.1.1의 주소에 5000번 포트로.
왜? 바로 MASQ머신에서 출발지 주소를 변조해버렸기때문이다.
자.기다리던 응답이 왔다.
패킷을 보면
도착지:1.1.1.1 도착포트:5000
출발지:웹사이트IP 출발포트:80
분명 COM1이 접속하고자 한 웹사이트에서 응답이 왔는걸을 위에서 보면 알수있다.
자 이제 이 패킷을 받은 MASQ머신은 다시 COM1에게 이 패킷을 전달해주기 위해
또다시 변조작업을 해야한다.
아래와 같이 변조한다. 이미 위에서 5000번 포트를 192.168.1.2의 10000포트로
매칭을 하고 MASQ머신은 똑똑하게 그것을 기억하고 있다.
그러므로 아래와 같이 변조된다.
도착지:192.168.1.2 도착포트:10000
출발지 웹사이트IP 출발포트:80
이렇게 하고 변조된 패킷은 내부 네트워크로 보내어진다.
그다음 결과는 불보듯 뻔할것이다.
COM1은 이 패킷을 받게 될것이고.
마치 웹사이트와 직접연결되어 패킷을 주고 받은것처럼 이패킷을 처리할것이다.
그리고 COM1이 바라던대로 웹프라우져에 접속한 웹사이트가 뜰껏이다.
재미있지 않은가?
MASQ머신이 하는일은 위와같다.
자 이제는 직접 MASQ머신을 꾸며 볼 차례이다.
우선 MASQ에 필요한 테이블은 아래와 같다.
FORWARD체인에 속해있는 PREROUTING과 POSTROUIING
테이블이 바로 우리가 룰을 세울 테이블이다.
한번 직접 보자
#iptables -t nat -L
위와 같이 치면 지금 룰이 텅텅비어있는 테이블을 보게될것이다.
iptables기본사용법 문서에서 다루었지만 위의 명령을 설명하면
-t(타겟지정옵션) nat(바로 패킷변조작업을 할 테이블)
-L 목록출력
※우선 FORWARD체인부터 설명해야겠지만 이 글을 읽고 있는 여러분은
MASQ에 더 관심이 있을줄 알고 POSTROUTING과 PREROUTING에 대해
먼저 설명을 한다.
POSTROUING? PREROUTING?
이름으로부터 벌써 추측을 할수 있을것이다.
POSTROUTING = 패킷을 변조후 보내는 룰을 세우는 테이블
PREROUTING = 패킷을 받아 변조시키는것인데 MASQ시에 포워딩부분에서 사용한다.
즉 앞에 문서에서 설명한 MASQ의 기능에서는 이 테이블이 쓰인적이없다.
나중에 포워딩부분에서 이 테이블을 다룰것이다.
우선 하나의 룰을 예로 들며 설명하겠다.
# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.1.1.1
위의 명령을 말로 풀어보자면
-t(타겟) nat(주소변환테이블 이곳에 POSTROUTING과 PREROUTING이 속해있음)
-A 룰추가
POSTROUTING 테이블에
-o eth0 ouput디바이스가 eth0 라면
-j SNAT 출발지 주소를 변환하라.( SNAT은 source NAT이라고 생각하면 된다.)
--to 1.1.1.1 IP가 1.1.1.1로
중요!:바로 이부분이 우리가 가진 MASQ머신의 실제IP를 적는 곳이다. 왜 이곳에 적는지는 SNAT으로 충분히 설명이 된다. 이곳에 적은 IP는 MASQ머신이 인터넷으로 보낼때 이곳 IP로 출발지를 변조해서 보낼것이다.
한문장으로 합치면 "nat테이블에 있는 POSTROUING테이블에 output디바이가 eth0이면
출발지 주소를 1.2.3.4로 변환하는 룰을 추가하라" 라는 말이된다.
※ --to 1.1.1.1 이외에 여라가지 방법으로 주소를 설정할수있다.
ex) --to 1.1.1.1-1.1.1.10 여러가지 변환이 필요할때.
위의 명령은 출발지 주소를 1.1.1.1부터 1.1.1.10까지 랜덤하게 바꾼다.
ex) --to 1.1.1.1:1-1024
위의 명령은 출발지 주소를 1.1.1.1로 하되 포트번호를 1번에서 1024번까지 해라는
명령이지만 잘 사용하지 않는다. 포트제한이 꼭 필요한경우라면 사용해야하겠지만
절대 권장하지 않는다.
위의 예제 룰 한줄이면 앞장에서 설명한 MASQ의 주소변조 작업을 수행할수있다.
하지만 더 세밀하게 할수도 있다.
우리가 iptables 기본사용법 문서에서 사용한 옵션의 일부를 여기서 사용할수있다.
아래와 같이.
-s, -d, -p, --dport를 옵션을 쓸수있다.(--dport는 SNAT에서 잘 쓰이지 않는다.)
이제 조금 더 세밀한 MASQ룰 을 세워보자
# iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.0/24 -j SNAT
--to 1.1.1.1
이번에는 -s옵션을 추가하였다. 물론 위쪽룰과 이 룰은 같은것이다.
다만 -s(출발지 옵션을 추가한것 뿐이다.)
그리고 -p옵션을 사용하지 않았는데 보통 이것은 사용하지 않는다.
왜냐면 우리는 통신에 tcp,udp 프로토콜을 같이 쓰기때문에
틀정 프로토콜을 정할수도 있겠지만 그렇게 하지 않는게 보통이다.
이정도면 충분히 MASQ머신을 만들수 있을것이다.
[포워딩]
자 이번에는 포워딩을 해보자
MASQ머신의 단점이 될수도 있고 장점이 될수있는 부분은은
내부에서 외부로밖에 접속을 할수없다는 것이다.
반대로 외부에서 내부는 접속이 전혀 되지 않는다.
외부에서 접속을 하려고 한다치자.
그러나 외부에서는 절대 내부를 볼수없다.
왜? 인터넷으로 나오는 패킷은 전부 MASQ머신이 보낸 패킷처럼
출발지 IP를 변조시켜 보내니까.
즉 외부에서 보기에는 MASQ만 보일뿐 어떤 내부컴퓨터도 볼수없다.
※ 이것이 장점이 될수있고 단점도 될수있는 부분이다.
내부로 연결은 밑에서 설명할 룰을 세워야만 가능하다.
룰없이는 불가능하다. 즉 내부로 연결하자면 조금 번거로울수있다(?)
소리바다 및 구루구루, MSN파일전송을 위해 설정하는것도 이러한 이유다.
하지만 이것은 다른면에서 보면 자동으로 보안을 강화시킬수 있는 장점이
되기도 한다.
그러면 어떻게 masq를 거쳐 내부컴으로 연결을 할수있을까?
바로 앞에서 잠시 말한 PREROUTING테이블에 룰을 세우면 이것을 할수있다.
다음과 같은 명령을 보자.
# iptables -t nat -A PREROUTING -p tcp -d 1.1.1.1 --dport 80
-j DNAT --to 192.168.1.2:80
이번에는 PREROUTING과 DNAT(destination NAT 이라고 보면됨)이 쓰였다.
이것이 포워딩에 쓰이는것이다. 즉 도착지를 다른곳으로 변경시켜 주는것이다.
위의 룰을 설명하면
-A PREROUTING : PRETOURING 테이블에 룰을 추가해라.
-p tcp : tcp프로토콜이고
-d 1.1.1.1 : 도착지가 1.1.1.1이며
--dport 80 : 80번포트로 접속을 하면
-j DNAT 목적지를 변환시켜라
--to 192.168.1.2:80 : 192.168.1.2 의 80번 포트로
즉 tcp프로토콜이고 도착지가 1.1.1.1이고 도착포트가 80번(www)이면
그 패킷은 192.168.1.2의 80번포트로 보내라.
자 이러면 우리가 외부에서 1.1.1.1번의 80번 포트로 접속을 할수있는것이다.
외부에서 보기에는 1.1.1.1의 컴에서 (80번 포트이므로 웹서버라 하겠다.) 웹서비스를
하고 있는걸로 보이지만 사실은 1.1.1.1은 패킷을 다른곳으로 보내줄뿐이고
사실상 웹서비스를 하고 있는 컴퓨터는 내부의 192.168.1.2번 컴퓨터이다.
udp또한 -p옵션으로 설정을해 포워딩을 시킬수 있다.
이번에는 특정 주소로 오는것을 전부다 포워딩을 시켜보자.
# iptables -t nat -A PREROUTING -d 1.1.1.1 -j DNAT --to 192.168.1.2
위의 명령은 프로토콜에 상관없이 도착지가 1.1.1.1이면
무조건 포워딩시켜버린다.
자 이제 실제 MASQ를 꾸미는 예를 보자.
우선 MASQ머신에 이더넷 카드 두장이상이 필요하다. 외부를 연결할 디바이스와
내부를 연결한 디바이스이다.
그리고 eth1과 eth0 의 네트워크 설정을 해주기 바란다.
일반적으로 eth1를 내부와 연결할경우 내부컴퓨터들의 게이트웨이는 eth1의 IP가 된다.
그런 다음 간단하게 다음과 같이 명령을 내리자.
패킷을 forwarding가능하게 하기위해
다음과같이 커널파라이터를 고친다. 부팅시 기본은 원래 0으로 되어있다.
다음과 같이 명령을 내리자.
# ehco 1 > /proc/sys/net/ipv4/ip_forward
그리고 난뒤 룰을 올리자.
eth0의 IP가 1.1.1.1이고 내부 네트워크가 192.168.1.0이라면
# iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.0/24 -j SNAT
--to 1.1.1.1
이 한줄이면 끝이다. 이 명령을 세우고 내부 컴에서 인터넷을 해보라.
잘 될것이다.
그리고 난 내부 컴에서 웹서버와 ftp서버를 돌리고 싶다.아래와 같이 하라.
내부 웹서버 IP가 192.168.1.2이고 포트는 80번이이면 밑과의 룰로 될것이다.
# iptables -t nat -A PREROUTING -p tcp -d 1.1.1.1 --dport 80
-j DNAT --to 192.168.1.2:80
그리고 ftp서버는 192.168.1.3번이고 21번 포트를 쓴다.
ftp서버가 active모드로 돌아간다면 data전송을 위해 20번포트를 쓰니까
# iptables -t nat -A PREROUTING -p tcp -d 1.1.1.1 --dport 21
-j DNAT --to 192.168.1.3:21
# iptables -t nat -A PREROUTING -p tcp -d 1.1.1.1 --dport 20
-j DNAT --to 192.168.1.3:20
위와 같이 내린다.
하지만 위는 예일뿐 실제 ftp는 MASQ하에 돌리지 않는다. 그이유는 속도측면에서의
손해와 passive모드(ftp 문서를 찾아보기 바란다)등이며 ftp는 절대적으로
NAT(즉, MASQ) 와 별로 친하지 않다. 따로 모듈을 올려줘야 한다.
그러한 이유등에서 ftp서버를 nat안에 두지 않는걸 적극 권장한다.
아! 그리고 중요한게 한가지 더 있다.
내부에서 ftp서버를 돌리든 돌리지 않든
내부 컴에서 ftp 클라이언트를 안정적으로 이용하려려면 MASQ머신에
ip_nat_ftp.o 이 모듈을 꼭 올려줘야만 한다.
ip_nat_ftp는 nat의 ftp접속추적모듈이다.
이로써 MASQUERADING부분이 끝났다. 이정도면 충분히 마스커레이딩을 할수있고
부족하다면 관련 문서를 찾아보며 조금만 공부를 하면 될것이다.
이번에는 FORWARD체인과 Mangle테이블에 대해 다루어 보자
[FORWARD]
FORWARD체인은 nat을 포함하고 있다.
nat은 PREROUTING,POSTROUTING을 포함하고 있다.
즉 FORWARD체인이 가장 상위의 체인이다.
설사 nat의 PREROUTING이나 POSTROUTING에서 먼저
룰을 세웠더라도
FORWARD에 룰을 세우면 이것은 가장먼저 적용된다.
FORWARD체인의 룰셋은 INPUT과 OUTPUT과 동일하다.
하지만 틀린점이 있다면 -i,-o등 양쪽 인터페이스를
다 지정할수있다.
실제로 예를 들어보이겠다.
#iptables -A FORWARD -p tcp --dport 80 -i eth0 -o eth1 -j DROP
명령 풀이에 더이상 -p나 --dport등 이미 자주설명해왔던것들은 생략하겠다.
-i eth0 : eth0으로 들어오는
-o eth1 : 그리고 eth1로 나가는 패킷은
-j DROP : 버려라
이 룰이 일단 세워지면 아무리 PREROUTING에서 80번 포트 포워딩을 세웠더라도
우선 FORWARD룰이 먼저 적용되기때문에 적용패킷은 버려질것이다.
이것이 FORWARD의 내가 사용하는 전부이다.
물론 더 있겠지만 실제로 쓰고, 많이 언급되고 있는 전부라는 것이다.
[Mangle]
이번에는 Mangle테이블을 보자
Mangle테이블은 패킷필터링 룰을 세우는 곳이 아니다.
Mangle테이블은 성능향샹을 위한 TOS를 설정하는 것이다.
TOS를 알고 싶다면 tcp/ip관련 문서나 책에서 찾아보기 바란다.
매우 고급적이 내용이므로 확실하게 이해하지 않는경우 그대로 두기 바란다.
잘못 설정할 경우 네트워크에 심각한 상황을 초래할수도 있다.
그래도 한번 해보고 싶은 사람이 있다면 큰맘 먹고 해보면 된다.
사실 리부팅하면 모든 룰이 그러하듯이 다 없어진다 🙂
TOS코드
이름 CODE[HEXCODE] 설명
Minimize-Delay 16[0x10] 최소지연
Maximize-Throughput 8[0x08] 최대 전송률
Maximize-Reliability 4[0x04] 최대 안정성
Minimize-Cost 2[0x02] 최소 경로
Normal=service 0[0x00] 일반서비스
telnet과 ssh는 최소 지연을 사용하고
ftp는 최대 전송률을 사용하게끔 세팅을 해보자
INPUT 체인
# iptables -t mangle -A INPUT -p tcp --dport 22
-j TOS --set-tox 0x10 // ssh
# iptables -t mangle -A INPUT -p tcp --dport 23
-j TOS --set-tox 0x10 // telnet
# iptables -t mangle -A INPUT -p tcp --dport 21
-j TOS --set-tox 0x10 // ftp 커맨드 전송포트
# iptables -t mangle -A INPUT -p tcp --dport 20
-j TOS --set-tox 0x08 // ftp-data전송포트
OUTPUT 체인
# iptables -t mangle -A OUTPUT -p tcp --dport 22
-j TOS --set-tox 0x10 // ssh
# iptables -t mangle -A OUTPUT -p tcp --dport 23
-j TOS --set-tox 0x10 // telnet
# iptables -t mangle -A OUTPUT -p tcp --dport 21
-j TOS --set-tox 0x10 // ftp 커맨드 전송포트
# iptables -t mangle -A OUTPUT -p tcp --dport 20
-j TOS --set-tox 0x08 // ftp-data전송포트
위에 설정한 그대로다 이제 일일이 설명하지 않아도 iptables 기본사용법과
이문서를 차근차근 본 문서라면, 또 이까지 별문제 없이 온사용자라면
위 문장만 봐도 충분히 이해가 가리라 믿는다.
MASQ and FORWARD and MANGLE