본문 바로가기
서버 및 보안

Shorewall

by 다움위키 2023. 12. 25.

Shorewall리눅스 커널에 내장된 Netfilter (iptables/ipchains) 시스템을 기반으로 하는 리눅스에 대해 오픈 소스 방화벽 도구로, 텍스트 파일을 사용하여 규칙을 설명하기 위한 더 높은 수준의 추상화를 제공함으로써 더 복잡한 구성 체계를 보다 쉽게 관리할 수 있게 만듭니다.

소개

리눅스에서 방화벽은 Netfilter 하나뿐입니다. 비록 iptables의 설정이 어려운 것은 아닐지라도, 초보자에게는 명령줄에 입력하는 자체가 큰 스트레스일 것입니다. 또한 규칙의 언어들의 의미를 파악하기 하는데에 많은 시간이 소요되기 때문에 설정을 일일이 한다는 것은 분명 고역일 것입니다. 이를 도와주는 여러 가지 도구들이 있지만, 직관적이면서도 풍부한 기능을 가진 것 중의 하나가 shorewall일 것입니다.

모든 설정이 점검 계획과 함께 이루어져야 하기 때문에, 여기서는 아래에 제시된 환경에서 가능한 설정을 다루고자 합니다. 점검에 사용한 판은 최근 안정판이며, 설정이 동작치 않을 경우에는 자신의 판 번호와 비교해 보시기 바랍니다.

이외에 여기서 찾을 수 없는 정보는 아래의 외부 연결에 있는 문서에서 확인하시기 바랍니다.

시스템 상황

인터넷 서비스 제공업체로부터 한 개의 유동 IP를 받는 컴퓨터가 있으며, 이 컴퓨터가 방화벽 역확을 합니다. 또한 ISP에서는 21(ftpd), 80(httpd), 135(location service), 445(server message block) 등의 포트가 BLOCKED 상태에 있습니다.

인터넷이 연결된 컴퓨터에서 httpd, ftpd 등의 서비스가 가능해야 하며, 웹서핑등의 클라이언트의 역할도 동시에 가능해야 합니다.

방화벽에 연결된 내부 네트워크에서도 인터넷 연결이 가능해야 합니다.

커널 설정

가장 먼저 해야할 일은 커널 설정입니다. 아래쪽에 제시하는 내용이 기본적으로 필요한 부분이며, 패킷 필터링에 해당하는 나머지 부분들은 전부 M(모듈)로 설정해 두는 것이 필요합니다.

커널 2.6.16 이후 설정입니다.

 Networking ---> 
  Networking options ---> 
    [*] Network packet filtering (replaces ipchains) ---> 
        Core Netfilter Configuration --->
         # 모든 선택사항을 <M> 정도로 선택하세요.
        IP: Netfilter Configuration ---> 
         <*> Connection tracking (required for masq/NAT)  
         # 모든 선택사항을 <M> 정도로 선택하시고,
         # <M>으로 선택할 수 없는 것들은 <*>으로 선택하세요.

커널 2.6.15 까지 설정입니다.

 Device Drivers ---> 
  Networking support ---> 
   Networking options ---> 
    [*] Network packet filtering (replaces ipchains) ---> 
        IP: Netfilter Configuration ---> 
         <*> Connection tracking (required for masq/NAT)  
         <*> IP Tables Support (required for filtering/masq/NAT) 
         # Include (<*> not <M>) all options and sub options

커널 2.4 설정입니다.

 Networking options ---> 
  [*] Network packet filtering (replaces ipchains) 
      IP: Netfilter Configuration ---> 
       <*> Connection tracking (required for masq/NAT)  
       <*> IP Tables Support (required for filtering/masq/NAT) 
       # Include (<*> not <M>) all options and sub options 
       # under IP tables support

설치

커널 컴파일 후에 만들어진 커널로 부팅을 했다면, 이제 shorewall을 설치해 보겠습니다. 먼저 아래의 명령으로 의존 패키지와 USE 플래그 등을 확인할 수 있습니다.

  • sudo apt-get install shorewall

반드시 필요한 iptables, route2 등이 설치되어 있지 않다면, 의존성 검사 후에 설치해 줄 것입니다.

설정

shorewall의 설정도 네트워크의 상황에 따라 다를 수 있습니다. 처음에는 자신의 네트워크의 상황을 그림으로 그리면서 해 보시기 바랍니다. 목표는 필요한 포트 외의 나머지 포트는 막는 것을 원칙으로 합니다.

shorewall.conf

여러가지 설정이 있지만, STARTUP_ENABLED를 반드시 설정해야 하면, 로그 파일의 위치를 /etc//shorewall/shorewall.conf에 씁니다.

 STARTUP_ENABLED=Yes
 #LOGFILE=/var/log/shorewall/shorewall.log
 LOGFILE=/var/log/messages

modules

ftpd를 21이 아닌 다른 포트를 이용할 경우 반드시 수정을 해야 합니다. ftpd는 실제로 2개의 포트가 필요한데, 한 개만 열어두기 때문에 다른 한 개를 알고 있어야 하기 때문입니다. 잘 알려진 포트 중 21번은 그런 설정이 필요없지만, 다른 포트를 사용할 경우에는 21번과 사용할 포트를 아래와 같이 적어줘야 합니다. 파일 /etc/shorewall/modules에 씁니다.

 loadmodule ip_conntrack_ftp ports=21,2121
 loadmodule ip_nat_ftp ports=21,2121 # linux-2.6.11이상에서는 필요없습니다.

interfaces

네트워크 카드를 설정해 줍니다. eth0가 케이블 모뎀에 연결되어 dpcp로 ip를 받아옵니다. eth1은 내부 네트워크을 구성하기 위한 이더넷 카드입니다. 만약 ADSL을 사용하고 있다면, eth0 대신에 ppp0를 사용하셔야 합니다. 파일 /etc/shorewall/interfaces에 씁니다.

 #ZONE    INTERFACE      BROADCAST       OPTIONS         GATEWAY
 net      eth0           detect          dhcp,nosmurfs,blacklist
 #net      ppp0           detect          dhcp,nosmurfs,blacklist #ADSL
 loc      eth1           detect
 #
 #LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE

zones

인터페이스 설정에 이어서 인터넷과 로컬 네트워크의 존 설정입니다. 변수는 위에서 사용한 net과 loc를 그대로 사용해야 합니다. 파일 /etc/shorewall/zones에 씁니다.

 #ZONE                   DISPLAY         COMMENTS
 net                     Internet        The big bad Internet
 loc                     Local           Local Network
 #LAST LINE - ADD YOUR ENTRIES ABOVE THIS ONE - DO NOT REMOVE</pre>

policy

네트워크의 허가에 대한 대원칙을 결정합니다. 세부적인 내용은 아래쪽의 rules에서 조정할 수 있습니다.

로컬 네트워크은 인터넷(외부 네트워크에 연결된 컴퓨터)에 모든 경우에 접근을 허가하며, 외부의 컴퓨터(인터넷)는 방화벽에 접근이 가능하며, 이를 제외한 모든 경우(여기서는 loc)는 접근을 불허하도록 설정합니다. 파일 /etc/shorewall/policy에 씁니다.

 #SOURCE         DEST            POLICY          LOG     LIMIT:BURST
 #                                               LEVEL
 loc             net             ACCEPT
 loc             fw               ACCEPT
 #
 # 방화벽이 설정된 컴퓨터에 서버(HTTPd, FTPd)를 사용할 경우 
 # 아래의 설정을 반드시 추가해 주어야 한다.
 # 그렇지 않으면 모든 포트가 rules에 상관없이 BLOCK 되어 버립니다.
 # 아래의 내용은 http://scan.sygate.com/ 을 통해 테스트한 것임으로
 # 믿을 수가 없습니다. 별도의 테스트가 필요합니다.
 net             fw              ACCEPT
 #
 net             all             DROP            info
 #
 # THE FOLLOWING POLICY MUST BE LAST
 #
 all             all             REJECT          info
 #LAST LINE -- DO NOT REMOVE

rules

인터넷에서 사용할 서비스는 허가해야 합니다. 이외에 서비스를 사용하게 되면 같은 형식으로 추가할 수 있습니다. 포트 번호를 알기 어려우면, /etc/services에서 검색을 할 수 있습니다. 파일 /etc/shorewall/rules에 씁니다.

 #ACTION  SOURCE         DEST            PROTO   DEST    SOURCE     ORIGINAL RATE            USER/
 #                                               PORT    PORT(S)    DEST LIMIT           GROUP
 # 외부(인터넷)에서 정보를 받아 옵니다. (클라이언트)
 # 이것은 방화벽이 설치된 컴퓨터에서 인터넷을 사용하기 위한 설정입니다.
 ACCEPT   fw             net             tcp     80 #http
 ACCEPT   fw             net             udp     80 #http
 ACCEPT   fw             net             tcp     21 #ftp
 ACCEPT   fw             net             tcp     53 #DNS
 ACCEPT   fw             net             udp     53 #DNS
 ACCEPT   fw             net             tcp     873 #rsync 
 ACCEPT   fw             net             tcp     2401 #CVS 
 ACCEPT   fw             net             udp     2401 #CVS
 # 외부로 정보를 내 보냅니다. (서버)
 ACCEPT   net            fw              tcp     2121 #ftpd
 ACCEPT   net            fw              tcp     8080 #httpd
 # 
 # 불필요한 포트를 막아 두는 것이 좋습니다.
 # 2121, 8080을 제외한 모든 포트를 막아두는 것이 좋습니다.
 #
 DROP     net            fw              icmp     8
 # 2122번부터 8079번까지 막습니다.
 DROP     net            fw              tcp     2122:8079
 # 8081 이후의 모든 포트를 막습니다.
 DROP     net            fw              tcp     8081:

masq

네부 네트워크에서 인터넷이 가능하도록 메스크레이딩을 설정합니다. 이 한 줄의 추가로 내부 네트워크에서 인터넷을 할 수 있도록 설정이 끝납니다. 만약 ADSL을 사용하고 있다면, eth0 대신에 ppp0를 사용하셔야 합니다. 파일 /etc/shorewall/masq에 씁니다.

 #INTERFACE              SUBNET          ADDRESS         PROTO   PORT(S) IPSEC
 eth0                    eth1
 #ppp0                    eth1 # ADSL
 #LAST LINE -- ADD YOUR ENTRIES ABOVE THIS LINE -- DO NOT REMOVE

blacklist

불필요하게 서비스에 접근을 하는 사람들(크래커 등)은 일시적으로 또는 영구적으로 막아둘 필요가 있습니다.

Shorewall#interfaces 설정중, OPTIONS에 blacklist를 먼저 추가해야 합니다. 파일 /etc/shorewall/blacklist에 씁니다.

 211.108.234.191/24
 211.108.234.191
 #LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE
  • 첫 번째 줄은 211.108.234.0~211.108.234.255번까지의 ip주소를 eth0(또는 ppp0)를 통해서는 접근할 수 없도록 설정하는 형식입니다.
  • 두 번째 줄은 211.108.234.191번만 접근을 불허하는 형식입니다.

시작

아래의 명령으로 서비스를 시작할 수 있습니다. policy와 rule에 따라 패킷 필터링을 수행할 것입니다.

  • sudo systemctl start shorewall

매번 실행하기 귀찮기 때문에, 아래의 명령으로 부팅 시에 서비스를 자동으로 시작하도록 할 수 있습니다.

  • sudo systemctl enable shorewall

그럼 반대로 서비스를 중지하는 명령은 무엇일까요?

일반적으로 서비스를 중지하는 것으로 알고 있는 아래의 명령은 shorewall에서는 전혀 다른 의미를 가지고 있습니다. 아래의 명령은 방화벽(fw)으로 들어오는 모든 패킷을 차단하는 역할을 합니다.

  • sudo systemctl stop shorewall

그럼 shorewall에서 서비스를 중지한다는 말은 무슨 의미를 해석해야 할까요? shorewall 서비스를 사용하지 않는다는 의미로 해석한다면, 방화벽을 중단한다로 쓰여질 수 있을 것입니다. 즉, policy와 rule에 따라 패킷 필터링을 수행하는 역할은 중단하고 모든 패킷을 통과하도록 허용하는 것을 말합니다. 아래의 명령이 이런 역할을 합니다.

  • sudo shorewall clear

로그 설정

syslog-ng를 사용할 경우, 로그를 별도의 파일로 보관할 수 있습니다. 아래와 같이 설정을 추가해 주세요. 파일 /etc/syslog-ng/syslog-ng.conf에 씁니다.

 ## You shouldn't need to add this line, 
 ## it's probably already there, however 
 ## I include it because the last line references it. 
 
 source src { unix-stream("/dev/log"); internal(); pipe ("/proc/kmsg"); }; 
 
 ## You do need to add these lines though 
                                                                           
 destination d_shorewall{ file ("/var/log/shorewall/shorewall.log"); }; 
 filter f_shorewall { match ("Shorewall"); }; 
 
 ## If you don't want shorewall messages logged to 
 ## /var/log/messages anymore add this filter as well 
 
 filter f_not_shorewall { not match ("Shorewall"); }; 
 
 ## Then add this to log messages to your shorewall log 
 
 log { source(src); filter (f_shorewall); destination (d_shorewall); }; 
 
 ## If you don't want shorewall messages logged to 
 ## any other destination, such as /var/log/messages 
 ## just use the f_not_shorewall filter like so 
 
 log { source(src); filter (f_not_shorewall);destination(messages); };

위와 같이 한 후에 아래의 명령으로 syslog-ng를 새로 시작하세요.

  • sudo /etc/init.d/syslog-ng stop
  • sudo /etc/init.d/syslog-ng start

만약 디렉토리나 파일이 없다는 오류메시지가 발생하면, 아래와 같이 디렉토리와 파일을 만들어 줍니다. 두 번째 명령을 내린 후에 Ctrl+D를 누르면, 빈 파일이 만들어집니다.

  • sudo mkdir -p /var/log/shorewall
  • sudo cat > /var/log/shorewall/shorewall.log

설정 확인

외부 네트워크에서 소켓으로 접근해 보는 방법이 유일한 방법입니다. IRC 등에서 다른 분들의 도움을 받아서 상태를 확인할 수 있습니다.

간혹 네트워크 테스트를 해주는 홈페이지들이 있습니다. 제가 테스트해 본 scan.sygate.com의 결과는 전혀 믿을 수가 없었습니다. 실제로 접속이 되고 있어도 BLOCKED라고 나오는 경우가 많았고, OPEN이라고 나오지만 접근이 되지 않는 경우도 많았습니다.

Nessus를 설치하고 실행해서 점검해 볼 필요가 있습니다.

External Resources