실습)

'외부'대역(211.183.3.0/24)에는 211.183.3.100의 주소를 갖는 mint 클라이언트가 존재하며 '내부'에는 아래와 같이 서로 다른대역에 서버들이 존재한다.

mint는 웹서버의 <주소>/tem에 접속시 간단한 무료템플릿을 볼 수 있고,
<주소>/wp 에 접속시 워드프레스 블로그,
<주소>/tom에 접근했을때는 tomcat 서버로 리버스프록시 되어 db와 잘 연동됐는지를 확인하는 페이지에 접속되길 바란다. 또한 이 페이지는 tomcat 서버에서 접속했을때는 localhost:8080/was 로 접속이 됐었다.
 

# 각 VM들의 기본설정(IP,GW,DNS,방화벽-셀리눅스off)은 끝난 상태

라우터 설정

R1#conf t
R1(config)#int f0/1
R1(config-if)#ip add 10.10.1.99 255.255.255.0
R1(config-if)#no sh
R1(config-if)#int f0/0
R1(config-if)#ip add 10
R1(config-if)#ip add 10.10.0.10 255.255.255.0
R1(config-if)#no sh
R1(config-if)#ip route 0.0.0.0 0.0.0.0 10.10.0.20
R2#conf t
R2(config)#int f0/0
R2(config-if)#ip add 10.10.0.20 255.255.255.0
R2(config-if)#no sh
R2(config-if)#int f0/1
R2(config-if)#ip add 10.10.2.99 255.255.255.0
R2(config-if)#no sh
R2(config)#int f1/0 
R2(config-if)#ip add 211.183.3.99 255.255.255.0
R2(config-if)#no sh

R2(config-if)#ip route 10.10.1.0 255.255.255.0 10.10.0.10
R2(config)#ip route 0.0.0.0 0.0.0.0 211.183.3.2

R2(config)#int f1/0
R2(config-if)#ip nat out
R2(config-if)#int f0/0
R2(config-if)#ip nat in
R2(config-if)#int f0/1
R2(config-if)#ip nat in
R2(config-if)#exit

R2(config)#access-list 1 per 10.10.0.0 0.0.3.255
R2(config)#ip nat inside source list 1 int f1/0 over

R2(config)#do ping 8.8.8.8 source 10.10.2.99

# 각 서버에서 외부로 핑이 가는지 확인

서버 설정

DB

  • db서버 설치
[root@chan-db ~]# yum install mariadb-server
  • tomdb 사용자 : tomuser
  • tomdb db이름 : tomdb
  • tomdb db암호 : 1234

wpdb

2개의 디비 생성

  • wpdb 사용자 : wpuser
  • wpdb db이름 : wpdb
  • wpdb db암호 : 1234
[root@chan-db ~]# systemctl restart mariadb
[root@chan-db ~]# systemctl enable mariadb
  • db 생성
[root@chan-db ~]# mysql -u root -p1234
MariaDB [(none)]> create database tomdb;
MariaDB [(none)]> create database wpdb;
MariaDB [(none)]> grant all privileges on wpdb.* to wpuser@'%' identified by '1234';
MariaDB [(none)]> grant all privileges on tomdb.* to tomuser@'%' identified by '1234';

WAS 설정

  • db가 유효한지를 확인하고자 클라이언트 설치
[root@chan-was ~]# yum install -y mysql
[root@chan-was ~]# mysql -u wpuser -p1234 -h 10.10.1.33

# 해당 사용자한테 db가 잘 보이는지 확인

[root@chan-was ~]# mysql -u tomuser -p1234 -h 10.10.1.33

tomcat 설치

[root@chan-was ~]# yum install -y java-11-openjdk wget unzip
[root@chan-was ~]# wget https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.34/bin/apache-tomcat-10.1.34.zip
[root@chan-was ~]# unzip apache-tomcat-10.1.34.zip > /dev/null
[root@chan-was ~]# mv apache-tomcat-10.1.34 tomcat
[root@chan-was ~]# cd tomcat/webapps/ROOT/
  • 이 경로에서 index.jsp 생성
[root@chan-was ROOT]# mkdir was
[root@chan-was ROOT]# mv dbtest.jsp was/index.jsp
[root@chan-was ROOT]# vi was/index.jsp

  • lib 폴더로 이동하여 jdbc 라이브러리를 다운로드
[root@chan-was ROOT]# chmod 777 -R /root/tomcat
[root@chan-was ROOT]# cd ../../lib
[root@chan-was lib]# wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.23/mysql-connector-java-8.0.23.jar
  • 톰캣 재시작 후 테스트

was서버에 wordpress 설치

[root@chan-was lib]# yum install -y epel-release yum-utils https://rpms.remirepo.net/enterprise/remi-release-7.rpm

[root@chan-was lib]# yum-config-manager --enable remi-php73

[root@chan-was lib]# yum install -y php php-mysql

 

[root@chan-was lib]# cd /var/www/html

[root@chan-was html]# wget https://wordpress.org/latest.zip

 

[root@chan-was html]# unzip latest.zip

 

[root@chan-was html]# rm -rf latest.zip

[root@chan-was html]# mv wordpress/ wp

[root@chan-was html]# mv wp/wp-config-sample.php wp/wp-config.php

[root@chan-was html]# systemctl restart httpd
[root@chan-was html]# systemctl enable httpd

# was에 워드프레스를 구현했으므로 10.10.1.88/wp 로 접근해서 되는지 확인

웹서버 설정 

/tem 경로로 프리템플릿 구성

  • 리버스프록시 및 /tem를 배포하기위한 apache 설치
[root@chan-web ~]# yum install -y httpd wget unzip
  • 프리템플릿 다운로드
[root@chan-web ~]# wget https://www.free-css.com/assets/files/free-css-templates/download/page296/oxer.zip
  • 압축해제
[root@chan-web ~]# unzip oxer.zip
  • tem 경로로 이동
[root@chan-web ~]# mkdir /var/www/html/tem
[root@chan-web ~]# mv oxer-html/ /var/www/html/tem

[root@chan-web ~]# systemctl restart httpd
[root@chan-web ~]# systemctl enable httpd

# tem에 복사된줄 알았는데 그 안에 oxer-html로 복사됐음

  • oxer-html의 하위디렉토리 포함 모든 내용을 현재 디렉토리(.)로 복사
[root@chan-web ~]# cd /var/www/html/tem
[root@chan-web tem]# cp -r oxer-html/* .

# /tem 경로로 잘 접속되는걸 확인

< /wp 경로로 was의 워드프레스로 리버스 프록시 구성>

< /tom 경로로 was의 tomcat에 리버스 프록시 구성>

[root@chan-web tem]# vi /etc/httpd/conf/httpd.conf

[root@chan-web tem]# systemctl restart httpd
[root@chan-web tem]# systemctl enable httpd

# wordpress 되는것 확인

 

# tomcat도 되는것 확인

  • 마무리 DNAT 설정
R2(config-if)#ip nat inside source static tcp 10.10.2.80 80 211.183.3.99 80


  • 현재 was서버(10.10.1.88/wp)에 워드프레스가 설치 되어있는 상태

 

  • was서버의 주소를 10.10.1.89로 변경

# 때에 따라서 워드프레스 안될 수 있다. 왜냐하면 DB에 저장된 정보는 10.10.1.88/wp를 기준으로 생성된 DB기 때문에 10.10.1.89/wp로 접근하거나 혹은 경로가 변경된 경우(10.10.1.89/wordpress)에는 DB정보와 매칭이 되지 않아 블로그가 정상적으로 동작하지 않을 수 있다. 이런 경우에는 아래와 같이 DB를 지우고 새로 만들면 설치화면으로 잘 접속된다.


ACL(Access Control List)

표준/확장이 존재, 정책이름으로도 정할 수도 있음

  • 표준(standard) - 출발지 주소를 제어
    <1-99> or <1300-1999>
  • 확장(extended) - 출발지,목적지 주소 및 포트까지 제어
    <100-199> or <2000-2699>

표준(Standard ACL)

우리가 NAT할때 사용했었던 access-list는 표준 ACL

 

1. 위에서 아래로, 순차적으로 읽다가 해당되는 내용이 발견되면 즉시 적용 후, 밑에줄은 나머지 폐기. 따라서, 좁은 범위 부터 설정을 해주는게 좋다. 중간에 룰을 삽입 불가능하므로 처음부터 잘 만들어야 함.

 

2. access-list의 끝에는 항상 deny all 이 생략되어있다. (암묵적 거부)

access-list 1 permit 10.10.1.0 0.0.0.255
access-list 1 deny 10.10.1.0 0.0.0.127

 

3. access-list는 포트의 in 혹은 out마다 한개씩만 적용 가능

# 같은 정책이라도 포트에서 in을 하냐 out을 하냐에 따라 전혀 다른 정책이 되기때문에 잘 적용을 시켜야하고, 그랬을때 in or out을 결정하는 주체는 그 장비(=라우터)를 기준으로 생각하면 된다.

ex. f0/0을 통해 라우터로 들어오는지(in) 나가는지(out)를 생각하는게 좋다.

# ACL을 하는동안은 NAT를 절대 하지 마세요!
# mint 와 web이 서로 통신되도록 만드세요!

# mint에서 웹접속이 되도록 프록시 해제 후  웹접속이 잘 되는 것 확인


웹접속을 차단하는 정책을 만들어보자.
R2의 f0/0에서 출발지 주소가 10.10.1.0 /24인 접속만을 차단하고 나머지는 다 허용하는 정책을
access-list 1로 만들어서 적용시켜 보자.

1. 정책 생성

R2(config)#access-list 1 deny 10.10.1.0 0.0.0.255
R2(config)#access-list 1 permit any

 

2. 정책을 특정 인터페이스에 in 혹은 out에 반영

R2(config)#int f0/0
R2(config-if)#ip access-group 1 in

  • 웹접속 차단 확인

  • 정책 삭제
R2(config-if)#no ip access-group 1 in
  • 정책 삭제 후 접속


접근제어를 다룰때는 항상 내가 의도한 대로 구성됐는지를 확인하는게 제일 중요

= A를 안되게 하고 싶다. = ‘원래 A가 됐었는데’ 내가 의도한대로 구성을 한 ‘후에 안됨’


실습1)

이번에는 access-list 2를 통해 10.10.1.0 /25만 R2의 f0/1에서 막아보세요.

# 일단 먼저 되는걸 확인

R2(config-if)#access-list 2 deny 10.10.1.0 0.0.0.127
R2(config-if)#access-list 2 permit any
R1(config-if)#int f0/1
R1(config-if)#ip access-group 2 out

# 정책 생성 및 반영 후 안되는 것 확인


실습2)

R1에서도 access-list 1을 통해 f0/0 에서 출발지가 10.10.1.0 /25인 패킷을 막아보세요

# 일단 먼저 되는걸 확인

R1(config-if)#access-list 1 deny 10.10.1.0 0.0.0.127
R1(config-if)#access-list 1 permit any
R1(config-if)#int f0/0
R1(config-if)#ip access-group 1 out

# 정책 생성 및 반영 후 안되는 것 확인


실습3)

vmnet1에 10.10.1.200 /24인 client 서버를 한대 두세요. R2의 f0/0에 access-list를 통해 10.10.1.0 /25 는 허용하여 mint가 웹서버에 접속되는지 확인하고, 10.10.1.128 /25는 거부를 하여 client가 웹접속이 안되는것을 확인해보세요

 

풀이)

기존의 모든 정책 R1, R2에서 다 삭제

f0/0이므로, 패킷의 흐름을 생각했을때 '라우터'로 들어오기 때문에 in 방향에 정책을 적용

R2(config-if)#access-list 3 deny 10.10.1.128 0.0.0.127
R2(config-if)#access-list 3 permit 10.10.1.0 0.0.0.127

R2(config-if)#int f0/0
R2(config-if)#ip access-group 3 in

# mint에서 접속 성공
# client에서 핑 및 curl 실패

추가적으로 기존의 설정을 삭제하지말고, R2의 f0/0 에서 출발지가 10.10.2.0 /24인 트래픽을 거부시켜보세요.
R2(config-if)#access-list 4 deny 10.10.2.0 0.0.0.255
R2(config-if)#access-list 4 permit any

R2(config-if)#int f0/0
R2(config-if)#ip access-group 4 out

# f0/0에 out에 걸려있는데 access-list 2 정책에 의해 출발지가 10.10.2.0 /24인 트래픽이 거부됐다. 따라서 mint가 웹접속이 거부된다.

 

ACL은 융통성이 없음

: 들어오는게 허용됐어도, 나가는 정책이 구성이 안되어있으면 왕복통신은 결국 실패

= stateless

 

“ ACL은 stateless하다”

 

어떤 접근제어가 stateful하다면, 그래서 융통성이 있어서 누군가 들어오는게 허용됐다면, 특별한 정책이 없어도 적어도 들어온 트래픽은 밖으로 나갈 수 있을 것이다.


확장(Extended ACL)

표준ACL이 출발지의 IP를 제어했다면 출발지, 목적지IP뿐 아니라 포트까지 전부 제어할 수 있다.

 

민트에서 웹서버로 웹접속은 허용하고, 다른 모든 트래픽은 차단해보자.

민트 - 웹서버 관계에서 웹접속은 되고, 핑이나 기타 ftp같은 다른 프로토콜은 안되어야 함.

차단되는 대상이 누구인가? 민트-웹서버의 http를 제외한 다른 모든 출발지,목적지의 프로토콜들.

 

기존의 설정을 삭제 후 R2의 f0/0 에서 in에 적용할 확장 ACL 정책을 만들어보자.
더보기
  • 가는 정책
R2(config)# access-list 100 permit tcp 10.10.1.100 0.0.0.0 eq 80 10.10.2.80 0.0.0.0 eq 80
  • 가는 정책 적용
R2(config)# int f0/0
R2(config-if)#ip access-group 100 in
R2(config)# exit
  • 왔다가 돌아가는 정책
R2(config)# access-list 110 per tcp host 10.10.2.80 eq 80 host 10.10.1.100 eq 80
  • 왔다가 돌아가는 정책 적용
R2(config)# int f0/0
R2(config)# ip access-group 110 out

연결이 안되는데...

  1. GNS 오류같으니 packet tracer로 연결해보자
  2. 출발지 포트가 80인지 모름... 목적지 포트만 80으로 알고 있음... 근데 둘다 80이라 지정해줌...
    → 모르면 지정해주지 말아야 함

R2의 f0/0 에서 in 에 적용할 확장 ACL 정책을 만들어보자.
  • 가는 정책
    • 빨강/오른쪽 라우터 R2에서 f0/0에 in
    • 출발지: 어떤 포트로 나가는지는 모르기 때문에 명시하면 안된다
    • 목적지: 웹서버의 80번 포트
R2(config)# access-list 100 permit tcp host 10.10.1.100 host 10.10.2.80 eq 80
  • 가는 정책 적용
R2(config)# int f0/0
R2(config-if)# ip access-group 100 in
R2(config)# exit
  • 왔다가 돌아가는 정책
    • 파랑/오른쪽 라우터 R2에서 f0/0에 out
    • 출발지: 웹서버의 80번 포트, 들어올때 목적지가 80번 포트였기 때
    • 목적지: 모르기 때문에 명시하면 안된다
R2(config)# access-list 110 permit tcp host 10.10.2.80 eq 80 host 10.10.1.100
  • 왔다가 돌아가는 정책 적용
R2(config)# int f0/0
R2(config)# ip access-group 110 out

실습)

남은 시간동안 각각의 그림과 같이 설정 후 되는지 안되는지 검증해보세요

→ 포트 지정을 안하면 포트를 다 열어뒀다는 의미
모두 mint의 포트 번호를 모르기 때문에 지정하면 안되는데, 지정해줬기 때문에 셋다 안된다.