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
'Linux > Ubuntu' 카테고리의 다른 글
[Linux] 우분투(Ubuntu) 20.04LTS 어도비 플래시 플레이어 다운받기 (0) | 2020.06.24 |
---|---|
[Linux] 우분투(Ubuntu) 20.04LTS 설치 및 세팅 (1) | 2020.04.21 |
[Linux] Ubuntu 19.04 에서 한글 뷰어 다운로드하기 (hwp 열기) (3) | 2019.09.13 |