< 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 |