본문 바로가기

UTM

UTM2 ( 웹 홈페이지 )

< UTM 설정해서 홈페이지 띄우기 >

0. UTM 기본 설정 

- 기초 방화벽 

 


- 인증 변경 


- 인터페이스 이름 변경 


1 인터페이스 추가 ( VMNET 1,2 )

vm ware에서 가상 인터페이스 추가 > 재부팅 진행 > utm 웹 페이지 재부팅 진행 

 

vm ware에서 가상 인터페이스 추가 > 재부팅 진행 > utm 웹 페이지 재부팅 진행 

 

- 인터페이스 추가 주소 

웹 서버 

192.168.10.100 >> 192.168.10.110


- 인터페이스 설명 

1. DMZ ( 10.10.10.254 )
- 역할 : DMZ는 외부에서 접근 가능한 서버(웹 서버, FTP, SSH 서버 등)를 두는 구간입니다.
            외부 서비스(웹서버, FTP 등)를 외부와 내부 모두에게 제공하기 위한 중간 보호망
- 내부 장비들이 DMZ에서 외부로 나가려면 NAT 및 라우팅 설정이 필요 ( 내부망과 분리 )
- 용도 : 외부에서 접근 가능한 서버들을 DMZ에 배치하여 보안 분리

2. 외부망 (Externel)
-  인터넷 또는 외부 네트워크와 연결되는 구간입니다.

3. 내부망(Internet)
- 내부 사용자들이 사용하는 내부 네트워크를 위한 인터페이스입니다.
- 일반적으로 내부 사용자들이 이 인터페이스를 통해 인터넷(외부망)으로 NAT 또는 라우팅되어 나갑니다
        예상 구성도                                       
                                                     [ 내부 PC (20.20.20.x) ]
                                                                      ↓
                                                             eth2 (내부망)
                                                                     ↓
                                                                [ UTM ]
                                                                 ↙ ↘
                                                         DMZ       외부망 (인터넷)
                                                10.10.10.x      192.168.10.2 (게이트웨이)

DMZ에 ROCKY_LINUX 10.10.10.10 연결
내부망에 Kali_LINUX 20.20.20.20 연결 
ping 확인 

 


2 인터넷 사용 ( NAT )

현재 인터넷 사용 제한 > NAT 설정 진행 

 

 

- NAT 설정 

(SNAT_DMZ) 

 

SNAT 설정 
DMZ ( 10.10.10.X ) 가 인터넷이나 외부로 나갈 때 소스 IP ( 10.10.10.X )를 >> 외부망 IP ( 192.168.10.100 )으로 변경
DMZ > > 외부망 방향 통신 가능 
구성도 
[ DMZ 서버: 10.10.10.10 ] → [ UTM (eth1: 10.10.10.254) ]
             ↓ SNAT 적용
[ UTM (eth0: 192.168.10.100) ] → [ 외부망 (게이트웨이 192.168.10.2) ]

 

(SNAT_내부망)

SNAT 설정 
내부망 → 외부망 통신 시 소스 IP를 외부망 인터페이스 IP로 변환
소스 IP 20.20.20.x → 192.168.10.100 으로 변경
응답 패킷이 다시 UTM을 통해 내부로 돌아올 수 있도록 함

 

[내부 PC: 20.20.20.10]
    ↓
[UTM eth2: 20.20.20.254]
    ↓ (소스 NAT)
[UTM eth0: 192.168.10.100]
    ↓
[외부망: 게이트웨이 192.168.10.2 → 인터넷]

 

( 10.10.10.10 ) 

 

( 20.20.20.20 )

웹 사이트등 서비스 이용을 안함 
SNAT 설정만으로 충분

- NAT 설정 

( 인터넷 사용 인터페이스, 방화벽 )

- 방화벽 

 


 

( DNAT ) 

( 인터넷 사용 NAT 설정 ) 

10.10.10.10에 index.html을 사용하여 웹 페이지에 띄움 
DNAT로 192.168.10.100 >> 10.10.10.10을 했기 때문에 가능 

 


3 DNS

fw100.sevas10.com : 192.168.10.100
ns.sevas10.com : 10.10.10.10
www.sevas10.com : 192.168.10.110

 

4 스크립트 

dnf install php-* -y 

공통
/var/www/html
시작페이지 (index.php)

<html>
<head>
<meta charset="utf-8">
<title>SEVAS_WEB</title>
</head>
<body>
<br>
<marquee width=600 bgcolor="red">
<font size=10 color=black>
SEVAS_TEST페이지에 오신것을 환영합니다.
</font>
</marquee>
<br>

<?php
session_start();
$connection = mysqli_connect( "db.sevas10.com", "master", "asd123" );
$connection  or die ("NET 연결오류");
echo "connect success<br>";
mysqli_select_db($connection,"sevas") or die ("DB 연결실패");
echo "Connect DB<br>";
$sql="select nick from class where id='$_SESSION[LoginID]'";
$exec=mysqli_query($connection,$sql);
$result=mysqli_fetch_array($exec);
if ($result[nick] != "" )
{
echo "$result[nick] 님 환영합니다.<br>";
}
?>

<table border="1">
<tr><td><font size=5 color=red> LIST </font><br></td></tr>
<tr><td><a href="login.html"> 로그인 </a> </td></tr>
<tr><td><a href="join.html"> 회원가입 </a> </td></tr>
<tr><td><a href="update.html"> 회원정보수정</a> </td></tr>
<tr><td><a href="board.php"> 게시판</a> </td></tr>
<tr><td><a href="webhard.html"> 웹하드</a> </td></tr>
<tr><td><a href="logout.php"> 로그아웃 </a> </td></tr>
<tr><td>
<a href="https://www.naver.com">
<img src="https://static-cdn.jtvnw.net/jtv_user_pictures/b9be3bf7-c1bc-4404-be0a-f404d5622f36-profile_image-300x300.png"
width="140" height="100">
</a>
</td></tr>
</table>

</html>

 

로그인 페이지 (login.html)

<html>
<head>
<title>
SEVAS_LOGIN
</title>
</head>
<body>
<font size=3 color=blue> ID와 PW를 입력해주세요 </font><br><br>
<table border="1">
<form action=proc/login_proc.php method=POST>
<tr>
<th colspan="3"> LOGIN </th>
</tr>
<tr>
<td> ID </td>
<td> <input type=text name=id></td>
<td rowspan="2"> <input type=submit value=로그인 style='height:50'> </td>
</tr>
<tr>
<td> PW </td>
<td> <input type=password name=pw> </td>
</tr>
</form>
</table>
<a href=/index.php> 되돌아가기 </a>

</body>
</html>

 

회원가입페이지 (join.html)    
/var/www/html/join.html 
<html> 
<head> 
<title> 회원가입 </title> 
</head> 
<body> 
<font size=3 color=blue> <b>회원가입신청서</b></font> 
<br><br> 
<form method=POST action=proc/join_proc.php> 
<table border="1"> 
<tr>  <td> 아이디 </td>  <td> <input type=text name=id> </td> 
<tr>  <td> 비밀번호 </td>  <td> <input type=password name=pw> </td> 
<tr>  <td> NICKNAME </td>  <td> <input type=text name=nick>  </td> 
<tr>  <td><a href=/index.php>메인화면 </a> </td> <td> <input type=submit value="회원가입완료"> 
<input type=reset value="입력   취소"> </td> 
</table> 
</body> 
</html> 

 

로그인 프로세스 (proc/login_proc.php)  
<?php 
$id=$_POST['id']; 
$pw=$_POST['pw']; 
$hidden=$_POST['hidden']; 
#echo "$id<br>"; 
#echo "$pw<br>"; 
#echo "$hidden<br>"; 
session_start(); 
$connection = mysqli_connect("db.sevas10.com", "master", "asd123"); 
$connection  or die ("NET 연결오류"); 
echo "connect success<br>"; 
mysqli_select_db($connection,"sevas") or die ("DB 연결실패"); 
echo "Connect DB<br>"; 
$sql="select id,pw from class where id='$id' and pw='$pw'"; 
$exec=mysqli_query($connection,$sql); 
$result=mysqli_fetch_array($exec) or die ("Login Fail<br> 
<form method=POST action=/login.html> 
<input type=submit value='다시로그인'> 
</form>" 
); 
echo "Login Success<br>"; 
$_SESSION['LoginID'] = $id; 
#echo $_SESSION['LoginID']; 
header ("location:/index.php"); 
#print_r($result); 
#echo "<br>"; 
#echo $result["0"]; 
#echo "<br>"; 
#echo $result["id"]; 
#echo "<br>"; 
#echo $result["1"]; 
#echo "<br>"; 
#echo $result["pw"]; 
#echo "<br>"; 
?> 

 

회원가입프로세스 (proc/join_proc.php)  
<?php 
$id = $_POST['id']; 
$pw = $_POST['pw']; 
$nick = $_POST['nick']; 
$connection = mysqli_connect("db.sevas10.com", "master", "asd123"); 
$connection  or die ("NET 연결오류"); 
echo "connect success<br>"; 
mysqli_select_db($connection,"sevas") or die ("DB 연결실패"); 
echo "Connect DB<br>"; 
$sql = "insert into class values (null,'$id','$pw','$nick',now() )"; 
$exec = mysqli_query($connection,$sql) or die ("회원가입실패<br> 
<form method=POST action=/join.html> 
<input type=submit value='회원가입페이지로'> 
</form>" 
); 
echo "회원가입성공"; 
echo "<form method=POST action=/index.php>"; 
echo "<input type=submit value='메인화면'>"; 
echo "</form>"; 
?> 

 

로그아웃 페이지 (logout.php) 
<?php 
session_start(); 
$_SESSION['LoginID']=""; 
session_destroy(); 
header ("location:/index.php"); 
?> 

 

게시판 페이지 (board.php) 
<html> 
<head> 
<title>게시판</title> 
</head> 
<body> 
<form method=POST action="board_insert.php"> 
글제목: <br> 
<input type=text name=subject> <br> 
글내용: <br> 
<textarea rows=5 cols=50 name=contents></textarea> <br> 
<input type=submit value="등록"> 
</form> 
<form method=POST action=index.php> 
<input type=submit value="메인화면"> 
</form> 
</body> 
</html> 
<?php 
session_start(); 
$connection = mysqli_connect("db.sevas10.com", "master", "asd123"); 
$connection  or die ("NET 연결오류"); 
mysqli_select_db($connection,"sevas") or die ("DB 연결실패"); 
$dbq="select * from b_tb"; 
$result=mysqli_query($connection,$dbq); 
while($result2=mysqli_fetch_array($result)) 

echo "<a href = board_view.php?b_no={$result2['b_no']} > 글번호 : {$result2['b_no']} </a>"; 
echo "글제목 : {$result2['subject']} "; 
echo "작성자 : {$result2['user']} "; 
echo "작성일자 : {$result2['reg_date']} <br> "; 

?> 
</body> 
</html> 
게시판 입력 페이지 (board_insert.php)   
<?php 
session_start(); 
$subject = $_POST['subject']; 
$contents = $_POST['contents']; 
$user = $_SESSION['LoginID']; 
$connection = mysqli_connect("db.sevas10.com", "master", "asd123"); 
$connection  or die ("NET 연결오류"); 
mysqli_select_db($connection,"sevas") or die ("DB 연결실패"); 
if($user == '') 

echo "로그인 후 이용해주세요<br>"; 
echo "<a href ='/login.html'> 로그인페이지 </a>"; 
exit; 

$dbq="insert into b_tb values (null,'$subject','$user','$contents',now())"; 
$result=mysqli_query($connection,$dbq); 
if($result) 

echo "글등록 성공<br>"; 
echo "<a href ='/board.php'> 되돌아가기 </a>"; 
exit; 

else 

echo "글등록 실패<br>"; 
echo "<a href ='/board.php'> 되돌아가기 </a>"; 

mysqli_close($connection); 
?> 

 

게시판 보기 페이지  (board_view.php)  
<?php 
$b_no=$_GET['b_no']; 
$dbc=mysqli_connect("db.sevas10.com","master","asd123"); 
mysqli_select_db($dbc,"sevas") or die ("DB 연결실패"); 
$dbq="select * from b_tb where b_no='$b_no' "; 
$result=mysqli_query($dbc,$dbq); 
$result2=mysqli_fetch_array($result); 
echo "글번호: {$result2['b_no']} <br>" ; 
echo "작성자: {$result2['user']} <br>" ; 
echo "글제목: {$result2['subject']} <br>" ; 
echo "글내용: {$result2['contents']} <br>" ; 
echo "등록일: {$result2['reg_date']} <br>" ; 
echo "<form method=POST action=index.php>"; 
echo "<input type=submit value='메인화면'>"; 
echo "</form>"; 
echo "<form method=POST action=board_delete.php>"; 
echo "<input type=hidden name=b_no value='$b_no'>"; 
echo "<input type=submit value='삭제'>"; 
echo "</form>"; 
echo "<form method=POST action=board.php>"; 
echo "<input type=submit value='게시판으로 돌아가기'>"; 
echo "</form>"; 
?> 

 

게시판 지우기 (board_delete.php) 
<?php 
session_start(); 
$user = $_SESSION['LoginID']; 
$b_no=$_POST['b_no']; 
$dbc=mysqli_connect("db.sevas10.com","master","asd123"); 
mysqli_select_db($dbc,"sevas") or die ("DB 연결실패"); 
$dbq="select * from b_tb where b_no='$b_no' "; 
$result=mysqli_query($dbc,$dbq); 
$result1=mysqli_fetch_array($result); 
if( $user == $result1[user] ) 

$dbq2="delete from b_tb where user='$user' and b_no='$b_no' "; 
$result2=mysqli_query($dbc,$dbq2); 
mysqli_close($dbc); 
#echo "$user"; 
#echo "$b_no"; 

else 

echo "작성한 회원만 삭제가 가능합니다.<br>"; 

echo "<a href='board.php'> 되돌아가기</a>"; 
?>
회원정보수정  (update.html)  
<html> 
<head> 
<title>회원정보수정</title> 
</head> 
<body> 
<font size=3 color=blue> <b>회원정보 수정</b></font> 
<br><br> 
<form method=POST action=proc/update_proc.php> 
<table border="1"> 
<td> 비밀번호 </td>  <td> <input type=password name=pw> </td> 
</table> 
<input type=submit value="회원정보수정완료"><input type=reset value="입력 취소"> 
<a href='index.php'> 되돌아가기</a> 
</body> 
</html> 

 

회원정보수정 프로세스  (proc/update_proc.php)   
<?php 
$pw = $_POST['pw']; 
session_start(); 
$conn = mysqli_connect("db.sevas10.com", "master", "asd123", "sevas"); 
$sql = "update class set pw='$pw'  where id='$_SESSION[LoginID]'"; 
$exec = mysqli_query($conn,$sql) or die ("회원정보수정실패<br> 
<form method=POST action=/update.html> 
<input type=submit value='회원정보수정'> 
</form>" 
); 
echo "회원정보변경완료"; 
echo "<form method=POST action=/index.php>"; 
echo "<input type=submit value='메인화면'>"; 
echo "</form>"; 
?> 

 

웹하드페이지 (webhard.html)   
<html> 
<head> 
<title> 
Web Hard (Search&Download)!!! 
</title> 
</head> 
<body> 
<pre> 
검색할 키워드 입력!! 
<form method=POST action="search_file.php"> 
키워드: <input type=text name=keyword> <br> 
<input type=submit value="검색"> 
</form> 
<br><br> 
업로드할 파일을 선택하고 전송을 누르세요!!!<br> 
<form method=POST action="up_file.php" enctype="multipart/form-data"> 
<input type=file name=upfile1> 
<input type=submit value="전송"> 
<input type=reset value="파일 취소"> 
</form> 
<a href=/index.php> 메인페이지 </a> 
</pre> 
</body> 
</html> 

 

업로드 페이지 (up_file.php)   
<?php 
session_start(); 
$upfile[1] = $_FILES['upfile1']['name']; 
$uptmpfile[1] = $_FILES['upfile1']['tmp_name']; 
$upfilesize[1] = $_FILES['upfile1']['size']; 
$conn = mysqli_connect("db.sevas10.com", "master", "asd123", "sevas"); 
mysqli_query('set names utf8'); 
$sql = "insert into file_tb values(null, '$upfile[1]',now(),'$_SESSION[LoginID]','$upfilesize[1]')"; 
$result = mysqli_query($conn, $sql); 
if(! $result) 


echo "Fail to Upload file"; 
echo "<a href=webhard.html> 되돌아가기 </a>"; 
exit; 
$result2 = move_uploaded_file($uptmpfile[1], "./file/".$upfile[1]); 
echo "File Upload Success!!<br>"; 
echo "<a href='index.php'> 홈으로</a><br>"; 
echo "<a href='webhard.html'> 목록</a><br>"; 
mysqli_close($conn); 
?>

 

파일내용 검색  (search_file.php)  
<?php 
session_start(); 
$keyword = $_POST['keyword']; 
 
$conn = mysqli_connect("db.sevas10.com", "master", "asd123", "sevas"); 
mysqli_query('set names utf8'); 
$sql = "select * from file_tb where file_name like '%$keyword%'"; 
 
$return = mysqli_query($conn,$sql); 
 
while($result = mysqli_fetch_array($return)) 

        echo "File No : $result[file_no]<br>"; 
        echo "FileName : <a href=/down_file.php?file_name=$result[file_name]> $result[file_name]</a><br>"; 
        echo "Ret Date : $result[reg_date]<br>"; 
        echo "Ownner : $result[file_own]<br>"; 
        echo "File Size : $result[file_size]<br><br>"; 

echo "<form method=POST action='webhard.html'>"; 
echo "<input type=submit value='검색'>"; 
echo "</form>"; 
mysql_close(); 
?>
다운로드 페이지 (down_file.php)  
<?php 
$file_name=$_GET['file_name']; 
 
Header("Content-Type:application/octet=stream"); 
Header("Content-Disposition:attachment; filename=$file_name"); 
Header("Content-Transfer-Encoding:binary"); 
Header("Content-Length:".filesize("./file/$file_name")); 
 
$fd = fopen("./file/$file_name", "rb"); 
 
echo fread($fd, filesize("./file/$file_name")); 
?> 

 

 


5. DB 

Rocky2
dnf install mariadb* -y

vi /etc/my.cnf
[mysqld]
character_set_server=utf8
[client]
default-character-set=utf8
mysql -u root -p
use mysql
update user set password=password('asd123')where user='root';
flush privileges;
create database sevas;
use sevas

왜 ? DB에서 계정을 www.sevas10.com이이 아니라 ns.sevas10.com으로 한 이유 

1. grant all privileges on sevas.* to master@'10.10.10.10' identified by 'asd123' with grant option; 즉 계정 IP를 10.10.10.10으로 만듬 
(192.168.10.100 = www.sevas10.com  (0) ) ( 10.10.10.10 = ns.sevas10.com (0) )
( 10.10.10.10 = www.sevas10.com (x) )

위 내용처럼 db 접속 시 클라이언트 (master) ip를 10.10.10.10으로 인식 

2. 웹서버가 192.168.10.10으로 생각했지만 실제 DB 입장에서 10.10.10.10 IP에서 접속이 들어온다 

(게시판 DB) 
create table b_tb( 
b_no    
int  unsigned  auto_increment not null, 
subject char(100) not null, 
user     
char(20) not null, 
contents text not null, 
reg_date datetime, 
index(b_no), 
unique key no(b_no)); 
(회원가입 DB) 
create table class ( 
c_no int unsigned auto_increment not null, 
id char(40) not null, 
pw char(40) not null, 
nick varchar(40) not null, 
date datetime not null, 
index(c_no), 
primary key(id), 
unique key sevas1(c_no), 
unique key sevas2(c_no,id)); 
(파일 업로드 DB) 
create table file_tb( 
file_no int not null auto_increment, 
file_name char(255) not null, 
reg_date datetime, 
file_own char(20), 
file_size char(10), 
unique key file1(file_no), 
primary key(file_name)); 


6. 기능 확인 

- 회원가입

 


- 로그인


- 회원 정보 수정 

 


- 게시판 확인 


- 웹 하드 (파일 업로드) 확인

 


- 로그 아웃 확인 


 

번외 

문제 해결

 

에러 확인 스크립트 

<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
session_start();

// DB 연결
$connection = mysqli_connect("db.sevas10.com", "master", "asd123");
if (!$connection) {
    die("❌ DB 서버 연결 실패: " . mysqli_connect_error());
}
echo "✅ DB 서버 연결 성공<br>";

// DB 선택
if (!mysqli_select_db($connection, "sevas")) {
    die("❌ DB 선택 실패: " . mysqli_error($connection));
}
echo "✅ DB 선택 성공<br>";

// 세션 확인
if (!isset($_SESSION['LoginID'])) {
    echo "⚠️ 세션에 LoginID 없음<br>";
    $_SESSION['LoginID'] = 'testid'; // 임시 ID 세팅 (테스트용)
}

// 쿼리 수행
$sql = "SELECT nick FROM class WHERE id='{$_SESSION['LoginID']}'";
echo "💡 실행할 SQL: $sql<br>";

$exec = mysqli_query($connection, $sql);
if (!$exec) {
    die("❌ 쿼리 실행 실패: " . mysqli_error($connection));
}

$result = mysqli_fetch_array($exec);
if (!empty($result['nick'])) {
    echo "🎉 {$result['nick']} 님 환영합니다.<br>";
} else {
    echo "ℹ️ 결과 없음<br>";
}
?>

db 서버에 sevas 데이터베이스 안에 class 테이블이 없음 추가 요망

 

 

'UTM' 카테고리의 다른 글

UTM3 ( IPS, 웹 방화벽 )  (0) 2025.05.12
UTM4 (VPN)  (0) 2025.05.07
UTM1 ( 기본 설정 세팅 )  (0) 2025.04.28