iptables를 사용한 방화벽 구축
iptables은 리눅스 시스템을 지나가는 모든 패킷에 대해 제어하고 흐름의 방향을 바꿀 수있는 인터페이스 프로그램입니다. iptables를 사용하며 불필요한 접속을 원천적으로 차단하고 수상한 접속 시도에 대해서 간단한 방법으로 로그를 남길 수 있기 때문에 각종 서버에서 유용하게 사용될 수 있습니다. 즉, iptables는 패킷 단위로 동작하며 패킷의 흐름을 제어하는 규칙을 적용하는 프로그램입니다.
예를 들어 IP주소를 바탕으로 특정 IP 대역에서 오는 모든 접속을 거부할 수 있으며 특정 포트로의 접속을 모두 막을 수도 있습니다. 또한 특정 패턴을 가진 패킷을 다른 컴퓨터로 전달할 수도 있으며 그 이외도 많은 조건들을 정의할 수 있습니다. 또한 이런 규칙들을 모두 조합해서 사용이 가능합니다.
iptables 의 세 가지 chain
모든 패킷은 chain 규칙을 통해 패킷을 처리합니다. 서버로 들어오는 모든 패킷은 세 가지 chain 중 하나를 통과하게 됩니다. 세 가지 체인은 INPUT, OUTPUT, FORWARD 체인입니다.
서버로 들어오는 모든 패킷은 INPUT 체인을 통과합니다. 그리고 나가는 모든 패킷은 OUTPUT 체인을 통과합니다. 그리고 다른 서버로 보내는 패킷은 FORWARD 체인을 통과합니다. 각 체인에는 여러 가지 규칙이 있으며 해당 규칙에 부합하는 경우 패킷을 거부(DROP, REJECT) 하거나 받아들일(ACCEPT) 수 있는 설정이 있습니다.
* 기본 정책을 확인하기
# iptables -L
위의 명령어를 입력하며 각 체인 별로 policy라는 부분을 통해 기본 정책을 확인 할 수 있습니다.
#iptables -L
Chain INPUT (policy ACCEPT)
tartget prop opt source destination
DROP tcp- anywhere 192.168.10.2 tcp dpt:telnet
Chain FORWARD (policy ACCEPT)
target prop opt source destination
Chain OUTPUT (policy ACCEPT)
target prop opt source destination
REJECT tcp - anywhere 210.210.210.0 tcp dpt:http
다음은 eth0 이라는 네트워크 카드로 부터 192.168.10.2 라는 호스트로 들어오는 23번 포트의 모든 텔넷 접속을 제한하는 명령입니다.
# iptables-A INPUT -i eth0 -p TCP -d 192.168.10.2 --dport 23 -j DROP
각 옵션에 대한 설명은 다음과 같습니다.
-A INPUT : INPUT 체인에 새로운 규칙을 추가(ADD)
-i eth0 : 특정 네트워크 디바이스 즉, eth0에게만 해당됨을 뜻함
-p TCP : TCP 패킷을 제한
-d 192.168.10.2 : 목적지 주소가 192.168.10.2
--dport 23 : 목적지 컴퓨터 접속 포트가 23번 일 경우
-j DROP : DROP으로 패킷을 처리합니다.
-j 옵션에 사용할 수 있는 기본적인 동작은 다음의 세 가지가 있습니다.
DROP : 패킷에 거부함. 전혀 반응하지 않음
REJECT : 패킷을 거부하되 상대방에게 즉각 접속 거부 신호를 보냅니다.
ACCEPT : 접속을 허용합니다.
만약 1.1.1.1 에서 오는 패킷을 DROP 시키기 위해서는 다음과 같은 명령어를 입력합니다.
# iptables -A INPUT -s 1.1.1.1 -j DROP
-s 아이피 옵션은 소스 아이피를 지정하는 옵션입니다.
* 모든 설정 초기화 명령어
# iptables -F
모든 체인의 설정을 지웁니다. INPUT 체인만 지울 경우 iptables -F INPUT 이라고 입력하면 됩니다.
※ iptables 룰 순서
iptables 룰의 적용되는 순서는 모든 것이 거부된 후 허용을 추가해도 허용이 동작하지 않습니다. 따라서 모두 허용을 지정한 후 거부를 지정해야 합니다.