DHCP 客户端脚本

# Install packages 
opkg update
opkg install tcpdump
 
# Capture DHCP traffic
tcpdump -evni any udp port 67 & \
sleep 5; \
killall -SIGUSR1 udhcpc; \
sleep 5; \
killall tcpdump
 
# Capture DHCPv6 traffic
tcpdump -evni any udp port 547 & \
sleep 5; \
killall -SIGUSR1 odhcp6c; \
sleep 5; \
killall tcpdump

参阅 通过DHCP提供ISP DNS, 热插拔

# Logging DHCP client
cat << "EOF" > /etc/udhcpc.user.d/00-logger
logger -t ${0##*/} ${@} $(env)
EOF
 
# Logging DHCPv6 client
cat << "EOF" > /etc/odhcp6c.user.d/00-logger
logger -t ${0##*/} ${@} $(env)
EOF
 
# Fetching new leases
ifup wan
ifup wan6
 
# Reading logs
logread -e dhcp.script
logread -e dhcpv6.script
 
# Checking status
ifstatus wan
ifstatus wan6

更新默认路由。

cat << "EOF" > /etc/udhcpc.user.d/30-default-route
DHCPC_EVENT="${1}"
DHCPC_IF="${interface}"
DHCPC_GW="${router}"
case ${DHCPC_EVENT} in
(bound|renew) ;;
(*) exit 0 ;;
esac
ip route delete default dev "${DHCPC_IF}"
ip route add default via "${DHCPC_GW}" dev "${DHCPC_IF}"
EOF

更新IPv6默认路由。

cat << "EOF" > /etc/odhcp6c.user.d/30-default-route
DHCPC_EVENT="${2}"
DHCPC_IF="${INTERFACE}"
DHCPC_GW="${SERVER}"
case ${DHCPC_EVENT} in
(bound|informed|updated|rebound|ra-updated) ;;
(*) exit 0 ;;
esac
ip -6 route delete default dev "${DHCPC_IF}"
ip -6 route add default via "${DHCPC_GW}" dev "${DHCPC_IF}"
EOF

更新DHCP服务器路由。

cat << "EOF" > /etc/udhcpc.user.d/30-dhcp-route
DHCPC_EVENT="${1}"
DHCPC_IF="${interface}"
DHCPC_SERV="${serverid}"
case ${DHCPC_EVENT} in
(bound|renew) ;;
(*) exit 0 ;;
esac
ip route delete "${DHCPC_SERV}" dev "${DHCPC_IF}"
ip route add "${DHCPC_SERV}" dev "${DHCPC_IF}"
EOF

通过DHCP宣告ISP DNS服务器。

cat << "EOF" > /etc/udhcpc.user.d/50-isp-dns
DHCP_POOL="lan"
DHCPC_EVENT="${1}"
DNS_SERV="${dns}"
case ${DHCPC_EVENT} in
(bound|renew) ;;
(*) exit 0 ;;
esac
for DHCP_POOL in ${DHCP_POOL}
do DHCP_OPT="$(uci -q get dhcp.${DHCP_POOL}.dhcp_option)"
for DHCP_OPT in ${DHCP_OPT}
do case ${DHCP_OPT%%,*} in
(6|option:dns-server)
uci del_list dhcp.${DHCP_POOL}.dhcp_option="${DHCP_OPT}" ;;
esac
done
uci add_list dhcp.${DHCP_POOL}.dhcp_option="6,${DNS_SERV// /,}"
done
uci commit dhcp
/etc/init.d/dnsmasq restart
EOF

重新连接您的客户端以应用更改。

通过DHCPv6通告IPv6 ISP DNS服务器。

cat << "EOF" > /etc/odhcp6c.user.d/50-isp-dns
DHCP_POOL="lan"
DHCPC_EVENT="${2}"
DNS_SERV="${RA_DNS} ${RDNSS}"
case ${DHCPC_EVENT} in
(bound|informed|updated|rebound|ra-updated) ;;
(*) exit 0 ;;
esac
for DHCP_POOL in ${DHCP_POOL}
do uci -q delete dhcp.${DHCP_POOL}.dns
for DNS_SERV in ${DNS_SERV}
do uci add_list dhcp.${DHCP_POOL}.dns="${DNS_SERV}"
done
done
uci commit dhcp
/etc/init.d/odhcpd restart
EOF

重新连接您的客户端以应用更改。

假设您的互联网服务提供商(ISP)通过DHCP提供动态IP地址。 不断重新连接,直到获得与特定正则表达式匹配的IP地址。 重新连接之间延迟10秒。

cat << "EOF" > /etc/udhcpc.user.d/10-wan-ipaddr
WAN_ADDR="${ip}"
case ${WAN_ADDR} in
(??.???.*) exit 0 ;;
esac
sleep 10
ifup ${INTERFACE}
EOF

自动解决 WAN/LAN 子网冲突。 如果 WAN/LAN 重叠,则更改 LAN 子网。

cat << "EOF" > /etc/udhcpc.user.d/10-lan-ipaddr
WAN_ADDR="${ip}"
LAN_IF="lan"
LAN_ADDR="$(uci -q get network.${LAN_IF}.ipaddr)"
case ${WAN_ADDR} in
(192.168.*) NEW_ADDR="172.16.1.1" ;;
(*) NEW_ADDR="192.168.1.1" ;;
esac
case ${NEW_ADDR} in
(${LAN_ADDR}) exit 0 ;;
esac
uci set network.${LAN_IF}.ipaddr="${NEW_ADDR}"
uci commit network
ifup ${LAN_IF}
EOF
  • Last modified: 2025/09/11 08:22
  • by starsfall