해킹 공격으로부터 리눅스 서버를 보호하기 위하여 패킷 필터링을 통해 기본적인 방화벽을 구성할 수 있으며
커널의 패킷 필터링 테이블에 필터링 규칙을 삽입하거나 삭제하는 도구.
Iptables를 사용하기 위해서는 netfilter가 2.3.15이상의 리눅스커널에 포함되어 있고,
커널 설정에서 CONFIG_NETFILTER 에 ‘Y’로 지정하고 컴파일 한 커널이어야 사용 가능.
iptables 소스 설치
http://ftp.netfilter.org/pub/iptables/ 에서 다운로드 할 버전을 체크.
다운로드 & 압축풀기 & 설치 준비 & 설치
yum 설치
iptables 포트 필터링
커널은 필터 테이블에 삭제가 불가능한 INPUT,OUTPUT,FORWARD 세개의 기본 체인을 가지고 있으며 이 외에 체인도 추가/삭제가 가능
체인 속 규칙의 형태는 "패킷의 헤더가 이렇게 되어 있으면 이곳에서 무엇을 하라. 규칙이 그 패킷에 맞지 않으면 다음 규칙을 참고".
마지막으로 더 이상 고려할 규칙이 없으면 커널은 무엇을 할 것인가를 결정하기 위하여 그 체인의 정책을 확인
* 정책 선택하기
1. 모든 체인의 정책 확인
2. 스크립트 파일을 생성해 /etc/rc.local 등에 삽입하여 부팅시 설정이 되도록 하거나
다음 명령어를 사용하여 현재의 규칙을 /etc/sysconfig/iptables 에 저장
* 원격 접속 상태에서 날리면 부담스러운 명령어.
위 명령은 모든 입력과 출력으로 전달하는 부분을 모두 차단하란 명령이다.
날리는 즉시 원격 접속 상태라면 접속이 바로 차단되어 버려서 아무것도 할 수 없게 된다. (서버로 달려가야 한다.)
그래서 스크립트로 위 명령과 동시에 터미널 접속된 22번 포트를 열어주어야 다른 작업도 가능해 진다.
3. iptables 스크립트 변경 / 적용
4. 수정한 스크립트 적용 / 확인
커널의 패킷 필터링 테이블에 필터링 규칙을 삽입하거나 삭제하는 도구.
Iptables를 사용하기 위해서는 netfilter가 2.3.15이상의 리눅스커널에 포함되어 있고,
커널 설정에서 CONFIG_NETFILTER 에 ‘Y’로 지정하고 컴파일 한 커널이어야 사용 가능.
iptables 소스 설치
http://ftp.netfilter.org/pub/iptables/ 에서 다운로드 할 버전을 체크.
다운로드 & 압축풀기 & 설치 준비 & 설치
# wget http://ftp.netfilter.org/pub/iptables/iptables-1.4.5.tar.bz2
# tar xvfj iptables-1.4.5.tar.bz2
# cd iptables-1.4.5
# ./configure
# make && make install
# tar xvfj iptables-1.4.5.tar.bz2
# cd iptables-1.4.5
# ./configure
# make && make install
yum 설치
# yum install -y iptables
iptables 포트 필터링
커널은 필터 테이블에 삭제가 불가능한 INPUT,OUTPUT,FORWARD 세개의 기본 체인을 가지고 있으며 이 외에 체인도 추가/삭제가 가능
체인 속 규칙의 형태는 "패킷의 헤더가 이렇게 되어 있으면 이곳에서 무엇을 하라. 규칙이 그 패킷에 맞지 않으면 다음 규칙을 참고".
마지막으로 더 이상 고려할 규칙이 없으면 커널은 무엇을 할 것인가를 결정하기 위하여 그 체인의 정책을 확인
* 정책 선택하기
1. 모두 허용하고, 특정 ip/port 차단하기
2. 모두 차단하고, 특정 ip/port 허용하기 (난 요게 좋을 것 같음.;)
1. 모든 체인의 정책 확인
# iptables -L
2. 스크립트 파일을 생성해 /etc/rc.local 등에 삽입하여 부팅시 설정이 되도록 하거나
다음 명령어를 사용하여 현재의 규칙을 /etc/sysconfig/iptables 에 저장
# /etc/init.d/iptables save
or
# service iptables save
or
# service iptables save
* 원격 접속 상태에서 날리면 부담스러운 명령어.
# iptables -P INPUT DROP
# iptables -P FORWARD DROP
# iptables -P FORWARD DROP
위 명령은 모든 입력과 출력으로 전달하는 부분을 모두 차단하란 명령이다.
날리는 즉시 원격 접속 상태라면 접속이 바로 차단되어 버려서 아무것도 할 수 없게 된다. (서버로 달려가야 한다.)
그래서 스크립트로 위 명령과 동시에 터미널 접속된 22번 포트를 열어주어야 다른 작업도 가능해 진다.
3. iptables 스크립트 변경 / 적용
# vi /etc/init.d/iptables
#!/bin/sh
# iptables exec directory
IPT=/sbin/iptables
# flush all chain
# -F --flush : 모든 체인의 모든 규칙 삭제
$IPT -F
# modify policy
# -P --policy : 체인(INPUT, OUTPUT...)에 대해 주어진 타겟(DROP, ACCEPT...)으로 정책 지정
# INPUT, FORWARD 체인을 통하는 패킷 차단
# OUTPUT 체인을 통하는 패킷 허용
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT ACCEPT
# accept loopback
# -A --apend : 선택된 체인의 마지막에 규칙 추가
# -j --jump : 규칙의 타겟 지정
# -i --in-interface : 인터페이스 이름
# INPUT 체인에 lo(로컬 루프백) 으로 들어오는 패킷 허용
$IPT -A INPUT -i lo -j ACCEPT
# accept established connections
# -m --match or -p --protocol : MATCH EXTENSIONS - 적합한 모듈 확장
# state --state : 연결 추적을 결합하는 모듈
# ESTABLISHED : 패킷이 이미 접속에 응답한 것
# RELATED : 새로운 접속을 만드는 패킷이지만 FTP 데이터 전송이나 ICMP 에러같은 기존 연결에 관련됨
# INPUT 체인에 존재하는 접속에 속하는 패킷(ESTABLISHED)과 연관성을 가진 패킷(RELATED)을 허용
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# allow ping
$IPT -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
# accept IP
# -s --source : 네트워크 이름, 호스트이름, IP주소(/마스크)
# 마스크가 24면 255.255.255.0과 같다.
# INPUT 체인에 IP 123.123.123.123 에서 들어오는 패킷 허용
$IPT -A INPUT -s 123.123.123.123 -j ACCEPT
# accept service port
# 1024 이상 포트로 시작하여(클라이언트) 20번 포트를 목적으로 하는 패킷 허용
$IPT -A INPUT -p tcp --sport 1024: --dport 20 -m state --state NEW -j ACCEPT
$IPT -A INPUT -p tcp --sport 1024: --dport 21 -m state --state NEW -j ACCEPT
$IPT -A INPUT -p tcp --sport 1024: --dport 22 -m state --state NEW -j ACCEPT
$IPT -A INPUT -p tcp --sport 1024: --dport 53 -m state --state NEW -j ACCEPT
$IPT -A INPUT -p udp --sport 1024: --dport 53 -m state --state NEW -j ACCEPT
$IPT -A INPUT -p tcp --sport 1024: --dport 80 -m state --state NEW -j ACCEPT
$IPT -A INPUT -p tcp --sport 1024: --dport 443 -m state --state NEW -j ACCEPT
$IPT -A INPUT -p tcp --sport 1024: --dport 3306 -m state --state NEW -j ACCEPT
#!/bin/sh
# iptables exec directory
IPT=/sbin/iptables
# flush all chain
# -F --flush : 모든 체인의 모든 규칙 삭제
$IPT -F
# modify policy
# -P --policy : 체인(INPUT, OUTPUT...)에 대해 주어진 타겟(DROP, ACCEPT...)으로 정책 지정
# INPUT, FORWARD 체인을 통하는 패킷 차단
# OUTPUT 체인을 통하는 패킷 허용
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT ACCEPT
# accept loopback
# -A --apend : 선택된 체인의 마지막에 규칙 추가
# -j --jump : 규칙의 타겟 지정
# -i --in-interface : 인터페이스 이름
# INPUT 체인에 lo(로컬 루프백) 으로 들어오는 패킷 허용
$IPT -A INPUT -i lo -j ACCEPT
# accept established connections
# -m --match or -p --protocol : MATCH EXTENSIONS - 적합한 모듈 확장
# state --state : 연결 추적을 결합하는 모듈
# ESTABLISHED : 패킷이 이미 접속에 응답한 것
# RELATED : 새로운 접속을 만드는 패킷이지만 FTP 데이터 전송이나 ICMP 에러같은 기존 연결에 관련됨
# INPUT 체인에 존재하는 접속에 속하는 패킷(ESTABLISHED)과 연관성을 가진 패킷(RELATED)을 허용
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# allow ping
$IPT -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
# accept IP
# -s --source : 네트워크 이름, 호스트이름, IP주소(/마스크)
# 마스크가 24면 255.255.255.0과 같다.
# INPUT 체인에 IP 123.123.123.123 에서 들어오는 패킷 허용
$IPT -A INPUT -s 123.123.123.123 -j ACCEPT
# accept service port
# 1024 이상 포트로 시작하여(클라이언트) 20번 포트를 목적으로 하는 패킷 허용
$IPT -A INPUT -p tcp --sport 1024: --dport 20 -m state --state NEW -j ACCEPT
$IPT -A INPUT -p tcp --sport 1024: --dport 21 -m state --state NEW -j ACCEPT
$IPT -A INPUT -p tcp --sport 1024: --dport 22 -m state --state NEW -j ACCEPT
$IPT -A INPUT -p tcp --sport 1024: --dport 53 -m state --state NEW -j ACCEPT
$IPT -A INPUT -p udp --sport 1024: --dport 53 -m state --state NEW -j ACCEPT
$IPT -A INPUT -p tcp --sport 1024: --dport 80 -m state --state NEW -j ACCEPT
$IPT -A INPUT -p tcp --sport 1024: --dport 443 -m state --state NEW -j ACCEPT
$IPT -A INPUT -p tcp --sport 1024: --dport 3306 -m state --state NEW -j ACCEPT
4. 수정한 스크립트 적용 / 확인
# /etc/init.d/iptables save
# iptables -L
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT all -- anywhere anywhere
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT icmp -- localhost.localdomain anywhere
ACCEPT tcp -- anywhere anywhere tcp spts:1024:65535 dpt:ftp-data state NEW
ACCEPT tcp -- anywhere anywhere tcp spts:1024:65535 dpt:ftp state NEW
ACCEPT tcp -- anywhere anywhere tcp spts:1024:65535 dpt:ssh state NEW
ACCEPT tcp -- anywhere anywhere tcp spts:1024:65535 dpt:domain state NEW
ACCEPT udp -- anywhere anywhere udp spts:1024:65535 dpt:domain state NEW
ACCEPT tcp -- anywhere anywhere tcp spts:1024:65535 dpt:http state NEW
ACCEPT tcp -- anywhere anywhere tcp spts:1024:65535 dpt:https state NEW
ACCEPT tcp -- anywhere anywhere tcp spts:1024:65535 dpt:mysql state NEW
Chain FORWARD (policy DROP)
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 -L
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT all -- anywhere anywhere
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT icmp -- localhost.localdomain anywhere
ACCEPT tcp -- anywhere anywhere tcp spts:1024:65535 dpt:ftp-data state NEW
ACCEPT tcp -- anywhere anywhere tcp spts:1024:65535 dpt:ftp state NEW
ACCEPT tcp -- anywhere anywhere tcp spts:1024:65535 dpt:ssh state NEW
ACCEPT tcp -- anywhere anywhere tcp spts:1024:65535 dpt:domain state NEW
ACCEPT udp -- anywhere anywhere udp spts:1024:65535 dpt:domain state NEW
ACCEPT tcp -- anywhere anywhere tcp spts:1024:65535 dpt:http state NEW
ACCEPT tcp -- anywhere anywhere tcp spts:1024:65535 dpt:https state NEW
ACCEPT tcp -- anywhere anywhere tcp spts:1024:65535 dpt:mysql state NEW
Chain FORWARD (policy DROP)
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
WRITTEN BY
- 손가락귀신
정신 못차리면, 벌 받는다.
,