■ iptables
- 설정파일 : /etc/sysconfig/iptables
- 설정복구 : iptables-restore < 백업파일 (내부적으로 설정파일에 덮어 씀)
- 설정저장 : /etc/init.d/iptables save (수정 내용을 설정파일에 저장)
(내부적으로는 iptables-save > /etc/sysconfig/iptables 하여 영구반영)
- 설정백업 : iptables-save (설정 파일내용이 출력됨)
■ system-config-firewall / system-config-firewall-tui
- GUI 및 TUI 를 통하여 리눅스 방화벽 설정. 내부적으로는 iptable 이용.
- 따라서 system-config-firewall 사용시 iptables 명령어를 이용하여
작업한 내용은 삭제됨.
- 설정파일 : /etc/sysconfig/system-config-firewall
# cat /etc/sysconfig/system-config-firewall
# Configuration file for system-config-firewall
--enabled
--port=2222:tcp
--port=5900-5902:tcp
--service=dns
■ iptables VS system-config-firewall
- system-config-firewall 은 GUI 및 TUI 를 이용하여 편리하게 방화벽 셋팅
- “적용” 클릭시 iptables 에 방화벽 룰 자동 셋팅
- 따라서 적용시 iptables 명령어를 이용하여 작업한 내용은 삭제됨.
-> system-config-firewall 수정 -> 적용 -> iptables 반영
- iptable을 직접 사용시 system-config-firewall 사용으로 인한 덮어씀 방지
(패키지 삭제: yum remove system-config-firewall.noarch
system-config-firewall-base.noarch
system-config-firewall-tui.noarch )
- 간단 수정 - > system-config-firewall, 전문가 -> iptables 사용
■ iptables Rule
* 기본 명령어
-A(--append) : 규칙을 추가한다.
-N(--new-chain) : 새로운 체인 생성
-X(--delete-chain) : 체인 제거
-P(--policy) : 체인 기본정책 변경
-L(--list) : 체인의 규칙상태 보기
-F(--flush) : 체인내의 모든 규칙 제거(방화벽 초기화)
-Z(--zero) : 체인내의 모든 규칙의 패킷과 바이트의 카운트 초기화
-D(--delete) : 규칙을 삭제
-R(--replace) : 새로운 규칙으로 대체
-I(--insert) : 체인의 가장 처음에 규칙을 추가한다.
-E(--rename-chain) : 체인의 이름을 변경한다.
* 확인 : iptables -L -n -v --line-numbers
-L : 리스트
-n : PORT를 이름이 아닌 숫자로 표현
-v : 자세한 출력(인터페이스 장비까지 나옴)
--line-numbers : 정책번호 출력(삽입,삭제시 인덱스로 유용)
* iptables 체인의 종류
INPUT : 로컬로 들어오는 패킷(입력 패킷)
FORWARD : INPUT와 OUTPUT 역할, 라우터에 방화벽을 적용할 때 쓰임
OUTPUT : 외부로 나가는 패킷(출력 패킷)
* 사용자 정의 체인 생성 및 INPUT 체인에 추가(옵션)
# iptables -N 사용자정의체인명
# iptables -A INPUT -j 사용자정의체인명
-> 사용자 정의 체인을 설정하고 모든 INPUT 을 사용자 정의 체인으로 보냄
-> 향후 등록시 -> iptables -A 사용자정의체인명 -s IP -d IP -j ACCEPT
* 기타 사항
- 최근 버전의 iptables 는 state(NEW,ESTABLISHED,RELATED) 지원
- iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited
: 모든 입력을 차단
: --reject-with icmp-host-prohibited 있으면 connection denied 통보
: --reject-with icmp-host-prohibited 없으면 connection timeout 발생
■ 정책 적용 방법
* OLD 버전(예, 인터넷과 SSH 을 열 때)
1)iptables -A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT
2)iptables -A INPUT -p tcp -m tcp --sport 80 -j ACCEPT
1)iptables -A OUTPUT -p tcp -m tcp --dport 22 -j ACCEPT
2)iptables -A INPUT -p tcp -m tcp --sport 22 -j ACCEPT
-> 1) 외부(80/22 PORT)로 나가는 패킷 허용
-> 2) 외부(80/22 PORT)에서 들어오는 패킷 허용
=> 위와 같이 INPUT/OUTPUT 을 두개씩 등록 필요
* NEW 버전
1)iptables -A OUTPUT -m state --state NEW -p tcp -m tcp
--dport 80 -j ACCEPT
1)iptables -A OUTPUT -p tcp -m tcp --dport 22 -j ACCEPT
2)iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-> 1) 외부(80/22 PORT)로 나가는 신규(NEW 즉 SYN) 패킷 허용
-> 2) 외부에서 들어오는 연결된/관련된(SYNACK, ACK) 패킷 허용
=> 따라서, OUTPUT 관련 정의 하나만 내리면,
INPUT 관련 패킷은 --state ESTABLISHED,RELATED 공통정의로 해결됨.
(이와 반대 상황도 마찬가지로 허용됨.)
=> ESTABLISHED,RELATED 허용의미는 이미 연결되었거나, 기존 연결에 관련된
패킷은 허용한다는 의미(예, FTP 21 포트 열면 20 포트는 자동열림)
* 정책 삽입
# iptables -I OUTPUT [RULE_NUMBER] -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT -m comment --comment "ACCEPT OUT - WWW"
* 로그 남기는 방법
# iptables -A INPUT -j LOG
-> /var/log/messages 에 로그가 남겨짐
-> 차단된 포트를 확인시 차단 정책 바로위에 정책 설정하면 됨.
- 체인 삭제 : iptables -X 체인명
- 정책 삭제 : iptables -D 체인명 인덱스
* 기본 모두 막고 시작하기
# iptables -F (방화벽 초기화)
# iptables -X (체인 제거)
# iptables -Z (통계 초기화)
# iptables -P INPUT DROP (기본정책 DROP 설정)
# iptables -P FORWARD DROP (기본정책 DROP 설정)
# iptables -P OUTPUT DROP (기본정책 DROP 설정)
(OUTPUT 은 편의를 위해서 DEFAULT ACCEPT로 하기도 함.)
* 루프백 허용
# iptables -A INPUT -i lo -j ACCEPT
# iptables -A OUTPUT -o lo -j ACCEPT
-----------------------------
# 방화벽 초기화 및 기본 설정 샘플
-----------------------------
1. 초기화 및 기본 차단 정책 설정
# iptables -F
# iptables -X
# iptables -Z
# iptables -P INPUT DROP
# iptables -P FORWARD DROP
# iptables -P OUTPUT DROP
2. 루프백 설정
# iptables -A INPUT -i lo -j ACCEPT -m comment --comment "ACCEPT IN - LOOP BACK"
# iptables -A OUTPUT -o lo -j ACCEPT -m comment --comment "ACCEPT OUT - LOOP BACK"
3. ESTABLISHED,RELATED state 추가
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -m comment --comment "ACCEPT IN - ESTABLISHED, RELATED"
# iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -m comment --comment "ACCEPT OUT - ESTABLISHED, RELATED"
4. ICMP 추가
# iptables -A INPUT -p icmp -j ACCEPT -m comment --comment "ACCEPT IN - ICMP"
# iptables -A OUTPUT -p icmp -j ACCEPT -m comment --comment "ACCEPT OUT - ICMP"
5. 필요한 정책 추가 (IN/OUT)
(1) DNS 서버 운영시
# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 53 -j ACCEPT -m comment --comment "ACCEPT IN - DNS SERVER"
# iptables -A INPUT -m state --state NEW -m udp -p udp --dport 53 -j ACCEPT -m comment --comment "ACCEPT IN - DNS SERVER"
(2) DNS QUERY
# iptables -A OUTPUT -m state --state NEW -m tcp -p tcp --dport 53 -j ACCEPT -m comment --comment "ACCEPT OUT - DNS QUERY"
# iptables -A OUTPUT -m state --state NEW -m udp -p udp --dport 53 -j ACCEPT -m comment --comment "ACCEPT OUT - DNS QUERY"
(3) 외부 웹서버 접근
# iptables -A OUTPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT -m comment --comment "ACCEPT OUT - WWW"
(4) 내부에 서버 운영시
# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 포트 -j ACCEPT -m comment --comment "주석"
(5) 외부에 서버 접근시
# iptables -A OUTPUT -m state --state NEW -m tcp -p tcp --dport 포트 -j ACCEPT -m comment --comment "주석"
6. 마지막 차단 정책(기본 정책이 DROP 일 경우, 추가하지 않아도 무방함 하지만 추가할 경우 차단을 명시적으로 알려주는 역할. 추가안할 경우 TIMEOUT 발생)
* 로그를 남기겠다면 추가
# iptables -A OUTPUT -j LOG -m comment --comment "LOGGING /etc/var/messages"
# iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited -m comment --comment "REJECT IN - ALL"
# iptables -A OUTPUT -j REJECT --reject-with icmp-host-prohibited -m comment --comment "REJECT OUT - ALL"
# iptables -A FORWARD -j REJECT --reject-with icmp-host-prohibited -m comment --comment "REJECT FORWARD - ALL"
7. 수정된 정책 저장
/etc/init.d/iptables save
--------------------------
# 방화벽 적용 샘플 - OLD 버전
--------------------------
< 내부망 허용 >
# iptables -A INPUT -s 192.168.0.0/24 -d 192.168.0.0/24 -j ACCEPT
# iptables -A OUTPUT -s 192.168.0.0/24 -d 192.168.0.0/24 -j ACCEPT
< 내부 -> 외부 접속 >
# iptables -A INPUT -s 외부주소 -p tcp -m tcp --sport 외부포트 -j ACCEPT
# iptables -A OUTPUT -d 외부주소 -p tcp -m tcp --dport 외부포트 -j ACCEPT
* DNS 포트 허용(외부 DNS 접근)
iptables -A INPUT -p udp -m udp --sport 53 -j ACCEPT
iptables -A OUTPUT -p udp -m udp --dport 53 -j ACCEPT
* ICMP 핑 허용
iptables -A INPUT -p icmp -j ACCEPT
iptables -A OUPUT -p icmp -j ACCEPT
or
iptables -A INPUT -i eth0 -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A OUTPUT -o eth0 -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -o eth0 -p icmp --icmp-type echo-reply -j ACCEPT
* SSH 포트 허용 (192.168.0.1 -> 172.16.1.20, 외부 ssh 서버 접근)
iptables -A INPUT -s 172.16.1.20 -p tcp -m tcp --sport 22 -j ACCEPT
iptables -A OUTPUT -d 172.16.1.20 -p tcp -m tcp --dport 22 -j ACCEPT
* HTTP 포트 허용(외부 웹서버 접근)
iptables -A INPUT -p tcp -m tcp --sport 80 -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT
* FTP 포트 허용
- 명령(제어) 포트(tcp 21) 접속
iptables -A INPUT -p tcp -m tcp --sport 21 --dport 1024:65535 -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --sport 1024:65535 --dport 21 -j ACCEPT
- 데이터 포트(tcp20) 접속(능동 모드 접속)
iptables -A INPUT -p tcp -m tcp --sport 21 --dport 1024:65535 -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --sport 1024:65535 --dport 21 -j ACCEPT
- 데이터 포트(tcp 1024이상의 포트) (Passive 모드 접속)
iptables -A INPUT -i eth0 -p tcp -m tcp --sport 1024:65535 --dport 1024:65535 -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -m tcp --sport 1024:65535 --dport 1024:65535 -j ACCEPT
< 외부 -> 내부 접속 >
* SSH 포트 허용
iptables -A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -m tcp --sport 22 -j ACCEPT
* http 포트 허용
iptables -A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -o eth0 0p tcp -m tcp --sport 80 -j ACCEPT
* ftp 포트 허용 ( passive mode)
iptables -A INPUT -i eth0 -p tcp -m tcp --dport 21 -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -m tcp --sport 21 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -m tcp --dport 1024:65535 -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -m tcp --sport 1024:65535 -j ACCEPT
출처 - http://infraking.tistory.com/163
'Linux > 네트워크&보안' 카테고리의 다른 글
dig 사용 방법 (0) | 2017.10.10 |
---|---|
Linux의 iptables 적용 시 적용 안될 때. (0) | 2013.02.04 |