linux의 여러 table들을 관리하는 명령어이다.
원래는 방화벽 뿐만이 아니라 여러개의 table을 담당을 한다. 기본으로 있는 table은 Filter, NAT, RAW, Mangle이다.
Ubuntu에서의 설치는 다음과 같다.
$ sudo apt install iptables
각 table에는 여러개의 chain이 있다. 각 chain은 여러개의 rule을 또 포함한다. 계층 관계를 가지고 있다고 생각하면 된다. 여러개의 규칙이 모여 chain 형성, 그리고 여러개의 chain이 모여 하나의 table 형성.
packet은 처음에 table에 도달하면 특정 chain에 들어가 거기 안에서 어떤 rule을 만족하는지 확인을 한다. 만족하는 rule을 찾으면, target이 주어지게 된다. 이 target은
ACCEPT
: packet 통과 허용DROP
: packet 통과 불허RETURN
: 해당 chain에서 더 진행되지 못하게 하고 이전 chain으로 돌아가도록 강요.REJECT
: DROP
과 같은데, 오류 메시지도 송신자에게 전달한다.iptables
조작을 하려면 꼭, sudo
권한을 가지고 있어야 한다.
PREROUTING
: routing이 본격적으로 이루어지기 전에 destination을 조작하는 것을 관여하는 chain이다.POSTROUTING
: routing이 이루어진 후 source를 수정할 때 사용하는 chain. masquerading에 쓰인다.INPUT
: 잘 안쓰인다. 보통 NAT가 routing 과정에 온 packet의 source/destination address를 변조시키는데 쓰이는데 본인의 host로 오는 packet에 대해서 이를 신경 쓸 이유는 별로 없기 때문.OUTPUT
: 반면 본인 host에서 온 packet이 다른곳에 전달되려고 할 때 destination을 수정하기 위해 자주 사용된다.PREROUTING
: 오고 있는 모든 종류의 connection에 대해서 골라내는데 사용되는 tableOUTPUT
: 본인에게서 나가고 있는 모든 종류의 packet에 대해서 골라내는데 사용되는 tableINPUT
: 본인으로 오는 packet에 대해 조작OUTPUT
: 본인에게서 나가는 packet에 대해 조작FORWARD
: linux box를 통해 routing되는 packet에 대해 조작PREROUTING
: 오고 있는 모든 종류의 connection에 대해 조작POSTROUTING
: 나가고 있는 모든 종류의 connection에 대해 조작INPUT
: host로 오는 packet들에 대해 관리를 하는 chainFORWARD
: 다른 곳으로 forwarding할 예정인데 이 host로 온 packet들에 대해 관리를 하는 chainOUTPUT
: host에서 밖으로 나가는 packet들에 대해 관리를 하는 chain-L
, -v
$ sudo iptables -L -v
-L
option은 모든 rule을 출력하는데 사용되며, -v
는 verbose의 약자로 상세한 정보를 보여주는데 사용된다. 사용하면 초기에는 다음과 같다.Chain INPUT (policy ACCEPT 438 packets, 476K bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 228 packets, 17560 bytes)
pkts bytes target prot opt in out source destination
-A
-i
: filtering 대상 host의 interface-p
: filtering 대상 packet의 protocol. tcp
, udp
, udplite
, icmp
, sctp
, icmpv6
등 여러개가 가능하다.-s
: filtering 대상 source ip address--dport
: filtering 대상의 destination port number-j
: target 이름. 앞에서 본 ACCEPT
, DROP
, RETURN
중 하나. Filter table의 경우 무조건 넣어야 한다.$ sudo iptables -D INPUT 1
-L
이랑 --line-numbers
를 같이 활용해가지고 list를 볼 수 있도록 하자.$ sudo iptables -L --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
2 ACCEPT all -- anywhere anywhere
3 ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
4 ACCEPT tcp -- anywhere anywhere tcp dpt:http
5 ACCEPT tcp -- anywhere anywhere tcp dpt:https
6 DROP all -- anywhere anywhere
$ sudo iptables -F
$ sudo iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT
iptables
는 filter table에 대해 작용한다. 다른 table에 대해서도 무언가를 하고 싶으면 -t
를 사용하고 뒤에 nat
, raw
, mangle
을 사용하면 된다.$ sudo iptables -t raw -L -v
$ sudo iptables -N WHACKAMOLE
$ sudo iptables -X WHACKAMOLE
lo
interface는 loopback
interface로 local host에서의 communication에서 사용된다. localhost
내 communication은 뭐든 신경 안쓰겠다는 뜻.$ sudo iptables -A INPUT -i lo -j ACCEPT
$ sudo iptables -A INPUT -o lo -j ACCEPT
$ 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
$ sudo iptables -L -v
Chain INPUT (policy ACCEPT 564 packets, 486K bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- lo any anywhere anywhere
0 0 ACCEPT tcp -- any any anywhere anywhere tcp dpt:ssh
0 0 ACCEPT tcp -- any any anywhere anywhere tcp dpt:http
0 0 ACCEPT tcp -- any any anywhere anywhere tcp dpt:https
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 228 packets, 17560 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- lo any anywhere anywhere
$ sudo iptables -A INPUT -j DROP
$ sudo iptables -F
$ sudo iptables -vL
Chain INPUT (policy ACCEPT 687 packets, 496K bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 228 packets, 17560 bytes)
pkts bytes target prot opt in out source destination
$ sudo iptables -A INPUT -p tcp -s 1.2.3.4 -j DROP
iprange
module이 필요하다. module을 사용할 때는 -m
option을 사용하고 module 이름을 거기에 붙여넣는다.$ sudo iptables -A INPUT -m iprange --src-range 192.168.0.128-192.168.0.255 -j REJECT
multiport
module을 사용해가지고 여러개의 destination/source port에 대한 rule을 한번에 추가하는 법을 알아볼 것이다. 이 때 -p
option이 필수로 들어가야 한다.$ sudo iptables -A INPUT -p tcp -m multiport --dport 22,80,443 -j ACCEPT
$ sudo iptables -A OUTPUT -p tcp -m multiport --sport 22,80,443 -j ACCEPT
-d
option은 destination ip address를 의미한다. host에서 나가는 packet중 저 특정 subnet을 destination으로, 22번 port를 목표로 하는 TCP packet들은 나가는 것을 허용하겠다는 뜻.$ sudo iptables -A OUTPUT -p tcp -d 192.168.72.128/24 --dport 22 -j ACCEPT
$ iptables -A INPUT -p icmp -i eth0 -j DROP
$ sudo iptables-save > ~/rule1
$ sudo iptables-save < ~/rule1
맨 위의 rule부터 하나씩 아래로 내려가면서 확인을 한다는 것에 유의해야 한다.
이 때문에, 만일 INPUT
에서 본인이 통과시킬 애들을 다 적절히 설정했다 싶으면, 마지막에는 다음 rule을 추가하는 것이 맞다.
$ sudo iptables -A INPUT -j DROP