우분투 리눅스에서 네트워크 보안 관련해서 관리하는 방법은 제법 복잡하다. 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에 대한 기본적인 내용은 아래의 링크를 참조하기 바란다. 하지만 아래 링크에서 알려준 --dport 옵션은 iptables 버전에 따라서 동작하지 않을 수 있다.
요약
iptables 명령을 통해서 다양한 설정이 가능하다.
이상입니다.
'SW개발 > 우분투 리눅스' 카테고리의 다른 글
https://repo.whale.naver.com/stable/deb/dists/stable/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg) (0) | 2022.09.07 |
---|---|
[우분투/Docker] cgroups: cannot found cgroup mount destination: unknown 에러 조치 방법 (1) | 2022.09.07 |
우분투 리눅스 proftpd 패키지 업그레이드시 의존성 문제 해결 방법 (0) | 2022.09.03 |
[우분투] apt-get update 실행시에 "InRelease is not valid yet" 에러 관련 (0) | 2022.07.12 |
우분투 설치시 "the grub-efi-amd64-signed package failed to install target" 에러 해결 방법 (0) | 2022.07.01 |
10년된 PC에서도 빠르게 동작하는 우분투 리눅스 22.04 (0) | 2022.06.28 |
[우분투 22.04] 색상 프로필을 만들려면 인증이 필요합니다. 해결 방법 (0) | 2022.06.16 |
[우분투 22.04] 자동 로그인 해제하는 방법 (/etc/gdm3/custom.conf) (0) | 2022.06.15 |