본문 바로가기

Linux/Ubuntu

[Linux] iptables 사용법 정리

 

1. iptables 란?

 

위키 백과의 설명

요약하자면

1) netfilter 라는 네트워크 관련 API 의 Wrapper임.

2) 방화벽 테이블, 체인, 규칙을 쉽게 쓸 수 있게 해줌

3) ip6tables, arptables, ebtables 같은 친구들이 있음

4) 리눅스 최신 버전은 nftables 를 쓰고, 이건 위 친구들을 전부 통합했음

이다.

 

비록 최신 리눅스는 nftables를 쓴다지만...

아직도 온라인에서 많은 자료들은 iptables 를 활용하고있고, 또 현업에서도 사용되고있다.

 

2. 전체 흐름 및 구분

 

간소화 버전과 풀버전

iptables의 RULE은 크게 Table & Chain, Match, Target 개념을 사용한다.

 

Table 과 Chain 에 관련된 내용은 iptables man page에 기술되어 있고,

Match 와 Target 에 관련된 내용은 iptables-extensions man page에 기술되어있다.

 

(1) Table & Chain

 

Table 은 Filter, NAT, Mangle, Raw 네 가지로 구분되며, 각각 사전에 정의된 Chain 을 가지고 있다.

Table 은 kernel level 에서 미리 정의되어 추가/삭제가 용이하지 않다.

반면 Chain은 사용자가 임의로 추가하거나 삭제하는 옵션을 가지고 있다.

만약 user-defined rule 이 필요할 경우 chain 을 활용하는 것이 좋다.

 

1) Filter

가장 기본적인 테이블로, 패킷 필터링을 담당한다.

아래 세 가지의 기본 Chain 을 가지고 있다.

a. INPUT : 호스트 컴퓨터의 로컬 프로세스를 향해 들어온 모든 패킷이 방문하는 chain 이다.

b. FORWARD : 타겟이 호스트가 아닌, 즉 호스트 컴퓨터를 경유하는 패킷이 방문하는 chain 이다. 이 chain 을 방문하는 packet 은 local process 를 거치지 않는다.

c. OUTPUT : 호스트 컴퓨터에서 자체적으로 생성된 패킷이 방문하는 chain 이다.

 

일반적으로 서비스 프로그램의 포트 등은 filter table 에 등록하며,

실제로 우분투 방화벽 시스템인 ufw 나 가상 환경 프로그램인 docker 은 설치 시 자신을 filter table에 새로운 chain을 추가하는 방식으로 등록한다.

 

2) NAT

Network Address Translation 의 약자로,

ip와 port 등을 변환하는 역할을 한다.

주로 Port forwarding, Bridging, Packet Monitoring 에 사용되며

실제로 실무에서 대부분의 서비스는 클라이언트의 ip, port 를 내부 프로그램으로 돌릴 때 NAT 테이블을 사용한다.

 

NAT 테이블의 기본 chain은 4가지가 있다.

a. PREROUTING : 패킷을 INPUT rule 로 보내기 전 ip 와 port를 변경하는 역할을 한다.

b. INPUT : filter 테이블과 같은 역할이나, 먼저 적용

c. OUTPUT : filter 테이블과 같은 역할이나, 나중에 적용

d. POSTROUTING : 패킷이 OUTPUT rule 에서 나온 이후 ip 와 port 를 변경하는 역할을 한다.

 

꼭 PREROUTING 이 destination 만을, POSTROUTING 이 source 만을 변경하라는 법은 없으나, 그러한 방식을 주로 사용한다.

 

3) Mangle : 특수 규칙을 이용해 패킷 구조를 변경하거나 ToS를 설정한다.

4) Raw : Netfilter API의 기본 tracking 과 별개로 존재하는 룰을 만들 때 사용된다.

5) Security : 보안을 위한 Table

 

많은 경우 Filter, NAT 테이블만을 사용하며 나머지는 특별한 상황이 아니면 잘 사용하지 않는다.

 

(2) Match

 

iptables [-m name [module-options...]]

 

일종의 trigger 를 설정하는 방안이다.

 

iptables 는 packet matching module extension 을  -m, --match 옵션을 통해 활용할 수 있다.

-p, --protocol 을 정한 다음 -h 또는 --help 하면 해당 프로토콜에 적용 가능한 모듈을 볼 수 있고

module 이름을 정한 다음 -h 또는 --help 하면 기존의 iptables 기본 설명이 아닌 모듈의 설명을 볼 수 있다.

 

아래는 자주 사용하는 match 규칙들이다.

 

1) addrtype

packet 의 address type 에 따라 매칭할 수 있다.

* UNSPEC : 0.0.0.0 등 unspecified address

* LOCAL : local address

* UNICAST, BROADCAST, ANYCAST, MULTICAST

* BLACKHOLE : blackhole addres

* UNREACHABLE, PROHIBIT

 

2) bpf

Linux socket filter 를 이용해서 matching 한다. bytecode 를 이용한 필터링이 가능해, 주로 PCAP 등을 활용할 때 자주 사용된다.

 

3) comment

필터 설정 시 256 자 까지 코멘트를 넣을 수 있고, 추후 코멘트를 이용해 필터링이 가능하다.

iptables -A INPUT -i eth1 -m comment --comment "my local LAN"

 

4) connbytes

해당 packet connection 이 이어지는 동안 여태까지 전달된 패킷의 크기를 이용해 필터링 가능하다.

* --connbytes from:to

* --connbytes-dir original|reply|both

* --connbytes-mode packets|bytes|avgpkt

iptables (...) -m connbytes --connbytes 0:1000 --connbytes-dir both --connbytes-mode packet

위와 같이 설정하여 양방향 패킷 1000개까지만 매치시켜 ACCEPT 룰 등을 추가할 수 있도록 만들 수 있다.

 

5) cpu

해당 패킷 handling 이 특정 cpu 클러스터에서 작동하도록 마킹한다.

 

6) iprange

IP 의 범위를 정해서 매칭할 수 있다.

* --src-range from-to

* --dst-range from-to

 

7) length

layer-3 payload 의 크기를 특정 또는 범위 지정하여 매칭할 수 있다.

 

8) limit

rate 나 maximum initial number 를 지정할 수 있다.

주의할 점은,

limit matching 은 트리거를 설정할 뿐이라는 것인데,

이는 logging 등을 유용하게 활용할 수 있는 방안이 되고

실제 rate limit 등을 하기 위해서는 target 을 drop 이나 reject 하는 등으로 추가 설정이 필요하다.

 

9) mac

MAC을 지정할 수 있다.

 

10) multiport

tcp, udp, dccp, sctp 를 전제로 source, destination port 를 최대 15개 까지 지정할 수 있다.

* --source-ports, --sports num, num1:num2

* --destination-ports, --dports num, num1:num2

* --ports num, num1:num2

iptables (...) -m multiport --sports 8080:8086

11) state

conntrack module 의 일부로, connection 상태를 기반으로 매칭시킬 수 있다.

* --state : INVALID, ESTABLISHED, NEW, RELATED, UNTRACKED 를 인자로 받을 수 있다.

 

 

(3) TARGET

 

iptables [-j target-name [target-options...]

 

iptables 에서 target 이란, 해당 table-chain 에게 적용할 정책(policy) 를 말한다.

패킷은 각 테이블에서 chain을 traverse 하며 matching 되는 rule을 찾고 RETURN 할 때 까지 continue 한다.

만약 패킷이 어느 한 Rule 에서 return 하면 해당 rule 을 따르고, 모든 rule 에서 매칭되지 않으면 그 chain의 default policy를 따른다.

 

기본 target 은 다음과 같다.

 

1) ACCEPT

패킷이 해당 rule에 매치되면 해당 패킷을 통과시킨다.

패킷이 해당 스테이지에서 통과되면 다음 스테이지로 넘어간다.

예를 들어, NAT의 PREROUTING 단계를 통과한 패킷은 FILTER 의 INPUT 단계로 넘어간다.

 

2) DROP

패킷이 해당 rule에 매치되면 해당 패킷을 버린다.

 

3) REJECT

기본적으로 DROP 과 같으나, 거절되었음을 응답하는 과정이 추가된다.

가령 ping 을 쏘는 ICMP 프로토콜의 경우 DROP은 무응답으로 timeout 되는 blackhole 상태이나, REJECT는 "port unreachable" 이라는 메시지를 mirror 해준다.

LAN을 구성할 때 IP occupy 를 신경써야하는 상황에서는 DROP 보다는 REJECT 가 더 좋을 것이다.

* --reject-with : icmp-proto-unrachable 등 reject 타입을 정한다.

 

4) LOG

matching packet 에 대한 kernel logging 을 켜 dmesg 나 syslog 로 보여준다.

옵션으로 아래 내용을 전달할 수 있다.

* --log-level

* --log-prefix

LOG 는 내부적으로 RETURN 이 아닌 CONTINUE 를 전달한다.

 

 

 

이외에 iptables-extensions 에서 정의되는 target 중 유용한 것은 다음이 있다.

 

1) AUDIT

accept, drop, reject 패킷을 기록할 때 사용된다.

iptables -N AUDIT_DROP # new chain
iptables -A AUDIT_DROP -j AUDIT
iptables -A AUDIT_DROP -j DROP

 

2) DNAT

NAT table 의 PREROUTING, OUTPUT chain 에서만 작동한다.

Packet의 Destination address 를 새로운 ip:port 로 수정한다.

iptables (...) -p tcp -j DNAT --to-destination 192.168.10.111:2323

 

3) IDLETIMER

특정 NIC가 유휴상태임을 구별하는 데 쓰인다.

설정한 타이머가 expired 되면 sysfs notification 을 유저에게 보낸다.

유저는 이 정보를 활용해 절전모드 off 등을 구별할 수 있다.

 

4) LED

system indicator 이 특정 패킷에 반응하도록 설정할 수 있다.

* --led-trigger-id : 트리거 이름을 설정한다. 실제 이름은 netfilter-(설정한이름) 이 된다.

* --led-delay : ms 단위 illuminate time 설정

iptables -A INPUT -p tcp --dport 22 -j LED --led-delay 100 --led-trigger-id ssh
echo netfilter-ssh >/sys/class/leds/ledname/trigger

 

5) MASQUERADE

NAT 테이블의 POSTROUTING chain 에서만 사용할 수 있는 target으로,

패킷이 나가는 인터페이스와 IP를 매핑하는 역할을 한다.

주의점으로는

a. interface 가 down 되면 connection 이 끊긴다.

b. DHCP 연결에서만 사용 가능하며, static 의 경우 SNAT 을 사용해야한다.

c. tcp, udp, dccp, sctp 에서만 사용 가능하다.

 

* --to-port : 사용할 source port 를 정하여 default SNAT 을 덮어씌운다.

* --random. --random-fully : 포트 매핑을 랜덤하게 한다.

 

자세한 내용은 후술한다.

 

6) REDIRECT

NAT 테이블의 PREROUTING, OUTPUT chain 에서만 사용할 수 있는 chain 이다.

기기 내에서 Destination IP 를 incoming interface 의 primary address 로 바꿈으로써 패킷을 redirect 해준다.

 

* --to-port : 사용할 destination port

* --random : port mapping 을 randomize 한다.

 

자세한 내용은 후술한다.

 

 

7) SET

ipset 명령어에 정의되어있는 옵션 이것저것을 추가할 수 있다.

8) SNAT

NAT 테이블의 POSTROUTING, INPUT chain 에서만 사용 가능하다.

Packet의 Source address 를 새로운 ip:port 로 수정한다.

자세한 내용은 DNAT, MASQUERADE 와 함께 후술한다.

 

9) TEE

패킷을 clone 하고 local network segment의 다른 호스트에게 redirect 한다.

즉, 받은 패킷을 처리하는 동시에 mirroring 해주는 기능이다.

 

아래는 eth2 로 받은 tcp 80포트 패킷을 192.168.0.1 에 mirror 해주는 설정 예시다.

iptables -A PREROUTING -t mangle -i eth2 -p tcp --dport 80 -j TEE --gateway 192.168.0.1

 

10) TTL

IPv4의 TTL 헤더를 수정한다.

TTL 헤더는 time to live 가 초과될 때 까지 packet이 traverse 할 수 있는 router의 수다.

TTL 을 줄이면 패킷은 금방 사라질 것이며, TTL을 늘리면 더 오래 살아남을 수 있다.

iptables-extensions man page 에서는 local network 를 벗어나는 packet 에는 절대로 set 이나 increment 하지 말라고 한다.

 

* --ttl-set value

* --ttl-dec value

* --ttl-inc value

 

 

3. 커맨드와 옵션

 

iptables 의 man page 를 보면 다음과 같이 기술되어 있다.

iptables [-t table] {-A|-C|-D} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
...

(1) Command

 

다음은 자주 사용하는 command 에 관한 설명이다.

 

1) Chain 관련

a. --new, -N : user-defined chain 을 생성한다.

b. --delete-change, -X : user-defined chain 을 삭제한다.

c. --rename-chain -E : 체인 이름을 바꾼다. predefined chain 도 가능하다.

d. --policy, -P : 체인의 기본 target을 변경한다. predefined chain 에만 적용 가능하다.

 

2) Rule 관련

a.  --append, -A : 체인의 가장 마지막에 룰을 더한다.

b. --insert, -I : 체인에 룰을 더한다. 순서(rule number)를 설정할 수 있으며, 입력하지 않으면 1(가장 처음)을 default 로 지정한다.

c. --delete, -D : 체인에 해당 룰을 제거한다. rule number 를 사용한다.

d. --flush, -F : 체인에 있는 모든 룰을 제거한다. 체인을 지정하지 않으면 모든 체인에 대해 적용한다.

e. --check, -C : 해당 체인에 rule 이 있는지 체크한다.

f. --replace, -R : rule number 를 변경한다.

g. --list, -L : chain 별 rule 의 리스트를 보여준다.

h. --list-rules, -S : 위 -L 옵션과 같은 내용을 명령어 옵션 형태로 print 해준다.

 

(2) Option

 

다음은 자주 사용하는 Option 에 관한 설명이다.

 

1) --protocol, -p : 프로토콜을 지정한다.

2) --source, -s : source address 를 지정한다.

3) --destination, -d : destination address 를 지정한다.

4) --in-interface, -i : INPUT 네트워크 인터페이스를 지정한다.

5) --out-interface, -o : OUTPUT 네트워크 인터페이스를 지정한다.

6) --jump, -j : 해당 rule에 해당하는 패킷에 사용할 target 정책을 지정한다. extended target 을 위한 옵션.

7) --match, -m : extended match 를 위한 옵션.

8) --table, -t : 테이블을 지정하는 옵션. 설정하지 않으면 filter 테이블을 default 로 지정한다.

9) -verbose, -v : verbose mode 로 사용한다.

10) --line-numbers : print 할 때 line number 를 함께 출력한다.

 

 

4. Filter 사용례

 

Filter 테이블은 대부분 아래 두 가지 용도로 사용된다.

 

(1) 방화벽

 

INPUT 과 OUTPUT 패킷에 대한 정책을 정하고 실행하여, 원하는 패킷만 선택적으로 수용하거나 일부 패킷만을 막는다.

 

1) ACCEPT

iptables -t filter -P INPUT DROP
iptables -t filter -A INPUT -p tcp --dport 137 -j ACCEPT

선택적 수용을 하기 위해서는 기본 정책이 block 이어야 하므로 INPUT 의 정책을 DROP 으로 변경한 뒤,

INPUT 에서 destination port 가 137인 것만 ACCEPT 를 하도록 예외 정책을 세웠다.

 

 

2) DROP, REJECT

iptables -t filter -P INPUT ACEEPT
iptables -t filter -A INPUT -p tcp --dport 22 -j DROP

선택적 차단을 하기 위해서는 기본 정책이 허용 이어야 하므로 INPUT 의 정책을 ACCEPT 으로 변경한 뒤,

INPUT 에서 destination port 가 22인 것만 DROP 를 하도록 예외 정책을 세웠다.

 

Custom chain 의 경우 -P 옵션을 사용한 default 정책 설정이 불가능하므로 다음과 같이 한다.

iptables -t filter -N user-chain
iptables -t filter -A user-chain -p tcp -j ACCEPT
iptables -t filter -I user-chain 1 -p tcp --dport 22 -j DROP

rule number 순서대로 작동하므로 exception 을 1번 Rule 에 넣고, default 를 그 후에 넣는다.

 

(2) 라우팅

 

Routing decision 은 forward 할지 local process input 으로 보낼 지 결정하는 단계로,

 

1) INPUT 체인에서 매칭되지 않거나, 매칭되었더라도 binding 되어있는 process 가 없음

2) FORWARD 체인의 기본 정책이 ACCEPT 이거나, block 이더라도 exception rule 에 매칭됌

일 경우 forwarding 한다.

 

즉, local process 가 요구하지 않는 자원이고 forward 하려는 의도가 있으면 forward 한다.

 

FORWARD 체인은 기본 정책으로 ACCEPT 이나,

만약 DROP 또는 REJECT 로 바꿀 경우 다음과 같이 exception rule 을 만들어주어야 한다.

 

iptables -t filter -P FORWARD DROP # default drop
iptables -t filter -A FORWARD -p udp -d 192.168.1.200 --dport 123 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

 

 

4. NAT 사용례

 

NAT 테이블에도 INPUT, OUTPUT 과 관련된 정책이 있지만,

Filter 테이블과 구별되는 차이점은 PREROUTING 과 POSTROUTING 이다.

해당 chain을 잘 활용하기 위한 target 인 SNAT, DNAT, MASQUERADE, REDIRECT 이 있다.

 

(1) SNAT

 

Source Network Address Translation 의 약자로,

다음 두 경우에 사용된다.

 

1) INPUT

Filter 테이블의 INPUT 직전에 사용되어

local process 에 접근하는 source address 가 원래는 비허가인데 허가인 것 처럼, 또는 허가인데 비허가인 것 처럼 변환한다.

주로 특정 ip 에서 접근하는 것만 허용하는 프로세스를 외부 client 가 접속할 때 사용한다.

 

2) POSTROUTING

local process 가 외부로 보내는 패킷의 source address 를 변환한다.

주로 응답 패킷을 기존 connection 과 같아 보이도록 유지하는 데에 사용하며,

패킷레벨에서는 TCP connection, 백엔드에서는 clustered server, 엣지 노드에서는 mesh network bridge 에서 유용하다.

 

 

(2) DNAT

 

Destination Network Address Translation 의 약자로,

다음 두 경우에 사용된다.

 

1) PREROUTING

외부에서 오는 패킷의 destination 을 변경하여,

- 기존에 INPUT 으로 가야 할 패킷을 FORWARDING 으로 변경

- well-known port 와 같은 기능을 하는 local process의 port 가 다를 경우 port 번호 변경

의 용도로 자주 쓰인다.

FORWARDING->INPUT 으로 변경하는 것은 잘 쓰이지 않는다. 패킷 모니터링 용도로는 TEE 등의 mirroring 기능을 사용한다.

 

2) OUTPUT

filter 테이블의 OUTPUT 직전에 사용되어

원래라면 output sending 할 수 없도록 filtering 되어야 할 패킷을 허가하는 것 처럼 변환하는 데 쓰인다.

원래 허가인 패킷을 비허가인 것 처럼 바꿀 수도 있으나, 이 경우 nat output 이 아니라 filter output 의 rule 을 바꾸는 게 맞다.

 

 

(3) Masquerade

 

POSTROUTING 단계에서 사용하는 SNAT 과 목적, 용도가 동일하다.

차이점은, SNAT 이 source address 를 Static IP 로 지정하는 것에 반해

Masquerade 는 네트워크 인터페이스를 지정하고, 해당 인터페이스의 DHCP를 따른다.

이러한 특성 때문에 브릿징을 할 경우 SNAT+DNAT 보다는 MASQUERADE+REDIRECT 를 사용한다.

 

아래는 wlan0로 나가는 패킷 중 ip 가 127.0.0.1 이고 netmask 가 255.255.255.0 인 모든 패킷을 51234 포트로 재전송하도록 설정하는 예시다.

 

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 127.0.0.1/24 -o wlan0 -j MASQUERADE --to-port 51234

 

 

(4) REDIRECT

 

REDIRECT 는 다음 두 용도로 사용된다.

 

1) PREROUTING

PREROUTING 단계에서 사용하는 DNAT 과 목적, 용도가 동일하다.

Masquerade 와 마찬가지로, DNAT 과의 차이점은 Static IP 가 아닌 incoming network interface 의 IP 를 따른다.

 

아래는 eth0 인터페이스로 오는 모든 패킷을  9040 포트로 redirect 설정하는 예시와, ip 1.1.1.1에서 80포트로 접속하려는 시도를 8080포트로 redirect 설정하는 예시다.

iptables -t nat -A PREROUTING -i eth0 -p tcp --syn -j REDIRECT --to-ports 9040
iptables -t nat -A PREROUTING -s 1.1.1.1 -p tcp --dport 80 -j REDIRECT --to 8080

 

물론 DNAT 도 IP 가 아닌 interface 기반의 filtering 을 사용할 수 있으므로, 아래 두 구문은 일치한다.

 

-A PREROUTING -i eth0 -p tcp --dport 123 -j REDIRECT --to-ports 50123
-A PREROUTING -i eth0 -p tcp --dport 123 -j DNAT --to-destination :50123

 

 

2) OUTPUT

local process 에서 생성된 output을 또 다시 다른 local process 로 보낼 때 사용한다.

이 경우 IP는 자동적으로 127.0.0.1 또는 ::1 이 할당된다.

 

아래는 192.168.123.12 로 패킷을 보내려는 locally generated output packet 을 다시 local host 의 50123 포트로 REDIRECT 하는 예시다.

iptables -t nat -p tcp -d 192.168.123.12 --dport 123 -j REDIRECT --to-port 50123

 

만약 output 을 firewall 너머의 다른 서버로 향하고자 한다면 REDIRECT 가 아닌 DNAT 을 사용하는 것이 바람직하다.

 

5. 복잡한 실 사용례

 

위 내용들을 종합해 복잡한 사용례를 만들어 보자.

 

외부에서 192.168.0.30:80 으로 HTTP 접속을 요청했을 때

 

1) mangle 의 PREROUTING 에서 TEE 를 이용해 eth0 80포트로 들어오는 내용을 gateway 192.168.0.1 로 미러링

 

2) nat 의 PREROUTING 에서 DNAT 하여 dport 80 를 8080으로 변경

 

3) filter 에서는 INPUT chain 을 default DROP 한 다음 user-defined chain 전체를 순회 등록

3-1) user-before-input-logging : chain 만 생성하고 rule X

3-2) user-before-input

a. conntrack 이용해서 connection state가 INVALID 인 것은 LOG 하고 DROP

b. ICMP 프로토콜 ACCEPT

c. UDP 프로토콜 sport 67 dport 68 ACCEPT

d. TCP 프로토콜 dst 235.255.255.250/32 의 dport 5353 ACCEPT

3-3) user-after-input

a. UDP 프로토콜 dport 136을 user-input-skip 으로 jump

b. TCP 프로토콜 dport 139를 user-input-skip 으로 jump

c. BROADCAST 타입을 user-input-skip 으로 jump

3-4) user-after-input-logging

limit 은 3/min, burst 는 10 으로 하여 [USERLIMIT BLOCK] prefix 와 함께 로깅

3-5) user-reject-input : 설정 X

3-6) user-track-input

conntrack 이용해서 tcp, udp 중 connection state가 NEW 인것은 ACCEPT

 

4) user-input-skip, user-output-skip

모든 packet 을 ACCEPT

 

5) filter 에서 OUTPUT chain default 를 ACCEPT로 하고, 다음 rule 생성

5-1) user-output-redirect

dst가 192.168.0.0 또는 dport 가 8080 인 것은 127.0.0.1:50080으로 REDIRECT

5-2) user-output-block

icmp-type이 11 인 것은 DROP

 

6) mangle 의 POSTROUTING 에서 TEE 를 이용해 local loopback 으로 미러링

 

7) nat 의 POSTROUTING 에서 src가 local loopback 이고 sport 80인 것을 output interface eth1 의 src IP, sport 8080으로 Masquerade 하여 전송

 

위를 구현하면 아래와 같다.

 

iptables -t mangle -A PREROUTING -i eth0 -j TEE --gateway 192.168.0.1
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-port 8080

iptables -F INPUT
iptables -P DROP
iptables -N user-before-input-logging
iptables -N user-before-input
iptables -N user-after-input
iptables -N user-after-input-logging
iptables -N user-reject-input
iptables -N user-track-input
iptables -N user-input-skip

iptables -A INPUT -j user-before-input-logging
iptables -A INPUT -j user-before-input
iptables -A INPUT -j user-after-input
iptables -A INPUT -j user-after-input-logging
iptables -A INPUT -j user-reject-input
iptables -A INPUT -j user-track-input

iptables -A user-before-input -m conntrack --ctstate INVALID -j DROP
iptables -A user-before-input -p icmp -j ACCEPT
iptables -A user-before-input -p udp --sport 67 --dport 68 -j ACCEPT
iptables -A user-before-input -p tcp -d 235.255.255.250/32 --dport 5353 -j ACCEPT
iptables -A user-after-input -p udp --dport 137 -j user-input-skip
iptables -A user-after-input -p tcp --dport 139 -j user-input-skip
iptables -A user-after-input -m addrtype --dst-type BROADCAST -j user-input-skip
iptables -A user-after-input-logging -m limit --limit 3/min --limit-burst 10 -j LOG --log-prefix "[USERLIMIT BLOCK]"
iptables -A user-track-input -p tcp -m conntrack --ctstate NEW -j ACCEPT
iptables -A user-track-input -p udp -m conntrack --ctstate NEW -j ACCEPT
iptables -A user-input-skip -j ACCEPT

iptables -N user-output-redirect
iptables -N user-output-block
iptables -A user-output-redirect -d 192.168.0.0 -j REDIRECT --to-port 50080
iptables -A user-output-redirect --dport 8080 -j REDIRECT --to-port 50080
iptables -A user-output-block -p icmp -m icmp --icmp-type 11 -j DROP

iptables -t mangle -A POSTROUTING -i eth0 -j TEE --gateway 127.0.0.1

iptables -t nat -A POSTROUTING -s 127.0.0.1 --sport 80 -o eth1 -j MASQUERADE --to-port 8080

 

6. save & restore

 

iptables 로 설정한 내용은 RAM 에 들어있고, 설정 즉시 적용되며, 재부팅시 날아간다.

따라서 save 와 restore 하는 과정이 필요하다.

 

(1) save

iptables-save > /etc/iptables.rules

 

(2) restore

iptables-restore < /etc/iptables.rules

 

(3) 부팅시 자동 restore

 

cat EOF >> /etc/network/interfaces
pre-up iptables-restore < /etc/iptables.rules
pst-down iptables-save -c > /etc/iptables.rules
EOF