• 2차 네임서버 구축 AWS EC2 DNS Server (3차, 4차, 5차)

    2차 네임서버 구축 AWS EC2 DNS Server (3차, 4차, 5차)

    1차 네임서버 구축 완료

    2차 네임서버 구축 진행중

    AWS EC2 서버를 이용하여 1차 네임서버를 완료하였습니다.

    아무리 아마존이라고 하지만 서버가 다운될수도 있고 또 에러발생할수도 있기에 2차 네임서버 구축을 진행하고 있습니다. 지난주에 거의 40개 가까운 서버를 자동 백업시스템을 만들었죠.

    오늘은 2차 네임서버 구축 진행중에 있습니다.

    이 부분도 백업만큼 중요한 부분이기에 필히 해야합니다.

    1차 네임서버 구축 할 당시 AWS EC2 인스턴스로 만들었기에 Route 53 네임서버를 이용하는것보다는 더 정교하고 프로그래밍이 가능하여 원하는 시스템을 만들때 좋은듯합니다.

    최종적으로 남아 있는 DDNS 서버까지 완성되면 모든 유동 아이피를 고정아이피 처럼 자동화 할 수 있습니다.

    일단 최종단계가 올해 중으로 해결될꺼같고요. 각 서버별 부하량 체크, 백업, 자동화, TVM 생성, TVM 공유, 확장에 용이하도록 만들어놓은상태라 DDNS 완성되고 관리자 툴까지 개발도면 기본세팅은 마무리가 됩니다.

    대량 서버 관리 시스템을 만들고 있는 중이라 한두대 서버가 아닌 천대 이상의 서버를 관리 할 수 있도록 그 규모에 맞게끔 프로그램 제작과 설계를 하고 있죠.

    2차 네임서버가 왜 필요하냐하면 막연히 백업용이라고 할수도 있지만 점점 서버 규모라던지 커지다보니 3차 4차 네임서버까지 만들어서 운영해야할듯합니다.

    2차 네임서버 구축 세팅 방법

    1차 네임서버
    # vi /etc/named.conf
    options {
            listen-on port 53 { any; };
            listen-on-v6 port 53 { none; };
            directory       "/var/named";
            dump-file       "/var/named/data/cache_dump.db";
            statistics-file "/var/named/data/named_stats.txt";
            memstatistics-file "/var/named/data/named_mem_stats.txt";
            recursing-file  "/var/named/data/named.recursing";
            secroots-file   "/var/named/data/named.secroots";
            ...
            allow-transfer  { 2차 네임서버 아이피; };
    #만약 3차 4차 5차 네임서버가 구축 될 경우 아래처럼 아이피를 나열하면됩니다.
            allow-transfer  { 2차 네임서버 IP; 3차 네임서버 IP; 4차 네임서버 IP; 5차 네임서버 IP;};
    
    그리고 zone 영역에 한줄 더 추가합니다.
    zone "네임서버 도메인" IN {
            type master;
            file "Zones/nameServerDomain";
            allow-update    { 2차 네임서버 아이피; };
    #만약 3차 4차 5차 네임서버가 구축 될 경우 아래처럼 아이피를 나열하면됩니다.
            allow-update    { 2차 네임서버 IP; 3차 네임서버 IP; 4차 네임서버 IP; 5차 네임서버 IP;};
    
    };
    2차 네임서버
    # vi /etc/named.conf
    options {
            listen-on port 53 { any; };
            listen-on-v6 port 53 { none; };
            directory       "/var/named";
            dump-file       "/var/named/data/cache_dump.db";
            statistics-file "/var/named/data/named_stats.txt";
            memstatistics-file "/var/named/data/named_mem_stats.txt";
            recursing-file  "/var/named/data/named.recursing";
            secroots-file   "/var/named/data/named.secroots";
            ...
            allow-notify {  2차 네임서버 아이피; };
    #만약 3차 4차 5차 네임서버에 적용 할 경우에는 각 네임서버의 IP를 입력하면 됩니다.
    #3차 네임서버 라면...
            allow-notify {  3차 네임서버 아이피; };
    #4차 네임서러 라면...
            allow-notify {  4차 네임서버 아이피; };
    #5차 네임서버 라면...
            allow-notify {  5차 네임서버 아이피; };
    
    그리고 zone 영역에 한줄 더 추가합니다.
    zone "네임서버 도메인" IN {
            type slave;
            masters { 1차 네임서버 아이피; };
            file "Zones/nameServerDomain";       
    };
    
    2차 네임서버에는 자동 동기화 설정이 되므로 아래 폴더에 named 수정권한이 있어야 합니다.
    chmod 770 /var/named
    chmod 770 /var/named/chroot/var/named
    둘중 어느것을 하더라도 상관없을듯 하나 저는 /var/named 전체 770 권한으로 변경했습니다.
    

    이렇게 세팅하고 2차 네임서버를 실행하면 아래처럼 원래 있어야 할 파일들의 이름이 모두 db-랜덤문자 형식으로 바뀌며 (백업되며) 1차 네임서버에 적용되는 동일한 파일명으로 zone 파일이 생성됩니다.

    이때 바이너리 형태의 문자라서 슬레이브 (2차 네임서버)에서는 수정을 할 수 없습니다.

    개인서버구축

    위의 파일은 삭제하여도 상관없이 동작합니다.

    새로 생성된 바이너리 형태의 zone 파일들은 자동으로 1차 네임서버랑 연동되어 동작합니다.

    정리

    AWS EC2 인스턴스 3차, 4차, 5차 네임서버 만드는 과정

    1. 2차 네임서버 EC2 인스턴스 스냅샷 생성

    2. 스냅샷으로 AMI 생성

    3. AMI 이용하여 EC2 인스턴스 등록

    4. vi /etc/named.conf (수정)

    #1차 네임서버의 option
            allow-transfer  { 2차 네임서버 IP; 3차 네임서버 IP; 4차 네임서버 IP; 5차 네임서버 IP;};
    
    #3차 네임서버의 option
            allow-notify {  3차 네임서버 아이피; };
    #4차 네임서버의 option
            allow-notify {  4차 네임서버 아이피; };
    #5차 네임서버의 option
            allow-notify {  5차 네임서버 아이피; };

    5. 1차 네임서버 도메인 리스트가 나오는지 확인

    named-checkconf -z

    끝!

    이제 대량도 감당할수 있음.

  • c# 외부 ip 가져오기 로컬 ipv4 아이피 함수 Function

    c# 외부 ip 가져오기 로컬 ipv4 아이피 함수 Function

    C 프로그래밍 언어와 C++, C# 등 로컬 영역에서 동작하는 프로그램으로는 자신의 외부 아이피를 확인 할 수 없습니다. 특히 공유기를 이용하고 있고 사설 아이피로 IP를 할당 받았다면 더더욱 알수 없죠.

    기껏 알수 있는 아이피는 192.168.0.1 수준의 사설 아이피뿐입니다.

    개인서버구축

    C# 외부 로컬 ipv4 아이피를 알기 위해서는 아래 함수를 이용하면 바로 확인 할 수 있습니다.

    인터넷이 꼭 연결되어져 있어야 합니다.

    public static IPAddress GetExternalIp()
    {
    	string ip = string.Empty;
    
    	try
    	{
    		string sourceURL = string.Empty;
    		sourceURL = string.Format("https://api.tion.kr");
    
    		WebClient client = new WebClient();
    		client.Encoding = Encoding.UTF8;
    
    		string data = client.DownloadString(string.Format("https://api.tion.kr"));
    
    
    		string pattern = "(<myip>)(?<ip>[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}?)(</myip>)";
    		MatchCollection matches = Regex.Matches(data, pattern);
    
    		foreach (Match match in matches)
    		{
    			if (match.Groups["ip"].Length > 0)
    			{
    				//IP 정상적으로 나오는지 확인하는부분
    				//MessageBox.Show(match.Groups["ip"].Value);
    				ip = match.Groups["ip"].Value;
    			}
    		}
    	}
    	catch (Exception)
    	{
    
    	}
    
    	IPAddress externalIp = IPAddress.Parse(ip); 
    
    	return externalIp;
    
    }

    위의 함수 소스코드는 https://api.tion.kr 사이트에서 제공하고있습니다.

    위의 사이트도 제가 직접 만든 사이트입니다.

    실제로 C#에서 아이피를 가져와야할 일이 많다보니 2013년부터 만들어서 앞으로 계속 사용하기 위해서 만든거라 개발하실때 만드시더라도 특별한 일 없는이상 위의 도메인을 유지할겁니다.

    2017년도에 기간연장 10년치 최고 결재라서 10년치 결재했는데 벌써 4년 남았네요.

    2년정도 남았을때 다시 10년 기간 연장 해놓겠습니다.

    개인서버구축

    직접 C# 프로그램으로 제작해보았습니다.

    아래는 제가 C#으로 직접 만든 프로그램 입니다.

    c# 외부 ip 가져오기 소스코드

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Net;
    using System.Text;
    using System.Text.RegularExpressions;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace ESXi_IP_Monitoring
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                label_ip.Text = String.Format("{0}", GetExternalIp());
            }
    
            public static IPAddress GetExternalIp()
            {
                string ip = string.Empty;
    
                try
                {
                    string sourceURL = string.Empty;
                    sourceURL = string.Format("https://api.tion.kr");
    
                    WebClient client = new WebClient();
                    client.Encoding = Encoding.UTF8;
    
                    string data = client.DownloadString(string.Format("https://api.tion.kr"));
    
    
                    string pattern = "(<myip>)(?<ip>[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}?)(</myip>)";
                    MatchCollection matches = Regex.Matches(data, pattern);
    
                    foreach (Match match in matches)
                    {
                        if (match.Groups["ip"].Length > 0)
                        {
                            //IP 정상적으로 나오는지 확인하는 부분
                            //MessageBox.Show(match.Groups["ip"].Value);
                            ip = match.Groups["ip"].Value;
                        }
                    }
                }
                catch (Exception)
                {
    
                }
    
                IPAddress externalIp = IPAddress.Parse(ip);
    
                return externalIp;
    
            }
        }
    }
    
    개인서버구축
    개인서버구축

    외부 IP를 잘 가져오는군요.

    저는 이렇게 외부 IP를 자동으로 가져와서 ESXi 방화벽에 자동추가하는 시스템을 만들고 있습니다.

    외부 어느지역에서도 ESXi 서버에 자유롭게 자동으로 접속하기 위한 시스템이죠.

    방화벽으로 특정 IP만 접속 할 수 있도록 만들고 위의 프로그램으로 1분동안 접속 가능하도록 만들고 있습니다.

    노트북을 끄는 순간 1분후에 자동으로 제가 사용하던 IP도 차단이 되는 시스템이죠.

    개인서버구축

    보안으로 인해서 작년 말부터 고생을 하고 있어 이부분을 확실히 하고 있습니다.

    보안이 필요하신 분들 계시면 말씀주세요.

  • dhclient-script overwrites resolv.conf 초기화 방지

    dhclient-script overwrites resolv.conf 초기화 방지

    지워도 지워도 계속 똑같은 resolv.conf 파일!!

    ; generated by /usr/sbin/dhclient-script
    search ap-northeast-2.compute.internal
    nameserver 172.31.0.2

    아마존 AWS EC2 사용자라면 가상화 VM 에서 사설 아이피로 인한 DHCP 환경으로 /usr/sbin/dhclient-script 스크립트에 의해서 자동으로 초기화가 됩니다.

    vi /sbin/dhclient-script

    vi 편집 프로그램으로 주석 하나 달아주면 해결됩니다.

    # After dhclient brings an interface UP with a new IP address, subnet mask, 
        # and routes, in the REBOOT/BOUND states -> search for "dhclient-up-hooks".
        if [ "${reason}" = "BOUND" ] || [ "${reason}" = "REBOOT" ] ||
           [ ! "${old_ip_address}" = "${new_ip_address}" ] ||
           [ ! "${old_subnet_mask}" = "${new_subnet_mask}" ] ||
           [ ! "${old_network_number}" = "${new_network_number}" ] ||
           [ ! "${old_broadcast_address}" = "${new_broadcast_address}" ] ||
           [ ! "${old_routers}" = "${new_routers}" ] ||
           [ ! "${old_interface_mtu}" = "${new_interface_mtu}" ]; then
    
            if [ -x ${ETCDIR}/dhclient-${interface}-up-hooks ]; then
                . ${ETCDIR}/dhclient-${interface}-up-hooks
            elif [ -x ${ETCDIR}/dhclient-up-hooks ]; then
                . ${ETCDIR}/dhclient-up-hooks
            fi
        fi
    
        #제 경우에는 626번째 라인이었습니다.
        #make_resolv_conf
    
        if [ -n "${new_host_name}" ] && need_hostname; then
            hostname ${new_host_name} || echo "See -nc option in dhclient(8) man page."
        fi
    
        if [[ ( "${DHCP_TIME_OFFSET_SETS_TIMEZONE}" = [yY1]* ) &&
              ( -n "${new_time_offset}" ) ]]; then
            # DHCP option "time-offset" is requested by default and should be
            # handled.  The geographical zone abbreviation cannot be determined
            # from the GMT offset, but the $ZONEINFO/Etc/GMT$offset file can be
            # used - note: this disables DST.
            ((z=new_time_offset/3600))
            ((hoursWest=$(printf '%+d' $z)))
    
            if (( $hoursWest < 0 )); then
                # tzdata treats negative 'hours west' as positive 'gmtoff'!
                ((hoursWest*=-1))
            fi
    
            tzfile=/usr/share/zoneinfo/Etc/GMT$(printf '%+d' ${hoursWest})
            if [ -e ${tzfile} ]; then
                cp -fp ${tzfile} /etc/localtime
    
    개인서버구축

    주석처리하고 네트워크 재실행 하면 이때부터 resolv.conf 계속 유지됩니다.

    검색 해보면 chmod 444 준다니 여러 방법 보이지만 버전이 오르면서 그러한 부분들도 모두 되지 않습니다.

    2023년 2월 기준으로 현재는 위 방법으로 해결하고 있으니 도움되셨으면 합니다.

    모든 부분들을 직접 해결하다보니 시간이 많이 걸리며 더디게 걸어가고 있지만…

    계속 성장중입니다.

    AWS EC2 인스턴스에서 네임서버 운영중인데 resolv.conf 파일이 변하니깐 DNS가 오락가락 했네요.

    서버때문에 2~3개월 다른일 못하고 있네요.

    곧 마무리되는대로 다시 돌아오겠습니다.

    오늘은 백업서버 자동화, DNS 서버 안정화 작업했습니다.

    일단 모두 해결되었습니다.

  • 윈도우 wget 대체 방법 vmware esxi 파일 공유 소스코드

    윈도우 wget 대체 방법 vmware esxi 파일 공유 소스코드

    윈도우 10, 11에서 VMWARE 강제 재부팅 문제 발생

    vmware 사용할때에는 자체 file share 기능을 이용하여 host 폴더를 지정하여 guest vm에서 같은 폴더를 지정하여 사용하였습니다. 그런데 host pc에서 최근들어 강제로 업데이트 되면서 vmware workstation 버전 상관없이 강제 재부팅이 자주 일어나고 있습니다.

    이를 해결하기 위해서 xenserver, vmware esxi, 기타 등등 linux 기반에서 vm을 관리하는 방법이 윈도우 10 강제 재부팅을 막을 수 있는 유일한 방법이더군요.

    게중에는 윈도우10, 11 업데이트를 막으면 된다는 글들이 많지만 실제로 수도 없이 해보았고 업데이트 안될시 불이익 등등 다 따져보았을때 운영체제를 바꾸는것이 정답이더군요.

    결국 ESXi 서버를 도입하게 되었습니다.

    그런데 이때 문제가 발생하더군요.

    기존에 vmware workstation 에서는 위에서 이미 말씀드린바 공유폴더를 지정할수 있었습니다.

    ESXi 와 Xenserver 와 같은 시스템에서는 그러한 부분들이 잘 되어 있지 않아 (제가 모를수도 있고요) 직접 guest vm마다 공유폴더를 만들어서 사용하려합니다.

    이렇다보니 윈도우7, 윈도우10 guest vm에서 파일을 강제로 다운받아야 하는데 리눅스처럼 wget 기능이 없어 윈도우 wget 대체 프로그램을 찾다가 파워쉘이 유일한 방법이더군요.

    그래서 제가 직접 만들게 된겁니다.

    wget.exe 파일 다운로드

    아래 파워쉘 방법은 그냥 참고 하시고요.

    매번 배치파일 만들어서 매번 저 명령어를 외울수도 없고…

    powershell "(New-Object System.Net.WebClient).DownloadFile('https://vlog.tion.co.kr/app/wget.exe','C:\Windows\System32\wget.exe')"
    
    powershell "(New-Object System.Net.WebClient).DownloadFile('https://URI','Filename.zip')"

    윈도우 wget 대체 소스코드 공유

    C#으로 만들었으며 소스코드는 그대로 올려놓을테니 저처럼 직접 필요한분들은 C#으로만들어 쓰세요.

    wget.exe 파일 다운로드

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Net;
    using System.Text;
    using System.Threading.Tasks;
    using static System.Net.Mime.MediaTypeNames;
    
    namespace wget
    {
        internal class Program
        {
            static void help()
            {
                Console.WriteLine("wget version: 1.0");
                Console.WriteLine("wget: missing URL");
                Console.WriteLine("Usage: wget https://vlog.tion.co.kr/app/wget.exe");
                Console.WriteLine("");
                Console.WriteLine("Try `wget --help` for help");
                Console.WriteLine("");
                Console.WriteLine("made by 리눅스맨 2023-02-24 vlog.tion.co.kr");
            }
            static void Main(string[] args)
            {
    
                if (args.Length == 0)
                {
                    help();
                }
                else
                {
                    switch (args.Length)
                    {
                        case 1:
    
                            if (args[0].Contains("http"))
                            {
                                Uri uri = new Uri(args[0]);
    
                                string fileName = null;
                                string[] uriSegments = uri.Segments;
                                int indexSegment = 0;
                                foreach (string getFileName in uriSegments)
                                {
                                    if (++indexSegment == uriSegments.Length)
                                    {
                                        //Console.WriteLine(getFileName);
                                        fileName = WebUtility.UrlDecode(getFileName.Trim());
                                    }
    
                                }
    
                                string remoteUri = uri.OriginalString;
                                string myStringWebResource = remoteUri;
                                // Create a new WebClient instance.
                                WebClient myWebClient = new WebClient();
                                // Concatenate the domain with the Web resource filename.
                                Console.WriteLine("Downloading File \"{0}\" from \"{1}\" .......\n\n", fileName, myStringWebResource);
                                // Download the Web resource and save it into the current filesystem folder.
    
                                myWebClient.DownloadFile(myStringWebResource, fileName);
                                Console.WriteLine("Successfully Downloaded File \"{0}\" from \"{1}\"", fileName, myStringWebResource);
                                Console.WriteLine("\nDownloaded file saved");
    
                            }
                            else if (args[0].Equals("--help"))
                            {
                                
                            }
                            else
                            {
                                help();
                                
                            }
    
                            break;
                    }
                }
                
            }
        }
    }
    

    이제 필요한 파일을 웹서버 하나 만들어서 업로드 하고 필요할때마다 wget.exe 파일 이용해서 다운받으면됩니다.

  • 웹서버 다운 원인 분석 결국 해커가 서버를 해킹

    웹서버 다운 원인 분석 결국 해커가 서버를 해킹

    웹서버 다운 원인 분석중입니다.

    워드프레스 홈페이지가 다운 되었다고 메일이 날라와서 그 시간대 로그를 확인해보았습니다.

    개인서버구축

    2023년 2월 17일 (금일 아침) 7시 47분 ~ 8시 8분 대략 22분정도 다운이 되었습니다.

    위의 파일은 serverChecker.php 파일을 1분마다 다운로드 받는것인데 제가 만들어놓은 스크립트가 있습니다.

    serverChecker.php 접속해서 자동으로 로그를 기록합니다.

    그걸 사용하시면 언제 웹서버가 다운되었는 정확하게 알 수 있습니다.

    파일 크키가 0일때 서버가 다운된것이므로 파일 크기 0일때를 조사해보았습니다.

    ll -SSh /root/_TION/_logs_tionServerMonitor/ | grep ^-

    개인서버구축

    3일정도를 분단위로 로그를 저장하고 있는데 하루에 한번씩 20분정도 서버가 멈추는 것으로 파악되었습니다.

    그리고 의문의 한가지가 있는데요.

    같은 시각 다른 서버에서도 동일한 흔적이 있었습니다.

    개인서버구축

    같은서버가 아님에도 불구하고 같은 시간 동일하게 서버가 다운되었습니다.

    그래서 로그를 확인해보니… 해킹시도로 인한 서비스 다운이 된듯합니다.

    개인서버구축

    최근에 관리자 접속이 계속 잠기고 로그인 할 수 없었는데 해커 2명정도가 계속 서버에 붙어서 로그인 시도를 하고 있었네요. 안타깝습니다.

    개인서버구축

    지금 확인하고 있는 가운데에도 계속 저렇게 해킹시도를 하고 있으니…

    이벤트 로그에서 해킹시도가 명백해졌으므로 IP 차단으로 해결할 문제는 아닌듯하고

    서버 root 접속 시도하는 모든 아이피를 자동으로 차단하도록 해야될꺼같단 생각이 들었습니다.

    아마존 EC2 운영은 보안서버가 EC2 서버 앞단에 있어서 방화벽으로IP를 제어할수 있지만

    ESXi, Xenserver 같은 개인서버를 운영할 경우 방화벽 단계가 없다보니 애시당초 로그인 자체를 못하게 막아야합니다.

    로그인 아이디 단 1번이라도 틀리면 접속을 못하도록 막아버려야 할꺼같습니다.

    ESXi 서버를 운영할 경우에는 아래 항목을 찾아서 변경합니다.

    Security.AccountLockFailures
    사용자 계정을 잠그기 전 허용되는 최대 로그인 실패 횟수입니다. 0은 계정 잠금을 사용하지 않습니다.
    5
    
    Security.AccountUnlockTime
    허용되는 최대 로그인 시도 실패 횟수를 초과한 후 사용자의 계정을 잠그는 기간(초)입니다.
    900
    
    개인서버구축

    저는 숫자를 900 기본값에서 999999999초로 변경하였습니다.

    31년동안 접속못하도록 막는 수치입니다.

    개인서버구축
    개인서버구축

    해커 IP가 31년 차단 당했네요.

    개인서버구축

    우리 31년 후에 만나자!~

    안녕.

    동시에 방화벽 설정에 접속 허용 IP를 지정해버렸습니다.

    개인서버구축

    완벽하게 접속하지 못하는것을 확인하였습니다.

    혹시나 유동IP 바뀌면 안되므로 고정아이피 3개랑 유동아이피 3개를 넣었습니다.

    바뀌더라도 어느 하나는 접속 가능하겠죠 ㅎㅎ

    해결 완료!

  • letsencrypt renewal-hooks SSL 보안인증 자동갱신

    letsencrypt renewal-hooks SSL 보안인증 자동갱신

    Let’s Encrypt renewal Hooks

    크론잡을 이용하여 아래 명령어를 입력하면 Let’s Encrypt SSL 보안 인증이 자동으로 갱신됩니다.

    하지만 보통 80 포트를 사용하고 있기에 apache 서버 80포트를 사용하고 있다면 중지를 먼저 해야합니다.

    스크립트를 이용하여 미리 아파치를 종료하고 켜고 반복할수 있겠지만…

    만료일이 도달하지 않을 경우 필요 이상으로 httpd 를 재실행 할 수 있습니다.

    crontab -e
    12 1,12 * * * root certbot renew --no-self-upgrade

    이를 방지 하기 위해서 Let’s Encrypt 3개월 무료 갱신 후크를 이용한 apache 중지, 실행, 재실행을 할 수 있습니다.

    스크립트 안에는 딱히 명령어가 많지는 않고 https 를 start, stop 명령만 넣었습니다.

    개인서버구축

    후킹에는 총 3개의 폴더로 구성되어 있습니다.

    deploy 배포후에 동작하는 shell script (재시작을 보통 넣지만 저는 start 를 입력했습니다)

    systemctl start httpd.service

    post 인증명령어 동장 후 무조건 진행하는 shell script

    systemctl start httpd.service

    pre 인증 전 미리 동작하는 shell script

    systemctl stop httpd.service

    하나하나 직접 만들어도 되지만 Let’s Encrypt 폴더가 /etc/letsencrypt 로 시작한다면 아래 명령어로 일괄 다운받아 설치 할 수 있습니다. 제가 서버 추가할때마다 아래 명령어를 그대로 복사해서 붙여넣고 있습니다.

    # 만약 다른 스크립트가 있다면 아래 명령어를 절대 실행해선 안됩니다. 모두 삭제됩니다.
    
    cd /etc/letsencrypt
    rm -rf /etc/letsencrypt/renewal-hooks/
    wget https://vlog.tion.co.kr/app/renewal-hooks.tar
    tar xvf renewal-hooks.tar
    rm -rf renewal-hooks.tar
    
    ll
    
    cd /etc/letsencrypt/renewal-hooks/
    du -ha
    

    파일이 정상적으로 다운받고 압축이 잘 풀렸는지 확인까지 한눈에 파악되니 쉽게 자동 인증서 갱신이 될듯합니다.

    개인서버구축

  • ESXi 관리자 root 접속 차단 해킹막는방법

    ESXi 관리자 root 접속 차단 해킹막는방법

    사용자 이름이나 암호가 잘못되어 로그인을 완료할 수 없습니다.

    예전에 이와 관련하여 글을 작성한적 있습니다.

    ESXi 접속 시도가 많아 아래처럼 나오면서 관리자가 접속 못하는 일이 벌어집니다.

    개인서버구축

    예전에 이부분의 글을 작성하면서 사설 IP가 답이라고 생각했었죠.

    그런데 사설IP를 달기위해서는 랜카드2개와 공유기가 필요합니다.

    외부에서 VMWARE에서 네트워크 연결을 바로 할 수 없다는 점에서 상당히 불편하더군요.

    이를 보안하기 위해 글을 다시 작성하고 있는중입니다.

    ESXi ROOT 접속 차단

    ESXi root 접속을 막아버리고 모든 로그인 접속 시도를 수용하는 방식을 택하였습니다.

    root로 지속적으로 접속 실패시 root계정을 Lock 시켜버립니다.

    그리고 위에서 보셨던 [ 사용자 이름이나 암호가 잘못되어 로그인을 완료할 수 없습니다. ] 이 멘트와 함께 로그인 자체가 막혀버리게 됩니다.

    개인서버구축

    당장 접속이 되도록 풀어야하니 VM 게스트 PC를 모두 종료하고 재부팅을 한번 하시던지…

    root 접속이 안될때 timeout 시간을 0으로 바꾸고 [ Restart Management Agents ] 눌러주세요.

    (※ DCUI 모드에서 F2번 눌러 [ Troubleshooting Options ] 항목)

    원천적으로 ROOT 계정의 권한을 없애버릴경우 가장 이상적인 방법같습니다.

    ESXi root 관리자 사용안함

    1. [ 관리 -> 보안 및 사용자 -> 사용자 ] 이동해주세요.

    개인서버구축

    사용자 root 하나가 나와있다면 정상입니다.

    이곳에 이제 사용자 추가를 할겁니다.

    2. 사용자를 추가합니다.

    개인서버구축

    설명항목은 필수가 아니며 어떠한 계정인지 알기 쉽도록 적는 설명란입니다.

    개인서버구축

    새로운 ESXi 아이디가 추가 되었다면 권한을 줘야합니다.

    지금은 아무런 권한이 없어서 할 수 있는게 없습니다.

    3. 관리자 권한을 부여합니다.

    개인서버구축

    [ 호스트 -> 작업 -> 사용 권한 ] 항목을 들어가서 [ 사용자 추가 ] 항목을 클릭합니다.

    개인서버구축

    방금 생성한 계정을 선택합니다.

    관리자 항목을 선택합니다.

    Root 모든 항목을 체크합니다. (관리자 선택하면 자동으로 모두 체크됩니다)

    사용자 추가 버튼을 눌러주세요.

    개인서버구축

    추가 된 아이디가 관리자 권한을 획득한것을 확인하였습니다.

    개인서버구축

    4. 로그아웃 하고 새로 만든 계정으로 로그인합니다.

    이 과정은 root 계정을 역할을 없애서 로그인 접속할 수 없게 만들기 위함입니다.

    개인서버구축

    로그인이 정상적으로 되었는것을 확인하였습니다.

    다시 [ 호스트 -> 작업 -> 사용 권한 관리 ] 항목을 들어갑니다.

    개인서버구축

    [ 관리자 ] 항목을 [ 권한 없음 ] 항목응로 변경 합니다.

    개인서버구축

    정상적으로 바뀌었습니다.

    개인서버구축

    이제 로그아웃하여 root 로그인을 시도해봅니다.

    개인서버구축

    이 작업을 수행할 수 있는 사용 권한이 거부되었습니다.

    라고 나왔다면 정상적으로 되었습니다.

  • 티온 서버모니터링 사용방법

    티온 서버모니터링 사용방법

    개인서버구축
    티온 웹서버모니터링

    티온 서버모니터링 사용방법

    서버를 다수 운영하다보니 각 서버마다 부하, 상태를 확인하기 어렵더군요.

    그래서 관련 웹서버 모니터링 서비스를 찾아보았지만 제 맘에 드는게 없어서 직접 만들었습니다.

    우선 파이썬3 버전이 설치가 되어져있어야 합니다.

    파이썬3 설치에 관련해서는 아래 링크를 참고해주세요.

    파이썬3 버전이 설치되었다면 아래 명령어를 그대로 복사 붙여넣기 하면됩니다.

    mkdir /root/_TION
    cd /root/_TION
    wget https://vlog.tion.co.kr/python/tionServerMonitoring.tar
    tar xvf tionServerMonitoring.tar
    rm -rf tionServerMonitoring.tar
    echo "python3 /root/_TION/tionServerMonitoring/memcheck_httpd_restart.py" > /tionServerMonitoring.sh
    chmod 701 /tionServerMonitoring.sh
    
    
    (crontab -l 2>/dev/null; echo "*/1 * * * * /tionServerMonitoring.sh") | crontab
    
    /tionServerMonitoring.sh
    
    ls -a
    

    위의 명령어를 그대로 서버에 SSH 프로그램을 이용하여 복사붙여넣기를 하면 python/tionServerMonitoring.tar 파일을 다운받고 그 파일을 압축풀어서 python3 명령어로 실행을 하게됩니다.

    개인서버구축

    python3: command not found

    파이썬3를 설치했음에도 불구하고 위처럼 나타나면 심볼릭을 잡아주시기 바랍니다.

    ln -s /usr/bin/python3.8 /usr/bin/python3
    개인서버구축

    이제 python3 명령어로 잘 실행이 되는군요.

    이제 다시 [ /tionServerMonitoring.sh ] 쉘스크립트를 실행해보겠습니다.

    위에서 이미 설치를 하였기에 다시 또 설치할 필요는 없습니다.

    괜히 crontab 항목에 1분마다 서버체크하는 항목만 더 추가되니 2번이상 설치하신분들은 꼭 crontab -e 항목을 확인하셔서 중복된 체킹을 제거해주세요.

    개인서버구축
    개인서버구축

    [root@amzn2 _TION]# /tionServerMonitoring.sh
    Traceback (most recent call last):
    File “/root/_TION/tionServerMonitoring/memcheck_httpd_restart.py”, line 1, in
    import psutil
    ModuleNotFoundError: No module named ‘psutil’

    이번에는 psutil 이라는 모듈이 없다고 나올겁니다.

    pip 명령어를 이용하여 psutil, stdin모듈을 설치해주세요

    pip install psutil stdin

    만약 pip 명령어가 없다고 나올 경우

    -bash: pip: command not found

    pip를 설치해야합니다.

    아래 링크에서 pip install 설치를 우선 확인하고 설치해주세요. (이 글 본문에도 링크 아랫쪽에 넣어두긴했습니다)

    1. 파이썬 get-pip.py 파일을 다운받습니다.

    개인서버구축

    아래 명령어를 입력하여 리눅스 서버에 get-pip.py 파일을 저장합니다.

    curl https://vlog.tion.co.kr/python/get-pip.py -o get-pip.py

    2. get-pip.py 파일을 이용하여 인스톨을 시작합니다.

    개인서버구축

    python3 get-pip.py

    개인서버구축

    이제 다시 pip install psutil string 이라고 해주세요

    개인서버구축

    이제 모든 모듈을 다 설치했습니다.

    이제 다시 [ /tionServerMonitoring.sh ] 쉘스크립트를 실행해보겠습니다.

    [root@amzn2 _TION]# /tionServerMonitoring.sh
    START!!
    MEMORY TOTAL: 960.46MB
    MEMORY USED: 187.34MB
    MEMORY FREE: 380.65MB
    -------------------------------------------------------------------------------------
    MEMORY percent is 34.10%
    MEMORY limit is over 80.00%
    -------------------------------------------------------------------------------------
    DISK TOTAL: 24.99GB
    DISK USED: 2.47GB
    DISK FREE: 22.52GB
    DISK PERCENT 9.90%
    NETWORK SENT: 2.39MB
    NETWORK RECV: 92.30MB
    NETWORK Packets_SENT: 0.03MB
    NETWORK Packets_RECV: 0.10MB
    BOOT_TIME: 2023-02-02 20:44:51
    CPU CORE: 1
    CPU PERCENT: [10.0]
    -------------------------------------------------------------------------------------
    --2023-02-02 21:14:07--  http://3.34.246.177/serverChecker.php?hostname=amzn2&mem_total=960.46MB&mem_used=187.34MB&mem_free=380.65MB&percent=34.10%25&limit=80.00%25&disk_usage_total=24.99GB&disk_usage_used=2.47GB&disk_usage_free=22.52GB&disk_usage_percent=9.90%25&net_io_counters_bytes_sent=2.39MB&net_io_counters_bytes_recv=92.30MB&net_io_counters_packets_sent=0.03MB&net_io_counters_packets_recv=0.10MB&boot_time=2023-02-02%2020:44:51&cpu_count=1&cpu_percent=[10.0]
    Connecting to 3.34.246.177:80... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 2 [text/html]
    Saving to: ‘/root/_TION/_logs_tionServerMonitor/serverChecker_php_2023-02-02_21:14:06’
    
    100%[===========================================================================================================================================>] 2           --.-K/s   in 0s      
    
    2023-02-02 21:14:07 (135 KB/s) - ‘/root/_TION/_logs_tionServerMonitor/serverChecker_php_2023-02-02_21:14:06’ saved [2/2]
    
    -------------------------------------------------------------------------------------
    INFO: /root/_TION/_logs_tionServerMonitor__ each 3600 minutes
    Checking file to remove in Forder [ /root/_TION/_logs_tionServerMonitor ]
    -------------------------------------------------------------------------------------
    MEMORY percent is 34.10%
    MEMORY limit is over 80.00%
    -------------------------------------------------------------------------------------
                  total        used        free      shared  buff/cache   available
    Mem:           960M        197M        370M        972K        392M        623M
    Swap:            0B          0B          0B
    -------------------------------------------------------------------------------------
    Filesystem      Size  Used Avail Use% Mounted on
    devtmpfs        464M     0  464M   0% /dev
    tmpfs           481M     0  481M   0% /dev/shm
    tmpfs           481M  704K  480M   1% /run
    tmpfs           481M     0  481M   0% /sys/fs/cgroup
    /dev/sda1        25G  2.5G   23G  10% /
    tmpfs            97M     0   97M   0% /run/user/0
    -------------------------------------------------------------------------------------
    [root@amzn2 _TION]# 
    
    개인서버구축

    위의 결과물이 나왔다면 정상적으로 동작하는것입니다.

    이제 매 1분마다 서버가 잘 동작하는지 확인을 합니다.

    개인서버구축

    로그 항목이 1분마다 만들어지고 있다면 정상등록된것입니다.

    개인서버구축

    이제 서버 정보를 findmyserverip.com 으로 보내어 서버 IP와 서버사용량을 실시간 단위로 확인 할 수 있습니다.

    현재는 무료로 사용할수 있으나 사용자가 많이 몰리게되면 1분체크를 5분으로 늘릴겁니다.

    혹시라도 1분 유지를 원하시는 분들은 따로 유료서버를 도입할 계획이니 플랜이 나오면 구입하셔서 사용하시면 됩니다. 지금은 그래프도 만들어야하고 결과 페이지를 만들어야하므로 무료로 사용하실 수 있습니다.

    앞으로만들어질 항목들은 이렇습니다.

    티온 서버모니터링 서비스

    1. 분당 기록되는 정보를 바탕으로 그래프 도표화

    2. 위험수치 (트래픽, 메모리, 디스크 용량 등) 도달시 SMS 문자 발송 서비스

    지금부터 사용하시는 분들에게는 초기맴버로 유료전환시 50% 할인 혜택을 제공해드리겠습니다.

    감사합니다.

  • VMWARE ESXi does not support the multple monitors feature in shared or remote virtual machines

    VMWARE ESXi does not support the multple monitors feature in shared or remote virtual machines

    VMWARE ESXi does not support the multple monitors feature in shared or remote virtual machines

    개인서버구축

    Cannot Use Multiple Monitors

    This virtual machine cannot use multiple monitors for the following reasons:

    • VMware ESXi does not support the multiple monitors feature in shared or remote virtual machines.
    • Please check the user manual for help on fixing these issues.

    Originally, VMware allows you to create dual monitors by selecting the Cycle Multiple Monitors item in full mode.

    원래 VMware 에서는 전체모드 상태에서 Cycle Multiple Monitors 항목을 선택하여 듀얼 모니터를 만들 수 있습니다.

    However, the ESXi model does not support this part.

    하지만 ESXi 모델에서는 이 부분을 지원하지 않습니다.

    개인서버구축

    When operating on a local PC with a simple VMware workstation-like model, multiple monitors can be used with just the following two points.

    단순하게 VMware workstation 같은 모델로 로컬 PC에서 동작할 경우에는 아래 2가지 사항만 맞추면 듀얼모니터를 사용할 수 있습니다.

    로컬 VMware 듀얼모니터 만들기

    1. 세팅에서 모니터를 2개로 변경합니다.

    이때 그래픽카드 메모리를 너무 낮은 4MB 처럼 만들지 마시고 128MB 이상의 비디오 메모리를 지정해주세요.

    여유가 있다면 1기가 정도의 메모리를 세팅해도 좋습니다.

    개인서버구축

    2. vmware tools 를 설치하세요.

    만약 vmware tools 의 버전이 다르다면 Reinstall VMware Tools… 항목을 클릭하여 새로 설치해야합니다.

    설치가 안될경우 듀얼모니터는 동작하지 않습니다.

    개인서버구축

    결론

    VMware workstation 버전으로 로컬 VM에서는 듀얼모니터가 동작하지만, ESXi 원격 서버 VM에서는 자체적으로 지원하지 않아 듀얼 모니터를 사용할 수 없습니다. 사용하려면 로컬로 다운로드 받아서 사용하고 다시 업로드 하여 서버에 등록해서 사용해야합니다.

    ESXi 6.x, ESXi 7.x 모델 모두 듀얼모니터 사용불가능

    현재 사용하고 있는 버전은 ESXi 7.0.3

    개인서버구축

    ESXi 7.0.3 (2023년기준)에서도 여전히 듀얼모니터는 사용불가능합니다.

    감사합니다.

  • 리눅스 서버 느림 부하 확인 조치방법

    리눅스 서버 느림 부하 확인 조치방법

    요즘 제가 운영하는 시스템이 손볼곳이 많아서 거의 두달 가까이 다른업무를 할수 없고 이 업무에 집중하고 있습니다. 그중에서 리눅스 서버 느림 현상을 만드는 부하의 원인에 대해서 조사하는중 특정 IP로 지속적인 서버 공격이 있었습니다.

    route 명령어를 이용하여 IP를 하나 막았는데…

    route add -host 180.230.13.57 reject

    다시 다른 아이피로 변경해서 아래처럼 또 공격을 하고 있습니다.

    이번에는 IP를 45.35182.179 로 변경했군요.

    이게 악의적으로 공격한다는것을 어떻게 알수 있냐하면… 기존에 차단한 IP를 차단 풀었더니 그 아이피로는 공격이 안들어오고 있기때문입니다. 즉 누군가가 일부로 리눅스맨 워드프레스 블로그로 공격을 하고 있다는 거죠.

    개인서버구축

    이런경우라면 수동으로 IP를 차단해봐야 또 그사람도 아이피를 VPN등 이용해서 바꾸고 다시 또 공격할겁니다.

    악의적으로 공격하는것이니 IP추적하여 VPN 업체 알아내고 그 VPN업체를 사이버수사대에 신고하면되지만…

    그런것조차 일이되고 제가 해야할 업무는 태산이라보니 그냥 무시하기로 했습니다.

    그냥 단순히 프로그램 하나 파이썬으로 개발해서 자동으로 IP를 차단하도록 했습니다.

    45.35.182.179 - - [30/Jan/2023:18:27:19 +0900] "\xbfI\xae\xa4E7\x97\x8a\xb9\x0e\xa7\xe2\xca\x8c\x01UH\xf5\x07\xb8\xd0\xa6\xe1\x94\x89\xe0z\xc1c\xe7\x99\xc8\xc7\x84$\x9f\x1d\\-y=\xa8\xd6P\xf9\b'\t\x95\x8b\\R\x0c\x1a\x14a\x88\xfc\xaf\x1c\xeb{\xa0a1\x9a\xae~(\xa8\xc8f@\xe5K9\xe0\x93\x1d%\xe7\x14\xb2\xb0\x94\x1b\b\xad\xc1\xd7tZ{\xd4\xaf,\xcf\xfa\x7f\xb9\xe9\xb2j\x8e\xb94\xbe^\x9fK\x89=\x1e\x16\xf1C\x13/\x87\xf6\x1b[\x8b\xa6\x0f\xe1\x82\x16\xca+\x17?\xfe|\x9aTp\xcc\x9f^\xfd\x18\x1a\xadA\xda{\x801b\x1cm-\x93\xa9\xf5\xe0\rz\xed?PN\x7f7\x90\xda\xc2\x18[9\xe5\x8c\xdc\xd5}e\xf1\x03\xfaKp'\r\xa5\x86\xc4\x9a\xd6\xaa\vjP\xa2\xc3#>\xbe\xdd\xac\x8e\xa0\x03\xd3\x98\xc3" 400 226 "-" "-"
    

    내용을 보면 문자를 인코딩해서 딱히 정확히 뭘 하려는건지는 알듯합니다.

    일단 IP를 바꿔서 재차 공격을 했다는것만 보면 악의적으로 서버부하를 일으켜서 트래픽을 발생시키기 위함입니다.

    일단 금전적인 돈으로 지출을 유도한것으로 보이고요. 서버 해킹이나 뭐 이런건 관심이 없는듯합니다.

    인코딩하면 제가 그 인코딩이 뭘까? 라고 파악할꺼라 생각하겠지만 문자열을 분석해보면 일치되는건 전혀 없고 단순 무의미한 글자를 인코딩해서 저렇게 날리는거보면 서버 부하를 일으켜서 서버 느리게 하고 트래픽으로 서버지출비용을 늘리기 위한 노력인것으로 보입니다.

    게다가 악의적으로 아이피를 바꿔가면서 공격한다는것은 그냥 제가 운영하는 이 워드프레스가 맘에 안드는것으로 보입니다.

    그거 말고는 답이 없습니다.

    일단 파이썬으로 자동으로 아이피 차단하도록 설정해두었으니 모든 서버에 적용시켜서 앞으로는 신경을 안써도 됩니다. 혹시라도 저처럼 이런 악의적인 서버 부하로 서버가 느림현상에 시달리고 계신다면 저에게 요청해주세요.

    제가 만든 자동화 파이썬 툴을 이용해서 자동으로 라우트 IP 차단을 하시기 바랍니다.

    더군다나 서로 공격 IP를 공유해서 미리 공격 IP를 차단시킬 수 있으니 함께 사용하면 더 좋을듯합니다.

    사용하실분들은은 운영하시는 웹서버 블로그에 이 글을 공유하셔서 더 많은 분들이 참여할 수 있도록 해주세요.

    감사합니다.

  • ESXi NAT NETWORK 만들기 IP 동일하게 같은 네트워크 만들기

    ESXi NAT NETWORK 만들기 IP 동일하게 같은 네트워크 만들기

    ESXi NAT NETWORK 만들기 IP 동일하게 같은 네트워크 만들기

    안녕하세요 리눅스맨 워드프레스 블로그에 오신것을 환영합니다.

    요즘 리눅스밍 툴도 개발하고 있으니 많은 검색과 관심 부탁드립니다.

    가끔 이 부분 NAT Network가 왜 필요하냐고 묻는분들이 계실듯합니다.

    공유기가 있으면 딱히 NAT 네트워크를 만들 필요가 없죠. 공유기에서 자동으로 만들어주기 때문이죠.

    공유기가 없지만 NAT 환경을 만들고 싶을때 사용합니다.

    사실 그 보다 더 중요한 부분은 특정 VM끼리 IP 를 동일하게 맞추기 위함입니다.

    가령 예를들어 블로그 운영을 할 경우 A라는 VM과 B라는 VM의 아이피를 동일하게 만들어서 A VM에서는 이웃관리를 자동화로 운영하고 B VM에서는 원격으로 접속하여 블로그관리대행을 할 경우에 바로 이러한 경우에 2개의 VM을 NAT으로 연결해야합니다.

    pfsense 툴 없이도 NAT 환경을 만들 수 있습니다.

    개인서버구축

    하지만 ESXi 에서는 NAT이 기본적으로 제공되지 않아 VMWRE처럼 방식대로 할 수 없습니다.

    VMWARE Workstation 버전에서는 아래 링크를 통해 2개이상의 VM을 같은 IP 대역대로 만들어 낼 수 있습니다.

    물론 NAT방식과 조금 다르지만 내가 원하는 VM끼리 NAT 방식으로 운영한다는 점에서는 IP 1개로 다수 VM을 여러개 운영할수 있죠. 호스트 IP를 공유하는건 아니고요. VM이 만들어낸 특정 IP 1개를 바탕으로 여러개 VM이 사용하는 방식입니다.

    이 방법식으로 여러 그룹의 NAT 운영을 할 수 있게됩니다.

    ESXi NAT NETWORK Setting

    1. 네트워킹 [ 가상 스위치 ] [ 포트 그룹 ] 항목에서 순서대로 각각 추가를 합니다.

    개인서버구축
    개인서버구축

    이 작업은 어렵지 않습니다.

    단순하게 포트 그룹 추가 버튼을 눌러서 기본으로 이름만 잡아주고 만들면됩니다.

    이름은 기억하기 편하도록 VM IP를 공유할 게스트의 이름으로 시작해도 됩니다.

    제 경우에는 네트워크 업데이트 이름을 [ NAT_TVM10_NOUPDATE ] 이렇게 만들었습니다.

    NAT을 사용할건데 TVM10_NOUPDATE 라는 VM 게스트의 이름을 활용한것이죠.

    개인서버구축

    매우중요

    ※ 이때 가상스위치는 위에서 새로 만든 NAT_TVM10_NOUPDATE 스위치로 선택해야합니다.

    만약 스가상스위치를 선택하지 않게된다면 이상하게 꼬이게되어 다른 네트워드크를 선택하더라도 NAT_TVM10_NOUPDATE 로 연결될 수 있습니다.

    2. 호스트로 지정할 VM의 설정항목에서 네트워크 어댑터 [ NAT_TVM10_NOUPDATE ] 하나 더 추가합니다.

    개인서버구축

    VM_NAT_TVM10_NOUPDATE 네트워크 어댑터를 이용하여 통신을 하기 위해 추가하는것입니다.

    즉 이 네트워크 어댑터로 게스트VM쪽으로 인터넷이 되도록 IP를 송출한다는 이야기입니다.

    3. 게스트로 지정할 VM의 설정항목에서 네트워크 어댑터를 새로 만든 NAT_TVM10_NOUPDATE 네트워크로 변경합니다.

    개인서버구축

    게스트로 지정되는 VM에서는 딱히 IP를 할당받을 필요가 없다면 기존 네트워크 어댑터를 위처럼 변경하면됩니다.

    아이피를 유지하면서 NAT을 연결하시려면 역시 네트워크 어댑터를 추가해서 동일하게 세팅하면됩니다.

    4. 호스트 VM에서 새로 추가한 네트워크 어댑터로 인터넷이 되도록 설정합니다.

    개인서버구축

    윈도우10 설정 – 이더넷 항목에서 [ 어댑터 옵션 변경 ] 항목에 들어갑니다.

    새로 만들어진 Ethernet1 이라는 네트워크가 보일 겁니다.

    현재는 이곳에 자동으로 IP가 할당된 상태이지만 속성에 들어가서 설정을 변경해야합니다.

    쿠팡 버튼은 리눅스맨 서버 호스팅 운영비라 생각해주시고 너그럽게 이해해주세요.

    손해보시는건 없고 그저 한번 쿠팡창 열릴뿐입니다.

    바로 닫고 아래 내용보시면됩니다.

    IP 설정을 꼭 제가 알려드린대로 바꾸셔야 합니다.

    아래 내용보시고 그대로 따라하시면 됩니다.

    [coupang]

    개인서버구축

    아래처럼 설정을 하지 않게된다면 호스트 VM에서는 총 2개의 아이피를 할당 받게 됩니다.

    내부 통신망을 만들어야하므로 네트워킹 -> 인터넷 프로토콜 버전 4(TCP/IPv4) 항목의 IP를 아래처럼 변경해주세요.

    개인서버구축

    [coupang_end]

    개인서버구축
    IP : 192.168.137.10
    SubMask : 255.255.255.0
    Gateway : 192.168.137.1
    
    DNS1 : 168.126.63.1
    DNS1 : 168.126.63.2

    그리고 아래 항목도 매우 중요하니 아래 항목을 꼭 설정해야합니다.

    원래 사용하던 네트워크 Ethenet 클릭 -> 속성 -> 공유 -> 다른 네트워크 사용자가 이 컴퓨터의 인터넷 연결을 통해 연결할 수 있도록 허용(N) 체크해야합니다.

    개인서버구축

    두개의 네트워크 어댑터 설정이 다르니 꼭 주의하셔야 합니다.

    이제 2개의 VM 아니 3개의 VM에 대해서 NAT이 제대로 이루어졌는지 확인해보겠습니다.

    일단 호스트 VM [ TVM10_NOUPDATE ] 의 IP를 확인해보니 211.xxx.xx.30 으로 나타납니다.

    개인서버구축

    게스트로 지정한 TVM10_ADOBE VM에 대해서 확인해보니 역시 211.xxx.xx.30 아이피로 동일하게 할당받았습니다.

    개인서버구축

    게스트로 지정한 TVM10_PROGRAMMING VM에 대해서 확인해보니 역시 211.xxx.xx.30 아이피로 동일하게 할당되었네요. 이로소 총 3대의 VM이 동일한 IP영역을 갖는 NAT 환경이 구성되었습니다.

    개인서버구축

    이 쉬운 방법을 외국에서는 이상한 프로그램 사용해서 만들어야 한다고 알려주더군요.

    조금 아쉬움도 남고해서 제가 알고 있는 방법을 여러분들에게 알려드리고자 리눅스맨 워드프레스에 남겼습니다.

    ESXi 뿐만 아니라 Xenserver에서도 가능하며 VMWARE 등 각종 가상화 OS에서 모두 사용할 수 있는 방법입니다.

    리눅스에서도 NAT 방식 만들려면 이러한 방법으로 윈도우7이나 윈도우10 호스트 만들고 보내는 네트워크 어댑터를 이용하면 됩니다.

    NAT 방식으로 할 수 있는 사업모델이 많습니다.

    클라이언트와 IP를 동일하게 맞춰야 하는 경우에도 이와같은 방식을 이용하여 호스트 PC에 VPN을 생성하여 게스트 PC에서 호스트PC로 접근하도록 만들수도 있습니다. 방법은 다양하고 많기 때문에 굳이 돈내가며 프로그램 사용해가며 할 필요는 없을겁니다.

    ESXi 와 Xenserver 그리고 VMWARE 만 존재하면 원격시스템과 무인화 시스템을 모두 만들어 낼 수 있습니다.

    감사합니다.

  • [ Solved ] file /bin/yum”, line 30 except keyboardinterrupt, e 파이썬3.x 설치후 yum 에러

    [ Solved ] file /bin/yum”, line 30 except keyboardinterrupt, e 파이썬3.x 설치후 yum 에러

    [root@~]# yum install java
    File "/usr/bin/yum", line 30
    except KeyboardInterrupt, e:
    ^
    SyntaxError: invalid syntax
    [root@~]# yum install php
    File "/usr/bin/yum", line 30
    except KeyboardInterrupt, e:
    ^
    SyntaxError: invalid syntax
    [root@~]# yum install php5-dg
    File "/usr/bin/yum", line 30
    except KeyboardInterrupt, e:
    ^
    SyntaxError: invalid syntax
    [root@~]#
    개인서버구축

    yum update

    yum install 패키지명

    파이썬 3.8버전 섨치 후 yum 업데이트 또는 패키지를 인스톨 하려고 할때 아래처럼 에러가 발생하였습니다.

    yum update
      File "/usr/bin/yum", line 30
        except KeyboardInterrupt, e:
                                ^
    SyntaxError: invalid syntax
    

    원인은 yum 동작시 3.x 버전에서 안정화되지 않은상태라 2.x 버전대로 실행을 해야합니다.

    위의 에러는 /usr/bin/python 폴더 혹은 심볼릭으로 연결된 파이썬의 버전이 2.x버전이 아닌 3.x 버전으로 되어져있을 때 위와같은 에러가 발생하며 yum 실행이 되지 않습니다.

    위의 경우에는 여러가지 방법으로 해결할 수있습니다.

    그 방법에 대해서 제가 직접 해보고 가장 좋은 방법이 무엇인지 결론으로 말씀드리도록 하겠습니다.

    파이썬 3.x 설치 후 yum 에러 날 경우 해결방법

    1. yum 실행명령줄에 파이썬 심볼릭링크를 강제로 2.x버전으로 맞춥니다.

    이 방법은 개인적으로 제일 무난한 방법으로 보입니다.

    제가 사용하는 방법은 2번과3번 방식입니다.

    ls -l /usr/bin/python*

    파이썬의 주소를 확인한 다음 아래 명령어로 파이썬의 2.x 버전대 주소를 강제로 변경합니다.

    개인서버구축

    제가 설치한 파이썬 버전은 2.7버전과 3.8버전 두가지입니다.

    vi /usr/bin/yum

    개인서버구축

    #! /usr/bin/python 으로 되어진 이 부분을

    #! /usr/bin/python2.7 이렇게 변경하고 한번더

    아래의 항목을 똑같이 python2.x 버전대 주소로 변경해줍니다.

    vi /usr/libexec/urlgrabber-ext-down

    개인서버구축

    그리고 yum update, yum install 명령어를 사용하면됩니다.

    2. update-alternatives 이용하여 파이썬 버전관리합니다.

    이 부분은 여러가지 버전의 모듈을 설치해놓고 2.x, 3.x, 4.x 등등 필요에 따라 2.x버전으로 돌려서 yum 업데이트, 인스톨을 하고 불필요시에는 파이썬 최신버전 혹은 원하는 버전으로 사용할 수 있는 방법입니다.

    update-alternatives --config python
    update-alternatives --config python
    
    There are 2 programs which provide 'python'.
    
      Selection    Command
    -----------------------------------------------
     + 1           /usr/bin/python2.7
    *  2           /usr/bin/python3.8
    
    Enter to keep the current selection[+], or type selection number: 1

    이렇게 2개의 버전을 등록해놓고 평소에는 3.8 버전으로 사용하다가 yum update, yum install 할 당시에만 살짝 2.7버전으로 돌리는 방식입니다.

    우선 등록부터 해야합니다.

    update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1
    update-alternatives --install /usr/bin/python python /usr/bin/python3.8 2

    등록된 리수트를 확인해봅니다.

    update-alternatives --list
    libnssckbi.so.x86_64	auto	/usr/lib64/pkcs11/p11-kit-trust.so
    ld	auto	/usr/bin/ld.bfd
    mta	auto	/usr/sbin/sendmail.postfix
    cifs-idmap-plugin	auto	/usr/lib64/cifs-utils/cifs_idmap_sss.so
    iptables	auto	/usr/sbin/iptables-legacy
    java	auto	/usr/lib/jvm/java-17-amazon-corretto.x86_64/bin/java
    jre_17	auto	/usr/lib/jvm/java-17-amazon-corretto.x86_64/jre
    python	auto	/usr/bin/python3.8
    

    방금 추가한 python 항목에 3.8이 자동으로 설정되어져있네요.

    파이썬 2.x 변경할때에는 아래명령어를 사용하면됩니다.

    update-alternatives --config python

    그러면 python으로 등록된 2개의 링크가 보입니다.

    이중에서 2.7버전을 선택하겠습니다.

    
    There are 2 programs which provide 'python'.
    
      Selection    Command
    -----------------------------------------------
       1           /usr/bin/python2.7
    *+ 2           /usr/bin/python3.8
    
    Enter to keep the current selection[+], or type selection number: 1

    which python 명령어로 파이썬 경로를 확인해보면 그대로 동일한 /usr/bin/python 을 가리키지만 2.7 버전으로 변경됩니다.

    which python
    /usr/bin/python
    
    개인서버구축

    그리고 yum update 명령어로 확인해보니 정상적으로 되고 있습니다.

    개인서버구축

    다시 python3.8 버전으로 바꾸었더니 yum update 명령어가 동작하지 않네요 ㅎㅎ

    개인서버구축

    일단 yum update, install 할때만 1번 2.7으로동작!!

    3. 파이썬3.x 심볼릭을 python3으로 연결해줍니다.

    사실 3번째 지금 알려드리는 이 방법만 사용해도 무방합니다.

    대신 python 이라는 명령어로 3.x 버전을 사용못할 뿐이지 python3 이렇게 심볼릭 잡아서 사용한다면 아무 문제없이 사용할 수 있습니다

    yum update, install 명령어는 python 심볼릭이 연결되어져있으니

    3.x 버전은 python3 네이밍에 심볼릭을 연결해서 사용하는거죠.

    ln -s /usr/bin/python3.8 /usr/bin/python3

    이렇게 심볼릭을 만들어서 파이썬 3.x 버전 사용을 python3 hello.py 이런식으로 사용하면 됩니다.


    yum 명령어가 python 버전 차이로 인해서 오류가 생길수 있어 안정적인 버전인 2.x 버전대로 동작하는듯합니다.

    이로인해서 파이썬 버전을 버전별로 관리하거나 다른 네이밍의 심볼릭을 이용하여 사용할수 있는데요

    저는 2번 항목과 3번항목을 같이 사용하고 있습니다.

    하지만 계속 사용해보니 그냥 3번 항목만 따라 하더라도 큰 문제가 없다는것을 알게되었습니다.

    결론은 3번째 방법으로 python3 심볼릭 만들어서사용하자!

    파이썬 4.x 버전나오면 python4 심볼릭 만들어 쓰면되겠네요.