안녕하세요. 명월입니다.
이번 포스팅에서는 리눅스 방화벽 정책에 대하 포스팅하겠습니다. 개발을 하다보면 방화벽에 신경을 쓸일이 많습니다. 특히 네트워크 개발자라면 방화벽이랑 아주 밀접한 경우가 많습니다. 예를 들면 내가 소켓만들어 포트를 열었는데 방화벽 정책으로 막혀있는데 그것도 모르고 한참 소스를 해맨 경우가 많습니다.
그래서 네트워크 개발을 하기위해선 방화벽 정책에 대해 공부를 해야 하고 알고 넘어가야 하겠습니다.
시중에 있는 모든 방화벽을 보지는 못했으나 제가 경험상 리눅스 방화벽이 가장 많이 쓰이고 보편적인 것 같습니다. 윈도우 방화벽도 있는데 윈도우 방화벽은 소프트웨어적인 느낌이 강하기 때문에 조금은 제 역할을 못할 것 같은 느낌이 있습니다. (실제로는 윈도우 방화벽도 매우 강력하다고 합니다. 검증되지 않는 제 느낌일 뿐입니다.)
그러나 리눅스 방화벽은 INPUT ,OUTPUT, FORWARD 로 구성되어 좀 더 하드웨어적인 느낌의 방화벽 같습니다. 그럼 자세히 알아보겠습니다.
일단 리눅스에 접속을 하셔서 setup으로 방화벽이 실행 중 인지 확인해 보겠습니다.
두번째 방화벽 설정으로 들어가서 보완수준을 활성화로 변경하겠습니다.
SELinux 도 보완 프로그램의 일종으로써 침입자가 root 권한을 획득시 모든 시스템이 일시에 크랙 될수 있는 위험성을 줄인 프로그램으로써 이건 조금 복잡하니 다음 포스팅때 다루어 보도록하겠습니다.
그리고 커맨드에서 iptables -h로 일단 iptables의 명령어를 확인 해 보록하겠습니다.
시작에 앞서 명령에 대해 알아보겠습니다.
iptables 기본형식 (iptables --help 치면 나옵니다)
명령어 | 설명 |
---|---|
Iptables -A chain | 새로운 규칙을 추가 |
iptables -D chain | 규칙을 삭제 |
iptables -C chain | 룰의 존재 확인 |
iptables -I chain | 새로운 규칙을 삽입 |
iptables -R chain | 새로운 규칙을 교체 |
iptables -L | 모든 규칙을 출력 |
iptables -F | 모든 규칙을 삭제 |
iptables -Z | 모든 체인의 패킷과 바이트 바운터 값을 0으로 만듬. |
iptables -N | 새로운 체인을 만듬. |
iptables -X | 체인을 삭제함. |
iptables -P | 기본 정책을 변경함. |
Option | |
-p | 패킷의 프로토콜의 포트번호 또는 이름을 명시함. |
-s | 패킷의 발신지를 명시. |
-d | 패킷의 도착지를 명시. |
-i | 규칙을 적용한 인터페이스 이름을 명시. |
-j | 규칙에 맞는 패킷을 어떻게 처리할 것인가를 명시. |
-y | 접속 요청 패킷인 SYN패킷을 허용하지 않음. |
-f | 두 번째 이후의 조각에 대해서 규칙을 명시. |
설명이 꽤 복잡합니다. 역시 설명보다는 하나의 예시로 보이는게 이해가 빠르기에 예제하나 살펴보겠습니다.
우선 명령어 iptables -L 로 체인의 상태를 확인하겠습니다.
위에 보이면 Chain INPUT, Chain FORWARD, Chain OUPUT, Chain RH_Firewall-1-INPUT 보입니다.
먼저 INPUT,FORWARD,OUTPUT chain은 INPUT 들어오는 패킷 FORWARD는 지나가는 패킷,OUTPUT은 나가는 패킷을 통제하는 것입니다.
즉 웹서버 80포트를 통제하고 싶으면 INPUT , OUTPUT 을 둘 중하나만 막아도 막히는 것이지요.
INPUT을 막으면 최초 들어오지도 않을 것이고 OUPUT만 막으면 패킷이 들어오기는 하겠으나 송출이 되지 않을 것입니다. 그러나 보통 통신을 하게 되면 INPUT을 막게 됩니다. 왜냐하면 해커들은 일단 침투해서 변조를 일으켜 버릴수 있기 때문에 보통은 OUTPUT 보다는 INPUT 을 막게 됩니다. 그러나 OUTPUT 을 안쓰는 것도 아닙니다. 누군가가 정보유출을 목적으로 사용자가 들어왔으면(해커가 아닌 내부) 그런 사람을 위해서는 OUTPUT 을 막는게 맞겠지요.
FORWARD 는 보통 리눅스를 허브로 사용할때 사용하는 것으로 패킷의 목적지가 리눅스가 아닌 중간자일 떄 사용되는 것입니다. 실제로 리눅스 방화벽을 올리게 되면 이 영역을 많이 사용하게 되겠습니다.
가장 밑의 Chain RH_Firewall-1-INPUT 이라고 있습니다. 맨 뒤에 INPUT 이 붙은거 보니 INPUT 방화벽과 관계가 있는 것 같습니다. RH_Firewall 이란 뭐 특별한 의미를 두는게 아니고 그룹이라고 생각하시는게 빠릅니다.
즉, 리눅스는 서버 특성상 여러사람이 한컴퓨터에 사용하는 멀티사용자가 가능한데 각각 각자의 생각으로 방화벽을 다 올려버린다면 방화벽 정책이 꼬이겠지요. 즉, A라는 사용자는 8090을 막았는데 B라는 사용자그 그 포트를 사용하고 있었다면 문제가 되겠지요 그 걸 완화 하기 위한 그룹형식의 방화정책이라고 생각하시면 됩니다.
대형 프로젝트에서나 사용할까 대형 프로젝트에서는 리눅스 방화벽이 아닌 정말 물리적인 방화벽을 사용하겠지요.
그러니 그룹체인 정도는 거의 사용할 일이 없으니 그냥 INPUT에 정책을 새기셔도 무방할 듯 싶습니다.
설명은 이 정도 이고 ICMP를 막는 예제를 하나 보여드리도록 하겠습니다.
명령어는 iptables -A OUTPUT -p icmp -j DROP 으로서
iptables에서 OUTPUT 에 -A는 등록합니다
-P Protocal은 icmp
-j DROP 을 겁니다.
(※ DROP - 은 포트를 막는 키워드입니다. 반대 키워드는 ACCEPT 입니다.)
OUTPUT 체인에 DROP 으로 생겼습니다.
제 컴퓨터에 PING을 쳐서 알아본 결과 위에까지는 핑이 잘 나오던게 갑자기 막혔습니다. ICMP를 막았기 때문입니다.
반대로 체인을 지워 보겠습니다.
참고 사항
예를 들면 제 컴퓨터가 192.168.0.30의 아이피라고 하면 ICMP의 도착지는 제 컴퓨터이니 -d의 정책을 넣어서 막아야 합니다.
즉, iptables -A output -p ICMP -d 192.168.0.30 -j DROP 이런 식입니다.
만약 출발지로 잘 못 이해하여 iptables -A output -p ICMP -s 192.168.0.30 -j DROP 이렇게 하면 전혀 막히지 않기 때문입니다. 저도 가끔 헤갈려서 거꾸로 사용하는 경우가 있는데 이점을 주의해야 하겠습니다.
전혀 막히지가 않았습니다. ^^ 주의해 주세요.
'Development note > Linux' 카테고리의 다른 글
[CentOS] Plex 설치 (0) | 2019.05.19 |
---|---|
[CentOS] 네트워크 드라이브, Samba 설정하기 (0) | 2019.05.19 |
[CentOS] 레드마인 설치하기 (0) | 2019.05.15 |
[CentOS] Wheel 권한 설정 (0) | 2019.05.14 |
[CentOS] Vim 편집기 설치하기 (0) | 2019.05.14 |
[CentOS] apache-tomcat 연동하기 (0) | 2019.05.13 |
[Linux] Mysql, PHP 연동 (1) | 2012.09.21 |
[Linux] Putty 파일 (0) | 2012.09.17 |