ubuntu安装pppoe和基于pppoe的ipv6等服务
环境:ubuntu18.04,接口名ens38
1. 安装pppoe, radvd,dibber服务器
sudo apt install -y pppoe radvd dibbler-server
2. 修改配置文件/etc/ppp/pap-secerts
3. 修改配置文件/etc/ppp/options
4. 添加/etc/ppp/pppoe-server-options文件,并写入以下内容
auth require-pap logfile /var/log/pppd.log +ipv6 ipv6 ::1,::2
5. 创建文件/etc/radvd.conf并将以下内容写入配置文件, ens38为接口名。注意需要使用制表符作为缩进
interface ens38 { AdvSendAdvert on; MinRtrAdvInterval 30; MaxRtrAdvInterval 60; AdvManagedFlag off; AdvOtherConfigFlag on; prefix 2024:1:ff:100::/64 { AdvOnLink on; AdvAutonomous on; AdvRouterAddr off; AdvPreferredLifetime 100; AdvValidLifetime 200; }; RDNSS 2024:1:ff:100::1 2024:1:ff:100::2 { }; };
5.2 拷贝文件
cp /etc/radvd.conf /etc/radvd.conf.bak
6. 修改/etc/dibbler/server.conf,内容如下
# Logging level range: 1(Emergency)-8(Debug) log-level 8 # Don't log full date log-mode short preference 0 iface "ens38" { t1 1800 t2 2700 prefered-lifetime 3600 valid-lifetime 7200 class { pool 2024:1:ff:100::100-2024:1:ff:100::254 } pd-class { pd-pool 2024:1:ff:100::/56 pd-length 60 } option dns-server 2024:1:ff:100::3,2024:1:ff:100::4 }
6.2 拷贝文件
cp /etc/dibbler/server.conf /etc/dibbler/server.conf.bak
7. 修改文件/etc/ppp/ipv6-up,内容如下
#!/bin/sh # These variables are for the use of the scripts run by run-parts. PPP_IFACE="$1" PPP_TTY="$2" PPP_SPEED="$3" PPP_LOCAL="$4" PPP_REMOTE="$5" PPP_IPPARAM="$6" export PPP_IFACE PPP_TTY PPP_SPEED PPP_LOCAL PPP_REMOTE PPP_IPPARAM # The environment is cleared before executing this script. PATH=/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin export PATH # If /var/log/ppp-ipupdown.log exists use it for logging. if [ -e /var/log/ppp-ipupdown.log ]; then exec >> /var/log/ppp-ipupdown.log 2>&1 fi # This script can be used to override the .d files supplied by other packages. if [ -x /etc/ppp/ipv6-up.local ]; then exec /etc/ppp/ipv6-up.local "$@" fi run-parts /etc/ppp/ipv6-up.d \ --arg="$1" --arg="$2" --arg="$3" --arg="$4" --arg="$5" --arg="$6" # if pon was called with the "quick" argument, stop pppd if [ -e /var/run/ppp-quick ]; then rm /var/run/ppp-quick wait kill $PPPD_PID fi /etc/ppp/add_radvd_conf.sh ${PPP_IFACE} /etc/ppp/add_dibbler_conf.sh ${PPP_IFACE}
8. 修改文件/etc/ppp/ipv6-down,内容如下
#!/bin/sh # These variables are for the use of the scripts run by run-parts. PPP_IFACE="$1" PPP_TTY="$2" PPP_SPEED="$3" PPP_LOCAL="$4" PPP_REMOTE="$5" PPP_IPPARAM="$6" export PPP_IFACE PPP_TTY PPP_SPEED PPP_LOCAL PPP_REMOTE PPP_IPPARAM # The environment is cleared before executing this script. PATH=/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin export PATH # If /var/log/ppp-ipupdown.log exists use it for logging. if [ -e /var/log/ppp-ipupdown.log ]; then exec >> /var/log/ppp-ipupdown.log 2>&1 fi # This script can be used to override the .d files supplied by other packages. if [ -x /etc/ppp/ipv6-down.local ]; then exec /etc/ppp/ipv6-down.local "$@" fi run-parts /etc/ppp/ipv6-down.d \ --arg="$1" --arg="$2" --arg="$3" --arg="$4" --arg="$5" --arg="$6" /etc/ppp/del_radvd_conf.sh ${PPP_IFACE} /etc/ppp/del_dibbler_conf.sh ${PPP_IFACE}
9 添加文件/etc/ppp/add_radvd_conf.sh,内容如下
#!/bin/bash
radvd_conf=/etc/radvd.conf
lockfile="/tmp/radvdlock"
tryCount=50
ifname=$1
logfile="/var/log/pppd_ipv6.log"
date=$(date +%Y-%m-%d' '%H:%M:%S.%N | cut -b 1-23)
# 获取前缀号
pd=2024:1:${ifname:3}:100
# 避免开机时同时上线两个以上ppp连接
random=$(( ${ifname:3} % 3))
sleep ${random};
echo "${date}:sleep ${random} to get filelock" >> ${logfile}
#防止多个 ppp 节点同时生成同时操作 radvd 配置文件,故设置文件锁
while [ ${tryCount} -gt 0 ]
do
if [ -e ${lockfile} ];then
sleep 1;
else
echo "${date}:add radvd conf get filelock" >> ${logfile}
touch ${lockfile};
trap "rm -f ${lockfile}; exit" 0 1 2 3 9 15
break;
fi
tryCount=$((${tryCount}-1))
done
if [ ${tryCount} -le 0 ];then
echo "${date}:add radvd conf get filelock ${lockfile} time out." >> ${logfile}
return;
fi
#查找 radvd 配置文件中是否存在对应节点
realstartline=`grep -wn "${ifname}" ${radvd_conf} | cut -d':' -f1`
if [ "a${realstartline}" != "a" ];then
rm -f ${lockfile};
echo "${date}:add radvd conf release filelock, because ${ifname} has exist." >> ${logfile}
return;
fi
# 增加动态节点到 radvd 配置文件
#addconf
echo "interface ${ifname} {" >> ${radvd_conf}
echo " AdvSendAdvert on;" >> ${radvd_conf}
echo " MinRtrAdvInterval 30;" >> ${radvd_conf}
echo " MaxRtrAdvInterval 60;" >> ${radvd_conf}
echo " AdvManagedFlag off;" >> ${radvd_conf}
echo " AdvOtherConfigFlag on;" >> ${radvd_conf}
echo " prefix ${pd}::/64 {" >> ${radvd_conf}
echo " AdvOnLink on;" >> ${radvd_conf}
echo " AdvAutonomous on;" >> ${radvd_conf}
echo " AdvRouterAddr off;" >> ${radvd_conf}
echo " AdvPreferredLifetime 100;" >> ${radvd_conf}
echo " AdvValidLifetime 200;" >> ${radvd_conf}
echo " };" >> ${radvd_conf}
echo " RDNSS 2024:1:ff:100::1 2024:1:ff:100::2" >> ${radvd_conf}
echo " {" >> ${radvd_conf}
echo " };" >> ${radvd_conf}
echo "};" >> ${radvd_conf}
#endconf
# 添加ppp接口地址
ip -6 addr del ${pd}::1 dev ${ifname}
ip -6 addr add ${pd}::1 dev ${ifname}
#添加ppp接口路由
ip -6 ro del ${pd}::/56 dev ${ifname}
ip -6 ro add ${pd}::/56 dev ${ifname}
# 重启radvd
systemctl restart radvd
rm -f ${lockfile}
echo "${date}:add radvd conf release filelock on success ${ifname}" >> ${logfile}
10. 添加文件/etc/ppp/del_radvd_conf.sh,内容如下
#!/bin/bash
radvd_conf=/etc/radvd.conf
lockfile="/tmp/radvdlock"
tryCount=50
ifname=$1
logfile="/var/log/pppd_ipv6.log"
date=$(date +%Y-%m-%d' '%H:%M:%S.%N | cut -b 1-23)
# 获取前缀号
pd=2024:1:${ifname:3}:100
#通过 add 脚本计算一条 ppp radvd 所占行数
add_radvd_file=/etc/ppp/add_radvd_conf.sh
startline=$(grep -n '#addconf' ${add_radvd_file} | cut -d':' -f1)
endline=$(grep -n '#endconf' ${add_radvd_file} | cut -d':' -f1)
if [ "a${startline}" = "a" -o "a${endline}" = "a" ];then
return
fi
cntline=$((endline - startline - 1))
#防止多个 ppp 节点同时生成同时操作 radvd 配置文件,故设置文件锁
while [ ${tryCount} -gt 0 ]
do
if [ -e ${lockfile} ];then
sleep 1;
else
echo "${date}:del radvd conf get filelock" >> ${logfile}
touch ${lockfile};
trap "rm -f ${lockfile}; exit" 0 1 2 3 9 15
break;
fi
tryCount=$((${tryCount}-1))
done
if [ ${tryCount} -le 0 ];then
echo "${date}:${lockfile} time out." >> ${logfile}
return
fi
#查找 radvd 配置文件中是否存在对应节点
realstartline=$(grep -n ${ifname} ${radvd_conf} | cut -d':' -f1)
if [ "a${realstartline}" = "a" ];then
rm -f ${lockfile};
echo "${date}:del radvd conf release filelock, because not find startline ${ifname}" >> ${logfile}
return;
fi
realendline=$((${realstartline} + ${cntline} - 1))
#删除 radvd 配置文件中存在对应节点
echo "${date}:sed -i '${realstartline},${realendline}d' ${radvd_conf}" >> ${logfile}
sed -i "${realstartline},${realendline}d" ${radvd_conf}
# 删除接口地址
ip -6 addr del ${pd}::1 dev ${ifname}
# 删除接口路由
ip -6 ro del ${pd}::/56 dev ${ifname}
systemctl restart radvd
rm -f ${lockfile}
echo "${date}:del radvd conf release filelock, on success ${ifname}" >> ${logfile}
11. 添加文件/etc/ppp/add_dibbler_conf.sh,内容如下
#!/bin/bash
dibbler_conf=/etc/dibbler/server.conf
lockfile="/tmp/dibblerlock"
tryCount=50
ifname=$1
date=$(date +%Y-%m-%d' '%H:%M:%S.%N | cut -b 1-23)
logfile="/var/log/pppd_ipv6.log"
# 获取前缀号
pd=2024:1:${ifname:3}:100
# 避免开机时同时上线两个以上ppp连接
random=$(( ${ifname:3} % 3))
sleep ${random};
echo "${date}:sleep ${random} to get filelock" >> ${logfile}
#防止多个 ppp 节点同时生成同时操作 dibbler 配置文件,故设置文件锁
while [ ${tryCount} -gt 0 ]
do
if [ -e ${lockfile} ];then
sleep 1;
else
echo "${date}:add dibbler conf get filelock" >> ${logfile}
touch ${lockfile};
trap "rm -f ${lockfile}; exit" 0 1 2 3 9 15
break;
fi
tryCount=$((${tryCount}-1))
done
if [ ${tryCount} -le 0 ];then
echo "${date}:add dibbler conf get filelock ${lockfile} time out." >> ${logfile}
return;
fi
#查找 dibbler 配置文件中是否存在对应节点
realstartline=$(grep -n ${ifname} ${dibbler_conf} | cut -d':' -f1)
if [ "a${realstartline}" != "a" ];then
rm -f ${lockfile};
echo "${date}:add dibbler conf release filelock, because ${ifname} has exist." >> ${logfile}
return;
fi
# 增加动态节点到 dibbler 配置文件
#addconf
echo "iface ${ifname} {" >> ${dibbler_conf}
echo " t1 1800" >> ${dibbler_conf}
echo " t2 2700" >> ${dibbler_conf}
echo " prefered-lifetime 3600" >> ${dibbler_conf}
echo " valid-lifetime 7200" >> ${dibbler_conf}
echo " class {" >> ${dibbler_conf}
echo " pool ${pd}::100-${pd}::254" >> ${dibbler_conf}
echo " }" >> ${dibbler_conf}
echo " pd-class {" >> ${dibbler_conf}
echo " pd-pool ${pd}::/56" >> ${dibbler_conf}
echo " pd-length 60" >> ${dibbler_conf}
echo " }" >> ${dibbler_conf}
echo " option dns-server 2024:1:ff:100::3,2024:1:ff:100::4" >> ${dibbler_conf}
echo "}" >> ${dibbler_conf}
echo "" >> ${dibbler_conf}
#endconf
rm -rf /var/lib/dibbler/*
killall dibbler-server
dibbler-server start
rm -f ${lockfile}
echo "${date}:add dibbler conf release filelock on success ${ifname}" >> ${logfile}
12. 添加文件/etc/ppp/del_dibbler_conf.sh,内容如下
#!/bin/bash
dibbler_conf=/etc/dibbler/server.conf
lockfile="/tmp/dibblerlock"
tryCount=50
ifname=$1
date=$(date +%Y-%m-%d' '%H:%M:%S.%N | cut -b 1-23)
logfile="/var/log/pppd_ipv6.log"
#通过 add 脚本计算一条 ppp dibbler 所占行数
add_dibbler_file=/etc/ppp/add_dibbler_conf.sh
startline=$(grep -n '#addconf' ${add_dibbler_file} | cut -d':' -f1)
endline=$(grep -n '#endconf' ${add_dibbler_file} | cut -d':' -f1)
if [ "a${startline}" = "a" -o "a${endline}" = "a" ];then
return
fi
cntline=$(( endline - startline - 1 ))
#防止多个 ppp 节点同时生成同时操作 dibbler 配置文件,故设置文件锁
while [ ${tryCount} -gt 0 ]
do
if [ -e ${lockfile} ];then
sleep 1;
else
echo "${date}:del dibbler conf get filelock" >> ${logfile}
touch ${lockfile};
trap "rm -f ${lockfile}; exit" 0 1 2 3 9 15
break;
fi
tryCount=$((${tryCount}-1))
done
if [ ${tryCount} -le 0 ];then
echo "${date}:${lockfile} time out." >> ${logfile}
return;
fi
#查找 dibbler 配置文件中是否存在对应节点
realstartline=$(grep -n ${ifname} ${dibbler_conf} | cut -d':' -f1)
if [ "a${realstartline}" = "a" ];then
rm -f ${lockfile};
echo "${date}:del dibbler conf release filelock, because not find startline ${ifname}" >> ${logfile}
return;
fi
realendline=$(( realstartline + cntline - 1 ))
#删除 dibbler 配置文件中存在对应节点
echo "${date}:sed -i '${realstartline},${realendline}d' ${dibbler_conf}" >> ${logfile}
sed -i "${realstartline},${realendline}d" ${dibbler_conf}
rm -rf /var/lib/dibbler/*
killall dibbler-server
dibbler-server start
rm -f ${lockfile}
echo "${date}:del dibbler conf release filelock, on success ${ifname}" >> ${logfile}
13. 开启ipv4和ipv6转发,修改文件/etc/sysctl.conf,将net.ipv4.ip_forward=1和net.ipv6.conf.all.forwarding=1之前的注释#去点
14 执行转发立即生效
sudo sysctl -p
15. 添加ipv4 iptables规则
sudo iptables -t nat -A POSTROUTING -s 172.18.1.0/24 -o ens33 -j MASQUERADE # 注意:上述规则重启后失效,需要重新添加,ens33为实际出口网卡
16. 设置ens38 ipv6地址,修改文件/etc/netplan/01-network-manager-all.yaml,内容参考如下
17. 启动服务
sudo systemctl start radvd sudo dibbler-server start pppoe-server -I ens38 -L 172.18.57.142 -R 172.18.57.200 -N 100 -S BRCM
18. 添加到自启动。编辑/etc/rc.local文件,内容如下
# pppoe服务器 iptables -A POSTROUTING -t nat -s 172.18.58.0/24 -o ens38 -j MASQUERADE pppoe-server -I ens38-L 172.18.58.1 -R 172.18.58.100 -N 100 -S BRCM # RA服务器 cp /etc/radvd.conf.bak /etc/radvd.conf systemctl start radvd # dhcpv6 服务器 cp /etc/dibbler/server.conf.bak /etc/dibbler/server.conf dibbler-server start
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤