Iptables: Difference between revisions
No edit summary |
(→ETC) |
||
(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> | ||
$ 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 | ||
</pre> | |||
== ETC == | |||
=== Persistent mode === | |||
Run the iptables rule in a persistent mode. | |||
<pre> | |||
$ sudo apt install iptables-persistent | |||
iptables | |||
iptables - | |||
</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: | [[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>
- -- 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 일 경우 설정하는 방법이다.
$ 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
- 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 />