1

글타래: OS X에서 방화벽 설정하기

OS X에서 방화벽 설정하기

OS X에서 방화벽은 시스템 환경설정의 "공유" 항목에서 설정해서 사용할 수 있지만, 여기서는 약간 설 익은 ipfw의 기능들만을 제공합니다. 또한, 여러대의 컴퓨터들에 비슷한 방화벽 환경을 구현할 경우에는, 번잡한 과정들이 필요하게 됩니다.

그래서, OS X에 내장되어 있는 방화벽 도구인 ipfw를 사용해서, 간단하고 쉽게 여러대의 컴퓨터들에 적용될 수 있는 방화벽 설정 스크립트를 만들어 보겠습니다.

방화벽 규정 생성 스크립트 만들기

먼저, 방화벽을 위한 규정 생성 스크립트를 만듭니다.
일단, 규정들을 스크립트 파일에 저장해 놓으면, 나중에 아주 손쉽게 수정하고 설치가 가능하게 됩니다.

1. 터미널을 열고 root 사용자로 들어가서 ipfw 규정 생성 스크립트 파일을 생성합니다.

$ su -
# vi ipfw.rules

2. 아래와 같은 코드를 자신의 네트워크 환경에 맞게 수정하고, 열고자 하는 포트들을 추가한 후에 규정 생성 스크립트 파일에 붙입니다.

#!/bin/sh 
# Simple Firewall rules 
# darky83@sleektech.nl 

# +----------+ 
# | settings | 
# +----------+ 
# IPFW command 
fwcmd="/sbin/ipfw" 

# DHCP server 
dhcps="192.168.0.1" 

# interface, network, netmask and ip 
if="en0"                    # Your Interface 
net="192.168.0.0"            # Your Network 
mask="255.255.255.0"        # Your Netmask 
ip="192.168.0.1"            # Your IP 

# DNS Servers 
dns1="1.1.1.1" 
dns2="2.2.2.2" 

################ 
# Start Script # 
################ 

# Flush everything first 
${fwcmd} -f flush 

# We need counting don't we? so we can get some nice stats.. 
${fwcmd} add 10 count ip from any to any via ${ip} 
${fwcmd} add 11 count ip from any to any in recv ${ip} 
${fwcmd} add 12 count ip from any to any out xmit ${ip} 

# Allow loopback 
${fwcmd} add 100 pass all from any to any via lo0 
${fwcmd} add 101 deny all from any to 127.0.0.0/8 
${fwcmd} add 102 deny ip from 127.0.0.0/8 to any 

# Stop RFC1918 nets on the outside interface 
# NOTE: IF YOU ARE ON A LAN UNCOMMENT THE IPRANGE OF YOUR LAN 
${fwcmd} add 300 deny all from any to 10.0.0.0/8 via ${if} 
${fwcmd} add 301 deny all from any to 172.16.0.0/12 via ${if} 
#${fwcmd} add 302 deny all from any to 192.168.0.0/16 via ${if} 
${fwcmd} add 303 deny all from any to 0.0.0.0/8 via ${if} 
${fwcmd} add 304 deny all from any to 169.254.0.0/16 via ${if} 
${fwcmd} add 305 deny all from any to 192.0.2.0/24 via ${if} 
${fwcmd} add 306 deny all from any to 224.0.0.0/4 via ${if} 
${fwcmd} add 307 deny all from any to 240.0.0.0/4 via ${if} 

# Allow TCP through if setup succeeded 
${fwcmd} add 410 pass tcp from any to any established 

# Allow IP fragments to pass through 
${fwcmd} add 420 pass all from any to any frag 

############################# 
# INPUT                     # 
# COMMENT OUT YOUR SERVICES # 
############################# 

# Allow setup of incomming ftp 
#${fwcmd} add 500 pass tcp from any to ${ip} 20 setup 
#${fwcmd} add 501 pass tcp from any to ${ip} 21 setup 

# Allow setup of incoming ssh 
#${fwcmd} add 502 pass tcp from any to ${ip} 22 setup 

# Allow setup of incoming www 
#${fwcmd} add 503 pass tcp from any to ${ip} 80 setup 

# Bittorrent 
${fwcmd} add 510 pass tcp from any to ${ip} 6881 
${fwcmd} add 511 pass tcp from any to ${ip} 6882 
${fwcmd} add 512 pass tcp from any to ${ip} 6883 
${fwcmd} add 513 pass tcp from any to ${ip} 6884 
${fwcmd} add 514 pass tcp from any to ${ip} 6885 
${fwcmd} add 515 pass tcp from any to ${ip} 6886 
${fwcmd} add 516 pass tcp from any to ${ip} 6887 
${fwcmd} add 517 pass tcp from any to ${ip} 6888 
${fwcmd} add 518 pass tcp from any to ${ip} 6889 

#### 
# DNS 
#### 

# Allow access to our DNS 
${fwcmd} add pass tcp from any to ${dns1} 53 setup 
${fwcmd} add pass udp from any to ${dns1} 53 
${fwcmd} add pass tcp from any to ${dns2} 53 setup 
${fwcmd} add pass udp from any to ${dns2} 53 
${fwcmd} add pass udp from any 53 to any 

# ALLOW THE DHCP REQUESTS 
${fwcmd} add 650 allow udp from any 68 to ${dhcps} 67 out via ${if} 
${fwcmd} add 651 allow udp from ${dhcps} 67 to any 68 in via ${if} 

# Reject & Log all setup of incoming connections from the outside 
${fwcmd} add 700 deny log logamount 50000000000 tcp from any to any in via ${if} setup 

# Allow setup of any other TCP connection 
${fwcmd} add 800 pass tcp from any to any setup 

##### 
# OUTPUT 
#### 

# We allow everything here (as I said its a simple fw.) 
${fwcmd} add 900 allow ip from ${ip} to any 

# ICMP 
${fwcmd} add 920 allow icmp from any to any icmptypes 0,3,8,11,12 

# Deny everything els and log it 
${fwcmd} add 60000 deny log logamount 50000000000 ip from any to any

3. 이제, 다음과 같이 터미널에서 앞에서 만든 ipfw 규정 생성 스크립트를 적용해 줍니다.

# sh ipfw.rules

4. 다음에, 아래처럼 모든 것이 정상적으로 작동하는지 확인합니다.

# ipfw show
00010  548 216938 count ip from any to any via 192.168.0.1 
00011  253 135927 count ip from any to any in recv 192.168.0.1 
00012  295  81011 count ip from any to any out xmit 192.168.0.1 
00100 8552 592520 allow ip from any to any via lo0 
00101    0      0 deny ip from any to 127.0.0.0/8 
00102    0      0 deny ip from 127.0.0.0/8 to any 
00300    0      0 deny ip from any to 10.0.0.0/8 via en0 
00301    0      0 deny ip from any to 172.16.0.0/12 via en0 
00303    0      0 deny ip from any to 0.0.0.0/8 via en0 
00304    0      0 deny ip from any to 169.254.0.0/16 via en0 
00305    0      0 deny ip from any to 192.0.2.0/24 via en0 
00306  120  14758 deny ip from any to 224.0.0.0/4 via en0 
00307    0      0 deny ip from any to 240.0.0.0/4 via en0 
00410  321 191264 allow tcp from any to any established 
00420    0      0 allow ip from any to any frag 
00510    0      0 allow tcp from any to 192.168.0.1 6881 
00511    0      0 allow tcp from any to 192.168.0.1 6882 
00512    0      0 allow tcp from any to 192.168.0.1 6883 
00513    0      0 allow tcp from any to 192.168.0.1 6884 
00514    0      0 allow tcp from any to 192.168.0.1 6885 
00515    0      0 allow tcp from any to 192.168.0.1 6886 
00516    0      0 allow tcp from any to 192.168.0.1 6887 
00517    0      0 allow tcp from any to 192.168.0.1 6888 
00518    0      0 allow tcp from any to 192.168.0.1 6889 
00618    0      0 allow tcp from any to x.x.x.x 53 setup 
00650    0      0 allow udp from any 68 to x.x.x.x 67 out xmit en0 
00651    0      0 allow udp from x.x.x.x to any 68 in recv en0 
00700    0      0 deny log logamount 2147483647 tcp from any to any in recv en0 setup 
00718    8    545 allow udp from any to 1.1.1.1 53 
00800    8    480 allow tcp from any to any setup 
00818    0      0 allow tcp from any to 2.2.2.2 53 setup 
00900   56   4362 allow ip from x.x.x.x to any 
00918    0      0 allow udp from any to x.x.x.x 53 
00920    0      0 allow icmp from any to any icmptype 0,3,8,11,12 
01018    8    686 allow udp from any 53 to any 
60000    4    948 deny log logamount 2147483647 ip from any to any 
65535 1215  80133 allow ip from any to any

위에서는, ipfw show 명령을 입력하면, 모든 규정들이 정상적으로 적용되었음을 나타내어 줍니다.

방화벽 규정 생성 스크립트의 시동 항목 파일 만들기

이렇게 해서 만들어진 방화벽 규정 생성 스크립트를 컴퓨터가 시동할 때마다 실행되게 하기 위해서는 시동 항목 파일을 만들어야 합니다.

1. 먼저, /Library/StartupItems/ 폴더에 Firewall 디렉토리를 생성하고, 방화벽 규정 생성 스크립트인 ipfw.rules를 생성한 Firewall 디렉토리에 복사합니다.

# mkdir /Library/StartupItems/Firewall
# cp /var/root/ipfw.rules /Library/StartupItems/Firewall

여기서, 저는 규정 파일을 /var/root/ 디렉토리에 생성했었습니다만, 만약 다른 곳에 저장하셨었다면, 그 곳에 있는 규정 파일을 옮기시면 됩니다.

2. 다음과 같이, 시동 스크립트 파일을 만듭니다. (여기서, 시동 스크립트의 파일 이름은 위치하고 있는 디렉토리의 이름과 같아야 합니다.)

# cd /Library/StartupItems/Firewall 
# vi Firewall

다음은 스크립트 파일의 내용입니다

#!/bin/sh
##
# Configure The Firewall
##
. /etc/rc.common
StartService () 
{ 
        sh /Library/StartupItems/Firewall/ipfw.rules 
} 
StopService () 
{ 
        return 0 
} 
RestartService () 
{ 
        return 0 
} 
RunService "$1"

이제, 다음과 같이 시동 스크립트 파일에 실행 권한을 부여합니다.

# chmod 755 Firewall

3. StartupParameters.plist 파일을 만들고 내용을 아래와 같이 입력합니다.

# vi StartupParameters.plist

StartupParameters.plist 파일 내용:

{ 
  Description     = "Firewall Rules"; 
  Provides        = ("Firewall"); 
  Requires        = ("Network Configuration"); 
  OrderPreference = "None"; 
}

마지막으로 컴퓨터를 재시동하게 되면, 방화벽 규정들이 적용되는 것을 시동 화면에서 확인하실 수 있습니다.
참고로, ipfw front-end인 BrickHouse를 사용하시면 위에서 설명된 규정들을 터미널을 사용할 필요 없이, 쉽고 간편하게 설정하실 수 있습니다. 그러고 보니, 벽돌 집은 불에 강하겠군요. wink

+ = ²