미니의 블로그

  • 아이폰 핫스팟 제한 우회하기

    요즘 따라 데이터를 많이 사용해 요금제를 무제한 요금제로 바꿨다.

    그런데 이 무제한이 완전한 무제한이라고 써져 있는데 완전 무제한이 아니다.

    테더링이나 핫스팟을 사용하면 사용량을 측정해서 공유데이터에 반영이 되고 이 공유 데이터를 다 쓰면 핫스팟을 사용할 수가 없다.

    그래서 핫스팟 제한을 우회하려고 찾아봤으나 웬만한 것들은 다 막혀 있다.

    그래서 인터넷을 더 찾아보다 보니까 아이폰에 프록시 서버를 만들어서 아이폰에서 접속하는 것처럼 만들면 핫스팟 제한을 우회할 수 있다는 것을 알게 되었다.

    nneonneo/iOS-SOCKS-Server: iOS HTTP/SOCKS proxy server for fake-tethering

    누군가가 이렇게 아이폰에서 프록시 서버를 만들 수 있게 해 두었다.

    나는 이걸 쓰기로 했다.

    문제는 이것을 쓰려면 파이썬을 실행할 수 있는 앱이 필요한데 이 앱이 유료다.

    Pythonista 3 on the App Store

    14,000원이나 한다마는 값어치는 있다고 생각했다.

    우선 저 GitHub 페이지에서 Code 를 눌러 Download ZIP 을 해서 소스코드를 받는다.

    그러면 파일앱의 다운로드에 가면 ZIP 파일이 있는데 이것을 압축을 풀어준다.

    그리고 Pythonista 3 을 다운로드 받으면 파일에서 iCloud 에 Pythonista 3 폴더가 생기는데 여기로 압축을 푼 파일을 넣어준다.

    이제 핫스팟을 켠 다음 Pythonista 3 를 실행해서 socks5.py 를 실행해 주면 된다.

    이제 맥에서 연결을 해 보겠다.

    우선 IP를 수동으로 설정해 줘야 하니 나중에 편하게 바꿀 수 있게 위치를 추가해 줄 것이다.

    설정 > 네트워크 > … > 위치 > 위치 편집 으로 들어간다.

    + 버튼을 눌러 위치를 새로 생성해 준다 나는 iPhone Hotspot 으로 설정했다.

    이제 Wi-Fi 로 가서 아이폰 핫스팟을 연결한다.

    세부사항 > TCP/IP 로 들어간다.

    IPv4 구성을 수동으로 바꾸고 IP 주소를 172.20.10.X 서브넷 마스크를 255.255.255.0 으로 설정한다. 여기서 X는 2-254 사이의 숫자를 입력하면 된다.+20250420

    그다음 프록시로 가서 SOCKS 프록시를 켜주고 아이폰에 나오는 SOCKS Address 를 입력해 주면 된다 기본값은 서버 172.20.10.1 에 포트 9876 일것이다.

    이렇게 설정하면 끝이다.

    맥에서 웹사이트나 유튜브 등을 보면 아이폰의 프록시 서버를 통해서 통신해서 공유데이터 사용량에 집계가 안된다.

    허나 단점이 있는게.

    • 앱을 계속 실행하고 있어야 한다. 다행히도 실행하는 동안 화면이 꺼지지는 않는다.
    • 모든 트래픽이 우회 되는 것은 아니다. 실험해 보니 디스코드는 안된다.+20250408

    그래도 이 정도면 쓸 만하다고 생각한다.

    참고로 단축어에 등록을 해서 탭하면 핫스팟이랑 프록시 서버가 자동으로 켜지게끔 해 둘 수 있다.

    필요한 사람은 아래에 단축어 링크를 올렸으니 참고 바란다.

    핫스팟 단축어

    === 2025-03-07 추가내용 ===

    아이폰을 유선으로 테더링 하면 IP 주소를 수동으로 설정할 수가 없는데 터미널로 설정할 수 있다.

    sudo networksetup -setmanual "iPhone USB" 172.20.10.X 255.255.255.0

    X 값에 2-254 사이의 원하는 숫자를 넣어준다 (다른 기기와 겹치면 안된다)+20250420

    sudo networksetup -setsocksfirewallproxy "iPhone USB" 172.20.10.1 9876
    sudo networksetup -setautoproxyurl "iPhone USB" http://172.20.10.1:8088/wpad.dat

    첫번째 줄은 SOCKS5 프록시를 설정하는것이고

    두번째 줄은 자동 프록시 구정을 설정하는 것이다.
    이 값을 설정을 안하면 파이어폭스에서 인터넷이 안 되길래 설정했다.

    sudo networksetup -setproxybypassdomains "iPhone USB" localhost,.local,127.0.0.1,192.168.0.0/16,172.16.0.0/12,10.0.0.0/8

    위 설정은 프록시 설정값을 우회(bypass)할 호스트를 설정한 것이다.

    === 2025-04-08 추가내용 ===

    디스코드 같은 트래픽도 우회 시킬 수 있는 방법이 있다.

    NordVPN 같은 VPN 서비스를 사용하면 VPN 을 수동으로 연결할 수 있는데

    OpenVPN Connect 같은 앱을 깔아서 수동으로 VPN 구성을 추가해 준 다음 프록시를 아이폰의 프록시서버로 설정해 주면 된다.

    그러면 대부분의 트래픽은 프록시 서버로 통신하고 나머지 트래픽도 프록시 서버를 통해 VPN으로 통신한다.

    === 2025-04-20 추가내용 ===

    아이폰 핫스팟의 서브넷 마스크는 255.255.255.240 이다.

    따라서 네트워크 설정할 때 서브넷 마스크를 255.255.255.240 (네트워크 식별자 길이: 28)으로 설정하고 IP주소는 172.20.10.2 – 172.20.10.14 의 값을 입력해야 한다.

    이 포스트는 SKT + 아이폰15 기준으로 작성되었다. 다른 통신사는 안되는 것 같다고 하는데. 나중에 지인 폰으로 테스트 해 보고 내용을 추가해 보겠다.

  • Docker Swarm 써 보기

    요즘 Kubernetes를 많이 들어본다

    Kubernetes란 Docker 같은 컨테이너를 종합적으로 관리해 주는 것인데 이게 요긴하게 쓰인다고 한다.

    근데 Kubernetes는 너무 어렵다.

    그래서 Docker Compose를 쓰던 나는 이것에 익숙한 Docker Swarm이란걸 써 보기로 했다.

    우선 3개의 가상머신에 우분투 서버를 설치해 줬다.

    2개는 서버 컴퓨터에 1개는 시놀로지에 깔았다.

    우선 Docker Swarm이 사용할 공유 스토리지를 만들어 줘야 한다.

    Ceph 가 그 중에 하나인데 우분투에서 지원하며 설정하기 편한 microceph를 사용해 보겠다.

    우선 각각의 VM에 microceph를 설치해 준다

    sudo snap install microceph

    그 다음 마스터가 될 컴퓨터에 클러스터를 만들어 준다.

    sudo microceph cluster bootstrap

    그 다음에 새로운 노드를 추가할 준비를 한다.

    sudo microceph cluster add cm-server-2

    cm-server-2 자리에 원하는 이름으로 넣어주면 된다.

    그러면 토큰 값이 나오는데 그 토큰 값을 가지고 다음 명령어를 추가할 컴퓨터에서 실행한다.

    sudo microceph cluster join <토큰값>

    그 다음에 각각의 컴퓨터에 저장소로 사용할 빈 공간이 필요하다. 이 빈공간을 ceph 스토리지에 추가해 준다.

    나는 우분투 설치할 때 15기가 짜리 볼륨을 만들어 두었다. 그걸 사용하겠다.

    sudo microceph disk add /dev/mapper/ubuntu--vg-data--lv --wipe

    이제 모든 노드가 추가 되었는지 확인한다.

    sudo microceph status

    위 명령어를 실행했을 때 추가한 노드가 다 생기면 정상이고

    sudo ceph status

    위 명령어를 실행했을 때 HEALTH_OK가 뜨면 정상이다.

    이제 만든 이 스토리지에 풀을 만들고 마운트를 해 줄것이다.

    우선 메인 컴퓨터에 와서 풀 부터 만들어 준다.

    sudo ceph osd pool create cephfs_meta
    sudo ceph osd pool create cephfs_data

    이제 CepfFS 공유폴더를 만들어 준다.

    sudo ceph fs new <공유폴더이름> cephfs_meta cephfs_data
    sudo ceph osd pool set cephfs_data bulk true

    아래 명령어를 입력했을때 추가한 공유폴더가 보여야 한다.

    sudo ceph fs ls

    이제 만든 공유폴더를 마운트 해 줄것이다.

    각각의 컴퓨터에서 설정해 주어야 한다.

    우선 ceph-common 패키지를 설치해 줄것이다

    sudo apt install ceph-common

    그다음에 ceph-common과 snap의 ceph를 연결해 줄것이다.

    sudo ln -s /var/snap/microceph/current/conf/ceph.keyring /etc/ceph/ceph.keyring
    sudo ln -s /var/snap/microceph/current/conf/ceph.conf /etc/ceph/ceph.conf

    이제 마운트할 폴더를 만들고 마운트 해 주면 된다.

    sudo mkdir /mnt/data
    sudo mount -t ceph :/ /mnt/data/ -o name=admin,fs=<공유폴더이름>

    이제 임시로 파일을 만들어 주면 모든 컴퓨터에 파일이 똑같이 생기는 걸 볼 수 있다.

    sudo dd if=/dev/zero of=/mnt/data/random.img count=1 bs=50M

    이제 자동 마운트를 설정해 줄 것이다.

    보통은 /etc/fstab 파일을 수정하는데 이러면 종종 오류가 발생하므로 microceph가 실행된 후에 마운트하도록 서비스로 만들어 줄 것이다.

    다음 명령어를 써서 서비스 파일을 만들어준다.

    sudo nano /etc/systemd/system/mount-data.service

    파일 안에 다음 내용을 넣어주고 저장한다.

    [Unit]
    Description=Mount CephFS after MicroCeph is loaded
    After=snap.microceph.daemon.service network-online.target
    Requires=snap.microceph.daemon.service
    
    [Service]
    Type=oneshot
    RemainAfterExit=yes
    ExecStart=/bin/mount -t ceph :/ /mnt/data -o name=admin,fs=<공유폴더이름>
    ExecStop=/bin/umount /mnt/data
    
    [Install]
    WantedBy=multi-user.target

    그다음 이 서비스를 시작시에 실행하도록 한다.

    sudo systemctl enable mount-data.service

    이제 공유 스토리지는 다 만들었으며 이제 본격적으로 Docker Swarm을 설정할 것이다.

    우선 모든 컴퓨터에 docker 부터 설치해 준다.

    sudo apt-get update
    sudo apt-get install ca-certificates curl
    sudo install -m 0755 -d /etc/apt/keyrings
    sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
    sudo chmod a+r /etc/apt/keyrings/docker.asc
    
    echo \
      "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
      $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
      sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    sudo apt-get update
    sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
    sudo usermod -a -G docker $USER

    그 다음에 메인 컴퓨터에서 Swarm을 활성화 해 준다.

    docker swarm init

    이렇게 하면 노드를 추가할 수 있는 토큰이 나오지만 나는 한쪽이 죽어도 살릴 수 있는 매니저 노드를 추가할 것이다.

    다음 명령어를 사용해 토큰을 발급해 준다.

    docker swarm join-token manager

    이제 여기서 나온 명령어(토큰값)를 가지고 나머지 컴퓨터에 실행해 준다.

    docker swarm join --token <토큰값>

    이러면 Docker Swarm의 설정은 끝이 났고 이제 관리하게 편하게 Portainer를 설치해 줄 것이다.

    다음 명령어를 실행해 Portainer 설정을 다운 받는다.

    curl -L https://downloads.portainer.io/ce-lts/portainer-agent-stack.yml -o portainer-agent-stack.yml

    나는 Dokcer 볼륨을 안 쓰고 아까 만든 공유 스토리지를 쓸 것이기에 파일을 수정해 줄 것이다.

    version: '3.2'
    
    services:
      agent:
        image: portainer/agent:lts
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
          - /var/lib/docker/volumes:/var/lib/docker/volumes
        networks:
          - agent_network
        deploy:
          mode: global
          placement:
            constraints: [node.platform.os == linux]
    
      portainer:
        image: portainer/portainer-ce:lts
        command: -H tcp://tasks.agent:9001 --tlsskipverify
        ports:
          - "9443:9443"
          - "9000:9000"
          - "8000:8000"
        volumes:
          - /mnt/data/portainer/data:/data
        networks:
          - agent_network
        deploy:
          mode: replicated
          replicas: 1
          placement:
            constraints: [node.role == manager]
    
    networks:
      agent_network:
        driver: overlay
        attachable: true

    Portainer 볼륨을 없애고 data를 아까만든 CephFS 스토리지에 저장하게끔 했다.

    그리고 이제 아래 명령어를 실행해 주면 된다.

    docker stack deploy -c portainer-agent-stack.yml portainer

    그러면 이제 모든 설치가 끝났다.

    이제 추가한 노드들 중의 하나의 ip 주소로 접속하면 Portainer 설정 페이지를 볼 수 있다

    https://192.168.10.101:9443

    셋 중의 하나가 죽으면 그 IP로는 접속을 못하기 때문에 이제 가상IP 설정을 해서 고정된 IP로 접속할 수 있게 해야 한다

    그래서 나는 keepalived를 사용할 것이다.

    우선 모든 노드에 keepalived를 설치해 준다

    sudo apt install keepalived

    그다음에 /etc/keepalived/keepalived.conf 파일만들어 준다

    global_defs {
       notification_email {
         [email protected]
       }
       router_id SWARM_HA
       vrrp_skip_check_adv_addr
       vrrp_strict
       vrrp_garp_interval 0
       vrrp_gna_interval 0
    }
    
    vrrp_instance VI_1 {
        state MASTER
        interface ens18
        virtual_router_id 51
        priority 200
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass your-password
        }
        virtual_ipaddress {
            192.168.10.5
        }
    }
    
    virtual_server_group ALL_PORTS {
        192.168.10.5 1-65535
    }
    
    virtual_server 192.168.10.5 1-65535 {
        delay_loop 6
        lb_algo rr
        lb_kind NAT
        persistence_timeout 50
        protocol TCP
    
        real_server 192.168.10.101 1-65535 {
            weight 1
            TCP_CHECK {
                connect_timeout 3
                retry 3
                delay_before_retry 3
            }
        }
    
        real_server 192.168.10.104 1-65535 {
            weight 1
            TCP_CHECK {
                connect_timeout 3
                retry 3
                delay_before_retry 3
            }
        }
    
        real_server 192.168.10.51 1-65535 {
            weight 1
            TCP_CHECK {
                connect_timeout 3
                retry 3
                delay_before_retry 3
            }
        }
    }
    

    위에서 파란색으로 칠한 부분을 자신의 상황에 맞게 수정하면 되겠다.

    이제 설정한 가상 IP로 접속하면 어느 노드가 죽어도 Docker Swarm에 접속할 수 있다.

  • 시놀로지(Synology) 구매 그리고…

    나는 원래부터 자료를 저장해서 모으는 것을 좋아했다.

    그래서 외장하드에 차곡차곡 넣어 두었었다.

    그러다가 NAS라는 것에 대해 알게 되었고 이것을 가지는 것이 하나의 꿈이 되었다.

    NAS가 비싸서 사지는 못하고 리눅스에 SMB와 WebDAV 서버를 깔아서 쓰다가 회사에서 헤놀로지(XPenology)를 쓰는 사람을 보고 나도 헤놀로지를 깔아서 썼다.

    그러다가 이번에 중고로 120만원 상당이던 Synology사의 DS1520+ 모델을 75만원에 구하게 되었다.

    택배를 받고 나서 바로 상자를 까고 설치를 했다.

    마땅히 둘 자리가 없어 책상 위에 저렇게 설치했다.

    그렇게 첫 설정을 하고 있었는데…

    하드디스크가 갑자기 삑하고 소리가 나더니 죽어버린 것이다.

    아무래도 아까 시놀로지를 옮기다가 하드디스크에 충격이 가서 그런 것 같은데 정확한 이유는 모른다.

    나는 패닉에 빠졌으나 다행히도 자료는 다른 곳에 백업이 되어 있었다.

    바로 A/S 센터를 알아 보았고 아뿔사 서울에 있었다

    그래서 연차를 내고 바로 다음날 서울로 가는 기차표를 예매했다.

    다음날 일찍 일어나서 기차를 타는데 음… 앞과 마주 보는 자리에 타게 됐다.

    자리에 앉아서 사진을 찍었는데 이후 누가 와서 자기 자리라고 했다. 알고 보니 내가 옆 칸에 앉은 것이었다.

    그래서 내 자리로 가는데 앞 자리에 어린아이와 아이의 어머니가 타고 있었다.

    나는 그들과 불편한(?) 여행을 시작했다.

    서울에 도착하자마자 나는 황급히 자리를 떴고 목적지인 용산에 있는 하드 A/S 센터로 갔다.

    번호표를 뽑고 기다렸고 내 차례가 됐다.

    이렇게 이렇게 해서 하드가 고장났어요 했는데 바로 바꿔주셨다.

    너무 빨리 처리 되어서 당황스러웠다.

    그리고 나서 시간이 남아 마침 서울에 와 있던, 디스코드로 만나서 친해진 친구를 만났다.

    만나서 밥먹고 용산 아이파크몰을 구경했다.

    아이파크몰에 뭔가 신기하고 즐길게 많이 있었다.

    이렇게 글을 쓸 줄 알았으면 사진 좀 찍을 걸 그랬다.

    그렇게 나는 다음날 일찍 출근해야 했기에 일찍이 기차를 타고 다시 광주로 왔다.

    집에 도착 하니, 이런 일이 다시 일어나지 않기를 바라며, 어제 주문한 하드가 문 앞에 놓여 있었다.

    그렇게 A/S 받은 하드와 새로 주문한 하드를 새 시놀로지에 넣었다.

    하드가 하나 고장나도 바로 복구할 수 있도록 SHR로 묶었다.

    제발 이제는 고장 나지 않기를 바라며…