패킷이 조작될 상태를 지정한다.
Chain은 Network 통신에 미리 설정한 Rule을 적용하여 Target을 결정한다.
-----> INPUT ------> Linux Server ------> OUTPUT ------>
| |
+------------- FORWARD ---------------+
Chain INPUT : 서버로 들어오는 기본 정책
Chain FORWARD : 서버에서 forwarding 기본 정책
( 현재의 Linux Server가 목적지가 아닌 패킷이 통과하는 Chain, NAT(네트워크 공유) 기능 사용을 위해 사용된다. )
Chain OUTPUT : 서버에서 나가는 기본 정책
Masquerade : 내부 사설 IP의 PC들이 외부 인터넷이 연결 가능하도록 해주는 기능
NAT ( Network Address Translation ) : 네트워크 주소 변환 서비스
iptables [-t table][Action] [Chain][match] [-j target]
iptables v1.6.0
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:
--ipv4 -4 Nothing (line is ignored by ip6tables-restore)
--ipv6 -6 Error (line is ignored by iptables-restore)
[!] --protocol -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
--wait -w [seconds] wait for the xtables lock
--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 -V
iptables v1.8.4 (legacy)
# 모든 chain에 설정된 모든 rule을 제거
sudo iptables -F
# 기본 Chain을 제외한 나머지 모든 chain에 설정된 모든 rule을 제거
sudo iptables -X
$ sudo iptables -L
# 상세 조회
$ sudo iptables -v -L
# IP Address, Port Number 표시하여 조회
$ sudo iptables -L -n
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
sudo iptables -A INPUT -s 192.168.1.3 -j ACCEPT
sudo iptables -A INPUT -s 192.168.1.3 -j DROP
# 번호 확인
sudo iptables -L --line-numbers
# 삭제
sudo iptables -D INPUT 3
# 영구 반영 ( iptables 명령어는 수정한 테이블과 룰은 메모리에만 남아있음 )
sudo /sbin/iptables-save
⇒ 트래픽이 들어오면 NAT의 PREROUTING을 거쳐 FILTER의 INPUT을 거쳐 애플리케이션으로 들어갔다가 나올떄 FILTER의 OUTPUT 체인과 NAT의 OUTPUT 체인을 거쳐서 최종적으로 POSTROUTING 체인을 거쳐서 목적으로 라우팅된다.
이 과정에서 NAT 테이블의 체인 중 주로 사용되는 CHAIN을 보면
80port로 들어온 트래픽을 같은 호스트의 4000 포트로 포워딩하는 설정
sudo iptables -t nat -A PREROUTING -p tcp -dport 80 -j REDIRECT --to-port 4000
위처럼 설정할 시 localhost:80으로 호출하면 라우팅이 되질 않음
⇒ localhost는 PREROUTING CHAIN을 타지 않기 때문이다.
⇒ localhost에도 동일하게 작동하게 하려면 output chain을 아래와 같이 설정해야 함
sudo iptables -t nat -A OUTPUT -o lo -p tcp --dport 80 -j REDIRECT --to-port 8080
https://gitlab.com/gilgil/sns/-/wikis/iptables/iptables
https://linuxstory1.tistory.com/entry/iptables-기본-명령어-및-옵션-명령어
좋은 정보감사합니다.