본문 바로가기

해봐야 안다.OTL/Linux

[리눅스] 방화벽(firewall)구축 및 운영

<리눅스 방화벽(firewall)구축 및 운영>

Rule Base

Condition(조건이 필요하다.)

à 어디에 적용할 건가, interface 정보, 대상, 상태 정보,

    Permit

    Deny

다 열어놨는데 상위에서 Deny했다면 전부 Deny이다.

다 열어놨는데 상위에서 Permit했다면 전부 열린다.

 

따라서 허용할거냐 말 거냐 어디다 적용할 거냐 순서는 이걸 다 적용한 다음 방화벽을 설치하고

네트워크를 연결한다.

<netfilter와 iptables>

<http://www.netfilter.org/>

리눅스/유닉스 방화벽

2.2 버전때는 ipchains(stateless) 였지만

2.4 버전부터 iptables(stateful) 방식으로

 

 

Iptables

안정적이다.

커널 기반의 방화벽 cpu까지 가기 전에 미리 다 처리를 한다.

 

*상태추적(stateful inspection)기능

*향상된 매칭 기능

*향상된 로깅 기능

*포트포워딩(port forwarding)기능 내장

 

방화벽은 커널 수준에서 작동하기 때문에 먼저 커널에서 방화벽이 작동할 수 있도록 설정되어야 한다.

2.4.x à Networking options à IP: Netfilter Configuration 선택

2.6.x à Networking à Networking options à [*] Networking packet filtering framework (Netfilter)

예전에는 커널을 재 컴파일해서 사용했지만 2.6버전 때부터는 모듈로 되어 있어 편하게 사용할 수 있다.

모듈: 시스템에 적재되어 있지만 메모리에는 올라가 있지 않고 사용할 때만 커널에 올라와 메모리에 적재되어 사용되는 것

 

모듈로 되어있다는 것 자체가 불러서 쓸 수 있다는 것.

[root@jo:~]#cd /usr/src

[root@jo:/usr/src]#

[root@jo:/usr/src]#cd kernels/2.6.18-128.el5-i686/

[root@jo:/usr/src/kernels/2.6.18-128.el5-i686]#ls

arch init mm scripts

block ipc Module.kabi security

crypto kabi_whitelist Module.markers sound

drivers kernel Module.symvers symsets-2.6.18-128.el5.tar.gz

fs lib net usr

include Makefile samples 

--

[root@jo:/usr/src/kernels/2.6.18-128.el5-i686]#make menuconfig

HOSTCC scripts/kconfig/conf.o

HOSTCC scripts/kconfig/kxgettext.o

HOSTCC scripts/kconfig/mconf.o

HOSTCC scripts/kconfig/zconf.tab.o

HOSTLD scripts/kconfig/mconf

HOSTCC scripts/kconfig/lxdialog/checklist.o

HOSTCC scripts/kconfig/lxdialog/inputbox.o

HOSTCC scripts/kconfig/lxdialog/lxdialog.o

HOSTCC scripts/kconfig/lxdialog/menubox.o

HOSTCC scripts/kconfig/lxdialog/msgbox.o

HOSTCC scripts/kconfig/lxdialog/textbox.o

HOSTCC scripts/kconfig/lxdialog/util.o

HOSTCC scripts/kconfig/lxdialog/yesno.o

HOSTLD scripts/kconfig/lxdialog/lxdialog

scripts/kconfig/mconf arch/i386/Kconfig

#

# configuration written to .config

#

*** End of Linux kernel configuration.

*** Execute 'make' to build the kernel or try 'make help'. 

--

상태추적에 대한 제공 여부를 선택하는 부분 NAT나 마스커레이딩을 이요할 때 필요

menu config 에서 체크하면 해당 모듈이 커널에 적재된다.

 

[root@jo:~]#cat /proc/net/ip_tables_matches

state

icmp

udp

tcp

커널에 올라가있는 것들

 

[root@jo:~]#yum update iptables à iptables update하기

예전 처럼 귀찮게 커널 컴파일 안 해도 된다. 하지만 고급 기능을 이용하기 위해서 커널 컴파일을 해야 한다.

 

Psd patch: 시스템의 tcp/udp포트 스캔을 탐지하여 차단하는 모듈 하지만 오탐율도 많고

현재는 쓰지 않는다.

 

<방화벽에서 패킷의 이동 경로>

<그림3:방화벽 흐름도>

 

NAT tables에는 두 가지 종류가 있다.

SNAT : 내가 출발 할 때 쓰는 것(postrouting)

DNAT : 내가 들어오는 것(prerouting)

 

NAT에는 총 3개의 chain이 있는데 2개의 chain만 쓴다.

 

postrouting : SNAT타겟과 매칭 되어 내부 네트워크에서 방화벽을 통해 외부로 나갈 때 사용

(사설 IP를 사용하면서 하나의 공인 IP로 공유하고자 할 때)

 

prerouting : DNAT타겟과 매칭되어 주로 외부에서 방화벽 내부 서버로 향하는 패킷을 방화벽이 보호하는 내부서버로 포워딩 할 때 사용(사설IP로 서버를 운영하면서 외부로 서비스를 하고자 할 때 사용)<참고:리눅스 서버 보안관리 실무 2nd, p344>

 

<iptables>

[root@jo:/]#iptables –help

 

Iptables 사용법1

Iptables [-t table 명] 명령어 [매칭옵션] [타겟]

-A, --apend chain rule-specification 지정 체인에 새로운 룰을 추가

-D, --delete chain rule-specification 지정 체인에서 일치하는 첫 번째 룰을 삭제

-D, --delete chain rulenum 지정 체인에서 특정 룰을 삭제

-I, --insert chain [rulenum] rule-specification 지정 체인에 [지정 위치에] 새로운 룰을 삽입

-R, --replace

-L, --list [chain] 지정 체인의 룰 목록을 출력

-F, --flush [chain] 지정 체인을 초기화

-Z, --zero [chain] 지정 체인의 패킷과 바이트 카운트를 0으로 설정

-N, --new-chain chain 새로운 체인 만들기

-X, --delete-chain [chain] 체인 삭제

-P, --policy chain target 지정 체인의 정책변경

-E, --rename-chain old-chain new-chain 체인의 이름 변경

-h, Help 출력

--

기본적으로 iptables 명령어로 삽입된 룰은 시스템 재 부팅하면 사라진다.

[root@jo:/]#service iptables save --> 하면 저장한다

Saving firewall rules to /etc/sysconfig/iptables: [ OK ].

--

[root@jo:/]#iptables -L

Chain INPUT (policy ACCEPT)

target prot opt source destination

 

Chain FORWARD (policy ACCEPT)

target prot opt source destination

 

Chain OUTPUT (policy ACCEPT)

target prot opt source destination

 

Chain RH-Firewall-1-INPUT (0 references) --> 룰을 자기가 만들 수 있다. 그 때 이걸 쓰는 거다.

target prot opt source destination 

--

 

<iptables 실습>

[root@jo:/]#iptables -I INPUT -p tcp --dport 22 -j DROP

룰적용 숫자값을 출력해준다.

접속테스트 결과 안된다. Iptables 로 25번 smtp 포트를 막았기 때문이다.

출력된 넘버값을 입력해 iptables에 적용된 룰을 삭제한다.

 

다시 xp에서 25번 포트로 접속해보니 된다.

 

[root@jo:~]#iptables -D INPUT -p tcp -m tcp --dport 25 -j DROP --> 특정 룰 삭제

 

[root@jo:~]#iptables -A INPUT -p tcp --dport 25 -j DROP --> 들어오는 포트"25"를 막는다.

 

[root@jo:~]#iptables -A OUPUT -p tcp --sport 25 -j DROP --> 나가는 포트"25"를 막는다

--

[root@jo:~]#iptables -L –n [어떤 포트인지 보여준다.]

Chain INPUT (policy ACCEPT)

target prot opt source destination

 

Chain FORWARD (policy ACCEPT)

target prot opt source destination

 

Chain OUTPUT (policy ACCEPT)

target prot opt source destination

DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:25

 

Chain RH-Firewall-1-INPUT (0 references)

target prot opt source destination 

[root@jo:~]#iptables -L -n --line

Chain INPUT (policy ACCEPT)

num target prot opt source destination

 

Chain FORWARD (policy ACCEPT)

num target prot opt source destination

 

Chain OUTPUT (policy ACCEPT)

num target prot opt source destination

 

1 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:25

 

Chain RH-Firewall-1-INPUT (0 references)

num target prot opt source destination 

--

[root@jo:~]#iptables -I INPUT -p tcp --dport 22 -j ACCEPT à나한테 들어오는 22번포트를 허용

[root@jo:~]#iptables -L

Chain INPUT (policy ACCEPT)

target prot opt source destination

ACCEPT tcp -- anywhere anywhere tcp dpt:ssh

.

[root@jo:~]#iptables -P INPUT DROP

[root@jo:~]#iptables -L

Chain INPUT (policy DROP)

target prot opt source destination

ACCEPT tcp -- anywhere anywhere tcp dpt:ssh

.

Chain FORWARD (policy ACCEPT)

target prot opt source destination

.

Chain OUTPUT (policy ACCEPT)

target prot opt source destination

.

Chain Custom1 (0 references)

target prot opt source destination

(이 룰에 없으면)전부다 드롭한다.

22번 포트는 허용

--

.방화벽 정책

OPEN

HALF OPEN

CLOSE

 

INPUT, OUTOUT 둘 다 적용해야 되는데 하나만(INPUT)만 적용했는데 적용이 된다.

왜?

default값으로 OUTPUT이 à Chain OUTPUT (policy ACCEPT) 되어있기 때문.

 

Iptables 사용법2

옵션

--proto [!] -p 프로토콜타입을 지정합니다(tcp/udp/icmp/all)

--source [!] -s 소스 어드레스를 지정합니다(address[/mask])

--destination [!] -d 타겟 어드레스를 지정합니다(address[/mask])

--in-interface -i 네트워크 인터페이스를 지정합니다.

--jump -j 타겟에 대한 룰을 지정합니다(accept/reject/drop)

--numeric -n 이 옵션을 지정하면 포트번호나 프로토콜 타입들이 숫자로 표시됩니다.

(이걸 지정하지 않으면 80번 포트는 http로, 25번 포트는 smtp처럼 표시됩니다)

--source-port --sport 소스 포트를 지정합니다.

--destination-port --dport 타겟 포트를 지정합니다.

--

커널 컨피그에서

"match" 라는 것이 iptables -m 옵션(match)으로 모듈로 불러 올 수 있다.

다른 사람이 내 서버로 22번 포트로 ssh 접속을 시도하는 것을 막아보자

[root@jo:~]#iptables -L

Chain INPUT (policy DROP)

target prot opt source destination

ACCEPT tcp -- anywhere anywhere tcp dpt:ssh

.

Chain FORWARD (policy ACCEPT)

target prot opt source destination

.

Chain OUTPUT (policy ACCEPT)

target prot opt source destination

.

Chain Custom1 (0 references)

target prot opt source destination

.

22번 포트에 대해 "anywhere" 다 허용하기 때문에

Iptables -I ß "-I" 옵션을 써서 새로 갈아 엎는다.

.

[root@jo:~]#iptables -I INPUT -p tcp -s ! 192.168.10.26 --dport 22 -j DROP

192.168.10.26 은 내 호스트 OS인 XP의 IP이다.

내가 접속하는 컴퓨터 빼고 접속하려는 모든 IP주소에 대해 22번 포트를 막는다.

--

기본적으로 필요한 포트를 열어준다.

[root@jo:~]#iptables -I INPUT -p tcp --sport 80 -j ACCEPT à HTTP 포트

[root@jo:~]#iptables -I INPUT -p tcp --sport 443 -j ACCEPT à HTTPS 포트

[root@jo:~]#iptables -I INPUT -p udp --sport 53 -j ACCEPT à DNS 포트

[root@jo:~]#iptables -I INPUT -p udp --dport 53 -j ACCEPT à DNS는 두 가지 내가 물어보는 것도 필요하다. DNS 설정을 현재 자신으로 했기 때문에

.

[root@jo:~]#iptables -L

Chain INPUT (policy ACCEPT)

target prot opt source destination

ACCEPT udp -- anywhere anywhere udp spt:domain

ACCEPT tcp -- anywhere anywhere tcp spt:https

ACCEPT tcp -- anywhere anywhere tcp spt:http

DROP tcp -- !192.168.10.26 anywhere tcp dpt:ssh

.

Chain FORWARD (policy ACCEPT)

target prot opt source destination

.

Chain OUTPUT (policy ACCEPT)

target prot opt source destination

.

Chain RH-Firewall-1-INPUT (0 references)

target prot opt source destination

 

[root@jo:~]#service iptables save --> 반드시 iptables 설정 후 해줘야 재 부팅시 안 사라진다.

Saving firewall rules to /etc/sysconfig/iptables: [ OK ]

--