2022-01-27 · 7

[기능반] 서버구축 2.

serverlinux

이 글은 작성된 지 2년이 넘었어요. 내용이 오래됐을 수 있어요.

알아야할 내용 : 

더보기

**[기능반공부/네트워크] - [네트워크] NAT에 대해서**](https://nabomhalang.tistory.com/entry/네트워크-NAT에-대해서) [[네트워크] NAT에 대해서 NAT 내부 네트워크에서 외부로 나갈 때 내부 ip 주소를 다른 ip로 변환하여 외부로 나가게 해줍니다. ① NAT Static : 출발지와 목적지의 ip를 미리 매핑하여 고정해논 NAT ② NAT Dynamic : 출발지나 목적 — nabomhalang.tistory.com


Client가 외부서버 : main_srv, slave_srv 로는 통신가능하게, 외부서버가 client과는 통신이 안되게 설정할 것인데 이것을 NAT를 사용할 것 입니다. masqurade라는 기능을 사용할 것 입니다.

vim /etc/sysctl.conf

28번째줄이 net.pv4.ip_forward=1이 주석화 되있을텐데 이것을 #을 지워서 주석을 없애주고 :wq로 나와줍니다.

echo 1 > /proc/sys/net/ipv4/ip_forward
sysctl -w net.ip4.ip_forward = 1

위 2개의 명령어중에 되는걸로 해줍니다.

iptables -A FORWARD -o ens33 -j ACCEPT
iptables -A FORWARD -o ens37 -j ACCEPT
iptables -t nat -A POSTROUTING -o ens33 -j MASQUERADE

ens33(내부) ens37(외부)에서 접속이 가능하게 전부 ACCPET를 해줍니다. 그리고 위 3개의 명령어들을 차례대로 입력해 줍니다. 그러면 이제 Window Client에서 main_server로 핑이 보내집니다.

window Client → main-server

이제 window Client에서 ssh가 접속이 되게 설정할 것 입니다. main-server에서 진행합니다.

apt install openssh-server
sudo systemctl status ssh

install openssh-server로 ssh를 설치해 줍니다.

※ openssh가 설치가 되지 않는다면 ifconfig를 쳐보고 ens33이 꺼져있는지, ens37이 켜져있는지 확인해 봅시다. ens33은 가상네트워크라 패키지 다운받을 때는 꺼져있어야하고 패키지를 받기 위해서는 ens37이 켜져있어야 합니다.

설치 후 두번째 명령어를 입력해서 실행 중인지 확인해 봅시다.

실행 중인 것을 확인할 수 있습니다. 이제 이러면 window client에서 ssh로 접속이 될 것 입니다. main에서 만들었기 때문에 저 같은 경우는 main-server의 hostname이 main이기 때문에 ssh [email protected] 으로 접속이 가능합니다.

window terminal에서 main-server에 접속한 상황

이제 root로 한번에 접속이 가능하게 할겁니다. 혹시 ssh [email protected]으로 될거라고 생각하시면 한번 해보세요. 아마도 안될 것 입니다. 그러면 root로 접속이 가능하게 설정해 봅시다.

※ 만약 Window Client에서 ssh로 접속이 안된다면, main-server에서 22번 포트가 안열려있을 경우가 있을 수 있습니다. 그럴경우 main-server에서 ufw allow ssh 또는 ufw allow 22를 입력해서 포트를 다시 열려 봅시다.

vim /etc/ssh/sshd_config

위의 경로에서 vim으로 들어가서 바꿔주면 됩니다.

Port 22

- ssh가 사용할 기본 포트 지정합니다.

Allowusers user1 root

- 로그인 허락할 계정을 기록합니다.

LoginGraceTime 600

- 유저의 로그인이 성공적으로 이루어지 않았을 때 이 시간 후에 서버가 연결을 끊는 시간입니다.

- 기본값은 600초입니다.

PermitRootLogin no

- root 로그인을 허용여부를 결정하는 것입니다. yes, no, without-password를 사용할 수 있습니다.

PasswordAuthentication yes

- 패스워드 인증을 허용한다. 이 옵션은 프로토콜 버전 1과 2 모두 적용됩니다.

인증할 때 암호기반 인증 방법의 사용 여부를 결정합니다.

강력한 보안을 위해 이옵션은 항상 no로 설정되있어야 합니다.

여기서 루트 로그인을 허용하기 위해서는 PermitRootLogin를 yes로 바꿔주면 ssh [email protected]으로 접속이 가능할 것 입니다. 포트번호도 바꾸고 싶다면 Port 22에서 22를 원하는 포트로 변경해 주면 됩니다. 그럴경우에는 ssh [email protected] -p [포트] 로 접속하면 됩니다.

설정

위의 예시에서는 22000 포트에서 열고 RootLogin를 허용해 주었습니다.

ssh [email protected] -p 22000

위와 같이 root로 잘 접속이 되는 것을 볼 수 있습니다. 이제 apache로 웹 서비스를 해볼 것 입니다.

apt install apache2

위의 명령어를 입력하면 apache2가 설치가 됩니다.

※ 이제부터는 ens33과 ens37 껏다 키고하는 것들은 스스로 하셔야합니다.

아파치가 성공적으로 설치가 되셨으면 window client로 가 인터넷 창을 켜 주시고, main-server의 아이피를 입력해봅시다. 그러면 apache2의 기본적인 사이트 화면이 뜰겁니다. 이제 우리는 기본 탬플릿을 지워주고 "Hello World"를 입력해 봅시다. 그러면 아래와 같은 화면이 나올거에요.

22.1.24.10

잘 나오는 것을 확인할 수 있습니다. 이제 slave-server에는 nginx를 설치해서 아파치에서 설정했던 거와 마찬가지로 설정해주겠습니다. 

apt install nginx
vim /var/www/html/index.nginx-debian.html

이것도 설치가 완료가 되면 아파치와 마찬가지로 아이피로 접속이 가능해 집니다.

vim /var/www/html/index.nginx-debian.html

위와 같이 잘 바꿔 주셨으면 다시 window client로 이동해서 이번엔 slave-server의 IP를 인터넷창에 넣어주면 아파치에서 설정했던거와 동일하게 화면에 띄여지는 것을 확인할 수 있습니다.

Apache2와 Nginx 루트 디렉토리 변경

apache2

apache2는 총 2가지의 파일을 바꿔야합니다. 일단 /var/www/html/ 가 기본 디렉토리인데 이것을 /home/main/server/로 바꿔 봅시다.

vim /etc/apache2/apache2.conf
vim /etc/apache2/sites-available/000-default.conf

위 2파일에서 수정을 해줘야합니다.

vim /etc/apache2/apach2.conf

164줄에 있는 /var/www/html/ 이라 적혀있는 곳을 /home/main/server/ 로 바꿔 줍니다.

vim /etc/apache2/sites-available/000-default.conf

DocumentRoot에 적혀있는 /var/www/html/ 파일을 /home/main/server/ 로 바꿔줍니다. 그 후 /home/main/server 디렉토리 안에 index.html를 작성하여 기본적인 html파일을 만들어 줍니다. 그 후 apache2를 재시작해 줍니다.

systemctl restart apache2
service apache2 restart

둘 중에 하나만 되면 됩니다.

적용 후

적용 후 아주 잘 변경된 것을 볼 수 있습니다.

nginx

nginx는 매우 간단합니다. 단 하나의 파일만 바꿔주면 됩니다.

vim /etc/nginx/sites-enabled/default

vim /etc/nginx/sites-enabled/default

server에서 root에 있는 /var/www/html/ 를 /home/slave-server/server/로 바꿔줍니다. 그 후 재시작하면 정상적으로 작동하는 것을 볼 수 있습니다.

적용 후

IPTABLES 사용법

테이블(Table)

  • filter, nat, mangle, raw
  • 명시하지 않으면 기본적으로 filter입니다.

액션(Action)

  • -A(--append) : 정책 추가, 다른 정책들이 있다면 맨 아래에 추가합니다.
  • -I(--insert) : 청색 삽입, 다른 정책들이 있다면 맨 위에 추가합니다.
  • -D(--delete) : 정책 삭제
  • -R(--replace) : 정책 교체
  • -F(--flush) : 모든 정책 삭제
  • -P(--policy) : 기본 정책을 설정
  • -L(--list) : 정책 나열

체인(Chain)

  • INPUT
  • OUTPUT
  • FORWARD
  • PREROUTING
  • POSTROUING

매치(Match)

  • -s(--source, --src) : 출발지 매칭, 도메인, IP 주소, 넷마스크 값을 이용하여 표기
  • -d(--destination, --dst) : 목적지 매칭, 도메인, IP주소, 넷마스크값을 이용하여 표기
  • -p : 프로토콜과 매칭, TCP, UDP, ICMP와 같은 이름을 사용하고 대소문자는 구분하지 않음
  • -i(--in-interface) : 입력 인터페이스와 매칭
  • -o(--out-interface) : 출력 인터페이스와 매칭
  • -j(--jump) : 매치되는 패킷을 어떻게 처리할지 지정

타켓(target)

  • ACCEPT : 패킷을 허용합니다.
  • DROP : 패킷을 버립니다(패킷이 전송된 적이 없던 것처럼)
  • REJECT : 패킷을 버리고 이와 동시에 적절한 응답 패킷을 전송한다(ICMP-PORT-UNREACHABLE)
  • LOG : 패킷을 syslog에 기록한다.
  • SNAT --to [주소] :  소스 IP를 변환(NAT)NAT]한다.
  • DNAT --to [주소] : 목적지 IP를 변환(NAT)한다.
  • RETURN : 호출 체인 내에서 패킷 처리를 계속한다.

위에 것들을 잘 활용한다면 대부분 모든 정책을 설정하실 수 있을꺼에요 간단하게 문제입니다. 라우터에서 main-server에서 오는 80port를 차단해봅시다. 차단에 성공하면 window client에서 22.1.24.10 아파치 서버로 열었던게 안들어 가지겠죠?

다 하셨나요... 정답을 공개합니다.

iptables -I FORWARD -d 22.1.24.10 -p tcp --dport 80 -j DROP

위 코드를 라우터에 입력해주신 다음 window client에서 22.1.24.10에 접속해 보시면

이제 다시 iptables -F를 입력하신 후에 다시 접속을 해봅시다.

다시 잘 연결되는 모습을 확인할 수 있습니다. 만약 라우터가 아닌 main-server자체에서 80포트를 막고 싶다면

iptables -I INPUT -p tcp --dport 80 -j DROP

과같이 적어주시면 똑같이 window client에서는 접속이 안 됩니다.

오늘은 여기까지입니다.


원문: tistory — 2022-01-27 발행, 이 블로그로 이전됨.

댓글

댓글을 삭제할까요?

관련 글

[기능반] 서버구축 2. · 나봄하랑