노하우24 메인게시판

[리눅스] VPN서버 설정 #2

페이지 정보

작성자 최고관리자 작성일25-09-25 19:38 조회59회 댓글0건

본문

* strongswan-swanctl 및 charon-systemd 로 IKEV2 VPN서버를 운영할 때, L2TP를 추가 하기 위한 방법

 

1. 패키지 추가

sudo apt update

sudo apt install xl2tpd ppp

 

 

 

2. /etc/swanctl/swanctl.conf 에 연결 추가

connections {

  # ... (기존 연결들)

 

  l2tp-psk {

    version = 1

    proposals = aes128-sha1-modp1024,3des-sha1-modp1024

    local_addrs = %any

 

    local {

      auth = psk

      id = 서버이름(예: vpn.vpnserver.com)

    }

    remote {

      auth = psk

      id = %any

    }

 

    # L2TP는 IPsec 'transport' + 1701/udp만 보호

    children {

      l2tp {

        mode = transport

        start_action = start

        close_action = none

        dpd_action = clear

        esp_proposals = aes128-sha1,3des-sha1

        # L2TP 포트 바인딩 (UDP/1701)

        local_ts  = 0.0.0.0/0

        remote_ts = 0.0.0.0/0

      }

    }

 

# = rekey 비활성(혹은 children.l2tp.rekey_time=0s)

    # L2TP/ikev1은 재키잉으로 끊김날 수 있어 rekey 비권장

    rekey_time = 0s

    dpd_delay = 30s

  }

}

 

secrets {

  # ... (기존 secrets)

 

 

   ike-l2tp-psk {

      id = 서버이름(예: vpn.vpnserver.com)

      secret = "공유비밀번호"

   }

}

 

 

 

3. L2TP 환겨 설정 (/etc/xl2tpd/xl2tpd.conf)

 

[global]

; listen-addr = 0.0.0.0

 

[lns default]

; IP를 IKEv2와 나눠쓰려고...

ip range = 10.10.10.128-10.10.10.250

local ip = 10.10.10.1

require chap = yes

refuse pap = yes

require authentication = yes

name = l2tpd

pppoptfile = /etc/ppp/options.xl2tpd

length bit = yes

 

 

 

 

4. PPP 환경 설정 (/etc/ppp/options.xl2tpd)

 

require-mschap-v2

refuse-pap

refuse-chap

refuse-mschap

auth

mtu 1400

mru 1400

ms-dns 8.8.8.8     # 내부 DNS가 있으면 그걸로 교체

asyncmap 0

# crtscts

# lock

hide-password

# modem

proxyarp

lcp-echo-interval 20

lcp-echo-failure 5

noccp

 

 

5. 로그인 정보 (/etc/ppp/chap-secrets)

 

# user   service  password      assigned-IP

user1    l2tpd    강력한비번    *

 

 

 

6. 서비스 시작

sudo systemctl enable --now xl2tpd

 

 

 

7. 커널포워딩 및 보안 sysctl

 

sudo tee /etc/sysctl.d/99-vpn-l2tp.conf >/dev/null <<'EOF'

net.ipv4.ip_forward=1

net.ipv4.conf.all.accept_redirects=0

net.ipv4.conf.default.accept_redirects=0

net.ipv4.conf.all.send_redirects=0

net.ipv4.conf.default.send_redirects=0

EOF

sudo sysctl --system

 

 

8. 방화벽 설정

 

- iptables 사용시

# IKE/NAT-T

iptables -A INPUT -p udp --dport 500  -j ACCEPT

iptables -A INPUT -p udp --dport 4500 -j ACCEPT

 

# L2TP(1701)는 반드시 "IPsec 정책 일치"시에만 허용

iptables -A INPUT -p udp --dport 1701 -m policy --dir in --pol ipsec -j ACCEPT

# 평문(비보호) 1701은 거부(다른 규칙에서 허용되지 않게)

iptables -A INPUT -p udp --dport 1701 -j DROP

 

# L2TP 풀 → 인터넷 NAT (외부 NIC 가정: eth0)

iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o eth0 -j MASQUERADE

iptables -A FORWARD -s 10.10.20.0/24 -o eth0 -j ACCEPT

iptables -A FORWARD -d 10.10.20.0/24 -m state --state ESTABLISHED,RELATED -i eth0 -j ACCEPT

 

- nftables 사용시

nft add table inet vpn

nft 'add chain inet vpn input { type filter hook input priority 0; }'

nft 'add chain inet vpn forward { type filter hook forward priority 0; }'

nft 'add chain inet vpn post { type nat hook postrouting priority 100; }'

 

nft add rule inet vpn input udp dport {500,4500} accept

# 1701은 IPsec 보호 트래픽만

nft add rule inet vpn input udp dport 1701 ipsec in reqid 0x0 accept

nft add rule inet vpn input udp dport 1701 drop

 

nft add rule inet vpn post ip saddr 10.10.10.0/24 oif "eth0" masquerade

nft add rule inet vpn forward ip saddr 10.10.20.0/24 oif "eth0" accept

nft add rule inet vpn forward ip daddr 10.10.20.0/24 iif "eth0" ct state related,established accept

 

 

 

 

9. 동작확인

 

* IPSec 수립 상태

sudo swanctl --list-sas

journalctl -u strongswan-swanctl -n 100 --no-pager

 

* L2TP/PPP

journalctl -u xl2tpd -n 100 --no-pager

ip a | grep ppp

 

 

 

 

10. VirtualBox Guest 운영체제에서 VPN 서버 설치시 Guest OS에서 실행해야할 IPTABLE 규칙

 

WAN=enp0s3

VPNNET="10.10.10.0/24"

 

iptables -F INPUT

iptables -F FORWARD

iptables -t nat -X

 

# L2TP(1701) IPSec 보호 트래픽만 허용

iptables -A INPUT -p udp --dport 1701 -m policy --dir in --pol ipsec -j ACCEPT

iptables -A INPUT -p udp --dport 1701 -j DROP

 

# IPv4 NAT

iptables -t nat -A POSTROUTING -s $VPNNET -o $WAN -j MASQUERADE

 

# Forwarding

iptables -A FORWARD -s $VPNNET -o $WAN -j ACCEPT

iptables -A FORWARD -d $VPNNET -m state --state ESTABLISHED,RELATED -i $WAN -j ACCEPT

 

sysctl -w net.ipv4.ip_forward=1

 

 

 

11. VirtualBox 에서 포트포워딩 규칙

| 규칙    | 프로토콜 | 호스트IP | 호스트포트 | 게스트IP       | 게스트포트 |

| ----- | ---- | ----- | ----- | ----------- | ----- |

| IKE   | UDP  | (비워둠) | 500   | 게스트의 NAT IP | 500   |

| NAT-T | UDP  | (비워둠) | 4500  | 게스트의 NAT IP | 4500  |

 

 

 

* strongswan-swanctl 및 charon-systemd 로 IKEV2 VPN서버를 운영할 때, L2TP를 추가 하기 위한 방법

 

1. 패키지 추가

sudo apt update

sudo apt install xl2tpd ppp

 

 

 

2. /etc/swanctl/swanctl.conf 에 연결 추가

connections {

  # ... (기존 연결들)

 

  l2tp-psk {

    version = 1

    proposals = aes128-sha1-modp1024,3des-sha1-modp1024

    local_addrs = %any

 

    local {

      auth = psk

      id = 서버이름(예: vpn.vpnserver.com)

    }

    remote {

      auth = psk

      id = %any

    }

 

    # L2TP는 IPsec 'transport' + 1701/udp만 보호

    children {

      l2tp {

        mode = transport

        start_action = start

        close_action = none

        dpd_action = clear

        esp_proposals = aes128-sha1,3des-sha1

        # L2TP 포트 바인딩 (UDP/1701)

        local_ts  = 0.0.0.0/0

        remote_ts = 0.0.0.0/0

      }

    }

 

# = rekey 비활성(혹은 children.l2tp.rekey_time=0s)

    # L2TP/ikev1은 재키잉으로 끊김날 수 있어 rekey 비권장

    rekey_time = 0s

    dpd_delay = 30s

  }

}

 

secrets {

  # ... (기존 secrets)

 

 

   ike-l2tp-psk {

      id = 서버이름(예: vpn.vpnserver.com)

      secret = "공유비밀번호"

   }

}

 

 

 

3. L2TP 환겨 설정 (/etc/xl2tpd/xl2tpd.conf)

 

[global]

; listen-addr = 0.0.0.0

 

[lns default]

; IP를 IKEv2와 나눠쓰려고...

ip range = 10.10.10.128-10.10.10.250

local ip = 10.10.10.1

require chap = yes

refuse pap = yes

require authentication = yes

name = l2tpd

pppoptfile = /etc/ppp/options.xl2tpd

length bit = yes

 

 

 

 

4. PPP 환경 설정 (/etc/ppp/options.xl2tpd)

 

require-mschap-v2

refuse-pap

refuse-chap

refuse-mschap

auth

mtu 1400

mru 1400

ms-dns 8.8.8.8     # 내부 DNS가 있으면 그걸로 교체

asyncmap 0

# crtscts

# lock

hide-password

# modem

proxyarp

lcp-echo-interval 20

lcp-echo-failure 5

noccp

 

 

5. 로그인 정보 (/etc/ppp/chap-secrets)

 

# user   service  password      assigned-IP

user1    l2tpd    강력한비번    *

 

 

 

6. 서비스 시작

sudo systemctl enable --now xl2tpd

 

 

 

7. 커널포워딩 및 보안 sysctl

 

sudo tee /etc/sysctl.d/99-vpn-l2tp.conf >/dev/null <<'EOF'

net.ipv4.ip_forward=1

net.ipv4.conf.all.accept_redirects=0

net.ipv4.conf.default.accept_redirects=0

net.ipv4.conf.all.send_redirects=0

net.ipv4.conf.default.send_redirects=0

EOF

sudo sysctl --system

 

 

8. 방화벽 설정

 

- iptables 사용시

# IKE/NAT-T

iptables -A INPUT -p udp --dport 500  -j ACCEPT

iptables -A INPUT -p udp --dport 4500 -j ACCEPT

 

# L2TP(1701)는 반드시 "IPsec 정책 일치"시에만 허용

iptables -A INPUT -p udp --dport 1701 -m policy --dir in --pol ipsec -j ACCEPT

# 평문(비보호) 1701은 거부(다른 규칙에서 허용되지 않게)

iptables -A INPUT -p udp --dport 1701 -j DROP

 

# L2TP 풀 → 인터넷 NAT (외부 NIC 가정: eth0)

iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o eth0 -j MASQUERADE

iptables -A FORWARD -s 10.10.20.0/24 -o eth0 -j ACCEPT

iptables -A FORWARD -d 10.10.20.0/24 -m state --state ESTABLISHED,RELATED -i eth0 -j ACCEPT

 

- nftables 사용시

nft add table inet vpn

nft 'add chain inet vpn input { type filter hook input priority 0; }'

nft 'add chain inet vpn forward { type filter hook forward priority 0; }'

nft 'add chain inet vpn post { type nat hook postrouting priority 100; }'

 

nft add rule inet vpn input udp dport {500,4500} accept

# 1701은 IPsec 보호 트래픽만

nft add rule inet vpn input udp dport 1701 ipsec in reqid 0x0 accept

nft add rule inet vpn input udp dport 1701 drop

 

nft add rule inet vpn post ip saddr 10.10.10.0/24 oif "eth0" masquerade

nft add rule inet vpn forward ip saddr 10.10.20.0/24 oif "eth0" accept

nft add rule inet vpn forward ip daddr 10.10.20.0/24 iif "eth0" ct state related,established accept

 

 

 

 

9. 동작확인

 

* IPSec 수립 상태

sudo swanctl --list-sas

journalctl -u strongswan-swanctl -n 100 --no-pager

 

* L2TP/PPP

journalctl -u xl2tpd -n 100 --no-pager

ip a | grep ppp

 

 

 

 

10. VirtualBox Guest 운영체제에서 VPN 서버 설치시 Guest OS에서 실행해야할 IPTABLE 규칙

 

WAN=enp0s3

VPNNET="10.10.10.0/24"

 

iptables -F INPUT

iptables -F FORWARD

iptables -t nat -X

 

# L2TP(1701) IPSec 보호 트래픽만 허용

iptables -A INPUT -p udp --dport 1701 -m policy --dir in --pol ipsec -j ACCEPT

iptables -A INPUT -p udp --dport 1701 -j DROP

 

# IPv4 NAT

iptables -t nat -A POSTROUTING -s $VPNNET -o $WAN -j MASQUERADE

 

# Forwarding

iptables -A FORWARD -s $VPNNET -o $WAN -j ACCEPT

iptables -A FORWARD -d $VPNNET -m state --state ESTABLISHED,RELATED -i $WAN -j ACCEPT

 

sysctl -w net.ipv4.ip_forward=1

 

 

 

11. VirtualBox 에서 포트포워딩 규칙

| 규칙    | 프로토콜 | 호스트IP | 호스트포트 | 게스트IP       | 게스트포트 |

| ----- | ---- | ----- | ----- | ----------- | ----- |

| IKE   | UDP  | (비워둠) | 500   | 게스트의 NAT IP | 500   |

| NAT-T | UDP  | (비워둠) | 4500  | 게스트의 NAT IP | 4500  |

 

 

 

댓글목록

등록된 댓글이 없습니다.