-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Lim
committed
Feb 28, 2024
1 parent
c668f3a
commit a44870e
Showing
1 changed file
with
186 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,186 @@ | ||
### 10.1.3 리눅스 방화벽 정책 확인 | ||
|
||
``` | ||
// iptables의 설정값을 확인하는 명령은 -L (--list) 옵션을 사용 | ||
$ iptables -L | ||
``` | ||
|
||
``` | ||
ACCEPT all-- anywhere anywhere state RELATED, ESTABLISHED | ||
``` | ||
|
||
- INPUT 체인 1번 정책 | ||
- 첫 번째 허용 정책을 보면 RELATED, ESTABLISHED 상태인 모든 출발지에 대해 허용하도록 룰이 설정되어 있음 | ||
- 이미 세션이 맺어져 있거나(ESTABLISHED) 연계된 세션이 있을 때, 어떤 출발지나 목적지인 패킷이더라도 허용하는 정책 | ||
- FTP는 원시적인 프로토콜이어서 컨트롤 프로토콜과 데이터 프로토콜이 별도로 동작 | ||
- 처음 연결된 이후 로그온, 항목 리스트 등의 실제 파일을 다운로드하기 전까지 컨트롤 프로토콜을 사용하고 실제로 데이터 다운로드 명령이 내려지면 별도로 세션을 만들어 다운로드를 시작 | ||
- 두 개의 연결이 별도로 이루어지다보니 방화벽 입장에서는 이 두 개의 연결을 연계시키지 못하면 제대로 통신을 할 수 없음 | ||
- RELATE state를 이용해 이 두 가지의 연결을 하나로 간두하게 됨 | ||
|
||
``` | ||
ACCEPT icmp-- anywhere anywhere | ||
``` | ||
|
||
- INPUT 체인 2번 정책 | ||
- ICMP에 대한 허용 정책 | ||
- 이 정책을 통해 ping과 같은 서비스를 사용할 수 있음 | ||
|
||
``` | ||
ACCEPT tcp-- anywhere anywhere state NEW tcp dpt:ssh | ||
``` | ||
|
||
- INPUT 체인 4번 정책 | ||
- 신규 세션인 NEW state 중 목적지 서비스 포트가 SSH인 경우만 허용 | ||
- 간단히 표현하면 외부에서 서버로 SSH(22) 접속을 허용하는 정책 | ||
|
||
``` | ||
REJECT all-- anywhere anywhere reject-with icmp-host-prohibited | ||
``` | ||
|
||
- INPUT 체인 5번 정책 | ||
- 다섯 번째 정책은 위의 첫 번째부터 네 번째 정책에 매치되지 않은 패킷들을 차단하는 정책 | ||
- INPUT 체인 자체는 기본 정책이 ACCEPT로 선언되어 있지만 이 정책 때문에 화이트리스트 기반 방화벽처럼 동작하게 됨 | ||
- REJECT는 곧바로 폐기하는 DROP과 달리 ICMP 프로토콜을 이용해 패킷 차단 이유를 출발지에 전달 | ||
- iptables의 기본 룰에서는 icmp-host-prohibited 메시지를 이용해 해당 패킷이 차단되었음을 알려줌 | ||
|
||
``` | ||
ACCEPT all-- anywhere anywhere | ||
``` | ||
|
||
- INPUT 체인 3번 정책 | ||
- iptables -L의 내용만으로 보면 모든 출발지의 모든 트래픽에 대해 허용하므로 마치 Any Open 정책처럼 보임 | ||
- 하지만 실제로 외부에서 들어오는 패킷은 해당 정책을 거치지 않고 최하단의 DROP 정책에서 대부분 걸러짐 | ||
- iptables 설정확인 | ||
|
||
``` | ||
$ iptables -S | ||
``` | ||
|
||
- 모든 정책에 대해 허용하는 것으로 되어 있지만 실제로 해당 정책이 적용되는 인터페이스가 루프백 인터페이스(lo)임을 알 수 있음 | ||
- 실제 정책이 어떻게 정의되어 있는지 확인하려면 -S이나 iptables 파일을 직접 확인해야 함 | ||
|
||
### 10.1.4 리눅스 방화벽 관리 | ||
|
||
- iptables에 웹 서비스가 가능하도록 http 서비스 포트를 열어주는 정책 추가 | ||
|
||
``` | ||
$ iptables -A INPUT -p tcp --dport 80 -j ACCEPT | ||
``` | ||
|
||
- 정책을 추가하려면 -A나 --append 옵션을 사용 | ||
- 옵션 뒤에는 어떤 체인에 적용할 것인지를 지정 | ||
- 체인명 뒤에는 넣을 정책을 정의 | ||
- 프로토콜을 지정하기 위해 -p(또는 --protocol) 옵션을 사용 | ||
- 목적지 포트를 제어하기 위해 --dport 옵션을 사용 | ||
- 출발지 포트는 --sport 옵션을 사용 | ||
- 출발지나 목적지의 IP 주소를 제어하기 위해 -s(또는 --source), -d(--destination) 옵션을 사용 | ||
- IP 주소 설정을 별도로 하지 않으면 anywhere로 적용 | ||
- 정책에 일치하는 패킷을 어떻게 처리할 것인지를 정하는 타깃 지정은 -j 옵션 사용 | ||
- iptables의 정책 삭제는 -A 대신 -D나 --delete 옵션을 사용 | ||
|
||
``` | ||
$ iptables -D INPUT -p tcp --dport 21 -j ACCEPT | ||
``` | ||
|
||
- 정책이 너무 많을 때는 -L 옵션으로 일치하는 정책이 있는지 확인하기 어려우므로 -C나 --check 옵션을 사용해 해당 정책이 있는지 확인할 수 있음 | ||
|
||
``` | ||
$ iptables -C INPUT -p tcp --dport 21 -j ACCEPT | ||
``` | ||
|
||
- 특정 위치에 정책을 추가하려면 정책의 줄 번호를 지정해야 함 | ||
- 기본 정책 확인 명령어로는 방화벽 정책의 줄 번호를 확인할 수 없으므로 -L 옵션 뒤에 --line-number 옵션을 추가해 현재 정책의 줄 번호를 확인 | ||
|
||
``` | ||
$ iptables -L --line-number | ||
``` | ||
|
||
- 기존 tables에 추가할 때는 -A 옵션을 사용했지만 특정 위치에 정책을 추가하기 위해서는 -I나 --insert 옵션을 사용 | ||
|
||
``` | ||
$ iptables -I INPUT 5 -p tcp --dport 80 -j ACCEPT | ||
``` | ||
|
||
- 특정 서비스 포트에 대해 특정 IP만 허용 | ||
|
||
``` | ||
$ iptables -A INPUT -i eth0 -p tcp -s 172.16.10.10/32 --dport 22 -j ACCEPT | ||
$ iptables -A INPUT -i eth0 -p tcp --dport 22 -j DROP | ||
``` | ||
|
||
- IP 주소를 범위로 지정 | ||
|
||
``` | ||
$ iptables -A INPUT -p all -m iprange --src-range 192.168.0.0-192.168.255.255 -j DROP | ||
``` | ||
|
||
- iptable에서 주소를 범위로 지정하는 방법 | ||
|
||
``` | ||
-m iprange --src-range 시작 IP 주소-끝 IP 주소 | ||
-m iprange --dst-range 시작 IP 주소-끝 IP 주소 | ||
``` | ||
|
||
- 서비스 포트를 범위로 지정 | ||
|
||
``` | ||
$ iptables -A INPUT -p tcp -m multiport --dport 3001:3010 -j DROP | ||
``` | ||
|
||
- -F 옵션을 사용하면 iptables에 적용된 정책을 한꺼번에 삭제 가능 | ||
|
||
``` | ||
$ iptables -F | ||
$ iptables --flush | ||
``` | ||
|
||
- -p 옵션은 각 체인의 기본 정책을 변경 | ||
|
||
``` | ||
$ iptables -P INPUT DROP | ||
$ iptables -P FOWARD DROP | ||
$ iptables -P OUTPUT DROP | ||
``` | ||
|
||
- iptables 정책 파일은 다음의 위치에 있음 | ||
|
||
``` | ||
/etc/sysconfig/iptables | ||
``` | ||
|
||
### 10.1.5 리눅스 방화벽 로그 확인 | ||
|
||
- iptables도 일반 방화벽과 마찬가지로 로그를 통해 iptables 정책에 의해 차단되거나 허용된 내용을 확인할 수 있음 | ||
- iptables의 로그는 /var/log/messages에 남으므로 메시지 파일을 보려면 다음과 같이 로그 내용을 확인할 수 있음 | ||
|
||
``` | ||
$ tail -f /var/log/messages | ||
``` | ||
|
||
- 하지만 메시지 파일에는 iptables 로그 외에 다른 로그들도 포함되어 있음 | ||
- iptables 로그만 확인하려면 다음과 같은 설정이 필요 | ||
- rsyslog.conf 파일에 다음과 같이 추가 | ||
|
||
``` | ||
kern.* /var/log/iptables.log | ||
``` | ||
|
||
- rsyslog 서비스를 재시작 | ||
|
||
``` | ||
$ systemctl restart rsyslog.service | ||
``` | ||
|
||
- warning 수준의 로그를 남기기 위해 log-level을 4로 하고 로그를 구분하는 식별자 추가 | ||
|
||
``` | ||
$ iptables -I INPUT LOG --log-level 4 --log-prefix '## ZIGI-Log ## | ||
``` | ||
|
||
- --log-prefix 옵션을 사용하지 않아도 로그를 남길 수 있지만 prefix를 정해두면 로그를 구분할 수 있음 | ||
- iptables 정책을 확인하는 -L 옵션 뒤에 -v 옵션을 사용하면 통과하는 패킷과 바이트 수를 확인할 수 있음 | ||
|
||
``` | ||
$ iptables -L -v | ||
``` |