[Linux] iptables

pingping·2021년 2월 8일
0

iptables

개념

  • 방화벽 구성이나 NAT에 사용되는데, 리눅스 커널 방화벽이 제공하는 table, chain, rule을 시스템 관리자가 구성한다.
  • 각각 다른 kernel module과 프로그램들은 다른 프로토콜을 위해 사용되는데, iptables는 IPv4에, arptables는 ARP에, etables는 이더넷 프레임에 적용된다.
  • Kernel에서 NetFilter 패킷 필터링 기능을 사용자 공간에서 제어하는 수준으로 사용하고, Protocol 상태 추적, Packet 애플리케이션 계층 검사, 속도 제한, Filtering 정책 등의 기능을 제공한다.
  • 지나가는 패킷의 헤더를 보고 그 전체 패킷의 운명을 결정하는 것 → 패킷 필터링

용어

target

  • Packet이 Rule과 일치할 때 실행될 명령
    • ACCEPT : Packet을 허용
    • DROP : Packet을 차단하고, 사용자에게 오류 메시지를 보내지 않는다.
    • REJECT : Packet을 차단하고, 사용자에게 오류 메시지를 보낸다.
    • LOG : Packet을 syslog에 기록한다.
    • RETURN : chain 통과를 중지하고, 이전 chain의 다음 rule에 따라 다시 시작한다.
    • QUEUE : application에 packet을 대기 (queue)시키는 데 사용한다.
    • SNAT : 소스 네트워크 주소 변환에 사용
    • DNAT : 대상 네트워크 주소 변환에 사용

chain

  • 패킷이 조작될 상태를 지정한다.

  • 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 ) : 네트워크 주소 변환 서비스

      • SNAT : 내부 사설 IP에서 외부로 나갈 때 공인 IP로 변환 ( 마스커레이드와 비슷 )
      • DNAT : 외부에서 방화벽 (외부 IP)으로 요청되는 주소로 내부 사설 IP로 변환

table

  • iptables는 filter, nat, mangle, raw, security 등 5개의 table이 존재한다.
  • 룰을 정해 룰에 매치되는 트래픽에 대해서 핸들링할 수 있다.
    • Filter Table : 가장 많이 사용되는 테이블로, 트래픽에 대한 컨트롤을 하는 방화벽 역할
    • NAT Table : 들어오는 패킷을 다른 포트나 다른 호스트 서버로 라우팅하는 역할
    • Mangle Table : 패킷의 헤더를 변경하는데 사용할 수 있다.

명령어 문법 & 도움말

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 조회

  • iptables 확인
$ iptables -V
iptables v1.8.4 (legacy)
  • iptables 초기화
# 모든 chain에 설정된 모든 rule을 제거
sudo iptables -F

# 기본 Chain을 제외한 나머지 모든 chain에 설정된 모든 rule을 제거
sudo iptables -X
  • iptables 조회
$ sudo iptables -L

# 상세 조회
$ sudo iptables -v -L

# IP Address, Port Number 표시하여 조회
$ sudo iptables -L -n

iptables Filter table 설정

  • iptables 특정 프로토콜만 허용
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
  • iptables 특정 IP에서 들어오는 트래픽 허용, 불허
sudo iptables -A INPUT -s 192.168.1.3 -j ACCEPT

sudo iptables -A INPUT -s 192.168.1.3 -j DROP
  • 등록된 RULE 삭제
# 번호 확인
sudo iptables -L --line-numbers

# 삭제
sudo iptables -D INPUT 3

# 영구 반영 ( iptables 명령어는 수정한 테이블과 룰은 메모리에만 남아있음 )
sudo /sbin/iptables-save

iptables NAT table 설정

  • 들어온 트래픽을 다른 호스트로 라우팅 시키거나 또는 같은 호스트내의 다른 포트로 포워딩시키는 것이 가능하다.

⇒ 트래픽이 들어오면 NAT의 PREROUTING을 거쳐 FILTER의 INPUT을 거쳐 애플리케이션으로 들어갔다가 나올떄 FILTER의 OUTPUT 체인과 NAT의 OUTPUT 체인을 거쳐서 최종적으로 POSTROUTING 체인을 거쳐서 목적으로 라우팅된다.

  • 이 과정에서 NAT 테이블의 체인 중 주로 사용되는 CHAIN을 보면

    • PREROUTING : 들어온 트래픽을 다른 호스트나 또는 같은 호스트의 다른 포트로 포워딩
    • POSTROUTING : 호스트에서 아웃바운드로 나가는 트래픽을 다른 ip나 포트로 포워딩
  • 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
  • Reference

https://gitlab.com/gilgil/sns/-/wikis/iptables/iptables

https://linuxstory1.tistory.com/entry/iptables-기본-명령어-및-옵션-명령어

https://bcho.tistory.com/1366

profile
Cloud Infra Engineer & interested in python, IaC, k8s

1개의 댓글

comment-user-thumbnail
2021년 2월 9일

좋은 정보감사합니다.

답글 달기