레드햇 방화벽 (iptables) 설정법

-A INPUT -s 192.168.100.1 -p tcp -d 192.168.200.1 --dport 80 -j ACCEPT

-A 옵션은 append추가의 의미
-s packet이 날아 온 주소
-p protocol ( tcp, udp, icmp, etc )
-d packet이 날아 갈 주소
--dport 접속할 포트 ( 8080, 21, 23, etc )
-j 정책 ( ACCEPT or DROP )

방화벽에서 룰은 순서대로 적용됨
예를 들어

-A RH-Firewall-1-INPUT -p tcp --dport 21 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT

이렇게 설정 파일이 되어 있다면, 빨간 부분 아래의 룰은 적용되지 않는다.



iptables를 사용하기 위한 첫번째 단계는 iptables 서비스를 시작하는 것입니다. 다음 명령을 사용하시면 됩니다:

service iptables start

경고 경고
 

iptables 서비스를 사용하기 위해서는 다음 명령을 사용하여 ip6tables 서비스를 꺼야합니다:

service ip6tables stop
chkconfig ip6tables off

시스템이 부팅될 때마다 iptables가 기본으로 시작되도록 설정하시려면 chkconfig 명령을 사용하여 서비스의 런레벨 상태를 변경하셔야 합니다.

chkconfig --level 345 iptables on

iptables의 구문은 여러 부분으로 나뉘어지며, 중요한 부분은 chain 입니다. chain은 패킷이 조작될 상태를 지정하며 사용법은 다음과 같습니다:

iptables -A chain -j target

-A 옵션은 기존 규칙에 또 다른 규칙을 추가합니다. chain은 규칙에 사용될 chain의 이름입니다. iptables에 내장된 (즉, 네트워크를 지나가는 모든 패킷에 영향을 미치는) 3가지 chain은 INPUT, OUTPUT, FORWARD 입니다. 이 세가지 chain은 영구적이며 삭제 불가능합니다. -j target 옵션은 iptables에서 이 특정 규칙을 jump하도록 지시합니다. 명령에 내장된 타겟으로 ACCEPT, DROP, REJECT가 있습니다.

사용자 정의 chain이라고도 알려진 새로운 chain은 -N 옵션을 사용하여 생성 가능합니다. 새로운 chain을 생성하여 보다 정교하고 세밀한 규칙을 사용자 정의하실 수 있습니다.

7.2.1. 기본 방화벽 정책

기본 방화벽 정책을 세워놓으면 향후 보다 상세하고 사용자 정의된 규칙을 생성하는데 도움이 됩니다. iptables는 정책 (-P)을 사용하여 기본 규칙을 생성합니다. 관리자는 보안을 염두하여 일반적으로 모든 패킷을 드롭(drop)하며 상황 별로 특정 패킷을 허용하는 정책을 사용합니다. 다음은 네트워크 게이트웨이에서 들어오고 나가는 모든 패킷을 막는 규칙입니다:

iptables -P INPUT DROP
iptables -P OUTPUT DROP

추가로 전송 패킷(forwarded packets) — 방화벽에서 목적 시스템으로 라우팅될 네트워크 트래픽 — 을 거부하여 내부 클라이언트가 의도하지 않게 인터넷에 노출되는 것을 방지하시기를 권장합니다. 다음과 같은 규칙을 사용하시면 됩니다:

iptables -P FORWARD DROP 

정책 chain을 설정하신 후 특정 네트워크와 보안 요건에 맞는 새로운 규칙을 만들 수 있습니다. 다음 부분에서는 iptables 방화벽을 구축하는데 실행하실 일부 규칙들에 대하여 간단하게 설명해 보겠습니다.

7.2.2. iptables 규칙 저장 및 복구하기

방화벽 규칙은 컴퓨터가 켜져있는 동안에만 유효합니다. 만일 시스템이 재부팅되면 규칙이 자동으로 지워지고 재설정됩니다. 따라서 이후에도 똑같이 읽혀지도록 규칙을 저장하시려면 다음 명령을 사용하십시오:

/sbin/service iptables save

규칙이 /etc/sysconfig/iptables 파일에 저장되어 서비스가 시작되거나 재시작되며 컴퓨터가 재부팅될 때마다 동일하게 적용됩니다.



침입자들이 LAN에 침입하지 못하도록 하는 것이 네트워크 보안에서 가장 중요하지는 않아도 매우 중요한 부분입니다. 엄격한 방화벽 규칙을 사용하여 악의를 가진 원격 사용자가 LAN에 침입하는 것을 방지해야 합니다. 그러나 기본 정책이 들어오고 나가고, 전송되는 패킷을 모두 막도록 설정되어 있다면 방화벽/게이트웨이 및 내부 LAN 사용자는 서로 통신을 주고 받거나 외부와 통신을 주고 받을 수 없게 됩니다. 다라서 사용자들이 네트워크 관련 작업을 수행하고 네트워킹 프로그램을 사용할 수 있도록, 시스템 관리자는 통신에 사용되는 특정 포트를 열어두셔야 합니다.

예를 들어 방화벽에서 포트 80로의 액세스를 허용하시려면 다음 규칙을 추가하십시오:

iptables -A INPUT -p tcp -m tcp --sport 80 -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT 

이렇게 하시면 포트 80을 통하여 통신하는 웹사이트에서 일반 웹 브라우징이 가능해 집니다. 보안 웹사이트 (예, https://www.example.com/)로의 액세스를 허용하시려면 포트 443도 열어야 합니다.

iptables -A INPUT -p tcp -m tcp --sport 443 -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --dport 443 -j ACCEPT 

중요 중요
 

iptables 규칙을 만드실 때는 순서가 매우 중요합니다. 예를 들어 만일 chain에서 로컬 192.168.100.0/24 서브넷에서 들어오는 모든 패킷을 drop하도록 지정하신 후 (drop 하도록 지정된 서브넷에 포함되는) 192.168.100.13에서 들어오는 패킷을 모드 허용하는 chain (-A)을 그 후에 추가하시면 뒤에 추가된 추가 규칙이 무시됩니다. 먼저 192.168.100.13를 허용하는 규칙을 설정하신 후 서브넷을 drop하는 규칙을 설정하셔야 합니다.

기존 chain 규칙에 새로운 규칙을 넣으시려면 -I 옵션 다음에 규칙을 삽입할 chain 이름과 규칙이 위치할 번호 (1,2,3,...,n)를 입력하십시오. 예를 들면:

iptables -I INPUT 1 -i lo -p all -j ACCEPT

이 규칙은 INPUT chain의 첫번째 규칙으로 삽입되어 로컬 룹백 장치 트래픽을 허용할 것입니다.

가끔씩 외부에서 LAN에 원격 접속을 해야할 경우도 있습니다. LAN 서비스로 암호화된 원격 접속을 위해 SSH와 같은 보안 서비스를 사용하실 수 있습니다. PPP 기반 자원 (예, 모뎀 뱅크 또는 대량 ISP 계정)을 사용하시는 관리자는 다이얼업 액세스를 사용하여 방화벽을 안전하게 통과하실 수 있습니다. 그 이유는 모뎀 연결은 일반적으로 직접적인 연결이므로 방화벽/게이트웨이를 통과할 수 있습니다. 그러나 초고속 접속을 사용하시는 원격 사용자의 경우 특별한 설정이 가능합니다. iptables가 원격 SSH 클라이언트에서 들어오는 접속을 허용하도록 설정하실 수 있습니다. 예를 들어 원격 SSH 액세스를 허용하시려면 다음과 같은 규칙을 사용하실 수 있습니다:

iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p udp --sport 22 -j ACCEPT

다른 서비스에도 규칙을 지정하셔야할 경우가 있습니다. Red Hat Enterprise Linux 참조 가이드에서 iptables 및 함께 사용 가능한 다양한 옵션에 대한 광범위한 정보를 찾으실 수 있습니다.

이러한 규칙은 방화벽 상에서 일반 보안 서비스에 액세스할 수 있게 허용하지만, 방화벽으로 보호된 시스템은 이러한 서비스에 액세스할 수 없습니다. LAN에서 이러한 서비스에 액세스할 수 있도록 허용하시려면 iptables 필터링 규칙에 NAT을 사용하시면 됩니다.


대부분의 기업체는 ISP에서 제한된 숫자의 공공 IP 주소를 할당받았습니다. 따라서 관리자는 부족한 IP 주소를 LAN 상의 모든 시스템에 주지 않고서도 인터넷 서비스에 액세스를 공유할 수 있는 방법을 강구해내야 합니다. LAN 상의 모든 시스템이 내부 및 외부 네트워크 서비스에 적절히 액세스할 수 있도록 하는데 사설 IP 주소를 사용하는 방법이 가장 많이 사용되고 있습니다. 방화벽과 같은 Edge 라우터는 인터넷으로부터 들어오는 전송을 받고 그 패킷을 목적 LAN 시스템으로 라우팅해줍니다; 동시에 방화벽/게이트웨이는 또한 LAN 시스템으로부터 외부로 향하는 요청을 받아 원격 인터넷 서비스로 라우팅할 수도 있습니다. 이렇게 네트워크 트래픽을 전송하는 것이 워험할 경우가 있습니다. 특히 최신 크래킹 도구를 사용하여 내부 IP 주소인 것처럼하여 원격 침입자의 컴퓨터가 마치 기업체 LAN에 위치한 것처럼 작업할 가능성이 있기 때문에 더욱 그러합니다. 이러한 상황이 발생하는 것을 방지하기 위하여, iptables는 네트워크 자원이 악용되는 것을 방지할 수 있는 라우팅 및 전송 정책을 제공합니다.

관리자는 FORWARD 정책을 사용하여 LAN에서 패킷이 전송될 위치를 제어할 수 있습니다. 예를 들면 전체 LAN으로 전송을 허용하려면 다음과 같은 규칙을 설정하시면 됩니다 (방화벽/게이트웨이의 내부 IP 주소가 eth1 상에 위치한다고 가정합니다):

iptables -A FORWARD -i eth1 -j ACCEPT
iptables -A FORWARD -o eth1 -j ACCEPT

이 규칙은 방화벽/게이트웨이 뒤에 위치한 시스템이 내부 네트워크에 접근할 수 있도록 설정합니다. 게이트웨이는 한 LAN 네트워크로부터 들어오는 모든 패킷을 eth1 장치를 통해 대상 네트워크로 라우팅할 것입니다.

알림 알림
 

기본으로 Red Hat Enterprise Linux 커널의 IPv4 정책은 Red Hat Enterprise Linux를 운용하는 시스템이 전용 edge 라우터로 작동하는 것을 방지하기 위하여 IP 전송 지원을 비활성화 합니다. IP 전송을 활성화하시려면 다음 명령을 실행하십시오:

sysctl -w net.ipv4.ip_forward=1

만일 이 명령을 쉘 프롬프트에서 실행하시면 시스템을 재부팅하시는 경우 설정이 남아있지 않습니다. 영구적으로 설정을 보존하시려면/etc/sysctl.conf 파일에서 전송을 설정하시면 됩니다. 다음 줄을 찾아서 0을 1로 변경하시기 바랍니다:

net.ipv4.ip_forward = 0

다음 명령을 실행하여 sysctl.conf 파일의 변경 사항이 활성화되도록 하십시오:

sysctl -p /etc/sysctl.conf

이렇게 함으로서 LAN 상의 시스템들이 서로 통신할 수 있게 됩니다; 그러나 인터넷과 같은 외부 시스템과의 통신은 허용되지 않습니다. LAN 상의 시스템이 가상 IP 주소를 가지고 외부 공중 네트워크와 통신할 수 있도록 허용하시려면, LAN 시스템에서 외부로 향하는 요청이 방화벽 외부 장치(이 예시에서는 eth0)의 IP 주소로 나가도록 방화벽에 IP masquerading 기능을 설정하십시오:

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

이 규칙은 NAT 패킷 매칭표(matching table) (-t nat)을 사용하며 방화벽 외부 네트워킹 장치 (-o eth0)에서 NAT에 내장된 POSTROUTING chain을 (-A POSTROUTING) 지정합니다. POSTROUTING을 사용할 경우 패킷이 방화벽의 외부 장치를 떠날때 변경됩니다. -j MASQUERADE 옵션은 컴퓨터의 사설 IP 주소를 방화벽/게이트웨이의 외부 IP 주소로 바꾸기 위해 사용되었습니다.

내부 네트워크에 위치한 서버를 외부에서 사용 가능하도록 설정하시려면 NAT의 PREROUTING chain에 -j DNAT 옵션을 사용하여 내부 서비스로 접속을 요청하는 들어오는 패킷을 전송할 수신 IP 주소와 포트 번호를 지정할 수 있습니다. 예를 들어 HTTP 요청이 들어올 경우 전용 Apache HTTP 서버 서버 시스템의 주소 172.31.0.23으로 전송하려면, 다음과 같은 명령을 입력하시면 됩니다:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT \
      --to 172.31.0.23:80

이 규칙은 NAT 테이블이 내장된 PREROUTING chain을 사용하여 들어오는 HTTP 요청을 모두 수신 IP 주소 172.31.0.23으로 전송합니다.

알림 알림
 

FORWARD chain에 기본 DROP 정책을 지정하셨다면, 수신 NAT 라우팅이 가능하도록 들어오는 HTTP 요청 전송을 허가하는 규칙을 첨가하셔야 합니다.

iptables -A FORWARD -i eth0 -p tcp --dport 80 -d 172.31.0.23 -j ACCEPT

이렇게 설정하시면 방화벽 외부에서 들어오는 HTTP 요청을 방화벽 내부에 위치한 목적 Apache HTTP 서버 서버로 전송 가능합니다.

7.4.1. DMZ과 iptables

iptables 규칙을 설정시 특정 시스템, 예를 들면 전용 HTTP 또는 FTP 서버로, 특히 가능하다면 내부 네트워크에서 격리된 DMZ (demilitarized zone: 비무장 지대)에 위치한 서버로 트래픽을 라우팅하도록 설정 가능합니다. 들어오는 모든 HTTP 요청을 (LAN의 192.168.1.0/24 범위에서 벗어난) IP 주소가 10.0.4.2이고 포트 80에 위치한 전용 HTTP 서버로 라우팅할 규칙을 설정하시면, 네트워크 주소 변환 (NAT)은 패킷을 적절한 목적지로 전송하기 위해 PREROUTING 표를 호출합니다:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT \
	    --to-destination 10.0.4.2:80

이 명령을 사용하시면 LAN 외부에서 포트 80으로 들어오는 모든 HTTP 연결이 내부 네트워크에서 격리된 별개의 네트워크 상에 위치한 HTTP 서버로 라우팅됩니다. 이렇게 네트워크를 분리하는 것이 동일한 네트워크 상에 위치한 기계에 HTTP 연결을 허용하는 것보다 훨씬 안전합니다. 만일 HTTP 서버가 보안 연결을 허용하도록 설정되었다면, 포트 443도 전송(forward)하셔야 합니다.



보다 정교한 규칙을 세워 LAN 상에서 특정 서브넷이나 심지어는 특정 시스템으로 액세스를 제어하는 것도 가능합니다. 트로이 목마(trojans), 컴퓨터 웜(worms)이나 다른 클라이언트/서버 바이러스와 같은 수상한 서비스가 서버에 접속하는 것을 방지하는 규칙을 설정하실 수도 있습니다. 예를 들어 31337에서 31340까지 포트 (크래킹 용어로 elite포트라고 부릅니다)에서 네트워크를 스캔하여 서비스를 찾아내는 트로이 목마 침투 유형이 있습니다. 이러한 비표준 포트를 통해 통신하는 적당한 서비스가 없으므로 이 포트를 닫으시면 네트워크 상에서 바이러스 침입 당한 컴퓨터가 원격 마스터 서버와 독립적으로 통신을 주고 받을 가능성을 줄일 수 있습니다.

iptables -A OUTPUT -o eth0 -p tcp --dport 31337 --sport 31337 -j DROP
iptables -A FORWARD -o eth0 -p tcp --dport 31337 --sport 31337 -j DROP

또한 외부에서 사설 IP 주소 범위에 속하는 가짜 주소를 사용하여 LAN에 침투하려는 시도를 막는 규칙을 설정하는 것도 가능합니다. 예를 들어 LAN의 IP 주소 범위가 192.168.1.0/24인 경우 인터넷에 접속된 네트워크 장치 (예, eth0)가 이 LAN IP 범위 내의 주소를 가진 장치로 들어오는 모든 패킷을 드롭하도록 설정 가능합니다. 전송된 패킷을 거부하는 규칙을 기본으로 설정하시도록 권장되었으므로 외부 네트워크와 접촉하는 장치 (eth0) 장치로 들어오는 가짜 IP 주소는 자동으로 거부될 것입니다.

iptables -A FORWARD -s 192.168.1.0/24 -i eth0 -j DROP

알림 알림
 

규칙을 추가시 REJECT 하는 것과 DROP 하는 것의 차이를 아셔야 합니다. REJECT는 서비스에 접속하려는 사용자의 액세스를 거부하고 connection refused라는 오류 메시지를 보여주는 반면 DROP은 말 그대로 telnet 사용자에게 어떠한 경고 메시지도 보여주지 않은 채 패킷을 드롭합니다. 관리자의 재량껏 이러한 규칙을 사용할 수 있지만 사용자가 혼란스러워하며 계속해서 접속을 시도하는 것을 방지하시려면 REJECT를 사용하시는 것이 좋습니다.


방식은 연결 상태를 표에 저장하기 때문에, 다음과 같은 연결 상태에 따라서 시스템 관리자가 연결을 허용하거나 거부할 수 있습니다:

  • NEW — 새로운 연결을 요청하는 패킷, 예, HTTP 요청

  • ESTABLISHED — 기존 연결의 일부인 패킷

  • RELATED — 기존 연결에 속하지만 새로운 연결을 요청하는 패킷, 예를 들면 접속 포트가 20인 수동 FTP의 경우 전송 포트는 사용되지 않은 1024 이상의 어느 포트라도 사용 가능합니다.

  • INVALID — 연결 추적표에서 어디 연결에도 속하지 않은 패킷.

상태에 기반(stateful)한 iptables 연결 추적 기능은 어느 네트워크 프로토콜에서나 사용 가능합니다. UDP와 같이 상태를 저장하지 않는 (stateless) 프로토콜에서도 사용할 수 있습니다. 다음 예시에서는 기존 연결(established)과 관련된 패킷만 전송하는 연결 추적 방식을 사용하는 규칙을 보여줍니다:

iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ALLOW

저작자 표시
신고