리눅스 자체방화벽 iptables 를 이용한 Ubuntu 포트포워딩 설정하기

HYEONG HWAN, MUN/ 10월 18, 2014/ 미분류/ 1 comments

https://blog.lael.be/post/69

이 글은

1. 우분투로 오픈소스 클라우드 구축하기 (https://blog.lael.be/post/57)

2. 가상머신 관리자 사용법 (https://blog.lael.be/post/242)

에 이어서 쓰는 글이다.

 

제목은 “우분투 포트포워딩 설정하기“!!

Ubuntu 라고 써뒀지만 다른배포판 (CentOS등) 에서도 올바르게 동작할 것이다.

 

iptables 말고, 네트워크 터널링을 설정하려면 : https://blog.lael.be/post/231 글을 참고해주세요.

 

먼저 포트포워딩이 무엇인지 알아야 한다.

커맨드 창을 띄우고

윈도우 : tracert lael.be

리눅스 or 맥 : traceroute lael.be

 

라고 치면 대략 다음과 같은 화면이 나온다.
r1
(보안상 1~6 부분은 생략)

 

총 12대의 스위치(교환기)가 당신의 패킷을 전달한다.

참고로 우리나라는 인터넷 검열을 하는 나라 이므로 저것들중 일부는 당신의 패킷을 기록할 것이다. (따라서 SSL이나 기타 안전한 소켓통신을 하기를 바란다.)
r2
뉴스 출처 : 민중의 소리 (http://www.vop.co.kr/A00000438571.html)

 

민간인 사찰 사건터질때 공개된 이미지 인데요.

위 이미지의 가운데 쪽에 보면 알겠지만 인터넷 회선 감청이라는게 있습니다.

 

국가보안법 들이대면 일반인의 국내이메일+전화+팩스+인터넷회선 감청이 가능합니다.

 

무튼 중요한건 그게 아니고 패킷은 A에서 B로 전달될때 중간교환기가 여러개 껴 있습니다.

 

패킷에는 OSI 7 Layer에 의해서 여러가지 정보를 담고 있습니다.
r3
https://blog.lael.be/post/107 도 한번 읽어보세요.

 

패킷에서 정말 많은 데이터를 얻을 수 있는데 포워딩에 필요한 것은

[보낸IP] [받는IP] [패킷수명;TTL] [내용]

입니다.

 

스위치(교환기)는 역할로 따져보았을때 패킷의 길을 안내므로 router(라우터;길안내기) 라고도 합니다.

즉 스위치=라우터 라고 봐도 됩니다.

 

라우팅 방식은

PRE ROUTING과

POST ROUTING으로 나누어집니다.

 

PRE ROUTING 은 패킷에서 목적지 IP를 변경합니다.

POST ROUTING 은 패킷에서 보낸이 IP를 자신의 IP로 변경하고 재전송합니다.

 

용도에 따라서 쓰임이 다른데요.

A가 B에게 요청했는데 B가 C에게 PRE ROUTING을 한다면

C입장에서는 A가 자신에게 요청한 것으로 간주하고 처리합니다. (VPS 서비스를 한다면 이렇게 해야겠죠.)

단점은 ROUTING 을 먼곳으로 했을때 TTL이 줄어들어서 패킷이 DROP 될수도 있습니다. 그런데 보통 로컬로 PRE ROUTING을 하므로 별 문제되지는 않습니다.

 

A가 B에게 요청했는데 B가 C에게 POST ROUTING을 한다면

C입장에서는 요청을 B가 한것으로 처리합니다. 물론 패킷에는 [A가 요청한 거지만 내가 포워딩한다] 라고 표시를 합니다. 패킷헤더에 있습니다.

POST ROUTING의 경우 B 의 PC가 모든 내용을 해석한 후 동일내용으로 재전송을 시도하므로

중간단계인 “패킷처리”가 쉽습니다. 즉 방화벽 필터링이나 커스텀 룰을 추가하기 좋습니다.

주로 게이트웨이(출입구)로 쓰이죠.

예를들어 A.com 요청이라면 C 에게, B.com 이라면 D 에게 전달, 내부 서버중 부하가 적은 곳에 전달 같은 작업하기에 좋습니다.

중대형 서비스들이 이렇게 구축합니다. (내부 서비스가 다운되었거나 점검중일때 자동으로 점검중 페이지가 뜨게하죠)

 

무튼 포트포워딩(패킷라우팅)을 해보도록 합시다.

- POST ROUTING은 사용하기 좋은 툴인 rinetd 를 쓰세요.

- 터널링이나, 일반적인 포트포워딩을 하시려면 당연히 rinetd 를 사용하세요.

https://blog.lael.be/post/231

 

이 글에서는 iptables를 이용한 PRE ROUTING을 다룰겁니다.

 

1. 현재 iptables 규칙 백업

명령어 다루기가 까다로우므로 순간실수로 네트워크 마비가 올수 있다.

이때 빠른 복구를 위해서 현 상태를 저장해 놓는다.

/root 디렉토리에서 작업한다.

#su -l root

 

백업폴더생성

#mkdir iptables_backup

 

폴더로 이동

#cd iptables_backup

 

iptables 규칙 백업 (파일명은 2013.02.12.rule 알맞게 변경)

#iptables-save > 2013.02.12.rule

 

iptables 규칙 복원 테스트

#iptables-restore < 2013.02.12.rule

 


 

2. iptables 포워딩 규칙 설정

 

#주의 : 포워딩을 새로 설정하시려는 분이면 다음의 초기화를 해도 되지만

클라우드 구축중이라면 초기화를 하면 안됩니다.

클라우드 구축중 다음의 초기화 구문을 실행하면 내부 가상머신들의 네트워크 단절이 발생할 수도 있습니다.

 

리눅스 특색인지는 모르겠지만 대소문자를 맞춰서 써주세요.

 


#iptables 초기화;클라우드 구축중인 사용자는 실행하면 안되는 구문 - 실행시 내부 네트워크가 단절됨

 

- 기본규칙을 허용(ALLOW)로 설정

이걸 하지 않으면 콘솔직접접근을 할수없다면 서버에 접속이 불가능해 진다.

* 아래 명령어가 오류가 발생한다면 ALLOW 대신 ACCEPT 라는 단어를 사용하여라.

# iptables -P INPUT ALLOW
# iptables -P OUTPUT ALLOW
# iptables -P FORWARD ALLOW

 

iptables 모두 초기화 (초기화 직전에 꼭 위의 3가지 구문을 실행하였는지 확인하여라)

 

#iptables -F
#iptables -X
#iptables -Z

 

-A(--append)            : 규칙을 추가한다.

-N(--new-chain)        : 새로운 체인 생성

-X(--delete-chain)     : 체인 제거

-P(--policy)              : 체인 기본정책 변경

-L(--list)                  : 체인의 규칙상태 보기

-F(--flush)               : 체인내의 모든 규칙 제거(방화벽 초기화)

-Z(--zero)                : 체인내의 모든 규칙의 패킷과 바이트의 카운트를 0으로 초기화

-D(--delete)             : 규칙을 삭제

-R(--replace)            : 새로운 규칙으로 대체

-I(--insert)               : 체인의 가장 처음에 규칙을 추가한다.

-E(--rename-chain)    : 체인의 이름을 변경한다.

 


 

내 IP만 ssh 접속가능하게 - 같은 기본세팅을 쓸까 했는데 글이 포트포워딩이므로 관련 기능만 쓰겠습니다.

방화벽이 모두 open되어 있더라도 관리가 잘 되어 있다면 (루트 비밀번호가 매우 짧다던가) 해킹당하지는 않는다. - 관련하여 부연설명을 길게 적지는 않겠다.

 

포트포워딩 관련구분은 다음과 같다.

iptables -A PREROUTING -t nat -p tcp  -d 호스트서버의아이피  --dport 포트번호 -j DNAT --to 포워딩내부아이피:포트번호
iptables -A PREROUTING -t nat -p udp  -d 호스트서버의아이피  --dport 포트번호 -j DNAT --to 포워딩내부아이피:포트번호

예를들면

iptables -A PREROUTING -t nat -p tcp  -d 115.268.342.73  --dport 25565 -j DNAT --to 192.168.122.12:25565
iptables -A PREROUTING -t nat -p udp  -d 115.268.342.73  --dport 25566 -j DNAT --to 192.168.122.12:25566

가 가능해진다.

서비스들은 거의다 tcp 이므로 첫번째의 구문만 사용하면 된다.
다만 이 -t nat(내부네트워크) 의 PREROUTING 구문은 상위단계의 FORWARD 에서 한번 걸러지므로

iptables -A FORWARD -p tcp --dport 25565 -d 192.168.122.12 -j ACCEPT
iptables -A FORWARD -p udp --dport 25566 -d 192.168.122.12 -j ACCEPT

로 허용해 주어야 합니다. (FORWARD 기본값이 ALLOW라면 안해줘도 되지만)

 

올바로 세팅되었는지 체크

#iptables -L PREROUTING -t nat
#iptables -L FORWARD

 

필요없는 세팅 삭제 (예시: 상단의 -L로 봤을때 첫번째 룰 삭제, 삭제시 순서번호가 다시 매겨지므로 여러개 삭제시 순서를 잘 보고 하세요.)

#iptables -D PREROUTING 1 -t nat

 

virtual machine manager 로 세팅중이라면 FORWARD 구문중에 내부패킷 DROP 이 있을겁니다.

인덱스번호가 3,4 였던가 4,5 였던가 나란히 있는데 해당 룰을 제거해 주어야 합니다. (#iptables -L FORWARD 로 인덱스를 확인하세요)

예를들어 내부 DROP 구문이 세번째, 네번째라면

#iptables -D FORWARD 3 라는 명령어를 두번 실행해 주세요. (3번 삭제 후 인덱스 번호가 다시 매겨지므로)

 

작업이 어렵다면 방화벽룰 백업(iptables-save)을 하신 후에

해당 백업파일을 vi 나 nano 같은 에디터로 열어서 편집하신 후 복원(iptables-restore)하시면 됩니다.

 

덧붙여, iptables 가 유지가 되지 않기 때문에(즉 재부팅되면 초기화됨) iptables-persistent 같은 프로그램이 필요합니다.

관련 설치법은 https://blog.lael.be/post/73 글 중 일부를 참조하세요.

1 Comment

  1. Pingback: netstat, nmap등 | can1001

Leave a Comment

작성하신 댓글은 관리자의 수동 승인 후 게시됩니다.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
*
*