실습)
'외부'대역(211.183.3.0/24)에는 211.183.3.100의 주소를 갖는 mint 클라이언트가 존재하며 '내부'에는 아래와 같이 서로 다른대역에 서버들이 존재한다.
mint는 웹서버의 <주소>/tem에 접속시 간단한 무료템플릿을 볼 수 있고,
<주소>/wp 에 접속시 워드프레스 블로그,
<주소>/tom에 접근했을때는 tomcat 서버로 리버스프록시 되어 db와 잘 연동됐는지를 확인하는 페이지에 접속되길 바란다. 또한 이 페이지는 tomcat 서버에서 접속했을때는 localhost:8080/was 로 접속이 됐었다.
라우터 설정
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
[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
웹서버 설정
/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
- oxer-html의 하위디렉토리 포함 모든 내용을 현재 디렉토리(.)로 복사
[root@chan-web ~]# cd /var/www/html/tem
[root@chan-web tem]# cp -r oxer-html/* .
< /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
- 마무리 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이 서로 통신되도록 만드세요!
웹접속을 차단하는 정책을 만들어보자.
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
추가적으로 기존의 설정을 삭제하지말고, 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
연결이 안되는데... ♨
- GNS 오류같으니 packet tracer로 연결해보자
- 출발지 포트가 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의 포트 번호를 모르기 때문에 지정하면 안되는데, 지정해줬기 때문에 셋다 안된다.