Linux generic

psycho 2013. 8. 24. 10:08

※ 이 글은 2013-08-24 현재 최신버전 12.3을 기준으로 한다. 다른 버전의 경우 인터페이스나 기능에 변화가 있을 수 있으며, 특히 이후 버전의 경우 이 문제가 해결되었을 수도 있다.

※ 당연한 말이지만, 이 글에서 행하는 모든 작업은 root 권한을 필요로 한다. 컴퓨터가 말을 안 듣는다고 불평하기 전에, 명령을 실행하기 위한 조건이 갖춰졌는지 꼭 확인하는 습관을 들이자.


 최근의 openSUSE 배포판에는 SuSEfirewall2라는 자동 방화벽 관리 스크립트가 들어있다. 전체적인 시스템 관리 도구인 YaST와 연계해서 동작하며, 상당히 많은 기능(masquerading, port forwarding 등)들을 몇 개의 값만 입력하는 것으로도 쉽게 설정할 수 있게 해준다. 이전처럼 어떤 기능 하나를 구현하기 위해 수많은 iptables 명령을 입력할 필요가 없어졌다는 점은 환영받을 일이다.


 그렇지만, 자동화된 도구라는 건 항상 맹점이 있게 마련이다. 필자의 경우에는 두 대의 컴퓨터를 다른 subnet으로 할당하여 방화벽 컴퓨터에 물려놓았는데, 한쪽 subnet의 컴퓨터에서 다른 subnet의 컴퓨터로 접속할 일이 생겼다. 고전적인 iptables 명령을 사용한다면 다음과 같은 두 줄이면 (내부 네트워크간의 보안이야 어찌되었든) 일단 접속이 된다. (여기서는 외부 네트워크 인터페이스를 eth0, 내부 네트워크 인터페이스를 eth1, eth2로 가정한다)


localhost:/ # iptables -A forward_int -i eth1 -o eth2 -m conntrack --ctstate NEW,RELATED,ESTABLISHED -j ACCEPT

localhost:/ # iptables -A forward_int -i eth2 -o eth1 -m conntrack --ctstate NEW,RELATED,ESTABLISHED -j ACCEPT


 그런데, 무식하게 iptables 명령으로 이렇게 설정해본 사람이라면 알겠지만 이놈의 방화벽 규칙이 주기적으로 SuSEfirewall2의 설정파일에 기록된 대로 업데이트가 되기 때문에 매번 사용할 때마다 이렇게 해줘야 한다는 불편함이 따른다. 그렇다면 cron을 써도 된다고 생각하겠지만, 예를 들어 대용량 파일 전송을 하고 있는데 중간중간에 계속 끊긴다면?


 이럴 때 해결방법은 두 가지다. 하나는 SuSEfirewall2를 쓰는 것을 아예 포기하고 100% 수동으로 방화벽 설정 스크립트를 짜는 것이고, 나머지 하나는 어떻게든 SuSEfirewall2를 가지고 설정하는 방법이다. 전자를 실행할 수 있는 능력자라면 이런 글을 아예 읽지도 않을 테니 넘어가도록 하겠다. 후자에 해당하는 독자의 경우엔 분명히 YaST 등으로 이런 기능을 설정하겠답시고 수많은 삽질을 하다가 이 글을 읽게 되었을 것이다. 그렇다. 결론적으로 말하자면, YaST를 가지고는 이런 식의 forwarding 규칙을 설정하는 게 불가능하다. 이는 기본적으로 YaST에서의 방화벽 설정 구성이 방화벽 컴퓨터 자체를 향하여 들어오는 패킷에 대한 설정만을 다루도록 되어있기 때문이다. forwarding과 관련된 설정은 정말로 기껏해야 masquerading이나 port forwarding 정도고, Custom rules라고 된 부분도 일반적인 forwarding 기능과는 전혀 관련이 없다. 그나마 다행인 점은 이런 식의 사용자 정의 규칙을 사용할 수 있는 스크립트의 틀을 미리 만들어놨다는 점이다.


 길고 긴 잡설은 이쯤하고, 사용법을 설명하도록 하겠다. SuSEfirewall2의 설정 파일(기본 경로 : /etc/sysconfig/SuSEfirewall2)에는 외부의 설정 스크립트를 불러올 수 있는 항목이 있다. FW_CUSTOMRULES라는 설정 항목 이름을 가지고 있으며, 여기에 실행하고 싶은 스크립트의 전체 경로를 지정하면 된다. 해당 스크립트는 bash 스크립트 파일에서 include 명령으로 실행할 수 있기만 하면 된다. 보통 /etc/sysconfig/scripts/SuSEfirewall2-custom이라는 이름의 기본값이 주석 처리되어 저장되어 있고, 이 템플릿 파일을 사용하는 것을 권장한다. 여기에는 몇 개의 함수가 정의되어 있는데, 방화벽 설정 순서별로 함수가 나누어져 있으며, 이를 이용하여 추가하고자 하는 규칙의 순서를 조정할 수 있다. 동작 시점에 대한 설명이 자세하게 되어 있으므로 잘 읽어보고 규칙을 추가하기 바란다.


 여기에 규칙을 추가하는 것은 간단하다. 명령줄에서 입력하는 명령 그대로 함수 내에 입력해주면 된다. 예를 들어, 모든 정의된 규칙 처리가 끝나고 chain의 기본 정책대로 처리되기 직전에 위 예제 규칙들을 넣고 싶다면, fw_custom_before_denyall() 함수 안에 다음 두 줄을 그대로 붙여넣으면 된다.


iptables -A forward_int -i eth1 -o eth2 -m conntrack --ctstate NEW,RELATED,ESTABLISHED -j ACCEPT

iptables -A forward_int -i eth2 -o eth1 -m conntrack --ctstate NEW,RELATED,ESTABLISHED -j ACCEPT


 그리고, 설정을 적용하기 위해 /sbin/SuSEfirewall2를 실행한다. 문제가 없다면, iptables -L 명령을 실행했을 때 추가한 규칙들이 정상적으로 표시될 것이다. 만약 제대로 동작하지 않는다면, iptables 명령을 올바르게 입력했는지, 스크립트가 bash 문법에 맞는지 검사해보도록 한다.