Iptables: Difference between revisions

From 탱이의 잡동사니
Jump to navigation Jump to search
No edit summary
 
(9 intermediate revisions by the same user not shown)
Line 39: Line 39:
  -V, –version : 버전 정보를 보여준다.
  -V, –version : 버전 정보를 보여준다.
</pre>
</pre>
== Basic rules ==
=== Table ===
Iptable 에는 크게 4가지 테이블이 존재한다(Filter, Nat, Mangle, Raw).
=== Chain ===
Filter 테이블에는 미리 정의된 3가지 체인이 존재한다(INPUT, OUTPUT, FORWARD).
<pre>
- INPUT : 호스트 컴퓨터를 향한 모든 패킷
- OUTPUT : 호스트 컴퓨터에서 발생하는 모든 패킷
- FORWARD : 호스트 컴퓨터가 목적지가 아닌 모든 패킷, 즉 라우터로 사용되는 호스트 컴퓨터를 통과하는 패킷
</pre>
=== Match ===
Iptables 에서 패킷을 처리할 때, 매칭되는 조건을 지정한다.
<pre>
--source (-s) : 출발지 IP주소나 네트워크와의 매칭
--destination (-d) : 목적지 ip주소나 네트워크와의 매칭
--protocol (-p) : 특정 프로토콜과의 매칭
--in-interface (i) : 입력 인테페이스
--out-interface (-o) : 출력 인터페이스
--state : 연결 상태와의 매칭
--string : 애플리케이션 계층 데이터 바이트 순서와의 매칭
--comment : 커널 메모리 내의 규칙과 연계되는 최대 256바이트 주석
--syn (-y) : SYN 패킷을 허용하지 않는다.
--fragment (-f) : 두 번째 이후의 조각에 대해서 규칙을 명시한다.
--table (-t) : 처리될 테이블
--jump (-j) : 규칙에 맞는 패킷을 어떻게 처리할 것인가를 명시한다.
--match (-m) : 특정 모듈과의 매치
</pre>
=== Target ===
규칙에서 취해야 할 동작을 지정한다.
<pre>
- ACCEPT : 패킷을 받아들인다.
- DROP : 패킷을 버린다.
- REJECT : 패킷을 버리고 이와 동시에 적절한 응답 패킷을 전송한다.
- LOG : 패킷을 syslog에 기록한다.
- RETURN : 호출 체인 내에서 패킷 처리를 계속한다.
</pre>
REJECT는 서비스에 접속하려는 사용자의 액세스를 거부하고 connection refused라는 오류 메시지를 보여주는 반면 DROP은 말 그대로 telnet 사용자에게 어떠한 경고 메시지도 보여주지 않은 채 패킷을 드롭한다.
=== Connection Tracking ===
서비스 연결상태에 따른 규칙 적용이 가능하다.
<pre>
- NEW : 새로운 연결을 요청하는 패킷, 예, HTTP 요청
- ESTABLISHED : 기존 연결의 일부인 패킷
- RELATED : 기존 연결에 속하지만 새로운 연결을 요청하는 패킷, 예를 들면 접속 포트가 20인 수동 FTP의 경우 전송 포트는 사용되지 않은 1024 이상의 어느 포트라도 사용 가능하다.
- INVALID : 연결 추적표에서 어디 연결에도 속하지 않은 패킷
</pre>
상태에 기반(stateful)한 iptables 연결 추적 기능은 어느 네트워크 프로토콜에서나 사용 가능하다. UDP와 같이 상태를 저장하지 않는 (stateless) 프로토콜에서도 사용할 수 있다.


== Samples ==
== Samples ==
=== Default DROP ===
=== Default DROP ===
기본 설정을 DROP으로 하고, 이어서 필요한 서비스들에 대한 포트들만 ACCEPT 하는 전략.
기본 설정을 DROP으로 하고, 이어서 필요한 서비스들에 대한 포트들만 ACCEPT 하는 전략.
<source lang=bash>
#-- Set default policy to DROP
$ sudo iptables -P INPUT DROP
#-- ssh
$ sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
$ sudo iptables -A INPUT -p udp --dport 22 -j ACCEPT
#-- http
$ sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
$ sudo iptables -A INPUT -p udp --dport 80 -j ACCEPT
#-- https
$ sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
$ sudo iptables -A INPUT -p udp --dport 443 -j ACCEPT
#-- jenkins
$ sudo iptables -A INPUT -p tcp --dport 8081 -j ACCEPT
#-- sip
$ sudo iptables -A INPUT -p tcp --dport 5060 -j ACCEPT
$ sudo iptables -A INPUT -p tcp --dport 5060 -j ACCEPT
$ sudo iptables -A INPUT -p tcp --dport 5061 -j ACCEPT
$ sudo iptables -A INPUT -p tcp --dport 5061 -j ACCEPT
$ sudo iptables -A INPUT -p udp -m udp --dport 10000:20000 -j ACCEPT
</source>
=== Masquerade ===
Masquerade 는 Linux 에서 하나 이상의 NIC 혹은 네트워크를 가지고 있을 경우, 한쪽에서 다른 쪽으로 패킷을 전달하고자 할 때 사용하는 기술이다. 다른 말로는 NAT 라고도 표현한다.
다음 예제는 외부로 향하는 네트워크의 NIC 이름이 eth0 일 경우 설정하는 방법이다.
<pre>
<pre>
iptables -P INPUT DROP
$ sudo -i


-- ssh
# echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p udp --dport 22 -j ACCEPT


-- http
#cat /proc/sys/net/ipv4/ip_forward
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
1
iptables -A INPUT -p udp --dport 80 -j ACCEPT


-- https
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
</pre>
iptables -A INPUT -p udp --dport 443 -j ACCEPT


-- jenkins
== ETC ==
iptables -A INPUT -p tcp --dport 8081 -j ACCEPT
=== Persistent mode ===
 
Run the iptables rule in a persistent mode.
-- sip
<pre>
iptables -A INPUT -p tcp --dport 5060 -j ACCEPT
$ sudo apt install iptables-persistent
iptables -A INPUT -p tcp --dport 5060 -j ACCEPT
iptables -A INPUT -p tcp --dport 5061 -j ACCEPT
iptables -A INPUT -p tcp --dport 5061 -j ACCEPT
iptables -A INPUT -p udp -m udp --dport 10000:20000 -j ACCEPT
</pre>
</pre>
* https://www.thomas-krenn.com/en/wiki/Saving_Iptables_Firewall_Rules_Permanently


== See also ==
== See also ==
* http://www.cyberciti.biz/tips/linux-iptables-examples.html - Linux: 20 Iptables Examples For New SysAdmins
* http://www.cyberciti.biz/tips/linux-iptables-examples.html - Linux: 20 Iptables Examples For New SysAdmins
* https://www.thomas-krenn.com/en/wiki/Saving_Iptables_Firewall_Rules_Permanently - Saving Iptables Firewall Rules Permanently
* http://webdir.tistory.com/170 - [CentOS] 방화벽 설정 - iptables
* https://codeghar.wordpress.com/2012/05/02/ubuntu-12-04-ipv4-nat-gateway-and-dhcp-server/ - Ubuntu 12.04 IPv4 NAT Gateway and DHCP Server
* https://www.howtoforge.com/nat_iptables - Step-By-Step Configuration of NAT with iptables
* http://www.revsys.com/writings/quicktips/nat.html - Quick-Tip: Linux NAT in Four Steps using iptables


== References ==
== References ==
<references />
<references />


[[category:linux]]
[[category:command/utility]]

Latest revision as of 12:31, 18 June 2019

Overview

Iptables 명령어 사용법 및 활용법 정리.

Command

 iptables -[ADC] chain 상세룰 [옵션]
 iptables -[RI] chain 룰번호 상세룰 [옵션]
 iptables -D chain 룰번호 [옵션]
 iptables -[LFZ] [chain] [옵션]
 iptables -[NX] chain
 iptables -E 이번체인이름 새로운체인이름
 iptables -P chain target [옵션]
 iptables -h

 -A chain, –append chain : chain을 추가한다.
 -D chain, –delete chain : chain에서 룰을 삭제한다.
 -D chain 룰넘버, –delete chain 룰넘버 : chain 정책 중 지정한 룰넘버를 삭제한다. 만일 룰넘버가 1이라면 chain 규칙의 첫 번째 룰을 삭제한다.
 -I chain [룰넘버], –insert chain [룰넘버] : chain 정책에 지정한 숫자번째에 삽입하거나, 마지막에 룰을 삽입한다.
 -R chain 룰넘버, –relace : chain 정책 중 지정한 숫자번째의 룰을 교체한다.
 -L [chain], –list [chain] 모든 chain 정책을 보거나, 지정한 chain 정책을 본다.
 -F [chain], –flush : 모든 chain 정책을 삭제하거나, 지정한 chain 정책을 삭제한다.
 -Z [chain], –zero : 모든 chain 정책을 제로로 만들거나, 지정한 chain 정책을 제로로 만든다.
 -C chain, –check chain : 설정한 chain 정책을 테스트한다.
 -N chain, –new-chain : 새로운 정책을 만든다.
 -X [chain], –delete-chain : 사용자가 만든 chain이나 모든 chain을 삭제한다.
 -P chain target, –policy chain target : chain 정책을 지정한 chain 정책으로 바꾼다.
 -E old-chain new-chain, –rename-chain old-chain new-chain : chain명을 바꾼다.
 -p, –protocol [!] proto : 프로토콜을 지정한다. !은 제외의 의미이다.
 -s, –source [!] address[/mask] : 출발지 주소를 지정한다. mask는 C클래스면 255.255.255.0이나 24비트로 표현된다.
 -d, –destination [!] address[/mask] : 목적지 주소를 지정한다.
 -i, –in-interface [!] input name[+] 수신하는 네트워크 인터페이스 이름을 지정한다. name+은 name으로 시작하는 모든 인터페이스 이름이다.
 -j –jump target : 지정하는 target으로 리다이렉트 시킨다.
 -m : 지정한 match로 확장이 가능하다.
 -n : IP주소와 포트번호를 숫자 그대로 보여준다.
 -o, –out-interface [!] output name[+] : 발신하는 네트워크 인터페이스 이름을 지정한다.
 -v, –verbose : 상세한 정보를 보여준다.
 –line-numbers : 룰정책을 보여줄 때 줄번호도 나타낸다.
 -x, –exact : 정확한 값으로 나타낸다.
 -V, –version : 버전 정보를 보여준다.

Basic rules

Table

Iptable 에는 크게 4가지 테이블이 존재한다(Filter, Nat, Mangle, Raw).

Chain

Filter 테이블에는 미리 정의된 3가지 체인이 존재한다(INPUT, OUTPUT, FORWARD).

- INPUT : 호스트 컴퓨터를 향한 모든 패킷
- OUTPUT : 호스트 컴퓨터에서 발생하는 모든 패킷
- FORWARD : 호스트 컴퓨터가 목적지가 아닌 모든 패킷, 즉 라우터로 사용되는 호스트 컴퓨터를 통과하는 패킷

Match

Iptables 에서 패킷을 처리할 때, 매칭되는 조건을 지정한다.

--source (-s) : 출발지 IP주소나 네트워크와의 매칭
--destination (-d) : 목적지 ip주소나 네트워크와의 매칭
--protocol (-p) : 특정 프로토콜과의 매칭
--in-interface (i) : 입력 인테페이스
--out-interface (-o) : 출력 인터페이스
--state : 연결 상태와의 매칭
--string : 애플리케이션 계층 데이터 바이트 순서와의 매칭
--comment : 커널 메모리 내의 규칙과 연계되는 최대 256바이트 주석
--syn (-y) : SYN 패킷을 허용하지 않는다.
--fragment (-f) : 두 번째 이후의 조각에 대해서 규칙을 명시한다.
--table (-t) : 처리될 테이블
--jump (-j) : 규칙에 맞는 패킷을 어떻게 처리할 것인가를 명시한다.
--match (-m) : 특정 모듈과의 매치

Target

규칙에서 취해야 할 동작을 지정한다.

- ACCEPT : 패킷을 받아들인다.
- DROP : 패킷을 버린다.
- REJECT : 패킷을 버리고 이와 동시에 적절한 응답 패킷을 전송한다.
- LOG : 패킷을 syslog에 기록한다.
- RETURN : 호출 체인 내에서 패킷 처리를 계속한다.

REJECT는 서비스에 접속하려는 사용자의 액세스를 거부하고 connection refused라는 오류 메시지를 보여주는 반면 DROP은 말 그대로 telnet 사용자에게 어떠한 경고 메시지도 보여주지 않은 채 패킷을 드롭한다.

Connection Tracking

서비스 연결상태에 따른 규칙 적용이 가능하다.

- NEW : 새로운 연결을 요청하는 패킷, 예, HTTP 요청
- ESTABLISHED : 기존 연결의 일부인 패킷
- RELATED : 기존 연결에 속하지만 새로운 연결을 요청하는 패킷, 예를 들면 접속 포트가 20인 수동 FTP의 경우 전송 포트는 사용되지 않은 1024 이상의 어느 포트라도 사용 가능하다.
- INVALID : 연결 추적표에서 어디 연결에도 속하지 않은 패킷

상태에 기반(stateful)한 iptables 연결 추적 기능은 어느 네트워크 프로토콜에서나 사용 가능하다. UDP와 같이 상태를 저장하지 않는 (stateless) 프로토콜에서도 사용할 수 있다.

Samples

Default DROP

기본 설정을 DROP으로 하고, 이어서 필요한 서비스들에 대한 포트들만 ACCEPT 하는 전략. <source lang=bash>

  1. -- Set default policy to DROP

$ sudo iptables -P INPUT DROP

  1. -- ssh

$ sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT $ sudo iptables -A INPUT -p udp --dport 22 -j ACCEPT

  1. -- http

$ sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT $ sudo iptables -A INPUT -p udp --dport 80 -j ACCEPT

  1. -- https

$ sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT $ sudo iptables -A INPUT -p udp --dport 443 -j ACCEPT

  1. -- jenkins

$ sudo iptables -A INPUT -p tcp --dport 8081 -j ACCEPT

  1. -- sip

$ sudo iptables -A INPUT -p tcp --dport 5060 -j ACCEPT $ sudo iptables -A INPUT -p tcp --dport 5060 -j ACCEPT $ sudo iptables -A INPUT -p tcp --dport 5061 -j ACCEPT $ sudo iptables -A INPUT -p tcp --dport 5061 -j ACCEPT $ sudo iptables -A INPUT -p udp -m udp --dport 10000:20000 -j ACCEPT </source>

Masquerade

Masquerade 는 Linux 에서 하나 이상의 NIC 혹은 네트워크를 가지고 있을 경우, 한쪽에서 다른 쪽으로 패킷을 전달하고자 할 때 사용하는 기술이다. 다른 말로는 NAT 라고도 표현한다.

다음 예제는 외부로 향하는 네트워크의 NIC 이름이 eth0 일 경우 설정하는 방법이다.

$ sudo -i

# echo 1 > /proc/sys/net/ipv4/ip_forward

#cat /proc/sys/net/ipv4/ip_forward
1

# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

ETC

Persistent mode

Run the iptables rule in a persistent mode.

$ sudo apt install iptables-persistent

See also

References

<references />