Linux에서 서비스에 원격 액세스를 활성화하기 위한 Iptables 방화벽 설정하기 – 8부

Linux Foundation Certified Engineer – Part 8

Linux Foundation 인증 프로그램 소개

Iptables 소개에서 기억할 것입니다. 제 1 부 – Iptables 소개에서 우리는 방화벽이란 무엇인지에 대한 기본 설명을했습니다. 네트워크로 들어오고 나가는 패킷을 관리하기 위한 메커니즘입니다. “관리”라는 것은 사실 다음을 의미합니다:

  1. 특정 패킷의 네트워크로 이동하거나 떠날 지 허용하거나 방지합니다.
  2. 네트워크의 한 지점에서 다른 지점으로 다른 패킷을 전달합니다.

지정된 기준에 따라.

이 기사에서는 기본적인 패킷 필터링을 구현하는 방법과 iptables를 사용하여 방화벽을 구성하는 방법에 대해 설명하겠습니다. 이것은 방화벽에 사용되는 원시 커널 모듈 인 netfilter의 프런트 엔드 인 iptables입니다.

방화벽은 방대한 주제이며이 기사는 이를 이해하기 위한 포괄적인 가이드가 아닙니다. 대신이 주제를 더 깊이 연구하기 위한 시작점으로 고려됩니다. 그러나 우리는 Linux에서 방화벽의 몇 가지 구체적인 사용 사례를 탐색할 때이 시리즈의 제 10 부에서 다시 이 주제를 다룰 것입니다.

방화벽은 거의 24/7 승객

공항 직원들은 필요한 경우 공항의 한 곳에서 다른 곳으로 사람들에게 이동할 것을 지시할 수 있습니다, 예를 들어 그들이 세관 서비스를 통과해야 할 때.

이 튜토리얼의 나머지 동안 공항 비유가 유용할 수 있습니다. 계속 진행하면서 다음 관계를 염두에 두세요:

  1. 사람들 = 패킷
  2. 방화벽 = 공항
  3. 국가 #1 = 네트워크 #1
  4. 국가 #2 = 네트워크 #2
  5. 공항 규정을 집행하는 공항 직원 = 방화벽 규칙

Iptables – 기본 사항

낮은 수준에서는, 커널 자체가 체인이나 문장으로 그룹화된 규칙에 따라 패킷에 대해 무엇을 할지 “결정”합니다. 이러한 체인은 패킷이 지정된 기준을 충족할 때 어떤 조치를 취해야 하는지를 정의합니다.

iptables에 의해 취해지는 첫 번째 조치는 패킷에 대해 무엇을 할지 결정하는 것입니다:

  1. 수락하십시오 (네트워크로 통과하게 하겠습니까)?
  2. 거부하십시오 (네트워크 접근을 막겠습니까)?
  3. 전달하십시오 (다른 체인으로)?

이 도구가 iptables라고 불리는 이유가 궁금하셨을 경우, 이것은 이러한 체인이 테이블에 구성되어 있기 때문입니다. 필터 테이블이 가장 잘 알려진 테이블이며 이 세 가지 기본 체인을 사용하여 패킷 필터링을 구현하는 데 사용됩니다:

1. 입력 체인은 네트워크로 들어오는 로컬 프로그램에 대한 목적지 패킷을 처리합니다.

2. 출력 체인은 로컬 네트워크에서 발생한 패킷을 분석하여 외부로 전송해야 하는 경우에 사용됩니다.

3. FORWARD 체인은 다른 목적지로 전달해야 하는 패킷을 처리합니다(라우터의 경우와 같이).

각 체인마다 기본 정책이 있으며, 이는 체인에 있는 규칙과 일치하지 않는 패킷에 대해 기본적으로 어떻게 처리해야 하는지를 지정합니다. 각 체인에 생성된 규칙과 기본 정책을 확인하려면 다음 명령을 실행하십시오:

# iptables -L

사용 가능한 정책은 다음과 같습니다:

  1. ACCEPT → 패킷을 통과시킵니다. 체인의 어떠한 규칙과도 일치하지 않는 패킷은 네트워크로 허용됩니다.
  2. DROP → 패킷을 조용히 삭제합니다. 체인의 어떠한 규칙과도 일치하지 않는 패킷은 네트워크로 들어오지 못하도록 차단됩니다.
  3. REJECT → 패킷을 거부하고 정보성 메시지를 반환합니다. 이것은 특히 기본 정책으로 사용되지 않습니다. 대신에 패킷 필터링 규칙을 보완하기 위한 것입니다.
Linux Iptables Policies

구현할 정책을 결정할 때는 위에 설명된 각 접근 방식의 장단점을 고려해야 합니다 – 모든 상황에 적합한 해결책이 없다는 점을 유의하십시오.

규칙 추가

방화벽에 규칙을 추가하려면 다음과 같이 iptables 명령을 호출하십시오:

# iptables -A chain_name criteria -j target

여기서,

  1. -A는 Append(현재 규칙을 체인의 끝에 추가)을 나타냅니다.
  2. chain_name은 INPUT, OUTPUT 또는 FORWARD 중 하나입니다.
  3. 대상은 이 경우에 적용할 동작 또는 정책입니다 (ACCEPT, REJECT 또는 DROP).
  4. 기준은 패킷이 검사될 조건의 집합입니다. 이는 아마도 다음 플래그 중 하나 이상으로 구성됩니다. 대괄호 안의 옵션은 수직 막대로 구분되어 서로 동등합니다. 나머지는 선택적인 스위치를 나타냅니다:
[--protocol | -p] protocol: specifies the protocol involved in a rule.
[--source-port | -sport] port:[port]: defines the port (or range of ports) where the packet originated.
[--destination-port | -dport] port:[port]: defines the port (or range of ports) to which the packet is destined.
[--source | -s] address[/mask]: represents the source address or network/mask.
[--destination | -d] address[/mask]: represents the destination address or network/mask.
[--state] state (preceded by -m state): manage packets depending on whether they are part of a state connection, where state can be NEW, ESTABLISHED, RELATED, or INVALID.
[--in-interface | -i] interface: specifies the input interface of the packet.
[--out-interface | -o] interface: the output interface.
[--jump | -j] target: what to do when the packet matches the rule.

우리의 테스트 환경

다음 두 가지를 위한 다음 테스트 환경을 사용하여 3가지의 클래식 예제를 모두 결합해 봅시다:

Firewall: Debian Wheezy 7.5 
Hostname: dev2.gabrielcanepa.com
IP Address: 192.168.0.15
Source: CentOS 7 
Hostname: dev1.gabrielcanepa.com
IP Address: 192.168.0.17

그리고 마지막 예제에 대해서는 다음을 사용합니다

NFSv4 server and firewall: Debian Wheezy 7.5 
Hostname: debian
IP Address: 192.168.0.10
Source: Debian Wheezy 7.5 
Hostname: dev2.gabrielcanepa.com
IP Address: 192.168.0.15
예제 1: DROP 및 REJECT 정책 간의 차이 분석

먼저 방화벽으로 들어오는 핑에 대한 DROP 정책을 정의할 것입니다. 즉, icmp 패킷은 조용히 삭제될 것입니다.

# ping -c 3 192.168.0.15
# iptables -A INPUT --protocol icmp --in-interface eth0 -j DROP
Drop ICMP Ping Request

REJECT 부분을 진행하기 전에, 입력 체인에서 모든 규칙을 삭제하여 새로운 규칙에 의해 패킷이 테스트될 것을 확인할 것입니다:

# iptables -F INPUT
# iptables -A INPUT --protocol icmp --in-interface eth0 -j REJECT
# ping -c 3 192.168.0.15
Reject ICMP Ping Request in Firewall
예제 2: dev2에서 dev1로의 ssh 로그인 비활성화 / 다시 활성화

우리는 외부 트래픽을 처리하고 있기 때문에 OUTPUT 체인을 다루게 될 것입니다:

# iptables -A OUTPUT --protocol tcp --destination-port 22 --out-interface eth0 --jump REJECT
Block SSH Login in Firewall
예제 3: NFS 클라이언트(192.168.0.0/24에서)가 NFS4 공유를 마운트하는 것을 허용 / 방지

모든 종류의 트래픽에 대해 포트 2049와 111을 닫기 위해 NFSv4 서버 / 방화벽에서 다음 명령을 실행하십시오:

# iptables -F
# iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 2049 -j REJECT
# iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 111 -j REJECT
Block NFS Ports in Firewall

이제 해당 포트를 열어보고 결과를 확인해 봅시다.

# iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 111 -j ACCEPT
# iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 2049 -j ACCEPT
Open NFS Ports in Firewall

보시다시피, 우리는 트래픽을 열고 나서 NFSv4 공유를 마운트할 수 있었습니다.

규칙 삽입, 추가 및 삭제

이전 예제에서 우리는 규칙을 INPUTOUTPUT 체인에 추가하는 방법을 보여주었습니다. 미리 정의된 위치에 대신 삽입하려면 -I (대문자 i) 스위치를 사용해야 합니다.

규칙이 한 번에 하나씩 평가되며 평가가 중지되거나 점프되는 경우, DROP 또는 ACCEPT 정책이 일치할 때까지입니다. 이러한 이유로 필요에 따라 규칙을 체인 목록에서 위아래로 이동해야 할 수 있습니다.

이를 설명하기 위해 간단한 예제를 사용하겠습니다:

Check Rules of Iptables Firewall

다음 규칙을 다음 위치에 놓겠습니다,

# iptables -I INPUT 2 -p tcp --dport 80 -j ACCEPT

INPUT 체인에서 2)번 위치에 (이전 #2를 #3으로 이동)

Iptables Accept Rule

위의 설정을 사용하면, 트래픽이 포트 80으로 전송되는지 확인한 후 포트 2049를 확인합니다.

또는 규칙을 삭제하고 남은 규칙의 대상을 REJECT로 변경할 수 있습니다 (-R 스위치 사용):

# iptables -D INPUT 1
# iptables -nL -v --line-numbers
# iptables -R INPUT 2 -i eth0 -s 0/0 -p tcp --dport 2049 -j REJECT
# iptables -R INPUT 1 -p tcp --dport 80 -j REJECT
Iptables Drop Rule

마지막으로, 방화벽 규칙이 영구적으로 유지되려면 파일에 저장한 다음 부팅시 자동으로 복원해야 함을 기억해야 합니다 (선호하는 방법이나 배포에 사용 가능한 방법 사용).

방화벽 규칙 저장:

# iptables-save > /etc/iptables/rules.v4		[On Ubuntu]
# iptables-save > /etc/sysconfig/iptables		[On CentOS / OpenSUSE]

규칙 복원:

# iptables-restore < /etc/iptables/rules.v4		[On Ubuntu]
# iptables-restore < /etc/sysconfig/iptables		[On CentOS / OpenSUSE]

여기서는 위와 유사한 절차를 사용하여 더미 파일인 iptables.dump을 사용하여 방화벽 규칙을 수동으로 저장 및 복원하는 것을 볼 수 있습니다.

# iptables-save > iptables.dump
Dump Linux Iptables

이러한 변경 사항을 부팅 간에 영구적으로 유지하려면:

우분투: iptables-persistent 패키지를 설치하면 /etc/iptables/rules.v4 파일에 저장된 규칙이 로드됩니다.

# apt-get install iptables-persistent

CentOS: 다음 2줄을 /etc/sysconfig/iptables-config 파일에 추가하십시오.

IPTABLES_SAVE_ON_STOP="yes"
IPTABLES_SAVE_ON_RESTART="yes"

OpenSUSE: 허용된 포트, 프로토콜, 주소 등을 /etc/sysconfig/SuSEfirewall2에 쉼표로 구분하여 나열하십시오.

더 많은 정보는 파일 자체에 있으며, 이는 많은 주석이 달려 있습니다.

결론

이 기사에서 제공된 예제는 iptables의 모든 기능을 다루지는 않지만, 들어오거나 나가는 트래픽을 활성화하거나 비활성화하는 방법을 보여주는 목적으로 제공됩니다.

방화벽 팬인 여러분들을 위해, 우리는 이 LFCE 시리즈의 제10부에서 더 구체적인 응용 프로그램과 함께 이 주제를 재방문할 예정입니다.

질문이나 의견이 있으시면 언제든지 알려주세요.

Source:
https://www.tecmint.com/configure-iptables-firewall/