SW개발/우분투 리눅스

우분투 리눅스 iptables 설정 방법

공무원 봉급 2022. 7. 4. 09:59

 

우분투 리눅스에서 네트워크 보안 관련해서 관리하는 방법은 제법 복잡하다. ufw를 통한 방화벽 설정 방법도 있고, iptables를 통해서 구체적으로 어떤 패킷은 허용하고, 어떤 패킷은 거부할 것인지에 대해서 설정할 수도 있으며, 복수의 네트워크에 연결되어 있을 경우에는 라우팅 테이블을 사용하여 어떤 네트워크를 선택할 것인지에 대해서도 설정이 가능하다. 본 페이지에서는 iptables를 통해서 네트워크의 접속을 관리하는 방법에 대해서 설명하고자 한다.

 

iptables 패키지 설치 여부 확인

iptables 설정을 하려면 당연히 iptables 패키지가 설치되어 있어야 한다. 아래의 명령을 통해서 iptables 패키지가 설치되어 있는지 확인을 한다.

$ iptables --version

 

아래와 같이 버전이 표시되면 iptables 패키지가 설치된 것이고, 그렇지 않다면 설치가 필요하다.

iptables v1.8.7 (nf_tables)

 

 

iptables 패키지 설치 방법

위의 단계에서 iptables 패키지가 설치되어 있지 않다면 아래의 명령으로 설치를 진행한다.

$ sudo apt-get install iptables

 

위의 명령으로 iptables 패키지를 설치한 이후에 iptables --version 명령을 통해서 정상적으로 패키지가 설치되어 있는지 확인을 한다.

 

 

iptables 설정 확인 방법

패키지 설치를 하면 기본적으로 iptables의 설정은 INPUT, OUTPUT, FORWARD 모두 허용으로 되어 있다. 아래 명령으로 현재 설정된 리스트를 확인할 수 있다.

$ sudo iptables -L

 

iptables 설정을 한 번도 하지 않았다면, 아래와 같이 모든 패킷 전송이 허용된 상태이다.

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination        

 

만약 ufw를 통한 방화벽 설정이 되어 있다면 ufw 내용을 iptables에서 확인이 가능하다. (내용이 너무 많아서 접은글로 표시)

더보기

Chain INPUT (policy DROP)
target     prot opt source               destination         
ufw-before-logging-input  all  --  anywhere             anywhere            
ufw-before-input  all  --  anywhere             anywhere            
ufw-after-input  all  --  anywhere             anywhere            
ufw-after-logging-input  all  --  anywhere             anywhere            
ufw-reject-input  all  --  anywhere             anywhere            
ufw-track-input  all  --  anywhere             anywhere            

Chain FORWARD (policy DROP)
target     prot opt source               destination         
ufw-before-logging-forward  all  --  anywhere             anywhere            
ufw-before-forward  all  --  anywhere             anywhere            
ufw-after-forward  all  --  anywhere             anywhere            
ufw-after-logging-forward  all  --  anywhere             anywhere            
ufw-reject-forward  all  --  anywhere             anywhere            
ufw-track-forward  all  --  anywhere             anywhere            

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
ufw-before-logging-output  all  --  anywhere             anywhere            
ufw-before-output  all  --  anywhere             anywhere            
ufw-after-output  all  --  anywhere             anywhere            
ufw-after-logging-output  all  --  anywhere             anywhere            
ufw-reject-output  all  --  anywhere             anywhere            
ufw-track-output  all  --  anywhere             anywhere            

Chain ufw-after-forward (1 references)
target     prot opt source               destination         

Chain ufw-after-input (1 references)
target     prot opt source               destination         
ufw-skip-to-policy-input  udp  --  anywhere             anywhere             udp dpt:netbios-ns
ufw-skip-to-policy-input  udp  --  anywhere             anywhere             udp dpt:netbios-dgm
ufw-skip-to-policy-input  tcp  --  anywhere             anywhere             tcp dpt:netbios-ssn
ufw-skip-to-policy-input  tcp  --  anywhere             anywhere             tcp dpt:microsoft-ds
ufw-skip-to-policy-input  udp  --  anywhere             anywhere             udp dpt:bootps
ufw-skip-to-policy-input  udp  --  anywhere             anywhere             udp dpt:bootpc
ufw-skip-to-policy-input  all  --  anywhere             anywhere             ADDRTYPE match dst-type BROADCAST

Chain ufw-after-logging-forward (1 references)
target     prot opt source               destination         
LOG        all  --  anywhere             anywhere             limit: avg 3/min burst 10 LOG level warning prefix "[UFW BLOCK] "

Chain ufw-after-logging-input (1 references)
target     prot opt source               destination         
LOG        all  --  anywhere             anywhere             limit: avg 3/min burst 10 LOG level warning prefix "[UFW BLOCK] "

Chain ufw-after-logging-output (1 references)
target     prot opt source               destination         

Chain ufw-after-output (1 references)
target     prot opt source               destination         

Chain ufw-before-forward (1 references)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere             icmp destination-unreachable
ACCEPT     icmp --  anywhere             anywhere             icmp time-exceeded
ACCEPT     icmp --  anywhere             anywhere             icmp parameter-problem
ACCEPT     icmp --  anywhere             anywhere             icmp echo-request
ufw-user-forward  all  --  anywhere             anywhere            

Chain ufw-before-input (1 references)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ufw-logging-deny  all  --  anywhere             anywhere             ctstate INVALID
DROP       all  --  anywhere             anywhere             ctstate INVALID
ACCEPT     icmp --  anywhere             anywhere             icmp destination-unreachable
ACCEPT     icmp --  anywhere             anywhere             icmp time-exceeded
ACCEPT     icmp --  anywhere             anywhere             icmp parameter-problem
ACCEPT     icmp --  anywhere             anywhere             icmp echo-request
ACCEPT     udp  --  anywhere             anywhere             udp spt:bootps dpt:bootpc
ufw-not-local  all  --  anywhere             anywhere            
ACCEPT     udp  --  anywhere             224.0.0.251          udp dpt:mdns
ACCEPT     udp  --  anywhere             239.255.255.250      udp dpt:1900
ufw-user-input  all  --  anywhere             anywhere            

Chain ufw-before-logging-forward (1 references)
target     prot opt source               destination         

Chain ufw-before-logging-input (1 references)
target     prot opt source               destination         

Chain ufw-before-logging-output (1 references)
target     prot opt source               destination         

Chain ufw-before-output (1 references)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ufw-user-output  all  --  anywhere             anywhere            

Chain ufw-logging-allow (0 references)
target     prot opt source               destination         
LOG        all  --  anywhere             anywhere             limit: avg 3/min burst 10 LOG level warning prefix "[UFW ALLOW] "

Chain ufw-logging-deny (2 references)
target     prot opt source               destination         
RETURN     all  --  anywhere             anywhere             ctstate INVALID limit: avg 3/min burst 10
LOG        all  --  anywhere             anywhere             limit: avg 3/min burst 10 LOG level warning prefix "[UFW BLOCK] "

Chain ufw-not-local (1 references)
target     prot opt source               destination         
RETURN     all  --  anywhere             anywhere             ADDRTYPE match dst-type LOCAL
RETURN     all  --  anywhere             anywhere             ADDRTYPE match dst-type MULTICAST
RETURN     all  --  anywhere             anywhere             ADDRTYPE match dst-type BROADCAST
ufw-logging-deny  all  --  anywhere             anywhere             limit: avg 3/min burst 10
DROP       all  --  anywhere             anywhere            

Chain ufw-reject-forward (1 references)
target     prot opt source               destination         

Chain ufw-reject-input (1 references)
target     prot opt source               destination         

Chain ufw-reject-output (1 references)
target     prot opt source               destination         

Chain ufw-skip-to-policy-forward (0 references)
target     prot opt source               destination         
DROP       all  --  anywhere             anywhere            

Chain ufw-skip-to-policy-input (7 references)
target     prot opt source               destination         
DROP       all  --  anywhere             anywhere            

Chain ufw-skip-to-policy-output (0 references)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            

Chain ufw-track-forward (1 references)
target     prot opt source               destination         

Chain ufw-track-input (1 references)
target     prot opt source               destination         

Chain ufw-track-output (1 references)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             anywhere             ctstate NEW
ACCEPT     udp  --  anywhere             anywhere             ctstate NEW

Chain ufw-user-forward (1 references)
target     prot opt source               destination         

Chain ufw-user-input (1 references)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh
ACCEPT     udp  --  anywhere             anywhere             udp dpt:22
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
ACCEPT     udp  --  anywhere             anywhere             udp dpt:80
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:https
ACCEPT     udp  --  anywhere             anywhere             udp dpt:https
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:microsoft-ds
ACCEPT     udp  --  anywhere             anywhere             udp dpt:445
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:netbios-ssn
ACCEPT     udp  --  anywhere             anywhere             udp dpt:139
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:137
ACCEPT     udp  --  anywhere             anywhere             udp dpt:netbios-ns
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:138
ACCEPT     udp  --  anywhere             anywhere             udp dpt:netbios-dgm
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ftp
ACCEPT     udp  --  anywhere             anywhere             udp dpt:fsp
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ms-wbt-server
ACCEPT     udp  --  anywhere             anywhere             udp dpt:3389
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:smtp
ACCEPT     udp  --  anywhere             anywhere             udp dpt:25
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:submission
ACCEPT     udp  --  anywhere             anywhere             udp dpt:587
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:pop3
ACCEPT     udp  --  anywhere             anywhere             udp dpt:110

Chain ufw-user-limit (0 references)
target     prot opt source               destination         
LOG        all  --  anywhere             anywhere             limit: avg 3/min burst 5 LOG level warning prefix "[UFW LIMIT BLOCK] "
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable

Chain ufw-user-limit-accept (0 references)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            

Chain ufw-user-logging-forward (0 references)
target     prot opt source               destination         

Chain ufw-user-logging-input (0 references)
target     prot opt source               destination         

Chain ufw-user-logging-output (0 references)
target     prot opt source               destination         

Chain ufw-user-output (1 references)
target     prot opt source               destination

 

iptables 설정 상세 확인 방법

좀 더 상세하게 iptables 설정 내용을 확인하고 싶으면 -v 옵션을 붙여주면 된다.

$ sudo iptables -L -v

 

-v 옵션을 붙이면 설정한 규칙마다 해당하는 패킷 개수와 크기가 표시된다.

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
 1526  168K ACCEPT     all  --  lo     any     anywhere             anywhere            
 9123 7989K ACCEPT     all  --  any    any     anywhere             anywhere             ctstate RELATED,ESTABLISHED
  367  142K DROP       all  --  eth0   any     anywhere             anywhere            

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DROP       all  --  eth0   any     anywhere             anywhere            

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
 1518  167K ACCEPT     all  --  any    lo      anywhere             anywhere           
    0     0 DROP       all  --  any    wlan0   anywhere             actiontoad.canonical.com 

 

설정을 모두 초기화하는 방법

간혹 iptables 설정을 모두 초기화하고 싶을 때가 있다. 이 때는 -F 명령을 사용하면 된다.

$ sudo iptables -F

 

만약 iptables 설정을 스크립트로 일괄적으로 수행한다면, 스크립트의 시작 부분에 sudo iptables -F 명령을 수행하면 된다. 그러면 모든 설정을 다 초기화하고 새로운 설정들을 스크립트로 생성할 수 있어서 편리하다.

 

 

특정 인터페이스의 통신을 막는 방법 (-i 옵션 / -o 옵션)

필자의 경우는 라즈베리파이에 유선랜과 무선랜을 모두 연결해서 사용중이다. 즉, 기본적으로 무선랜으로만 통신을 하고, 유선랜은 특정한 포트만 열어놓고 사용하는 방법이 가능하다. 예를들면, eth0 인터페이스와 wlan0 인터페이스 중에서 기본적으로 eth0 인터페이스는 특정한 기능으로만 사용하고, 나머지 모든 통신은 wlan0로 사용할 수 있게 설정할 수 있다.

여러가지 인터페이스를 사용하고 있다면 그 중 특정한 인터페이스로 들어오는 통신을 막는 방법은 아래와 같다.

 

특정 인터페이스의 INPUT 패밋을 모두 막는 방법

특정 인터페이스로 들어오는 패킷을 모두 막는 명령은 아래와 같다. 

 $ sudo iptables -A INPUT -i eth0 -j DROP

-i eth0 옵션을 통해서 eth0로 들어오는 패킷에 대해서 모든 DROP 처리할 수 있다.

 

특정 인터페이스의 FORWARD를 모두 막는 방법

여러가지의 인터페이스를 사용하고 있다면, 그 중에서 특정 인터페이스로 들어오는 포워딩을 모두 막는 명령은 아래와 같다.

sudo iptables -A FORWARD -i eth0 -j DROP

역시 -i eth0 옵션을 통해서 eth0로 요청되는 FORWARD 패킷에 대해서 모두 DROP 처리할 수 있다.

 

특정 인터페이스로 나가는 OUTPUT을 모두 막는 방법

특정 인터페이스로 나가는 OUTPUT을 모두 막는 방법은 아래와 같다.

sudo iptables -A OUTPUT -o eth0 -j DROP

-i eth0 옵션이 아니라 -o eth0 옵션의 경우에 DROP 되도록 설정해주면 된다.

 

트러블 슈팅 방법

아래는 iptables 설정 도중에 발생하는 문제들을 조치하는 방법이다.

 

--dport 옵션이 먹지 않는 경우

구글링을 하다보면 특정 포트에 대한 규칙을 설정할 때 --dport 옵션을 붙이라고 안내하는 경우가 있다. 하지만, 필자가 사용하는 우분투 리눅스 22.04에서는 아래와 같은 에러 메시지가 출력되면서 --dport 옵션이 인식되지 않는다.

iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.

 

이 때문에 --dport 옵션 대신에 -p 옵션 또는 -m 옵션을 사용해야 한다.

 

iptables -p all --dport

iptables doesn't seem to recognize --dport with -p all. iptables -A INPUT -p all --dport www -j ACCEPT yields: iptables v1.4.4: unknown option `--dport' Try `iptables -h' or 'iptables --help' fo...

serverfault.com

 

참고할 만한 링크들

iptables에 대한 기본적인 내용은 아래의 링크를 참조하기 바란다. 하지만 아래 링크에서 알려준 --dport 옵션은 iptables 버전에 따라서 동작하지 않을 수 있다.

 

iptables 개념 및 명령어

============== 1. iptables 란? ============== iptables는 리눅스상에서 방화벽을 설정하는 도구로서 커널 2.4 이전 버전에서 사용되던 ipchains를 대신하는 방화벽 도구이다. iptables는 커널상에서의 netfilte..

linuxstory1.tistory.com

 

 

 

요약

iptables 명령을 통해서 다양한 설정이 가능하다.

 

이상입니다.