vpn包含ipsec,pptp,l2tp
本文主要描述开发ipsec和pptp的基本流程和遇到的问题:
一、开发大致流程:
1、选中内核驱动并添加内核模块的支持:
pptp:
insmod slhc.ko
insmod slip.ko
insmod arc4.ko
insmod ecb.ko
insmod ppp_generic.ko
insmod sha1_generic.ko
insmod ppp_deflate.ko
insmod ppp_mppe.ko
insmod pppox.ko
insmod pppoe.ko
insmod crc-ccitt.ko
insmod ppp_async.ko
ipsec:
insmod /mnt/mod_ipsec/slhc.ko
insmod /mnt/mod_ipsec/slip.ko
insmod /mnt/mod_ipsec/arc4.ko
insmod /mnt/mod_ipsec/ecb.ko
insmod /mnt/mod_ipsec/af_key.ko
insmod /mnt/mod_ipsec/ah4.ko
insmod /mnt/mod_ipsec/esp4.ko
insmod /mnt/mod_ipsec/ipt_ah.ko
insmod /mnt/mod_ipsec/xt_esp.ko
insmod /mnt/mod_ipsec/ppp_generic.ko
insmod /mnt/mod_ipsec/sha1_generic.ko
insmod /mnt/mod_ipsec/ppp_deflate.ko
insmod /mnt/mod_ipsec/ppp_mppe.ko
insmod /mnt/mod_ipsec/pppox.ko
insmod /mnt/mod_ipsec/pppoe.ko
insmod /mnt/mod_ipsec/crypto_null.ko
insmod /mnt/mod_ipsec/crc-ccitt.ko
insmod /mnt/mod_ipsec/ppp_async.ko
mknod /dev/ppp c 108 0
insmod /mnt/mod_ipsec/arp_tables.ko
insmod /mnt/mod_ipsec/ipt_REDIRECT.ko
insmod /mnt/mod_ipsec/iptable_raw.ko
insmod /mnt/mod_ipsec/tunnel4.ko
#insmod /mnt/mod_ipsec/xfrm4_mode_beet.ko
#insmod /mnt/mod_ipsec/xfrm4_mode_transport.ko
#insmod /mnt/mod_ipsec/xfrm4_mode_tunnel.ko
#insmod /mnt/mod_ipsec/xfrm4_tunnel.ko
insmod /mnt/mod_ipsec/ipsec.ko
insmod /mnt/mod_ipsec/pppol2tp.ko
insmod /mnt/mod_ipsec/xfrm_user.ko
insmod /mnt/mod_ipsec/xfrm_ipcomp.ko
2、执行文件:pppd、chat、pppdump、pptp、xl2tpd、ipsec、ip-up ip-down
3、添加脚本自动执行;
二、遇到的问题:
1、设备无法Ping通facebook.com等地址;
2、手机连上设备后,无法上网;
3、手动修改配置文件,将reslov.conf和udhcpd.conf的dns改为8.8.8.8和8.8.4.4后,设备和手机均可正常访问;
三、解决方法:
1、修改自动执行的脚本,添加如下:
cp /etc/udhcpd.conf /etc/udhcpd.conf.bak
sed '/option dns/coption dns 8.8.8.8' /etc/udhcpd.conf >/etc/udhcpd.conf.tmp
cp /etc/udhcpd.conf.tmp /etc/udhcpd.conf
killall -9 udhcpd
udhcpd /etc/udhcpd.conf
cp /etc/resolv.conf /etc/resolv.conf.bak
echo nameserver 8.8.8.8 > /etc/resolv.conf
echo nameserver 8.8.4.4 >> /etc/resolv.conf
iptables -A POSTROUTING -t nat -o ppp+ -j MASQUERADE
2、由于pppd会自动调用ip-up和ip-down脚本,所以修改ip-up和ip-down也可达到目的;
四、问题导致:
1、 无线接口过来的dns数据包,被路由到ppp0接口,再到eth0接口;通过ppp0的p2p到达vpn的对端;
2、当dns为192.168.199.1时,地址到达vpn服务器后,此地址为内网地址,无法解析出dns的域名地址;
3、当改为8.8.8.8后,则到了vpn服务器后就可以访问该国外的域名服务器,正确解析IP地址并实现上网;
五、对数据包ppp0和vlan的理解:(开发的流程和做法跟人用眼睛观察然后读取信息再去做处理是一样的,并没有其他更神奇和捷径的方法)
数据包在二层和三层的区别:
1、第二层和第三层的区别主要是第二层在br桥上面,无法在br桥上面找到要访问的ip地址,就认为要访问到第三层;但第二层和第三层在从物理上来讲,都是物理接口,没什么区别;从软件的协议栈来讲,第二层到第三层就是状态机的一个转换,即代码执行一个if 语句的另一个分支代码;
2、当在本地局域网内的主机或路由器 经过路由器时,此时数据包均在第二层,特别是访问路由器的配置页面时,在第二层做判断,如果上input则将数据包放过,并流向路由器的httpd监听的端口,并将数据传输到http应用层做处理;
3、当要访问外网时,则会将数据包转到第三层的代码分支上;并根据Iptables到相应的接口;故ppp0和vlan放在实际物理接口之上,在数据包要从物理接口时候,会在代码处出物理接口之前,加上ppp0要传输的数据或者是vlan头;再加上物理层的以太网包头,然后从物理接口出去。
閱讀更多 北漂壯小夥 的文章