하기와 같이 -h 옵션을 주면 설정방법이 자세히 나와있습니다. 양이 좀 많지만 자주 사용하는 옵션으로 iptables 의 설정방법을 알아보겠습니다.
$ iptables -h
iptables v1.4.7
Usage: iptables -[ACD] chain rule-specification [options]
iptables -I chain [rulenum] rule-specification [options]
iptables -R chain rulenum rule-specification [options]
iptables -D chain rulenum [options]
iptables -[LS] [chain [rulenum]] [options]
iptables -[FZ] [chain] [options]
iptables -[NX] chain
iptables -E old-chain-name new-chain-name
iptables -P chain target [options]
iptables -h (print this help information)
Commands:
Either long or short options are allowed.
--append -A chain Append to chain
--check -C chain Check for the existence of a rule
--delete -D chain Delete matching rule from chain
--delete -D chain rulenum
Delete rule rulenum (1 = first) from chain
--insert -I chain [rulenum]
Insert in chain as rulenum (default 1=first)
--replace -R chain rulenum
Replace rule rulenum (1 = first) in chain
--list -L [chain [rulenum]]
List the rules in a chain or all chains
--list-rules -S [chain [rulenum]]
Print the rules in a chain or all chains
--flush -F [chain] Delete all rules in chain or all chains
--zero -Z [chain [rulenum]]
Zero counters in chain or all chains
--new -N chain Create a new user-defined chain
--delete-chain
-X [chain] Delete a user-defined chain
--policy -P chain target
Change policy on chain to target
--rename-chain
-E old-chain new-chain
Change chain name, (moving any references)
Options:
[!] --proto -p proto protocol: by number or name, eg. `tcp'
[!] --source -s address[/mask][...]
source specification
[!] --destination -d address[/mask][...]
destination specification
[!] --in-interface -i input name[+]
network interface name ([+] for wildcard)
--jump -j target
target for rule (may load target extension)
--goto -g chain
jump to chain with no return
--match -m match
extended match (may load extension)
--numeric -n numeric output of addresses and ports
[!] --out-interface -o output name[+]
network interface name ([+] for wildcard)
--table -t table table to manipulate (default: `filter')
--verbose -v verbose mode
--line-numbers print line numbers when listing
--exact -x expand numbers (display exact values)
[!] --fragment -f match second or further fragments only
--modprobe=<command> try to insert modules using this command
--set-counters PKTS BYTES set the counter during insert/append
[!] --version -V print package version.
- IPTABLES 에는 filter 테이블에 미리 정의된 3가지 체인(아래)이 존재합니다.
- 이 체인들은 어떠한 네트워크 트래픽에 대하여 정해진 규칙들을 수행합니다.
옵션 | 설명 |
---|---|
Chain INPUT (policy ACCEPT) | 호스트를 향한 모든 패킷 |
Chain FORWARD (policy ACCEPT) | 호스트 컴퓨터가 목적지가 아닌 모든 패킷, 즉 라우터로 사용되는 호스트 컴퓨터를 통과하는 패킷 |
Chain OUTPUT (policy ACCEPT) | 호스트 컴퓨터에서 발생하는 모든 패킷 |
1. iptables 명령어(command)
옵션 | 설명 |
---|---|
-A (–-append) | 새로운 규칙을 추가 |
-C (–check) | 패킷을 테스트 |
-D (–delete) | 규칙을 삭제 |
-F (–flush) | chain 으로 부터 규칙을 모두 삭제 |
-I (–Insert) | 새로운 규칙을 삽입 |
-L (–list) | 규칙을 출력 |
-N (–new) | 새로운 chain을 만듬 |
-P (–policy) | 기본정책을 변경 |
-R (–replace) | 새로운 규칙으로 교체 |
-X (–delete-chain) | chain 을 삭제 |
-Z (–zero) | 모든 chain의 패킷과 바이트 카운터 값을 0으로 만듬 |
2. 매치(match)
- iptables에서 패킷을 처리할 때 만족해야 하는 조건을 가리킵니다.
- 즉, 이 조건을 만족시키는 패킷들만 규칙을 적용합니다.
옵션 | 설명 |
---|---|
-s (–source) | 출발지 IP주소나 네트워크와의 매칭 |
-d (–destination) | 목적지 IP주소나 네트워크와의 매칭 |
-p (–protocol) | 특정 프로토콜과의 매칭 |
-i (–in-interface) | 입력 인터페이스 |
-o (–out-interface) | 출력 인터페이스 |
–state | 연결상태와의 매칭 |
–comment | 커널 메모리 내의 규칙과 연계되는 최대 256바이트 주석 |
-y (–syn) | SYN 패킷을 허용하지 않음 |
-f(–fragment) | 두번째 이후의 조가게 대해서 규칙을 명시한다. |
-t (–table) | 처리될 테이블 |
-j (–jump) | 규칙에 맞는 패킷을 어떻게 처리할것인가를 명시한다. |
-m (–match) | 특정 모듈과의 매치 |
3. 타겟(target)
- iptalbes에서 패킷이 규칙과 일치할 때 동작을 취하는 타겟을 지원합니다.
옵션 | 설명 |
---|---|
ACCEPT | 패킷을 받아들임 |
DROP | 패킷을 버림 (패킷전송이 없었던 것 처럼) |
REJECT | 패킷을 버리고 이와 동시에 적절한 응답 패킷을 전송 |
LOG | 패킷을 syslog에 기록 |
RETURN | 호출 체인 내에서 패킷 처리를 지속함 |
4. config 파일에 등록
-
config 파일에 등록을 하게 되면 서버 재부팅시 또는 iptables 을 재기동시 config 에 있는 설정값으로 셋팅되게 됩니다.
CentOS
$ vi /etc/sysconfig/iptables
Ubuntu
$ vi /etc/iptables.rules
5. 자주사용하는 iptables command
- cli 모드에서 command 를 입력하여 바로 적용시킬 수 있습니다.
- 서버에서 docker 를 사용할 경우 iptables 을 재기동하게 되면 network 설정이 꼬이게 되는데 그럴 때 이와 같은 방법으로 적용 할 수 있습니다.
# 적용상태 확인
$ iptables -nvL --line-numbers
# 특정 IP 차단
$ iptables -I INPUT -s xxx.xxx.xxx.xxx -j DROP
# 특정 IP 허용
$ iptables -I INPUT -s xxx.xxx.xxx.xxx -j ACCEPT
# 특정 Port 차단
$ iptables -A INPUT -p tcp --dport xxxx -j DROP
# 특정 IP / Port 허용
$ iptables -A INPUT -p tcp -s xxx.xxx.xxx.xxx --dport xxxx -j ACCEPT
# 특정 IP/Port 를 7번째 룰에 추가
$ iptables -I INPUT 7 -s xxx.xxx.xxx.xxx -p tcp --dport 8080 -j ACCEPT
# 7번째 룰 삭제
$ iptables -D INPUT 7
# INPUT chain 에 state 모듈 상태가 New 이고 프로토콜이 tcp 이고 목적지 port 가 8088 인 패킷에 대한 허용추가
$ iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 8088 -j ACCEPT
# 규칙삭제
$ iptables -D INPUT -p tcp -s xxx.xxx.xxx.xxx --dport xxxx -j ACCEPT
# 적용된 규칙 전부 삭제
$ iptables --flush
PREVIOUSZabbix Disk Monitoring 설정하기
NEXTBonding 네트워크 이중화