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
复制代码

 

posted @   roverqqq  阅读(502)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤
点击右上角即可分享
微信分享提示