데비안 리눅스를 IP 공유기로 사용하려면 내부 LAN 인터페이스에 고정 IP 주소를 지정하고 IPv4 포워딩을 활성화한다. iptables에서 패킷 전달을 허용하고 IP 마스커레이드를 설정하면 내부 장치가 외부 인터페이스의 IP 주소를 공유해 인터넷에 접속할 수 있다. IP 자동 할당이 필요하면 Kea DHCP를 설정하고, 방화벽 규칙을 저장한 뒤 재부팅 후 동작을 확인한다. 사용하지 않는 저사양 PC를 활용하는 리눅스 프로젝트의 오랜 단골 주제이기도 하다.
데비안 리눅스를 IP 공유기로 사용하기
가정이나 사무실에서 흔히 사용하는 IP 공유기는 PC나 스마트폰처럼 내부 네트워크에 연결된 여러 장치가 하나의 외부 IPv4 주소를 공유해 인터넷과 통신할 수 있도록 해 준다.
내부 장치가 외부로 패킷을 보내면 IP 공유기가 패킷의 출발지 IP 주소를 자신의 외부 인터페이스 주소로 바꾸고, 필요한 경우 출발지 포트 번호도 바꾼다. 외부에서 응답이 돌아오면 기록해 둔 변환 정보를 이용해 응답 패킷의 목적지 주소와 포트를 원래 값으로 되돌린 뒤, 통신을 시작한 내부 장치에 전달한다.
이렇게 IP 주소와 포트 번호를 함께 변환하는 것을 NAPT(네트워크 주소 및 포트 변환)라고 한다. NAPT는 NAT(네트워크 주소 변환)의 한 방식이다.
일반 PC도 패킷 전달과 NAT를 설정하면 IP 공유기로 사용할 수 있는데, 사용하지 않는 저사양 PC를 활용하는 리눅스 프로젝트의 오랜 단골 소재이기도 하다.
본 글에서는 외부 인터넷에 연결된 데비안 리눅스 시스템에 내부 LAN을 연결하고, IPv4 패킷 포워딩과 iptables의 패킷 전달 규칙 및 IP 마스커레이드를 설정하는 방법을 정리한다. 내부 장치에 IP 주소와 기본 게이트웨이를 자동으로 배포하려는 경우를 위해 Kea DHCP 서버 설정도 함께 다룬다.
Step 1. 데비안 리눅스 시스템의 패킷 전달 활성화
IP 공유기는 두 네트워크 사이에서 데이터를 전달할 수 있어야 한다. 때문에 리눅스 커널의 IPv4 포워딩 기능을 활성화 해주어야 한다.
커널의 동작은 sysctl을 이용해 관리한다. sysctl 명령은 procps 패키지에 포함되어 있으며, 일반적인 데비안 설치 환경에는 이미 설치되어 있다.
데비안 12의 sysctl 수정 방법
네트워크와 메모리 관리 등 리눅스 커널의 여러 동작을 설정하는 파일인 /etc/sysctl.conf를 수정해 IPv4 포워딩을 활성화할 수 있다. sudo nano /etc/sysctl.conf명령을 이용해 편집기에서 파일을 연 다음 #net.ipv4.ip_forward=1 항목을 찾아 앞의 주석 기호인 #을 제거하거나, 해당 항목이 없다면 아래의 내용을 추가한다.
net.ipv4.ip_forward=1
파일을 저장하고 변경한 설정을 현재 실행 중인 커널에 적용한다.
sudo sysctl -p /etc/sysctl.conf이 설정은 재부팅 후에도 적용된다. 데비안 12에서도 다음에 설명하는 /etc/sysctl.d/ 방식으로 설정할 수 있으므로, 두 곳에 같은 설정을 중복해서 작성할 필요는 없다.
데비안 13 이후의 sysctl 수정 방법
데비안 13에서는 systemd-sysctl이 /etc/sysctl.conf 파일을 읽지 않는다. 때문에 커널 설정은 /etc/sysctl.d/ 디렉토리에 별도의 .conf 파일로 작성한다.
아래 명령으로 공유기 설정을 위한 파일을 새로 만든다. 99-ip-router.conf는 이 글에서 사용하는 파일명으로, 해당 이름의 파일이 미리 존재해야 하는 것은 아니다.
파일에 다음 내용을 작성하고 저장한다.
net.ipv4.ip_forward=1
다음 명령으로 설정 파일들을 읽어 현재 실행 중인 커널에 적용한다. 작성한 파일은 이후 부팅 시에도 자동으로 읽힌다.
sudo sysctl --systemIPv4 포워딩 활성화 확인
위의 둘 중 하나의 방식을 이용해 설정을 마쳤다면 현재 적용된 값을 확인하여 1이 출력되는지 확인한다.
debian@debian:~$ sudo sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 1
Step 2. IP 공유기 구성에 필요한 패키지 설치
패킷 전달 기능을 활성화했다면 DHCP 서버와 IP 마스커레이드 설정에 필요한 패키지를 설치한다. DHCP 서버는 내부 네트워크의 장치가 자동으로 IP 주소와 기본 게이트웨이, DNS 서버 정보를 받아올 수 있게 해 준다. 본 글에서는 DHCP 서버로 Kea를 사용한다.
sudo apt install kea-dhcp4-server iptables iptables-persistent각 패키지의 역할은 다음과 같다.
kea-dhcp4-server- 내부 네트워크 장치에 IPv4 주소와 기본 게이트웨이, DNS 서버 등의 네트워크 설정을 자동으로 배포하는 DHCP 서버이다. DHCP 서버를 구성할 경우 설치한다.
iptables- 패킷의 통과 여부를 제어하고, IP 마스커레이드를 통해 내부 장치의 출발지 주소를 공유기의 외부 IP 주소로 변환한다.
iptables-persistent- iptables 규칙을 파일에 저장하고, 재부팅 후에도 저장된 규칙을 다시 적용할 수 있도록 한다.
iptables-persistent설치 중 현재 IPv4 및 IPv6 규칙을 저장할 것인지 묻는 화면이 나타날 수 있다.

현재 규칙을 유지하려면 Yes를 선택한다. 아직 공유기 규칙을 작성하지 않았다면 이후 설정을 마친 다음 다시 저장하면 된다.
인터페이스와 내부 IP 설정
먼저 외부 인터넷과 내부 단말을 연결할 인터페이스를 구분한다. 다음 값은 설명을 위한 예제이며, 인터페이스 이름은 실제 시스템의 이름을 사용해야 한다. 내부 네트워크의 주소 대역은 외부 네트워크와 겹치지 않아야 한다.
| 항목 | 예시 |
|---|---|
| 외부 인터넷 인터페이스 | wlp3s0 |
| 내부 LAN 인터페이스 | enp2s0 |
| 내부 네트워크 | 192.168.119.0/24 |
| 공유기 내부 IP | 192.168.119.1 |
| DHCP 자동 할당 IP 범위 | 192.168.119.101~192.168.119.200 |
아래의 예는 ifupdown으로 인터페이스를 관리하는 경우를 설명한다. 다른 네트워크 관리 방법을 사용하고자 할 경우 리눅스 IP 설정 방법과 네트워크 관리자 확인 절차를 참고한다.
sudo nano /etc/network/interfaces 명령을 이용해 인터페이스 설정 파일을 연다. 외부 인터페이스인 wlp3s0는 DHCP로 IP 주소와 기본 게이트웨이를 받도록 하고, 내부 인터페이스인 enp2s0에는 고정 IP 주소를 지정한다. 내부 네트워크의 게이트웨이 역할을 하는 enp2s0에는 IP 주소만 입력하면 된다.
# The loopback network interface
auto lo
iface lo inet loopback
# The external network interface
auto wlp3s0
iface wlp3s0 inet dhcp
wpa-conf /etc/network/wifi.conf
# The internal LAN interface
auto enp2s0
iface enp2s0 inet static
address 192.168.119.1/24
이 예제의 wlp3s0는 무선 랜 카드로, /etc/network/wifi.conf에 설정이 저장되어 있다.
설정을 저장하고 시스템을 재부팅해 적용한다. 원격으로 작업하고 있다면 네트워크 설정 변경으로 접속이 끊길 수 있으므로, 다시 접속할 수 있는지 확인할 수 있는 환경에서 진행한다.
sudo reboot
재부팅 후 ip a와 ip route를 실행해 enp2s0에 192.168.119.1/24가 지정되어 있고, 기본 경로가 wlp3s0를 사용하는지 확인한다.
관리자 접속용 iptables 규칙 추가
리눅스 시스템에 관리 목적으로 접속할 수 있도록 iptables 규칙을 추가한다. 다음 예는 내부 LAN인 192.168.119.0/24와 관리용 네트워크인 192.168.254.0/24에서 공유기 자체로 들어오는 통신을 허용한다.
sudo iptables -A INPUT -s 192.168.119.0/24 -i enp2s0 -j ACCEPT sudo iptables -A INPUT -s 192.168.254.0/24 -i wlp3s0 -j ACCEPT
INPUT- 공유기 자체를 목적지로 하는 패킷에 적용하는 체인이다.
-s- 허용할 출발지 IP 주소 대역
-i- 패킷이 들어오는 인터페이스
-j ACCEPT- 조건에 일치하는 패킷을 허용
결론적으로 위의 예는 enp2s0으로 들어오는 192.168.119.0/24 대역과 wlp3s0 인터페이스를 통해 들어오는 192.168.254.0/24 대역을 사용하는 클라이언트가 IP 공유기 역할을 하고 있는 리눅스 시스템에 제한 없이 접근할 수 있게 해 주는 설정이다. 만약 wlp3s0을 통해 들어오는 모든 주소를 허용하고 싶다면, sudo iptables -A INPUT -i wlp3s0 -j ACCEPT를 사용하면 된다.
(선택) Kea DHCP 서버 설정과 활성화
내부 네트워크에 IP 자동 할당을 사용하려면 DHCP 서버를 설정한다. 내부 네트워크를 고정 IP로 사용하거나, 와이파이 사용을 위해 무선 공유기등을 추가해 별도의 DHCP 서버가 존재한다면 이 단계는 생략할 수 있다.
Kea의 설정 파일인 /etc/kea/kea-dhcp4.conf를 편집기로 연다.
다음은 내부 인터페이스인 enp2s0에 DHCP 서버를 돌리고, 192.168.119.101부터 192.168.119.200까지 자동으로 할당하게 IP 풀을 할당한 예이다.
{
"Dhcp4": {
"interfaces-config": {
"interfaces": [ "enp2s0" ]
},
"lease-database": {
"type": "memfile",
"persist": true,
"name": "/var/lib/kea/kea-leases4.csv"
},
"valid-lifetime": 7200,
"renew-timer": 3600,
"rebind-timer": 6300,
"subnet4": [
{
"id": 1,
"subnet": "192.168.119.0/24",
"pools": [ { "pool": "192.168.119.101 - 192.168.119.200" } ],
"option-data": [
{
"name": "routers",
"data": "192.168.119.1"
},
{
"name": "domain-name-servers",
"data": "168.126.63.1, 8.8.8.8"
}
]
}
]
}
}
interfaces- DHCP 요청을 받을 인터페이스 이름
lease-database- IP 주소 할당 정보를
kea-leases4.csv파일에 저장한다. valid-lifetime- IP 주소의 임대 시간을 7,200초로 설정했다.
renew-timer- IP 주소 할당 후 갱신 요청 시간
subnet- 내부 네트워크의 주소 대역
pool- DHCP로 할당할 IP 주소 범위
routers- 자동 IP 할당시 알려 줄 기본 게이트웨이
domain-name-servers- 자동 IP 할당시 알려 줄 DNS 서버 정보.
168.126.63.1은 KT,8.8.8.8은 구글의 DNS 주소이다.
파일을 저장하고 서비스 자동 실행 등록한 다음 서비스를 재시작 하거나 서버를 재부팅한다.
sudo systemctl enable kea-dhcp4-server sudo systemctl restart kea-dhcp4-server
서비스 동작 상태를 sudo systemctl status kea-dhcp4-server 명령을 통해 확인하고 실제 장비를 연결해 IP를 받아오는지 확인한다. 문제가 있을 경우 sudo journalctl -u kea-dhcp4-server -n 50 --no-pager 등의 명령을 이용해 로그를 확인한다.
iptables IP 마스커레이드 SNAT 설정
IP 마스커레이드(IP Masquerading)는 NAT의 한 방식으로, 내부에서 외부로 나가는 패킷의 출발지 주소를 공유기의 외부 IP 주소로 바꾸는 SNAT를 수행한다. 리눅스 커널의 패킷 처리 기능인 Netfilter를 제어하는 명령행 도구 iptables를 이용해 설정할 수 있다.
내부 주소를 외부 주소로 변환(SNAT)
다음 명령은 내부 네트워크인 192.168.119.0/24 대역에서 출발한 패킷이 wlp3s0 인터페이스를 통해 외부로 나갈 때 IP 마스커레이드를 적용하는 예이다.
-t nat- 주소 변환 규칙을 관리하는
nat테이블을 선택한다. -A POSTROUTING- 경로가 결정된 패킷이 밖으로 나가기 전에 처리되는
POSTROUTING체인의 끝에 규칙을 추가한다. -s 192.168.119.0/24- 출발지 IP 주소가
192.168.119.0/24대역에 속하는 패킷을 대상으로 한다. -o wlp3s0- 출력 인터페이스가
wlp3s0인 패킷을 대상으로 한다. -j MASQUERADE- 조건에 일치하는 패킷에 IP 마스커레이드를 적용해 출발지 주소를 출력 인터페이스의 IP 주소로 변환한다.
응답 패킷은 연결 추적 정보에 따라 목적지 주소가 원래 내부 장치의 주소로 자동 복원되므로, 이를 위한 별도의 DNAT 규칙은 필요하지 않다.
iptables 방화벽 설정
NAT를 구성 했다 하더라도 방화벽이 막고 있다면 소용이 없다. 먼저 sudo iptables -S 명령을 통해 현재 규칙을 확인하고, sudo iptables -t nat -S 명령을 통해 NAT 를 사용하고 있는 규칙이 있는지 확인한다. INPUT은 리눅스 자신이 목적지인 통신에 적용되고, 내부 단말의 패킷이 리눅스를 통과할 때는 FORWARD가 적용된다.
만약 충돌하는 규칙이 있다면 중복을 피하기 위해 적절하게 통합시켜 주거나 적용 순서를 확인해야 한다. 아래는 외부와 내부 인터페이스 간에 방화벽을 풀어주고 불필요한 패킷을 차단하도록 하는 정책을 순서대로 입력한 예 이다.
- 내부에서 외부로 나가는 요청을 허용
sudo iptables -A FORWARD -i enp2s0 -o wlp3s0 -s 192.168.119.0/24 -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT
내부 인터페이스인
enp2s0으로 들어온 패킷 중 출발지 IP 주소가192.168.119.0/24에 속하면, 새 연결을 시작하는 패킷(NEW), 이미 성립한 연결의 패킷(ESTABLISHED), 기존 연결과 관련된 패킷(RELATED)을wlp3s0로 전달하도록 허용한다. - 외부에서 내부로 돌아오는 응답을 허용
sudo iptables -A FORWARD -i wlp3s0 -o enp2s0 -d 192.168.119.0/24 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
외부 인터페이스인
wlp3s0로 들어온 패킷 중 목적지 IP 주소가192.168.119.0/24에 속하면, 이미 성립한 연결의 패킷(ESTABLISHED)과 기존 연결과 관련된 패킷(RELATED)을enp2s0으로 전달하도록 허용한다. - 지정 대역 이외의 내부 패킷이 외부로 나가지 못하게 차단
sudo iptables -A FORWARD -i enp2s0 -j DROP
앞선 규칙에서 처리되지 않은 패킷 중
enp2s0으로 들어와 공유기를 거쳐 다른 곳으로 전달되는 패킷을 차단한다. - 외부에서 내부로 들어오지 못하게 차단
sudo iptables -A FORWARD -o enp2s0 -j DROP
앞선 규칙에서 처리되지 않은 패킷 중 공유기를 거쳐
enp2s0으로 나가는 패킷을 차단한다.
iptables 규칙 저장과 부팅 자동 적용 등록
명령으로 추가한 iptables 규칙을 재부팅 후에도 사용하려면 현재 적용 중인 규칙을 저장해야 한다. 앞서 iptables-persistent를 설치했다면 다음 명령으로 규칙을 저장하고, 부팅 시 자동으로 불러오도록 설정한다.
sudo netfilter-persistent save sudo systemctl enable netfilter-persistent
netfilter-persistent save- 현재 적용 중인 규칙을 파일에 저장한다.
systemctl enable netfilter-persistent- 부팅 시
netfilter-persistent서비스가 저장된 규칙을 자동으로 불러오도록 등록한다.
부팅 시 자동 적용은 마지막으로 저장한 규칙을 불러오는 기능이다. 이후 iptables 규칙을 추가하거나 변경했다면 sudo netfilter-persistent save를 다시 실행한다.
최종 확인 – 진실의 시간
내부 단말의 IP를 192.168.119.0/24 대역으로 설정하고 게이트웨이를 공유기의 주소로 설정한다. 만약 DHCP 사용할 경우, 지정한 주소 범위와 게이트웨이를 받았는지 확인한다. 예를 들어 IP는 192.168.119.101, 서브넷 마스크는 255.255.255.0, 게이트웨이는 192.168.119.1로 표시될 수 있다. 이는 예상 값의 예이며 실제 할당 주소는 달라질 수 있다.
먼저 내부 단말과 192.168.119.1 사이의 통신을 확인하고, 이어서 외부 IP 통신과 도메인 이름 해석, 웹 접속을 확인한다. 리눅스 공유기에서는 다음 명령으로 중계 규칙과 주소 변환의 처리 상태를 확인할 수 있다.
sudo iptables -L FORWARD -n -v sudo iptables -t nat -L POSTROUTING -n -v
마지막으로 재부팅 후 내부 고정 IP, DHCP 서비스, 포워딩 값과 iptables 규칙이 유지되는지 확인한다. IP만 받고 인터넷이 연결되지 않는다면 외부 연결, 기본 경로, 포워딩, FORWARD, NAT, DNS를 나누어 점검한다.
FAQ
- 데비안 리눅스 PC를 IP 공유기로 사용할 수 있는가?
- 가능하다. 내부 LAN과 외부 네트워크를 연결할 인터페이스를 마련하고, IPv4 포워딩을 활성화한 뒤 iptables에서 패킷 전달과 IP 마스커레이드를 설정한다. 내부 장치에 IP 주소와 기본 게이트웨이 등을 자동으로 배포하려면 DHCP 서버도 구성한다.
- SNAT과 DNAT의 차이는 무엇인가?
- SNAT(Source Network Address Translation)은 패킷의 출발지 IP 주소를 바꾸고, DNAT(Destination Network Address Translation)은 목적지 IP 주소를 바꾼다. 공유기에서 내부 장치의 인터넷 통신에 외부 인터페이스의 주소를 사용하게 하는 것은 SNAT의 예이고, 외부에서 특정 포트로 들어온 연결을 내부 서버로 보내는 포트 포워딩은 DNAT의 대표적인 예이다.
- IP 마스커레이드란 무엇인가?
- IP 마스커레이드(IP Masquerading)는 패킷의 출발지 IP 주소를 패킷이 나가는 인터페이스의 현재 IP 주소로 바꾸는 SNAT 방식이다. 변환에 사용할 주소를 자동으로 선택하므로, 공유기의 외부 IP 주소가 DHCP 등으로 바뀔 수 있는 환경에 적합하다.
- 인터넷에서 돌아오는 응답을 받으려면 DNAT 규칙도 추가해야 하는가?
- 내부 장치가 시작한 통신의 응답은 공유기가 연결 추적 정보를 이용해 목적지 주소를 원래 내부 장치의 주소로 자동 복원한다. 따라서 이 응답을 처리하기 위한 별도의 DNAT 규칙은 필요하지 않다.
- iptables는 IP 공유기에서 어떤 역할을 하는가?
- iptables는 리눅스 커널의 패킷 처리 규칙을 설정하는 명령행 도구이다. 이 글에서는 공유기 자체로 들어오는 패킷을
INPUT체인에서, 공유기를 거쳐 전달되는 패킷을FORWARD체인에서 제어한다. IP 마스커레이드 규칙은nat테이블의POSTROUTING체인에 추가한다. - IP 마스커레이드만 설정하면 내부 장치가 인터넷에 연결되는가?
- 주소 변환과 함께 IPv4 포워딩을 활성화하고, 방화벽의
FORWARD체인에서 외부로 나가는 패킷과 돌아오는 응답을 허용해야 한다. 내부 장치에는 리눅스 공유기의 내부 IP 주소를 기본 게이트웨이로 지정한다. - DHCP 서버는 IP 공유기에 반드시 필요한가?
- 내부 장치에 IP 주소, 서브넷 마스크, 기본 게이트웨이, DNS 서버 정보를 직접 입력하거나 같은 LAN의 다른 DHCP 서버가 이 정보를 제공한다면 공유기에 DHCP 서버를 둘 필요는 없다. 이 글에서는 자동 할당이 필요한 경우 Kea를 사용한다.
- 리눅스 IP 공유기를 구현하려면 고사양 PC가 필요한가?
- 본 필자는 인텔 Celeron N2840 프로세서와 4GB RAM 사양의 미니 PC로 IP 공유기와 VPN을 구동하고 유튜브 라이브 인코딩을 동시에 수행하고 있지만 CPU 사용률이 가장 높을 때도 50%를 넘지 않았다. 일반적으로 1GHz 이상의 CPU라면 IP 공유기를 구동하는데 전혀 문제가 없다.
- iptables-persistent는 어떤 역할을 하는가?
- iptables-persistent는 iptables 규칙을 파일에 저장하고 부팅 시 다시 불러올 수 있게 해 준다. 이 글에서 설정한 IPv4 방화벽 규칙과 NAT 규칙은
/etc/iptables/rules.v4에 함께 저장된다. - iptables 규칙을 변경하면 저장된 규칙도 자동으로 바뀌는가?
- 명령으로 변경한 규칙은 실행 중인 시스템에 적용된다. 재부팅 후에도 변경 내용을 사용하려면 sudo netfilter-persistent save를 다시 실행해 현재 규칙을 저장한다.