반응형

스마트폰, 액션캠, 디지털카메라로 촬영한 동영상을 웹 페이지로 보려면, WEBM 형식으로 파일을 변환해야 한다.

변경 방식은 간단하다. 아래와 같은 명령을 수행하면 Web browser에서 바로 볼 수 있는 동영상 파일로 변환된다.

 

##
## 만약 MacOS를 사용한다면, 아래와 같이 ffmpeg을 먼저 설치한다.
##
$ brew install ffmpeg


##
## 명령 예시
##  아래 명령에서 'input.avi'가 스마트폰으로 촬영한 동영상 원본 파일명이고, 
##  'output.webm'이 변환된 이후에 web server에 올릴 파일명이다. 
##
$ ffmpeg -y -i my_input_movie.avi -c:v libvpx-vp9 -c:a libopus my_output_movie.webm


## 원본 파일이 .mp4 파일이면, 아래와 같이 수행하면 된다.
$ ffmpeg -y -i my_input_movie.mp4 -c:v libvpx-vp9 -c:a libopus my_output_movie.webm

참고:
꼭 Web browser로 포기 위한 용도가 아니더라도 위와 같인 webm 파일로 변경하면 좋은 점이 하나 더 있다. 그것은 바로, 동영상의 사이즈가 1/10 수준으로 확 줄어든다. 신기하게도 90% 정도의 사이즈 압축이 있지만, 동영상 품질의 차이는 눈으로 느낄 수 없을 정도이다. 동영상 품질이 거의 원본과 동일하다.

반응형

 

iptables의 Chain(Rule) & Table 구조 

iptables는 다수의 Chain(예: PREROUTING, INPUT, OUTPUT, POSTROUTING, FORWARD)과 그 Chain에 정의된 Rule, 그리고 각 Chain에는 다수의 Table(raw, mangle, nat, filter, security)이 포함되어 있다.

 

Iptables의 Chain 종류와 Table 종류

 

 

IP Packet이 유입된 이후에 아래 그림과 같이 패킷의 L2, L3, L4 Header를 조작하거나, Header의 내용을 보면서 IP Packet을 다음 Chain에서 처리하게 할지, 아니면 Client(Sender)로 되돌려 보낼지를 처리한다.

 

IPTables Chains Order Scheme  (from  https://jimmysong.io/en/blog/sidecar-injection-iptables-and-traffic-routing/)

 

위 그림을 볼 때, 주의할 점은 노란색 메모장 같은 라벨이 붙은 table에서는 IP packet을 조작한다는 것이다. 그리고 filter 같은 table에서는 IP packet을 열람만하고 조작하지 않는다.

 

그리고, 아래 그림은  istio의 envoy proxy container와 app container가 어떻게 IP Traffic을 전달하는지 보여준다. 이때도 역시 iptables가 IP traffic의 전달에 관여한다.

 

image from  https://jimmysong.io/en/blog/sidecar-injection-iptables-and-traffic-routing/

 

 

image from  https://jimmysong.io/en/blog/sidecar-injection-iptables-and-traffic-routing/

 

 

Packet Flow in Netfilter and General Networking  (from wikipedia.org/wiki/Netfilter)

 

 

 

iptables 명령 기본 표기법

iptables [-t table] [action] [chain] [pattern] [-j target] 

  • [table] 크게 nat와 filter로 나누며 기본값은 filter이다. 
  • [action] 전체 체인에 대한 정책을 지정 / -A , -L , -D , -F 등 대문자 옵션이 해당한다. 
  • [chain] 일반적 필터링에 속하는 INPUT.OUTPUT.FORWARD가 있으며 NAT테이블에는 POSTROUTING / PREROUTING / OUTPUT 이 있다. 
  • [pattern] 세부규칙을 지정하는 것으로 소문자 옵션 -s / -p /-d 등이 이에 해당한다. 
  • [target] 정책을 지정하는 것이며 DROP / ACCEPT / LOG 등등이 있다. 

 

iptables 명령 예시

Example - A

$ iptables -t filter
           -A INPUT  # 들어오는 패킷에 대한 필터링 
           -i eth0   # eth0 네트워크 아답터로 들어오는 패킷들이 대상임
           -p ICMP   # 프로토콜이 ICMP이면
           -j DROP   # 위 조건을 만족하는 패킷을 소멸(삭제)

 

Example - B

$ iptables -t filter
           -A INPUT       # 들어오는 패킷에 대한 필터링
           -i eth0        # eth0 네트워크 아답터로 들어오는 패킷들이 대상임
           -o eth0        # eth0 네트워크 아답터로 나가는는(output) 패킷들이 대상임
           -p TCP         # 프로토콜이 TCP이면
           --dport 22     # destination port가 22번이면
           --sport 39321  # source port가 39321번이면 
           -j ACCEPT      # 위 조건을 만족하는 패킷을 Accept

 

 

 

iptables 사용하기

iptables는 사용하는 방법은 크게 두가지가 있다.  

  • 첫번째는 전체 체인에 대한 설정이고,
  • 두번째는 각 체인에 대한 규칙을 사용하는 방법이다.  

체인에 대한 동작설정은 대문자 옵션을 사용하고 체인에 대한 세부규칙은 소문자 옵션을 사용한다. 

 

체인 전체옵션 설명 

-N 새로운 체인을 만든다 
-X 비어있는 체인을 제거한다 
-P 체인의 정책을 설정한다 
-L 현재 체인의 정책을 보여준다 
-F 체인의 규칙을 제거한다 
*체인 동작옵션 설명 (내부규칙을 뜻함) 
-A 체인에 새로운 규칙을 추가한다. 해당체인에 마지막규칙으로 등록된다. 
-t 가 filter 인 경우 INPUT, FORWARD 사용가능 
-t 가 nat 인 경우 POSTROUTING , PREROUTING 사용가능 
-I 체인에 규칙을 맨 첫부분에 등록한다. 
-R 체인의 규칙을 교환한다. 
-D 체인의 규칙을 제거한다 

 

 

 

iptables 세부 옵션

-s / -d 출발지('-s' , '--source') / 도착지 ('-d' , '--destination')를 뜻함 
$ iptables -A INPUT -s 192.168.10.0/24 -j DROP   # 192.168.10.0/24 네크워크에서 들어오는 패킷들을 모두 DROP한다. 
                                                 # -j 옵션에 대해 ACCEPT | DROP | DENY | REDIRECT 등등 설정 

$ iptables -A INPUT -s 192.168.10.20 -j DENY     # 192.168.10.20으로 들어오는 패킷에 대해서 거부한다.

 

-p (프로토콜의 지정) 
     (예) -p ! TCP      # TCP 프로토콜이 아닌경우를 뜻함 

-i (--in-interface) 패킷이 들어오는 인터페이스를 지정 
     INPUT / FORWARD 체인에서 사용 
     -t nat 이면 PREROUTING에서만 사용 가능 

-o ('--out-interface') 패킷이 나가는 인터페이스를 지정 
     OUTPUT / FORWARD 체인에서 사용 
     -t nat 이면 POSTROUTING에서만 사용 가능 

-t (--table) 테이블 선택의 의미 
     -t filter / -t nat / -t mangle 세가지 선택을 할수 있다. 

 

 

 

iptables 의 추가 옵션 설정하기 

-p 같은 프로토콜 관련 옵션들의 기능에 대한 세부적인 추가 옵션을 제공한다. 
--sport 발신지에서의 하나의 포트나 포트범위를 지정한다. 
--dport 도착지에서의 포트를 지정한다. 
--tcp-flags 플래그를 지정하는 옵션이다. 첫번째는 검사하고자 하는 지시자 리스트 . 
두번째는 지시자에 어떻게 할것인가를 설정 
$ iptables -A INPUT -p tcp --tcp-flag ALL SYN<ACK -j DENY  # 모든플래그를 검사(ALL의 의미는 SYS,ACK,FIN,RST,URG,PSH를 의미)SYN 과 ACK만 거부한다.

 

 

 

정책(Rule) 확인법

ping test를 이용하여 traffic policy를 확인할 수 있다.

$ ping localhost   # 127.0.0.1로 핑 보내기 
## 정상적으로 ping packet이 전송되는 것을 확인한다.

$ iptable -A INPUT -s 127.0.0.1 -p icmp -j DROP   # 출발지가 127.0.0.1 이며 프로토콜 icmp 사용해 들어오는 패킷을 DROP 한다. 

$ ping localhost 
## DROP 정책이 정상적으로 적용되었다면, ping이 되지 않을 것이다.

 

 

 

정책(Rule) 지우기

우선, 지우고자 하는 정책을 확인하고, -D 옵션을 이용하여 해당 정책을 지운다.

$ iptables -L --line   # 정책 순서대로 리스트 번호가 설정되어 보여짐

## 개별 정책 지우기 (-D) 
## iptables -D [해당정책] [리스트번호] 
$ iptables -t nat -D PREROUTING 2 

## 전체 정책 초기화 (-F) 
$ iptables -F INPUT    # INPUT체인에 부여된 정책 모두 제거

 

 

 

iptables rule 저장하고 불러오기

방법 A : 수작업 복구

원하는 방화벽 체인을 설정해 놓은후 그 설정을 저장하여 설정된 내용을 불러 올수 있다. 

## iptables-save > [파일명] 
$ iptables-save > my-save.txt 

## 저장한 내용 화면에 출력하기 
$ iptables-save 

## iptables-save로 저장한 체인을 복구 명령: iptables-restore 
$ iptables-restore < my-save.txt

 

방법 B :  자동 복구 (부팅 시 백업된 Rule 적용)

## root 사용자로 변경
$  sudo -s

## 자동 복구를 위한 관련 SW 패키지 설치
$  apt install iptables-persistent

## 아래와 같이 /etc/iptables 폴더가 생성되었는지 확인
$  ls -al /etc/iptables/

## netfilter-persistent 서비스 상태를 확인
$  systemctl status netfilter-persistent

$  systemctl is-enabled netfilter-persistent


## 테스트를 위해 아래와 같이 Rule을 추가해보고, OS Reboot해본다.
$  iptables -A POSTROUTING -t nat -o br-ex -s 172.16.0.0/16 -j MASQUERADE

##
## OS Reboot 완료 후, iptables 명령으로 netfilter rule이 잘 복구되었는지 확인한다.
##
$ iptables-save | grep 172.16.0.0

 

## 아래 명령과 같이 'save' 서브 명령이 있는데,
## 지금까지 테스트해본 결과를 보면, 'save' 명령을 수행하지 않아도
## 그때그때 netfilter rule의 변화를 /etc/iptables 폴더에 반영하는 것 같다.
## (2023년 6월 기준으로 이렇게 동작하지만, 나중에 또 어떻게 바뀌지 모르니까 참고만 할 것 !)
$ netfilter-persistent save

 

 

 

 


 

Somthing to read

 

https://iximiuz.com/en/posts/laymans-iptables-101/

이  Web Docs가 그림을 이용하여 다양한 상황을 잘 Illustration하고 있다. 시간 날 때마다 읽어서 기억을 유지하면 좋을 듯 :)

 

Illustrated introduction to Linux iptables - Ivan Velichko

What are iptables chains, rules, policies, and tables? Describe iptables in layman's terms.

iximiuz.com

image from&nbsp;https://iximiuz.com/en/posts/laymans-iptables-101/

반응형

tcpdump 명령만 이용하면, 출력을 보기 좋게 또는 예쁘게 터미널로 출력하기 어렵다.

보기 좋은 형식으로 출력하려면 tshark 명령을 사용하는 것을 추천한다.

 

 

tshark 명령 사용

tshark을 사용하면, Network Packet이 정말 예쁘게 출력된다.  

아래와 같이 wireshark 패키지를 설치한다.  (참고로 tshark은 wireshark 패키지에 포함되어 있다)

##
## 아래 예시처럼 yum install 명령을 이용하여 wireshark 패키지를 설치한다.
##

$ yum install wireshark
...

##
## 설치 완료 후, 아래 명령과 같이 실행
## 참고: -V 옵션은 Packet을 Decode해서 출력하라는 뜻
##
$ tshark -i eth0 -nV port 53

 

위 예제 명령 정도의 옵션만 사용해도 꽤 보기 좋은 모양으로 IP 네트워크 패킷이 출력된다.

 

 

tcpdump 명령의 -A 옵션 사용해서 가독성 높게 출력하기

tshark을 사용할 수 없는 경우라면, 아래 명령처럼 -A 옵션을 주면, TCP 또는 UDP의 Payload가 ASCII 로 출력된다.

(사람 눈으로 읽을 수 있는, 즉 Readable Character만 터미널에 출력함) 

 

-A 옵션만 사용하면, TCP 세션을 수립하기 위한 SYNACKFIN 패킷도 모두 보여지기 때문에 

Filter에  tcp[32:4] = 0x47455420 조건을 추가한다. ("GET "에 대한 Pointcode 값이다) 

 

 

HTTP GET 요청 메시지만 출력
$ tcpdump -i p2p2 -s 1500 -An 'src net 192.168.0.0/24' and dst port 80 and 'tcp[32:4] = 0x47455420'

 

 

HTTP GET 요청과 응답 메시지 모두 출력
$ tcpdump -i em2 -s 1500 -An 'src net 192.168.0.0/24' and 'tcp[32:4] = 0x48545450' or 'tcp[32:4] = 0x47455420'

 

  또는 아래와 같은 방식을 사용할 수 있다.

(이 방식을 추천함)

$ tcpdump -i em2 -An -s 0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

 


참고: 위의 3개 명령 중에서 제일 마지막 명령이 제일 출력 포맷이 예쁘다. 

반응형

 


 

만약, Kubernetes cluster network 외부에서 kubernetes service에 access한다고 가정하면

아래와 같이 kubectl port-forward 명령으로 외부 IP traffic을 허용할 수 있다.

 

 

Example: Jenkins Web Dashboard 접속한다고 가정하고 테스트해보기

  • 구성 예시:
    • kubernetes service의 port는 8080
    • Web browser로 접속할 port는 8180

 

 

 

 

즉, 외부에서 8180으로 접속시도하면, 8080으로 port forward하도록 하려면, 아래와 같이 명령을 수행하면 된다.

 

##
## --addresss=0.0.0.0은 모든 IP Address를 수용하겠다는 뜻이다.
##
## 8180:8080은 Kubernetes Cluster 외부의 Client가 8180 포트로 접속 요청하면
## Kubernetes Cluster 내부의 8080 서비스 포트로 Forward해주겠다는 뜻이다.
##

$ kubectl  port-forward  --address=0.0.0.0 \
     $(kubectl get pod -l app.kubernetes.io/name=jenkins -o jsonpath='{.items[0].metadata.name}') \
     8180:8080

 

위와 같이 설정하고 Web browser에서 bastion node로 접속 시도한다.  (아래 예제 명령처럼 접속한다.)

 

$  curl  http://bastion.my-kube.node:8180/

 

 

위 예시는 Pod Name을 이용한 것이고, Service 이름을 이용해서도 port-forward 설정할 수 있다. (아래 명령을 참고)

##
## Cluster 밖의 Client가 9999 port 번호로 요청하면,
## 80 port 번호로 바꾸어서 almighty 네임스페이스의 almighty 서비스로 forwarding한다.
##

$ kubectl port-forward --address=0.0.0.0 -n almighty service/almighty 9999:80
Forwarding from 0.0.0.0:9999 -> 8080
Handling connection for 9999
...

 

 

 


참고:
kubectl port-forward 명령을 수행한 node가 bastion이라면, web browser가 접속할 Server(Target) 주소도 bastion의 IP address이어야 한다.

 

 

게시물 작성자: sejong.jeonjo@gmail.com

 

 

반응형

Ingress Concept

‘호롤리’가 작성한 Ingress Gateway의 개념 설명과 실습 절차이다.
https://gruuuuu.github.io/cloud/k8s-service/#

 

Kubernetes Service & Ingress

1. Overview 이번 문서에서는 Kubernetes(k8s)의 Service와 Ingress에 대해서 알아보겠습니다. 2. Prerequisites 본문에서 사용한 spec : OS : CentOS v7.6 Arch : x86 k8s클러스터는 1마스터 2노드로 구성했습니다. Master : 4c

gruuuuu.github.io

 

위 블로그를 따라 해도 Ingress Gateway가 잘 동작하고, 아래와 같이 내가 만든 Practice YAML을 이용해도 Ingress Gateway가 잘 동작한다.

 

 

Practice

일반적인 준비 절차:

K8s cluster에 'ingress controller'가 동작 중인지 확인한다.

(만약 설치된 ingress controller가 없으면, nginx ingress controller를 설치할 것!)

$ kubectl get all -n ingress-nginx
NAME                                 READY   STATUS    RESTARTS   AGE
pod/ingress-nginx-controller-2bzz7   1/1     Running   0          6h23m
pod/ingress-nginx-controller-5rnw8   1/1     Running   0          6h23m
pod/ingress-nginx-controller-69jf2   1/1     Running   0          6h23m
pod/ingress-nginx-controller-j9nwr   1/1     Running   0          6h22m
pod/ingress-nginx-controller-xzc79   1/1     Running   0          6h22m

NAME                               TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
service/ingress-nginx-controller   LoadBalancer   10.233.15.71   10.10.9.180   80:31302/TCP,443:31071/TCP   57d

NAME                                      DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
daemonset.apps/ingress-nginx-controller   5         5         5       5            5           kubernetes.io/os=linux   57d

가능하면, 위 예제처럼 service type이 ‘LoadBalancer’가 되도록하고, cluster 외부에서 직접 접속 가능한 주소를 할당한다. (예: 10.10.9.180)
위 예제대로라면, Cluster 밖에 있는 Web Browser는 80, 443 포트로 접속 가능하다.

 

 

Ingress Object 설정 및 생성

내 Pod에 접근할 수 있는 Ingress object를 생성한다.

아래와 같이 내 서비스에 접근할 수 있도록 Ingress manifest 파일을 작성한다.

##
## Filename: ingress.yaml
##
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: mymusic
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: andrewapp.peter.space    # web browser에서 'http://andrewapp.peter.space/'로 요청이 들어온다면...
    http:
      paths:
      - path: /mymusic      # web browser에서 'http://.../mymusic/...' 로 요청이 들어온다면...
        backend:
          serviceName: andrewapp   # 'andrewapp'이름의 '80' 포트 서비스 Object로 패킷을 Forward한다.
          servicePort: 80

 

위에서 작성한 ingress.yaml을 kubernetes cluster에 적용한다.

$ kubectl apply  -n andrew  -f ingress.yaml

 

 

Example App을 이용한 테스트

Service manifest 파일을 생성한다.

##
## Filename: service.yaml
##
apiVersion: v1
kind: Service
metadata:
  name: andrewapp          # 이 값이 위 ingress에서 설정한 'serviceName: andrewapp'과 일치해야 한다.
spec:
  ports:
  - port: 80               # 이 값이 위 ingress에서 설정한 'servicePort: 80'과 일치해야 한다.
    protocol: TCP
    targetPort: 80
  selector:
    app: mymusic
  type: ClusterIP

 

위에서 작성한 yaml을 kubernetes cluster에 적용한다.

$ kubectl apply  -n andrew  -n service.yaml

 

실제 application이 돌아가는 예제 Web 서버를 구동한다.

##
## deploy.yaml
##
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mymusic
spec:
  selector:
    matchLabels:
      app: mymusic
  replicas: 1
  template:
    metadata:
      labels:
        app: mymusic           # service.yaml에서 사용한 selector 정보와 동일해야 한다.
    spec:
      containers:
      - name: mymusic
        image: nginx:1.14.2
        ports:
        - containerPort: 80

 

위에서 작성한 yaml을 kubernetes cluster에 적용한다.

$ kubectl apply  -n andrew  -n deploy.yaml

 

PC에서 Web browser로 접속한다.

주소는 ingress object에 설정했던 ‘andrewapp.peter.space/......’이다.

짜잔~~~  Web Page가 잘 보일 것이다.

반응형

나의 학생 시절, 연애 시절, 그리고 결혼하고 육아하면서 찍은 사진이 수 만장이 되었다.

너무 사진이 많고, 용량이 커서 클라우드에는 못 올렸고, 그래서 USB 외장 하드(HDD)에 차곡차곡 저장해놓았다.

그런데 이렇게 저장만 하면 뭐하나 ㅠㅠ;

 

USB 외장 하드 디스크(HDD)에 사진 파일이 있으니까 아래와 같은 것이 불편했다.

  • 옛날에 찍은 사진을 보려면, 외장 하드 디스크를 꺼내서 PC에 연결해야 한다. 매번 이 과정을 반복하는게 귀찮다.
  • 집 밖에 외출했을 때, 스마튼폰으로 다른 사람이나 내 아이에게 어린 시절의 사진을 보여주고 싶을 때 사진을 보여줄 수 없는 문제가 있었다.
  • 누군가에게 사진을 공유하고 싶은데, 그럴 수 없다.
  • 10~20년 지난 사진은 내가 어디서 이 사진을 찍었는지 기억이 안 난다. ㅠㅠ
  • 그냥 사진만 있으면, 이때 나와 나의 가족이 무슨 상황에서 찍었는지 스토리가 연상되지 않는다.  그저 웃고 있는 표정으로 "우리가 저때 행복했었나보다"라고 추측만 할 뿐이다.

그래서 큰 마음을 먹고, 이 수 만장의 사진과 동영상을 Web page로 만들었다.

  • golang으로 외장 하드 디스크에 저장된 .jpg .mov .mpeg 같은 사진 및 동영상 파일을 읽어 들여서, 자동으로 web page를 생성하도록 프로그래밍 했다. 
  • 스마트폰이나 노트북 PC에서 내가 만든 웹 서버에 접속해서, 사진 및 동영상을 볼 수 있게 했다. (초기 홈페이지 접속 화면에서 링크만 따라가면 지난 20년간 찍은 사진을 모두 볼 수 있다)
  • JPG 사진 파일의 Metadata를 읽어서, 사진을 어디서 찍었는지 알 수 있게 했다.  웹 페이지에 있는 사진을 클릭하면 이 사진을 찍은 위치를 지도에 보여주도록 했다.
  • 사진마다 언제 찍었는지 '날짜, 시각'을 표시하게 했다.
  • JPG 사진 파일명에 '동호해변에서 수영하다 슈즈를 잃어버려서 슬픈 날이네'라고 내용이 있으면, 파일명에서 이 부분만 추출해서 사진의 아래에 이 내용을 출력해준다.  은근히 이 기능에 전체 사진 앨범의 스토리를 연결해주는데 도움을 준다.

 

Golang 언어를 스터디할 겸, 가족 앨범 자동 만들기 프로그램을 만들었는데 단순히 스터디라고 하기에는 너무 결과물이 만족스럽다 :D

 

어느 정도로 만족하냐면...

내가 이 사진 앨범을 홈페이지로 제작한 날, 아내가 웹 서버에 있는 가족 사진(앨범)을 보고 몇분 지나지 않아서 눈물을 뚝뚝 흘리면서 보는게 아닌가...

아이들의 옛날 사진과 동영상이 잊고 살았던 추억을 소환했기 때문인 듯.

 

외장 하드 디스크에서 잠자고 있던 사진을 이제는 언제 어디서든 볼 수 있으니, 그 동안 묵혀 놓았던 숙제 하나를 끝낸 느낌이다 :D

반응형

 


 

작성일: 2023년 12월 15일
준비물: Raspberry Pi 5
   (Pi 3B, 4, 5 모두 테스트해봤는데, 설정 내용이 동일했다. 그러니까 아무 버전의 Raspberry Pi 다 된다는 뜻.)

 

 

 

Raspberry Pi 5를 아래와 같이 Wi-Fi AP로 구축한다면, 아래의 설명을 쭉~ 따라하면 잘 동작한다.

 

Raspberry Pi를 Wi-Fi Access Point로 사용하기 위한 구성도

 

 

아래의 명령만 복붙(Copy & Paste)하면 동작할 것이다.

(자세한 설명은 이 링크의 공식 문서를 참고)

 

 

 

DNSMasq, HostAPD를 설치

$ sudo apt install dnsmasq hostapd

## 참고: 설정 작업을 위해 임시로 서비스를 종료시킨다.
$ sudo systemctl stop dnsmasq
$ sudo systemctl stop hostapd

 

Raspberry Pi의 무선 Interface wlan0에 Static IP 설정

$ sudo vim /etc/dhcpcd.conf

... 중간 생략 ...

## 이 파일의 마지막 부분에 아래의 3줄을 추가한다.
interface wlan0
    static ip_address=192.168.4.1/24
    nohook wpa_supplicant
    
$ sudo systemctl restart dhcpcd

 

DHCP Server 설정

$ sudo cp /etc/dnsmasq.conf /etc/dnsmasq.conf.orig

$ sudo vim /etc/dnsmasq.conf
## 이 파일에 아래 2줄을 추가한다.
interface=wlan0
dhcp-range=192.168.4.2,192.168.4.20,255.255.255.0,24h


$ sudo systemctl start dnsmasq

 

Access Point Host 프로그램 설정

$ sudo vim /etc/hostapd/hostapd.conf
country_code=KR
interface=wlan0
ssid=YOURSSID
hw_mode=g
channel=7
auth_algs=1
wpa=2
wpa_passphrase=YOURPWD
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
ignore_broadcast_ssid=0


$ sudo vim /etc/default/hostapd
... 중간 생략 ...
## 아래 설정 내용을 추가한다.
DAEMON_CONF="/etc/hostapd/hostapd.conf"
... 중간 생략 ...

 

 

위와 같이 따라하면, Wi-Fi 구간의 설정은 끝 !!!

 

아래는 Raspberry Pi의 Wi-Fi 인터페이스 wlan0 으로 들어온 IP 트래픽을 유선 인터페이스 eth0 방향으로 보내면서 Masquerading 하는 설정이다.  

이 설정이 잘 되어야 무선으로 접속한 PC 또는 스마트폰이 유선 방향(즉, 인터넷 방향)으로 트래픽이 잘 전달된다.

 

IP Routing 및 Masquerading 설정

$ sudo nano /etc/sysctl.conf
... 중간 생략 ...
## 아래의 1줄을 추가한다.
net.ipv4.ip_forward=1
... 중간 생략 ...

## 라즈베리 파이에서 외부로 나가는 트래픽을 eth0의 IP address로 변경하는 설정.
## (일반적인 Source NAT 설정과 동일함)
$ sudo iptables -t nat -A  POSTROUTING -o eth0 -j MASQUERADE

## 재기동 후, 위 IPTables의 NAT 설정이 유지되도록 아래와 같이 설정을 저장함.
$ sudo netfilter-persistent save

$ reboot

 

 

위 설정 작업이 끝나면, 라즈베리 파이는 무선 AP로 동작할 것이다.

스마트폰이나 노트북으로 라즈베리 파이의 Wi-Fi 접속해보면 인터넷이 잘 될 것이다.

 

 

참고하면 좋은 문서

https://raspberrypi-guide.github.io/networking/create-wireless-access-point


 

반응형

Macbook에 windows 10을 설치하면, Trackpad(touchpad)의 scroll 방향이 반대로 되어 있다.

이럴 때, 아래와 같이 설정하면 Trackpad의 scroll 방향을 바꿀 수 있다. 

 

상하 스크롤 방향 바꾸기

Windows 10의 CMD 창을 열어서, 아래와 같이 명령을 입력한다.

Get-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Enum\HID\*\*\Device` Parameters FlipFlopWheel -EA 0 | ForEach-Object { Set-ItemProperty $_.PSPath FlipFlopWheel 1 }

 

좌우 스크롤 방향 바꾸기

Get-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Enum\HID\*\*\Device` Parameters FlipFlopWheel -EA 0 | ForEach-Object { Set-ItemProperty $_.PSPath FlipFlopHWheel 1 }

 

 

 

 

+ Recent posts