리눅스 서버를 정적 및 동적으로 처리하기 위해 리눅스 서버를 라우터로 전환하는 방법 – 파트 10

이전 LFCE (Linux Foundation Certified Engineer) 시리즈의 이전 자습서에서 예상했듯이, 이 기사에서는 특정 응용 프로그램을 사용하여 IP 트래픽의 정적 및 동적 라우팅에 대해 논의할 것입니다.

Linux Foundation Certified Engineer – Part 10
리눅스 재단 인증 프로그램 소개

우선, 몇 가지 정의를 명확히 해 봅시다:

  1. 간단히 말해, 패킷은 네트워크 내에서 정보를 전송하는 데 사용되는 기본 단위입니다. TCP/IP를 네트워크 프로토콜로 사용하는 네트워크는 데이터 전송에 대해 동일한 규칙을 따릅니다: 실제 정보는 데이터와 보내야 하는 위치가 포함된 패킷으로 분할됩니다.
  2. 라우팅은 네트워크 내에서 데이터를 소스에서 대상으로 안내하는 과정입니다.
  3. 정적 라우팅은 라우팅 테이블에 정의된 수동으로 구성된 규칙 세트를 필요로 합니다. 이러한 규칙은 고정되어 있으며 한 기계에서 다른 기계로 이동하는 동안 패킷이 통과해야 하는 방법을 정의하는 데 사용됩니다.
  4. 동적 라우팅 또는 스마트 라우팅 (원한다면)은 시스템이 필요에 따라 패킷이 따르는 경로를 자동으로 변경할 수 있는 것을 의미합니다.

고급 IP 및 네트워크 장치 구성

iproute 패키지는 네트워킹 및 트래픽 제어를 관리하는 일련의 도구를 제공하며, 본 기사 전체에서 사용할 것입니다. 이 도구들은 ifconfigroute와 같은 기존 도구들의 대체물을 대표합니다.

iproute 스위트의 중심 유틸리티는 간단히 ip라고 불립니다. 기본 구문은 다음과 같습니다:

# ip object command

여기서 object는 다음 중 하나일 수 있습니다(가장 빈번한 객체만 표시됩니다 – 전체 목록은 man ip를 참조할 수 있습니다):

  1. link: 네트워크 장치.
  2. addr: 장치의 프로토콜(IP 또는 IPv6) 주소.
  3. route: 라우팅 테이블 항목.
  4. rule: 라우팅 정책 데이터베이스의 규칙.

여기서 command는 객체에 적용할 수 있는 특정 동작을 나타냅니다. 특정 객체에 적용할 수 있는 명령의 전체 목록을 표시하려면 다음 명령을 실행할 수 있습니다:

# ip object help

예를 들어,

# ip link help
IP Command Help

위 이미지에서 볼 수 있듯이 다음 명령을 사용하여 네트워크 인터페이스의 상태를 변경할 수 있습니다:

# ip link set interface {up | down}

‘ip’ 명령의 더 많은 예제를 보려면 IP 주소 구성을 위한 10가지 유용한 ‘ip’ 명령을 읽어보세요.

예제 1: 네트워크 인터페이스 비활성화 및 활성화

이 예에서는 eth1을 비활성화하고 활성화할 것입니다:

# ip link show
# ip link set eth1 down
# ip link show
Disable eth0 Interface

eth1을 다시 활성화하려면,

# ip link set eth1 up

모든 네트워크 인터페이스를 표시하는 대신 특정 인터페이스를 지정할 수 있습니다:

# ip link show eth1

그러면 eth1에 대한 모든 정보가 반환됩니다.

예제 2: 기본 라우팅 테이블 표시

다음 3개의 명령 중 하나를 사용하여 현재 기본 라우팅 테이블을 볼 수 있습니다:

# ip route show
# route -n
# netstat -rn
Check Linux Route Table

출력의 첫 번째 열은 대상 네트워크를 나타냅니다. ip route 명령어의 출력 (키워드 dev 다음)은 또한 해당 네트워크의 물리적인 게이트웨이로 작동하는 네트워크 장치를 나타냅니다.

현재는 ip command가 route보다 선호되지만, 나머지 열에 대한 자세한 설명은 man ip-routeman route을 참조할 수 있습니다.

예제 3: Linux 서버를 사용하여 두 개의 사설 네트워크 간에 데이터 패킷을 라우팅하는 방법

우리는 dev2에서 dev4로 icmp (ping) 패킷을 라우팅하고, 그 반대의 경우도 동일하게 하려고 합니다 (두 클라이언트 머신이 서로 다른 네트워크에 있는 점에 유의하십시오). 각 NIC의 이름과 해당하는 IPv4 주소는 대괄호 안에 제시되어 있습니다.

테스트 환경은 다음과 같습니다:

Client 1: CentOS 7 [enp0s3: 192.168.0.17/24] - dev1
Router: Debian Wheezy 7.7 [eth0: 192.168.0.15/24, eth1: 10.0.0.15/24] - dev2
Client 2: openSUSE 13.2 [enp0s3: 10.0.0.18/24] - dev4

dev1 (CentOS 상자)에서 라우팅 테이블을 확인해 봅시다:

# ip route show

그리고 192.168.0.15에 대한 enp0s3 NIC 및 연결을 사용하여 10.0.0.0/24 네트워크의 호스트에 액세스하기 위해 이를 수정해 봅시다:

# ip route add 10.0.0.0/24 via 192.168.0.15 dev enp0s3

이는 “enp0s3 네트워크 인터페이스를 통해 192.168.0.15를 게이트웨이로 사용하여 10.0.0.0/24 네트워크에 대한 경로를 추가”하는 것입니다.

Route Network in Linux

마찬가지로 192.168.0.0/24 네트워크의 호스트를 핑하기 위해 dev4 (openSUSE 상자)에서도 동일하게 해야 합니다:

# ip route add 192.168.0.0/24 via 10.0.0.15 dev enp0s3
Network Routing in Linux

마지막으로 Debian 라우터에서 포워딩을 활성화해야 합니다:

# echo 1 > /proc/sys/net/ipv4/ip_forward

이제 핑을 보내 봅시다:

Check Network Routing

그리고,

Route Ping Status

부팅 시 이러한 설정을 영구적으로 유지하려면 라우터의 /etc/sysctl.conf를 편집하고 net.ipv4.ip_forward 변수가 다음과 같이 true로 설정되어 있는지 확인하십시오:

net.ipv4.ip_forward = 1

또한, 두 클라이언트의 NIC를 구성합니다 (openSUSE에서는 /etc/sysconfig/network 내의 구성 파일을, CentOS에서는 /etc/sysconfig/network-scripts 내의 구성 파일을 찾아보세요 – 두 경우 모두 ifcfg-enp0s3라고 불립니다).

다음은 openSUSE 박스에서의 구성 파일입니다:

BOOTPROTO=static
BROADCAST=10.0.0.255
IPADDR=10.0.0.18
NETMASK=255.255.255.0
GATEWAY=10.0.0.15
NAME=enp0s3
NETWORK=10.0.0.0
ONBOOT=yes
예제 4: 리눅스 서버를 사용하여 사설 네트워크와 인터넷 간에 패키지를 라우팅하기

리눅스 기계를 라우터로 사용할 수 있는 또 다른 시나리오는 사설 LAN과 인터넷 연결을 공유해야 할 때입니다.

Router: Debian Wheezy 7.7 [eth0: Public IP, eth1: 10.0.0.15/24] - dev2
Client: openSUSE 13.2 [enp0s3: 10.0.0.18/24] - dev4

이전 예제에서 클라이언트에 패킷 포워딩과 정적 라우팅 테이블을 설정하는 것 외에도, 라우터에 몇 가지 iptables 규칙을 추가해야 합니다:

# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
# iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

첫 번째 명령은 nat (네트워크 주소 변환) 테이블의 POSTROUTING 체인에 규칙을 추가하여, eth0 NIC가 나가는 패키지에 사용되어야 함을 나타냅니다.

MASQUERADE는 이 NIC가 동적 IP를 가지고 있으며, “거친 거친 세상”인 인터넷으로 패키지를 보내기 전에 패킷의 사설 소스 주소를 라우터의 공용 IP 주소로 변경해야 함을 나타냅니다.

많은 호스트가 있는 LAN에서, 라우터는 /proc/net/ip_conntrack에서 확립된 연결을 추적하여 인터넷에서의 응답을 어디로 반환해야 하는지 알고 있습니다.

다음 스크린샷에서는:

# cat /proc/net/ip_conntrack

의 출력 일부만 보여집니다.

Route Packages in Linux

여기서 패키지의 출발지(사설 IP인 openSUSE 박스)와 목적지(Google DNS)가 강조되어 있습니다. 이것은 openSUSE 박스에서 실행한 결과입니다:

# curl www.tecmint.com

.

uteurenida, 로우터가 Google의 8.8.8.8를 네임서버로 사용하고 있음을 알 수 있습니다. 이러한 이유로 나가는 패킷의 목적지가 그 주소로 가는 것이죠.

ynote: 인来的 패킷은 이미 설정된 연결(명령 #2)의 일부이어야 하며, 나가는 패킷은 “자유적인 출력”이어야 합니다(명령 #3).

이 시리즈의 第8部分 – iptables 방화벽 구성에 기술된 단계를 따라 iptables 규칙을 영속化 시키는 것을 잊지 마십시오.

Quagga를 이용한 동적 routing

当今 Linux에서 가장 많이 사용하는 동적 routing 도구는 quagga입니다. 시스템 관리자는 상당히 저sea 비용의 Linux 서버로 powerful(과 비용이 높은) Cisco 로우터와 同じ 기능을 구현할 수 있습니다.

자신은 로outing을 하지 않는 도구이며, 패킷을 처리하기 위해 새로운 가장 좋은 경로를 배우면서 内核 로outing 표를 수정합니다.

좀 전에 開発이 중단 되었던 zebra 프로그램의 派出이므로 이전의 명령어와 구조와 마찬가지로 유지되었습니다. 이러한 이유로 이제 이곳에서 zebra에 대한 많은 참고를 볼 수 있습니다.

동적 routing과 모두의 관련 프로토콜을 한 ARTICLE에서 다 涵蓋하는 것은 아니며, 여기서 제시하는 내용이 여러분의 시작점을 形성하는 것을 확신합니다.

Linux에서 Quagga를 설치하는 方法

선택한 배포판에 quagga를 설치하려면:

# aptitude update && aptitude install quagga 				[On Ubuntu]
# yum update && yum install quagga 					[CentOS/RHEL]
# zypper refresh && zypper install quagga 				[openSUSE]

예제 #3과 같은 환경을 사용하지만, 유일한 차이점은 eth0이 IP 192.168.0.1을 가진 주요 게이트웨이 라우터에 연결되어 있다는 것입니다.

다음으로 /etc/quagga/daemons 파일을 편집합니다.

zebra=1
ripd=1

이제 다음 구성 파일을 만듭니다.

# /etc/quagga/zebra.conf
# /etc/quagga/ripd.conf

그리고 다음 라인을 추가합니다 (원하는 호스트 이름과 암호로 대체하세요):

service quagga restart
hostname    	dev2
password    	quagga
# service quagga restart
Start Quagga Service

참고: ripd.conf는 라우팅 정보 프로토콜의 구성 파일로, 라우터에게 어떤 네트워크에 도달할 수 있고 몇 번의 홉을 거쳐가는지에 대한 정보를 제공합니다.

quagga와 함께 사용할 수 있는 프로토콜 중 하나일 뿐이며, 본 튜토리얼에서는 사용의 용이성과 대부분의 네트워크 장치에서 지원되는 이유로 선택했지만, 평문으로 자격 증명을 전송하는 단점이 있습니다. 그래서 구성 파일에 적절한 권한을 할당해야 합니다.

# chown quagga:quaggavty /etc/quagga/*.conf
# chmod 640 /etc/quagga/*.conf 
예제 5: IP 트래픽을 동적으로 라우팅하기 위한 quagga 설정

이 예제에서는 두 라우터를 사용하는 다음 설정을 사용합니다 (이전에 라우터 #2의 구성 파일을 생성했는지 확인하세요):

Configure Quagga

중요: 다음 설정을 두 라우터에 대해 반복하는 것을 잊지 마세요.

라우터와 커널 사이의 논리적 중간 역할을 하는 zebra에 접속합니다 (포트 2601에서 수신 대기):

# telnet localhost 2601

/etc/quagga/zebra.conf 파일에 설정한 암호를 입력하고, 구성을 활성화합니다.

enable
configure terminal

각 NIC의 IP 주소와 네트워크 마스크를 입력하십시오.

inter eth0
ip addr 192.168.0.15
inter eth1
ip addr 10.0.0.15
exit
exit
write
Configure Router

RIP 데몬 터미널 (포트 2602)에 연결해야 합니다:

# telnet localhost 2602

/etc/quagga/ripd.conf 파일에 구성된 사용자 이름과 암호를 입력한 다음 굵게 표시된 다음 명령을 입력하십시오 (설명을 위해 주석을 추가했습니다):

enable turns on privileged mode command.
configure terminal changes to configuration mode. This command is the first step to configuration
router rip enables RIP.
network 10.0.0.0/24 sets the RIP enable interface for the 10.0.0.0/24 network. 
exit
exit
write writes current configuration to configuration file.
Enable Router

참고: 두 경우 모두 이전에 추가한 줄에 구성이 추가됩니다 (/etc/quagga/zebra.conf 및 /etc/quagga/ripd.conf).

마지막으로 두 라우터의 zebra 서비스에 다시 연결하고, 각각이 다른 쪽 뒤에 있는 네트워크 경로를 “배울” 방법과 해당 네트워크에 도달하기 위한 다음 홉을 표시하는 명령 show ip route를 실행하여 확인하십시오:

# show ip route
Check IP Routing

다양한 프로토콜이나 설정을 시도하려면 추가 문서를 참조하려면 Quagga 프로젝트 사이트를 참조하십시오.

결론

본문에서는 Linux 박스 라우터를 사용하여 정적 및 동적 라우팅을 설정하는 방법에 대해 설명했습니다. 원하는 만큼 많은 라우터를 추가하고 원하는 만큼 실험해보십시오. 문의나 의견이 있으시면 아래의 연락 양식을 사용하여 언제든지 연락 주시기 바랍니다.

Source:
https://www.tecmint.com/setup-linux-as-router/