兩台 Switch 上皆有 DHCP Server (同網段,使用不同的 IP Range),串接在一起就打架了,有什麼辦法可以串再一起又不會影響彼此的 DHCP ,一開始有想過設定 Vlan + Trunk 來隔開,後來找到另外一種更方便的方式 Switch ACL (Access Control List).
測試環境為 Edge-Core ES4650 (Power by Accton) Layer 3 Switch x 2.
兩台 Switch 串在一起的埠,可以透過 Switch ACL 功能來把 DHCP 協定阻擋 ( Deny , Block) 起來即可.
Firewall configuration
需先把 Filter 功能打開,透過 Web 在 ES4650 / ACL configuration / Filter configuration / Firewall configuration / Switch firewall configuration / Packet filtering 設定為 Open (Firewall default action 預設為 accept),不然在 Attach ACL to port 會顯示以下的錯誤訊息.
Warning: firewall is disable, we can't attach ACL for Port
DHCP IPv4 UDP package
設定前先來了解一下 DHCP 與 BOOTP (Bootstrap Protocol) 使用哪一種協定.
DHCP Client 向 DHCP Server 要求 IP 時主要的四個動作 ( DHCPDISCOVER , DHCPOFFER , DHCPREQUEST , DHCPACK ),如果能看到這四個動作,這就代表 Client 已經成功獲得 IP ,下面 Client 是正確透過 DHCP 獲取 IP 的過程.
15:42:31.013004 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:02:b3:af:b2:82, length 314 15:42:32.013978 IP 192.10.0.2.67 > 192.10.0.20.68: BOOTP/DHCP, Reply, length 300 15:42:32.014176 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:02:b3:af:b2:82, length 320 15:42:32.039599 IP 192.10.0.2.67 > 192.10.0.20.68: BOOTP/DHCP, Reply, length 300
主要 DHCP Client (Port 68 , 使用廣播封包 broadcast ) 與 DHCP Server (Port 67) 透過四個動作 ( DHCPDISCOVER , DHCPOFFER , DHCPREQUEST , DHCPACK ) 來獲得 IP (使用 UDP).
我們只需要把以下兩個 UDP 阻擋起來即可.
- DHCP Client (Source Port 68) 到 DHCP Server (Destination Port 67)
- DHCP Server (Source Port 67) 到 DHCP Client (Destination Port 68)
IP extended ACL
回到 Switch Web 設定 ES4650 / ACL configuration / Name ACL (numeric ACL 一樣可以設定,但名稱須為數字) / Extended name ACL / IP extended ACL.
同一 ALC (name 名稱或是 numeric 數字),可以同時設定多個規則.
- DHCP Client (Source Port 68) 到 DHCP Server (Destination Port 67)
- Operation type : UDP
- List name : DHCP
- Rule : Deny
- Source address type : Any IP
- Destination address type : Any IP
- Source port : 68
- Source port :
- Destination port : 67
- Destination port :
- DHCP Server (Source Port 67) 到 DHCP Client (Destination Port 68)
- Operation type : UDP
- List name : DHCP
- Rule : Deny
- Source address type : Any IP
- Destination address type : Any IP
- Source port : 67
- Source port :
- Destination port : 68
- Destination port :
ip access-list extended DHCP (used 1 time(s)) deny udp any-source s-port 68 any-destination d-port 67 deny udp any-source s-port 67 any-destination d-port 68
Attach ACL to port
回到 Switch Web 設定 ES4650 / ACL configuration / Filter configuration / Attach ACL to port (IP ACL , MAC ACL , MAC-IP ACL 至多只能有一條 ACL ,但一條 ACL 裡面可以有多條規則),依據自行需求的埠來設定.
- Port Ethernet : 1/1
- ACL type : IP
- List name : DHCP
- ACL attached direction : in
- Operation type : Add
設定完成, Port ethernet 1/1 將無法使用 DHCP .可以透過 tcpdump – https://benjr.tw/96904 觀察一下封包,在試過都沒問題之後要記得 Switch basic Configuration / Switch basic configuration / Save current running-configuration Apply Save current running-configuration.
如果只是簡單要避免使用者把自己的 DHCP Server 接上 Switch ,只需針對 DHCP UDP Source Port 67 阻擋起來即可,詳細說明請參考 https://benjr.tw/102036 .
ip access-list extended DHCP (used 1 time(s)) deny udp any-source s-port 67 any-destination
DHCP IPv6 UDP package
作法一樣,只是需要阻擋的 UDP Port (埠) 不一樣.來看一下 Client 端是如何透過 DHCPv6 來獲得 IPv6 的.
類似於 IPv4 的 DHCP ,客戶端主要使用 UDP port 546 而服務器端使用 UDP port 547 .雖類似於 DHCPv4 但不同的是 IPv6 已經不使用 Broadcast 的方式.
假如 Server 的 link-local address 是 fe80::0011:22ff:fe33:5566/64
以及 client 的 link-local address 是 fe80::aabb:ccff:fedd:eeff/64
主要會透過下面的步驟讓 Client 得到 IP (v6).
過程中會使用 IPv6 multicast addresses
ff02::1:2 – All DHCP servers and relay agents on the local network segment (defined in RFC 3315)
|
照上面的設定方式將以下兩個 UDP 埠阻擋起來即可.
- DHCP Client (Source Port 546) 到 DHCP Server (Destination Port 547)
- DHCP Server (Source Port 547) 到 DHCP Client (Destination Port 546)
另外一個與 IPv6 位址分配相關的服務是 RADVD (Router Advertisement Daemon) ,詳情請參考 https://benjr.tw/94906 ,該服務使用 ICMPv6 協定,需一併阻擋起來 (但可能會有其他副作用).
DHCP snooping
Switch 有一個功能是 DHCP snooping 的功能,還沒試過.