Windows Server IIS 서버 2 구성 가이드
같은 IIS IP에서 host header로 여러 사이트를 분리하는 가이드입니다. Windows DNS, Linux BIND, New-Website HostHeader, Resolve-DnsName, dig 검증을 정리했습니다.
Windows Server IIS 서버 2 구성 가이드: 같은 IP에서 호스트명으로 사이트 분리
같은 IIS 서버 IP에서 서로 다른 도메인 이름으로 다른 사이트를 제공하는 방법을 정리한다. 실습은 IIS 서버 192.168.10.199, Windows DNS 서버 192.168.10.198, Linux BIND DNS 서버 192.168.10.192, 도메인 st12.abc를 사용했다.
핵심은 IIS의 site binding에 host header를 넣는 것이다. IP와 포트가 같아도 HTTP 요청의 Host header가 www.01.st12.abc인지 www.02.st12.abc인지에 따라 IIS가 다른 site로 라우팅할 수 있다.
실습 구조
| 구성 | 값 |
|---|---|
| IIS 서버 | 192.168.10.199 |
| Windows DNS 서버 | 192.168.10.198 |
| Linux BIND DNS 서버 | 192.168.10.192 |
| Zone | st12.abc |
| Site 1 | www.01.st12.abc, 내용 hi |
| Site 2 | www.02.st12.abc, 내용 bye |
1. IIS 사이트 디렉터리 생성
New-Item -ItemType Directory -Force -Path C:\inetpub\www01
New-Item -ItemType Directory -Force -Path C:\inetpub\www02
Set-Content -Path C:\inetpub\www01\index.html -Value "hi"
Set-Content -Path C:\inetpub\www02\index.html -Value "bye"2. Host header 기반 IIS 사이트 생성
Import-Module WebAdministration
New-Website `
-Name "www01-st12-abc" `
-IPAddress "192.168.10.199" `
-Port 80 `
-HostHeader "www.01.st12.abc" `
-PhysicalPath "C:\inetpub\www01"
New-Website `
-Name "www02-st12-abc" `
-IPAddress "192.168.10.199" `
-Port 80 `
-HostHeader "www.02.st12.abc" `
-PhysicalPath "C:\inetpub\www02"
Get-Website | Format-Table Name, State, PhysicalPath, Bindingsbinding을 더 자세히 보려면 다음 명령을 사용한다.
Get-WebBinding |
Select-Object protocol, bindingInformation, ItemXPath |
Format-Table -AutoSize3. Windows DNS에 zone과 A record 생성
Windows DNS 서버에서 st12.abc 정방향 zone을 만들고 각 host를 IIS 서버 IP로 연결한다.
Install-WindowsFeature -Name DNS -IncludeManagementTools
Add-DnsServerPrimaryZone `
-Name "st12.abc" `
-ZoneFile "st12.abc.dns"
Add-DnsServerResourceRecordA `
-ZoneName "st12.abc" `
-Name "www.01" `
-IPv4Address "192.168.10.199"
Add-DnsServerResourceRecordA `
-ZoneName "st12.abc" `
-Name "www.02" `
-IPv4Address "192.168.10.199"
Get-DnsServerResourceRecord -ZoneName "st12.abc"클라이언트에서 Windows DNS 서버를 바라보도록 설정하고 질의한다.
Set-DnsClientServerAddress `
-InterfaceAlias "Ethernet" `
-ServerAddresses "192.168.10.198"
Resolve-DnsName www.01.st12.abc -Server 192.168.10.198
Resolve-DnsName www.02.st12.abc -Server 192.168.10.1984. HTTP host header 테스트
DNS가 아직 준비되지 않았더라도 host header만 직접 넣으면 IIS binding을 검증할 수 있다.
Invoke-WebRequest `
-Uri "http://192.168.10.199/" `
-Headers @{ Host = "www.01.st12.abc" } `
-UseBasicParsing |
Select-Object StatusCode, Content
Invoke-WebRequest `
-Uri "http://192.168.10.199/" `
-Headers @{ Host = "www.02.st12.abc" } `
-UseBasicParsing |
Select-Object StatusCode, Content5. Linux BIND로 같은 zone 구성
Windows DNS 대신 Linux BIND를 사용할 수도 있다. 이 경우 zone 파일 문법과 named 설정 검증이 중요하다.
sudo dnf install -y bind bind-utils
sudo cp -a /etc/named.conf /etc/named.conf.bak.$(date +%Y%m%d%H%M%S)/etc/named.conf에 zone을 추가한다.
sudo tee -a /etc/named.conf >/dev/null <<'EOF'
zone "st12.abc" IN {
type master;
file "st12.ca";
allow-query { any; };
};
EOFzone 파일을 만든다.
sudo tee /var/named/st12.ca >/dev/null <<'EOF'
$TTL 3600
@ IN SOA ns1.st12.abc. admin.st12.abc. (
2026062301
3600
900
604800
86400 )
IN NS ns1.st12.abc.
ns1 IN A 192.168.10.192
www.01 IN A 192.168.10.199
www.02 IN A 192.168.10.199
EOF
sudo chown root:named /var/named/st12.ca
sudo chmod 640 /var/named/st12.caBIND 설정을 검증하고 서비스를 시작한다.
sudo named-checkconf /etc/named.conf
sudo named-checkzone st12.abc /var/named/st12.ca
sudo systemctl enable --now named
sudo firewall-cmd --permanent --add-service=dns
sudo firewall-cmd --reloadLinux DNS 서버에 직접 질의한다.
dig @192.168.10.192 www.01.st12.abc +short
dig @192.168.10.192 www.02.st12.abc +short6. 문제 해결
| 증상 | 확인 |
|---|---|
| DNS는 맞는데 같은 페이지가 뜸 | IIS binding의 host header 중복 또는 누락 확인 |
| 브라우저에서 이름 해석 실패 | 클라이언트 DNS 서버 주소, zone record, 방화벽 53/udp 확인 |
| IP로 접속하면 원하는 사이트가 안 뜸 | host header site는 IP 단독 요청과 다르게 동작한다. |
| BIND가 시작되지 않음 | named-checkconf, named-checkzone, journal 로그 확인 |
| IIS 404 또는 403 | physical path, index.html, NTFS 권한, IIS 로그 확인 |
정리
같은 IP와 같은 80 포트에서 여러 IIS 사이트를 운영하려면 DNS A record와 IIS host header binding이 같이 맞아야 한다. DNS는 www.01.st12.abc와 www.02.st12.abc를 같은 IP로 보내고, IIS는 HTTP 요청의 Host header를 기준으로 서로 다른 physical path를 선택한다. DNS 문제인지 IIS binding 문제인지 분리하려면 Resolve-DnsName과 Invoke-WebRequest -Headers @{ Host =... }를 함께 사용하면 된다.