Policy based Port routing (manual method) - XIYO/asuswrt-merlin.ng-kr GitHub Wiki

μ†Œκ°œ

이 κ°€μ΄λ“œλŠ” 선택적 포트 (λ˜λŠ” MAC μ£Όμ†Œ) λΌμš°νŒ…μ„ κ΅¬ν˜„ν•˜λŠ” 데 도움을 λ“œλ¦½λ‹ˆλ‹€. VPN (λ˜λŠ” WAN을 ν†΅ν•œ 포트 선택적 λΌμš°νŒ… - 둜컬 ISPλ₯Ό ν†΅ν•œ)

ν•„μˆ˜ μš”κ΅¬ 사항

  • Asuswrt-Merlin ν˜Έν™˜ ARM 기반 λΌμš°ν„° 및 Asuswrt-Merlin v380.xx 이상
  • JFFS νŒŒν‹°μ…˜ ν™œμ„±ν™” 및 포맷
  • λΌμš°ν„°μ—μ„œ μž‘λ™ν•˜λŠ” VPN (VPN이 μž‘λ™ν•˜λŠ”μ§€ μˆ˜λ™μœΌλ‘œ ν…ŒμŠ€νŠΈλ¨)
  • λΌμš°ν„°μ— SSHκ°€ ν™œμ„±ν™”λœ winSCP ν΄λΌμ΄μ–ΈνŠΈ μ„€μ •
  • Notepad ++

μ„€μΉ˜

LAN μž₯치/IP/CIDR λ˜λŠ” λŒ€μƒ IP/CIDR의 μ •μ±… λΌμš°νŒ…μ€ GUIλ₯Ό 톡해 μ‚¬μš©ν•  수 μžˆμ§€λ§Œ, νŽŒμ›¨μ–΄μ—λŠ” Routing Policy Data Base (RPDB) fwmark κ·œμΉ™μ΄ ν¬ν•¨λ˜μ–΄ μžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λ‹€μŒ RPDB fwmarkλ₯Ό 선택적 포트 λΌμš°νŒ…μ— μ‚¬μš©ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

ip rule

0:	from all lookup local
9990:	from all fwmark 0x8000/0x8000 lookup main
9991:	from all fwmark 0x7000/0x7000 lookup ovpnc4
9992:	from all fwmark 0x3000/0x3000 lookup ovpnc5
9993:	from all fwmark 0x1000/0x1000 lookup ovpnc1
9994:	from all fwmark 0x2000/0x2000 lookup ovpnc2
9995:	from all fwmark 0x4000/0x4000 lookup ovpnc3
32766:  from all lookup main
32767:  from all lookup default
```**RPDB** fwmark κ·œμΉ™μ€ 슀크립트 **/jffs/scripts/nat-start** (λ§Œμ•½ **nat-start**κ°€ μ—†λŠ” 경우 [User scripts](https://github.com/RMerl/asuswrt-merlin.ng/wiki/User-scripts) ν•­λͺ© μ°Έμ‘°)에 μ˜ν•΄ μƒμ„±λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

```bash
#!/bin/sh

sleep 10  # λΆ€νŒ… ν”„λ‘œμ„ΈμŠ€ 쀑에 nat-startκ°€ μ—¬λŸ¬ 번 싀행될 수 μžˆμœΌλ―€λ‘œ ν•„μš”ν•©λ‹ˆλ‹€.
# 쀑볡 κ·œμΉ™μ΄ μƒμ„±λ˜μ§€ μ•Šλ„λ‘ ν™•μΈν•©λ‹ˆλ‹€.
for VPN_ID in 0 1 2 3 4 5
   do
      ip rule del prio 999$VPN_ID  2>/dev/null
   done
# RPDB κ·œμΉ™μ„ μƒμ„±ν•©λ‹ˆλ‹€.
ip rule add from 0/0 fwmark "0x8000/0x8000" table main   prio 9990        # WAN   fwmark
ip rule add from 0/0 fwmark "0x7000/0x7000" table ovpnc4 prio 9991        # VPN 4 fwmark
ip rule add from 0/0 fwmark "0x3000/0x3000" table ovpnc5 prio 9992        # VPN 5 fwmark
ip rule add from 0/0 fwmark "0x1000/0x1000" table ovpnc1 prio 9993        # VPN 1 fwmark
ip rule add from 0/0 fwmark "0x2000/0x2000" table ovpnc2 prio 9994        # VPN 2 fwmark
ip rule add from 0/0 fwmark "0x4000/0x4000" table ovpnc3 prio 9995        # VPN 3 fwmark

(좜λ ₯은 본문만)λ˜λŠ” ν•΄λ‹Ή VPN ν΄λΌμ΄μ–ΈνŠΈκ°€ μ‹œμž‘λ  λ•Œ μš”μ²­ μ‹œμ— μΆ”κ°€ν•  수 있으며, VPN ν΄λΌμ΄μ–ΈνŠΈκ°€ μ’…λ£Œλ  λ•Œ μ‚­μ œν•  수 μžˆμŠ΅λ‹ˆλ‹€. (μ˜€ν”ˆVPN 이벀트 트리거 vpnclientX-route-pre-up/vpnclientX-down μ°Έμ‘°)

RPDB fwmarkκ°€ μ •μ˜/ν™œμ„±ν™”λ˜λ©΄, μ§€μ •λœ VPN ν΄λΌμ΄μ–ΈνŠΈλ₯Ό 톡해 μ›ν•˜λŠ” 포트λ₯Ό μ„ νƒμ μœΌλ‘œ λΌμš°νŒ…ν•˜λŠ” μ μ ˆν•œ iptables κ·œμΉ™μ„ μΆ”κ°€ν•˜λŠ” 것이 κ°„λ‹¨ν•©λ‹ˆλ‹€.

예제 1.

Web HTTP/HTTPS (포트 80 및 443) νŠΈλž˜ν”½μ„ 192.168.1.99μ—μ„œ VPN ν΄λΌμ΄μ–ΈνŠΈ 2λ₯Ό 톡해 μ„ νƒμ μœΌλ‘œ λΌμš°νŒ…ν•˜κΈ°

iptables -t mangle -A PREROUTING -i br0 -m iprange --src-range 192.168.1.99 -p tcp -m multiport --dport 80,443 -j MARK --set-mark 0x2000/0x2000

예제 2.

LAN μž₯치 192.168.1.88μ—μ„œ λͺ¨λ“  νŠΈλž˜ν”½μ„ VPN을 톡해 λΌμš°νŒ…ν•˜μ§€λ§Œ RDP μ„œλΉ„μŠ€ (포트 3389)λ₯Ό ν˜ΈμŠ€νŒ…ν•˜λŠ” 경우

iptables -t mangle -A PREROUTING -i br0 -m iprange --src-range 192.168.1.88 -p tcp -m multiport --sport 3389 -j MARK --set-mark 0x8000/0x8000

μ°Έκ³ : WANμ—μ„œμ˜ μˆ˜μ‹  접근을 ν—ˆμš©ν•˜λ €λ©΄ _WAN - Virtual Server / Port Forwarding GUI_μ—μ„œ 포트 3389λ₯Ό ν¬μ›Œλ”©ν•΄μ•Ό ν•©λ‹ˆλ‹€.


GUIλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  포트 ν¬μ›Œλ”©ν•˜κΈ°

예λ₯Ό λ“€μ–΄ WANμ—μ„œ 포트 63389λ₯Ό λ…ΈμΆœμ‹œν‚€κ³  μ‹€μ œλ‘œ λ‚΄λΆ€μ—μ„œ RDP 포트 3389둜 ν˜ΈμŠ€νŒ…λ˜λŠ” 192.168.1.88을 λ…ΈμΆœν•˜λŠ” 경우```bash iptables -t nat -D VSERVER -p tcp -m tcp --dport 63389 -j DNAT --to-destination 192.168.1.88:3389 2> /dev/null iptables -t nat -I VSERVER -p tcp -m tcp --dport 63389 -j DNAT --to-destination 192.168.1.88:3389


***

***예제 3.***

포트 λ²”μœ„λ₯Ό μ§€μ •ν•˜κ³  μ—¬λŸ¬ μ†ŒμŠ€/λŒ€μƒκ³Ό 선택적 포트 λΌμš°νŒ…μ„ κ²°ν•©ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

μ‹­ 개의 LAN μž₯치 (**192.168.1.100**μ—μ„œ **192.168.1.109**κΉŒμ§€ 포함)λŠ” **VPN ν΄λΌμ΄μ–ΈνŠΈ 3**λ₯Ό 톡해 써틴 포트 (**80,443** 및 **54000**μ—μ„œ **54010**κΉŒμ§€ 포함)λ₯Ό μ„ νƒμ μœΌλ‘œ λΌμš°νŒ…ν•©λ‹ˆλ‹€.

iptables -t mangle -A PREROUTING -i br0 -m iprange --src-range 192.168.1.100-192.168.1.109 -p tcp -m multiport --dport 80,443,54000:54010 -j MARK --set-mark 0x4000/0x4000


***예제 4.***

λΌμš°ν„°μ—μ„œ ν˜ΈμŠ€νŒ…λ˜λŠ” μ„œλΉ„μŠ€λ„ **VPN**을 톡해 λΌμš°νŒ…λ  수 있으며, **X**λ₯Ό **VPN** μΈμŠ€ν„΄μŠ€λ‘œ λŒ€μ²΄ν•˜κ³  μ‘μš© ν”„λ‘œκ·Έλž¨μ— ν•„μš”ν•œλŒ€λ‘œ **--sport xxxx/--dport yyyy**λ₯Ό λŒ€μ²΄ν•©λ‹ˆλ‹€.

iptables -t mangle -A OUTPUT -p tcp -m multiport --sport xxxx -j MARK --set-mark 0xX000/0xX000 iptables -t nat -A POSTROUTING -s $(nvram get wan0_ipaddr) -o tun1X -j MASQUERADE


***예제 5.***

**MAC μ£Όμ†Œ** **xx:xx:xx:xx:xx:xx**μ—μ„œ **Web HTTP/HTTPS** (**포트 80** 및 **443**) νŠΈλž˜ν”½μ„ μ„ νƒμ μœΌλ‘œ **VPN ν΄λΌμ΄μ–ΈνŠΈ 2**λ₯Ό 톡해 λΌμš°νŒ…ν•©λ‹ˆλ‹€.

iptables -t mangle -A PREROUTING -i br0 -m mac --mac-source xx:xx:xx:xx:xx:xx -p tcp -m multiport --dport 80,443 -j MARK --set-mark 0x2000/0x2000


예λ₯Ό λ“€μ–΄, 단일 IPSET 선택적 λΌμš°νŒ… κ·œμΉ™μ€ (수천 개의) μ†ŒμŠ€/λŒ€μƒ IP, 포트, MAC 및 도메인을 μ°Έμ‘°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
```bash
iptables -t mangle -A PREROUTING -i br0 -m set --match-set VPN1 src,src,dst -j MARK --set-xmark 0x1000/0x1000

μ—¬κΈ°μ„œ IPSET VPN1은 μ—¬λŸ¬ IPSET(예: 포트 μ „μš© IPSET, μ†ŒμŠ€ IP/CIDR, λŒ€μƒ 포트 IPSET 및 μ†ŒμŠ€ MAC IPSET λ“±)을 포함할 수 μžˆμŠ΅λ‹ˆλ‹€.

μ°Έκ³ : Small Netbuilder νšŒμ› @XentrkλŠ” 선택적 λΌμš°νŒ… 및 LAN ν΄λΌμ΄μ–ΈνŠΈ, OpenVPN ν΄λΌμ΄μ–ΈνŠΈ 및 OpenVPN μ„œλ²„μš© μΆ”κ°€ 선택적 λΌμš°νŒ… κΈ°λŠ₯을 ν¬ν•¨ν•œ IPSET κΈ°μˆ μ„ ν™œμš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. μžμ„Έν•œ μ •λ³΄λŠ” GitHub의 x3mRouting ~ Asuswrt-Merlin νŽŒμ›¨μ–΄μš© 선택적 λΌμš°νŒ…μ„ μ°Έμ‘°ν•˜μ„Έμš”.