웹사이트 검색

Ubuntu 12.04에서 Iptables를 사용하여 방화벽을 설정하는 방법


상태: 더 이상 사용되지 않음

이 문서에서는 더 이상 지원되지 않는 Ubuntu 버전에 대해 설명합니다. 현재 Ubuntu 12.04를 실행하는 서버를 운영 중인 경우 지원되는 Ubuntu 버전으로 업그레이드하거나 마이그레이션하는 것이 좋습니다.

  • Ubuntu 14.04로 업그레이드합니다.
  • Ubuntu 14.04에서 Ubuntu 16.04로 업그레이드
  • 서버 데이터를 지원되는 버전으로 마이그레이션

이유:

대신 참조:

Iptables 정보

초기 설정 후 서버 보안을 강화하기 위해 Ubuntu는 배포판의 기본 방화벽인 iptables와 함께 제공됩니다. 처음에는 Ubuntu 방화벽이 구성되어 있지만 가상 사설 서버에서 모든 수신 및 발신 트래픽을 허용하도록 설정되어 있습니다. 서버에서 더 강력한 보호를 활성화하기 위해 몇 가지 기본 iptables 규칙을 추가할 수 있습니다.

iptables 규칙은 각각의 특정 프로세스를 생성하기 위해 결합할 수 있는 일련의 옵션에서 나옵니다. 방화벽을 통과하는 각 패킷은 각 규칙에 의해 순서대로 검사됩니다. 규칙과 일치하는 즉시 패킷은 연결된 작업을 따르고, 그렇지 않으면 라인 아래로 진행됩니다.

참고: 이 자습서에서는 IPv4 보안을 다룹니다. Linux에서 IPv6 보안은 IPv4와 별도로 유지됩니다. 예를 들어 "iptables"는 IPv4 주소에 대한 방화벽 규칙만 유지하지만 IPv6 네트워크 주소에 대한 방화벽 규칙을 유지하는 데 사용할 수 있는 "ip6tables"라는 IPv6 대응 항목이 있습니다.

VPS가 IPv6용으로 구성된 경우 적절한 도구를 사용하여 IPv4 및 IPv6 네트워크 인터페이스를 모두 보호해야 합니다. IPv6 도구에 대한 자세한 내용은 Linux VPS에서 IPv6를 사용하도록 도구를 구성하는 방법 가이드를 참조하세요.

iptables 명령

이 자습서에서는 서버에 기본적인 보안을 제공하는 제한된 양의 명령을 살펴보지만 iptables용으로 개발할 수 있는 다양한 미묘하고 구체적인 사례가 있습니다. 다음은 VPS용 방화벽을 개발하는 데 가장 유용한 명령 중 일부이지만 이것은 짧은 목록이며 다양한 다른 옵션이 있음을 명심하십시오.

-A: (Append), adds a rule to iptables
-L:  (List), shows the current rules
-m conntrack: allows rules to be based on the current connection state, elaborated in the the --cstate command.
--cstate: explains the states that connections can be in, there are 4: New, Related, Established, and Invalid
-p: (protocol), refers to the the protocol of the rule or of the packet to check.The specified protocol can be one of tcp, udp, udplite, icmp, esp, ah, sctp or the special keyword "all".
--dport: (port), refers to the the port through which the machine connects
-j: (jump), this command refers to the action that needs to be taken if something matches a  rule perfectly. It translates to one of four possibilities:
	-ACCEPT: the packet is accepted, and no further rules are processed
	-REJECT: the packet is rejected, and the 	sender is notified, and no further rules are processed
	-DROP: the packet is rejected, but the 	sender is not notified, and no further rules are processed
	-LOG: the packet is accepted but logged, and the following rules are processed 
-I: (Insert), adds a rule between two previous ones
-I INPUT 3: inserts a rule to make it the third in the list
-v: (verbose), offers more details about a rule

Iptables 규칙 만들기:

다음을 입력하면 현재 iptables 규칙을 볼 수 있습니다.

sudo iptables -L

다음과 같아야 합니다.

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

다른 규칙 집합이 있거나 새로 시작하려는 경우 규칙을 모두 플러시하고 삭제하여 항상 규칙을 다시 기본값으로 설정할 수 있습니다.

sudo iptables -F

또한 iptables로 작업 속도를 높이려면 명령에 -n을 포함할 수 있습니다. 이 옵션은 DNS 조회를 비활성화하고 명령이 규칙 세트에서 각 IP의 반대를 찾으려고 시도하지 않도록 합니다. 예를 들어 규칙을 나열하는 데 사용할 수 있습니다.

iptables -L -n

기본 방화벽

현재 규칙은 들어오고 나가는 모든 연결을 허용합니다. 보안 조치가 전혀 없습니다. 테이블을 만들 때 패킷이 ACCEPTED, REJECTED 또는 DROPPED가 되는 즉시 더 이상 규칙이 처리되지 않는다는 점을 명심하십시오. 따라서 먼저 오는 규칙이 나중에 오는 규칙보다 우선합니다.

규칙을 만드는 동안 실수로 SSH(서버에 연결하는 방법)를 차단하지 않도록 해야 합니다.

시작하려면 모든 현재 연결을 허용해야 합니다. 규칙을 만드는 시점의 모든 연결은 온라인 상태를 유지합니다.

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

계속해서 이것을 분해할 수 있습니다.

  1. -A는 iptables에게 테이블에 규칙을 추가하도록 지시합니다.
  2. INPUT은 이 규칙을 입력 체인의 일부로 지정합니다.
  3. m conntrack 뒤에 --cstate ESTABLISHED,RELATED가 있으면 이 규칙의 결과가 현재 연결에만 적용되고 관련 연결이 허용됨을 보장합니다.
  4. -j ACCEPT는 패킷이 JUMP에 수락하도록 지시하고 연결은 계속 유지됩니다.

가상 사설 서버에 대한 모든 현재 연결이 중단 없이 유지될 수 있음을 확인한 후 다른 안전하지 않은 연결을 차단할 수 있습니다.

2개의 공통 포트(SSH용 22개, 웹 트래픽용 80개)에서 들어오는 트래픽을 제외한 모든 들어오는 트래픽을 차단한다고 가정해 보겠습니다. 다음 명령을 사용하여 지정된 포트에서 모든 트래픽을 허용하여 진행합니다.

sudo iptables -A INPUT -p tcp --dport ssh -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT

이 두 명령 모두에서 -p 옵션은 연결되는 프로토콜(이 경우 tcp)을 나타내고 --dport는 패킷이 전송되는 포트를 지정합니다.

원하는 트래픽이 방화벽을 통과하도록 보장한 후 남은 모든 트래픽이 가상 서버에 액세스하지 못하도록 차단하여 마무리할 수 있습니다. 이것이 목록의 마지막 규칙이기 때문에 iptables의 이전 규칙과 일치하는 모든 트래픽은 영향을 받지 않으며 이전에 설정한 대로 처리됩니다.

나머지 트래픽을 모두 차단하는 규칙을 만들어 보겠습니다.

sudo iptables -P INPUT DROP

이를 통해 업데이트된 규칙이 어떻게 생겼는지 확인할 수 있습니다.

sudo iptables -L
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            ctstate RELATED,ESTABLISHED 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:http 

거의 끝났습니다. 그러나 우리는 또 하나의 규칙을 놓치고 있습니다. VPS에 루프백 액세스를 제공해야 합니다. 추가 한정자 없이 지금 규칙을 추가하면 목록의 끝으로 이동하고 모든 트래픽을 차단하는 규칙을 따르므로 결코 적용되지 않습니다.

이 문제를 해결하기 위해 INPUT 옵션을 사용하여 이 규칙을 목록의 첫 번째로 만들어야 합니다.

sudo iptables -I INPUT 1 -i lo -j ACCEPT

  1. -I INPUT 1 이 규칙을 테이블 시작 부분에 배치
  2. lo는 루프백 인터페이스를 나타냅니다
  3. -j ACCEPT 루프백 트래픽이 허용되도록 보장

이제 기본 방화벽 생성을 완료했습니다. 규칙은 다음과 같아야 합니다(-v를 입력하면 iptable의 세부 정보를 볼 수 있음).

sudo iptables -L -v
Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     all  --  lo     any     anywhere             anywhere            
 1289 93442 ACCEPT     all  --  any    any     anywhere             anywhere             ctstate RELATED,ESTABLISHED
    2   212 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp dpt:ssh
    0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp dpt:http     

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 157 packets, 25300 bytes)
 pkts bytes target     prot opt in     out     source               destination       

그러나 가상 서버가 재부팅되는 즉시 iptables 규칙이 지워집니다. 다음 단계는 iptables 규칙을 저장하고 복원하는 것입니다.

Iptables 규칙 저장

iptables 규칙은 유효하지만 서버가 재부팅되면 자동으로 삭제됩니다. 효과를 유지하기 위해 IP-Tables persistence라는 패키지를 사용할 수 있습니다.

apt-get을 사용하여 설치할 수 있습니다.

sudo apt-get install iptables-persistent

설치하는 동안 iptables 규칙을 IPv4 규칙과 IPv6 규칙 모두에 저장할 것인지 묻는 메시지가 표시됩니다. 둘 다 예라고 말하십시오.

그러면 규칙이 /etc/iptables/rules.v4 및 /etc/iptables/rules.v6에 저장됩니다.

설치가 완료되면 iptables-persistent 실행을 시작합니다.

sudo service iptables-persistent start

서버를 재부팅하면 규칙이 그대로 유지되는 것을 볼 수 있습니다.