linux inode 占用100%的解决办法

转载~!~!~!~!~!【源】

导语

当你的 Linux 系统无法创建新文件时,有可能是你的磁盘满了,还有可能是你的磁盘的 inode 用光了,我们今天要说的就是后一种情况,要解决这个问题,只能是删除一些文件,但是一般情况下,其实是你的系统中的某个地方产生了大量的你并不需要的文件,你要做的就是找到他们并删除就可以了,我并不是让你删除你有用的文件,因为你一般不会有那么多有用的文件来把系统的 inode 用光。

什么是 inode ?

文件储存在硬盘上,硬盘的最小存储单位叫做”扇区”(Sector)。每个扇区储存512字节(相当于0.5KB)。
操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个”块”(block)。这种由多个扇区组成的”块”,是文件存取的最小单位。”块”的大小,最常见的是4KB,即连续八个 sector组成一个 block。
文件数据都储存在”块”中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为”索引节点”。
每一个文件都有对应的inode,里面包含了与该文件有关的一些信息。

如何查看系统的 innode 占用情况

df -ih

如何查找那个目录下文件最多

首先切到根目录 /

cd /

然后执行

for i in /*; do echo $i; find $i | wc -l; done

Django常用三方库

用了一段时间django了, 备忘下常用的库(这是转载的 我是原地址

核心

  1. Django 这个应该不用多说了吧?
  2. Django-model-utils 如果使用类视图的话,这个库提供了很多有用的Field和Mixin,建议关注
  3. Ipdb 断点调试程序,可以说是pdb的加强版。类似于ipython和python的关系。
  4. Pillow 一款python的图形处理库,替代PIL的。
  5. pip 这个也不多说。
  6. Sphinx 为python程序生成文档的。
  7. MkDocs 如果喜欢markdown语法,可以用这个替代Sphinx,建议关注
  8. virtualenv以及virtualenvwrapper 这两个不多说。

异步

  1. celery 异步任务队列,建议关注
  2. flower 配合celery使用,用于监控。
  3. rq 用于处理后台任务的库,基于redis。
  4. django-rq 一个简单的app,配合rq在django使用。
  5. django-background-tasks 一个基于数据库的异步任务队列

数据库

  1. django-db-tools 这个本人没用过,看说明是设置数据库为只读模式的?
  2. psycopg2 用于操作postgresql数据库,类似于mysql-python。
  3. django-redis 链接redis数据库的。

部署

  1. circus 没用过,作者特意说明这个只有大型程序才有必要使用,命令行程序看进程以及套接字信息的。
  2. dj-database-url 没用过,看说明是简化settings中databases配置的。
  3. django-heroku-memcacheify 没用过,文档说这个是为了部署在heroku上的程序方便设置memcache的。
  4. Fabric 神器,尤其是部署集群的时候,建议关注
  5. Invoke 和fabric类似,支持python3。
  6. Supervisor 神器,除了用来部署django程序,可以干很多事情,建议关注

表单

  1. django-crispy-forms 让人更简单优雅的控制表单样式。
  2. django-foppyforms 和上面的可以搭配使用,完全控制表单样式。
  3. django-forms-bootstrap bootstrap样式的表单。
  4. django-forms-builder 可以控制admin的表单样式。
  5. django-attachments 一款通用的附件上传程序。

日志

  1. logutils 加强了原生的logging。
  2. Sentry 一个在线记录异常的网站。
  3. App Enlight 同上。
  4. Newrelic 功能同上,还包含了性能分析等,收费。类似的还有opbeat。

项目模板

  1. cookiecutter-django 很好很强大,修改了原生的django项目结构,这么做的原因请看书中解释,作者的项目,建议关注
  2. Cookiecutter 上面那个基于这个项目,作者妻子的项目。
  3. django-kevin 类似第一个项目,不过生成的是herlku的结构。
  4. django-herokuapp 同上。

REST APIs

  1. django-rest-framework 不多说了,Django最强大的REST框架。
  2. django-jsonview 一个简单的装饰器,把python对象(列表和字典,类实例能不能自动转本人没试过)转换为json格式返回。
  3. django-tastypie 另一个rest框架,没用过,看起来比第一个简单。
  4. django-cors-headers 解决前端跨域调用问题。
  5. django-rest-framework-jwt 为REST框架提供JWT认证。

安全

  1. bleach 一个简单的白名单。
  2. defusedxml 强制使用xml格式?没用过不多说。
  3. django-autoadmin 自动生成admin密码的。
  4. django-admin-honeypot 一个假的管理后台登录界面,并记录登录操作。
  5. django-axes 同上,记录登录失败行为的。
  6. django-ratelimit-backend 登录速度限制,防暴力破解的。
  7. django-passwords 检测密码强度的。
  8. django-secure 这个比较杂,看文档吧还是。

测试

  1. coverage 这个不多说,建议关注
  2. django-coverage-plugin coverage的django插件,可以用来覆盖测试django的模板,建议关注
  3. django-test-plus 增强了默认的TestCase,建议关注
  4. factory_boy 生成测试数据的库,建议关注
  5. model_mommy 同上。
  6. mock 这个已经集成在Python3.4了。
  7. pytest python测试工具,建议关注
  8. pytest-django 这是一个基于pytest的django插件,建议关注
  9. pytest-cov 把pytest和coverage结合的插件。
  10. pytest-xdist 多进程执行测试。
  11. nose 一个单元测试模块。
  12. pytest-sugar 增强了pytest的提示等。
  13. tox 提供了一个命令行工具自动打包、测试、发布程序,建议关注
  14. Django-debug-toolbar 这个有人不知道麼?调式django程序必备,建议关注
  15. Django-debug-panel 配合上面的使用,可以用来调试ajax一类的json响应。

用户注册

  1. django-allauth 提供了常见的注册和认证方式,比如邮件、twitter、facebook、github、google等。社交支持在我大天朝比较鸡肋。
  2. python-social-auth 同上。
  3. django-authtools 自定义用户模型。

视图

  1. django-braces 如果你使用类视图,强烈建议使用这个库,提供了很多有用的mixin类,建议关注
  2. django-extra-views 提供了很多通用类视图,建议关注
  3. django-vanilla-views 这个替换了django提供的通用类视图,使代码更精简,建议关注

时间

  1. python-dateutil 扩展了python自带的datetime模块。
  2. pytz 如果你被时区坑过,建议使用这个库。

杂项

  1. awesome-slugify 这个库有点意思,表面看处理字符串的,但实际上是处理url的。
  2. unicode-slugify 这个和第一个库类似。
  3. django-autoslug 这个和第一个库类似。
  4. dj-stripe stripe是一个国外支付平台,天朝内没大用。
  5. django-compressor 用于压缩css和js。
  6. django-extensions 包括management命令扩展,数据库字段扩展,admin后台扩展等,建议关注
  7. django-haystack 提供统一的 API 允许你使用不同的搜索后端,包括 Solr, Elasticsearch, Whoosh, Xapian 等等。
  8. django-pipeline 压缩css和js,使用cssmin和jsmin包。
  9. django-htmlmin 压缩html代码的。
  10. django-reversion 类似版本控制,可以记录每次数据变化的情况,以及回滚,建议关注
  11. django-environ 简化settings配置的,建议关注
  12. django-watson 跨表全文检索的,建议关注
  13. django-storages-redux 用来存储图片、文件到不同后端的,比如亚马逊s3或者微软的azure。
  14. envdir 和虚拟环境有关,没用过不多说。
  15. flake8 代码格式化的。
  16. pathlib 这个挺有意思,使用面向对象的方法来处理系统路径。
  17. pip-tools 一个pip命令的扩展。
  18. pyyaml 处理yaml格式数据。
  19. requests 神器,用了这个我再也没用过urllib2库了,建议关注
  20. silk 一个在线django性能检查调优工具,建议关注
  21. Unipath 和12类似,面向对象的方式处理路径。
  22. whitenoise 管理静态文件的,建议关注
  23. pandoc 提供了多种文档格式转换,比如markdown to rst等,建议关注

Linux 下使用 swap file

linux下至少有两种方法可以配置系统的swap.一种是直接格式化一个分区,用这个分区作为swap区.另一种是创建一个文件,swap的内容都丢到文件里面去.

直接格式化的写分区这种操作一般在装机的时候系统安装引导程序就帮忙做了,我只在装arch的时候被教育了下. 大致方法是分区,对这个分区mkswap,然后将这个分区的位置写到/etc/fstab中. 内容类似下面这样.

/etc/fstab
1
/dev/mapper/sae-swap    swap  swap    defaults   0 0

它会在启动的时候自动挂载本分区到swap,不用操心任何事情. 对于比较稳定的,长期使用的swap设置而言,这应当是最好的选择.

但有时候需求有点复杂,比如远程的时候腾出个分区格式化然后挂载虽然不困难,但若有更简单的方法,那个人还是倾向于用简单的.

linux支持使用文件作为swap,然后在线启用或者取消swap.流程很简单.进入root后几步操作就可以搞定.

首先你需要准备一个你想要的大小的文件.比如512MB(也就是1024 * 512MB = 524288 k)

1
# dd if=/dev/zero of=/swapfile1 bs=1024 count=524288

上面这条命令会在/swapfile1这个文件中写上512MB大小的0.它有个很严重的问题–效率. 若我只是开上上面命令的512MB的话,速度还是可以忍受的,但某次我要开上700G的文件,等得花儿都谢了. 我们的目标就是开个足够大的文件而已,另一个可用的命令是fallocate. 命令如下:

1
# fallocate -l 700G /swapfile1

虽然仍然需要等几秒,但速度还是非常快的.

此时文件的读写还是比较开放的,但这样就不安全了.设置文件权限如下:

1
2
# chown root:root /swapfile1
# chmod 0600 /swapfile1

然后,你需要对这个文件格式化一下.命令如下:

1
# mkswap /swapfile1

这样swapfile1就是swap可以接受的格式了.

最后,启用swap.

1
# swapon /swapfile1

这样我们就很容易的得到了一些新的swap空间.

如果我们需要让它每次开机自动挂载swap的话,我们需要编辑/etc/fstab,添加一行内容如下:

1
/swapfile1 none swap sw 0 0

如果我们不想要这个swap,解除也很容易

1
# swapoff /swapfile1

然后我们就可以安全的删除/swapfile1这个文件了.

pip常用指令

列出已安装的包

pip freeze or pip list

导出requirements.txt

pip freeze > <目录>/requirements.txt

安装包

在线安装

pip install <包名>pip install -r requirements.txt

通过使用== >= <= > <来指定版本,不写则安装最新版

requirements.txt内容格式为:

APScheduler==2.1.2
Django==1.5.4
MySQL-Connector-Python==2.0.1
MySQL-python==1.2.3
PIL==1.1.7
South==1.0.2
django-grappelli==2.6.3
django-pagination==1.0.7

安装本地安装包

pip install <目录>/<文件名>pip install --use-wheel --no-index --find-links=wheelhouse/ <包名>

<包名>前有空格

可简写为

pip install --no-index -f=<目录>/ <包名>

卸载包

pip uninstall <包名>pip uninstall -r requirements.txt

升级包

pip install -U <包名>

升级pip

pip install -U pip

显示包所在的目录

pip show -f <包名>

搜索包

pip search <搜索关键字>

查询可升级的包

pip list -o

下载包而不安装

pip install <包名> -d <目录>pip install -d <目录> -r requirements.txt

打包

pip wheel <包名>

更换国内pypi镜像

国内pypi镜像

指定单次安装源

pip install <包名> -i http://pypi.v2ex.com/simple

指定全局安装源

在unix和macos,配置文件为:$HOME/.pip/pip.conf
在windows上,配置文件为:%HOME%\pip\pip.ini

[global]
timeout = 6000
  index-url = http://pypi.douban.com/simple

阿里云安装pip镜像配置

阿里云安装pip

在阿里云上使用默认的pip源的时候,经常出现下载很慢,或者有时候出现根本无法下载的情况。只有加载本地的源才行。

pip镜像列表

pip的镜像可以在这里查看 https://pypi-mirrors.org/

可以看到其中已经有了aliyun的镜像,赶紧点进去看看,发现https的是打不开的,只有选择http的。

http://mirrors.aliyun.com/pypi/simple/

访问这个可以进去看看

这里也推荐可以使用pypi.douban.com 豆瓣的或者 其他的。我的直接在阿里云上所以就直接选择阿里云的镜像了,实测也是最快的,下载速度可以到几M

配置pip配置文件

在root目录下创建文件~/.pip/pip.conf

详细的配置如下:

    [global]
    timeout = 6000
    index-url = http://mirrors.aliyun.com/pypi/simple
    [install]
    use-mirrors=true
    mirrors= http://mirrors.aliyun.com
    trusted-host=mirrors.aliyun.com

安装pip包 enjoy~!

Python命令行自动补全和记录历史命令

~$ cat .pythonstartup 
import os    
import readline    
import rlcompleter    
import atexit    
    
    
#tab completion    
readline.parse_and_bind("tab: complete")    
    
    
#history file    
history_file = os.path.join(os.environ["HOME"],".pythonhistory")    
try:    
    readline.read_history_file(history_file)    
except IOError:    
    pass    
atexit.register(readline.write_history_file,history_file)    
    
    
del os,history_file,readline,rlcompleter

.bashrc中追加

export PYTHONSTARTUP=”/root/.pythonstartup”

source .bashrc使之生效

这样Python命令行就支持自动补全和记录历史命令的功能了

CentOS7下Strongswan架设IPSec-IKEv1, IKEv2, L2TP VPN,适用于 IOS9,OSX, Windows, Linux

VPN 隧道协议PPTP、L2TP、IPSec和SSLVPN(SSTP,OpenVPN)中安全性逐级提高,相应的受到墙的干扰相对要弱点,但是现在我们考虑到跨平台,PPTP穿透力及安全性可以忽略,所以这里搭建支持 ikev1/ikev2 的 Ipsec VPN,适用于iOS、Android、Windows 7+ 、MacOS X,及Linux。为了兼容Windows 7以下的系统,同时搭建L2TP/IPSec支持。

More: Strongswan IKEV2免导入证书配置及调试笔记

最后更新时间:2016.04.08 支持IOS9 IKEV2

温馨提示:这种方法不适合架梯子,GFW干扰太强。

同时GFW对https及Shadowsocks也是能检测到,VPS间歇性的Timeout.

安装 StrongSwan

由于Openswan已经没人维护了,所以我们选择更强大的Strongswan.它是一个完整的2.4和2.6的Linux内核下的IPsec和IKEv1 的实现。它也完全支持新的IKEv2协议的Linux 2.6内核。

StrongSwan 的发行版已包含在 EPEL 源中, 但是CentOS源的包比较旧,所以我们手动在官网https://www.strongswan.org/download.html下载安装包,当然你也可以直接源码编译。

wget http://dl.fedoraproject.org/pub/epel/7/x86_64/s/strongswan-5.3.2-1.el7.x86_64.rpm
rpm -ihv strongswan-5.3.2-1.el7.x86_64.rpm

安装依赖:

#CentOS
yum install -y gmp-devel
#debian/ubuntu
apt-get -y install gcc
apt-get -y install make
apt-get -y install install libgmp10 libgmp3-dev libssl-dev pkg-config libpcsclite-dev libpam0g-dev

编译:

wget http://download.strongswan.org/strongswan.tar.gz
tar xzf strongswan.tar.gz
cd strongswan-*
./configure  --sysconfdir=/etc  --enable-openssl --enable-nat-transport --disable-mysql --disable-ldap  --disable-static --enable-shared --enable-md4 --enable-eap-mschapv2 --enable-eap-aka --enable-eap-aka-3gpp2  --enable-eap-gtc --enable-eap-identity --enable-eap-md5 --enable-eap-peap --enable-eap-radius --enable-eap-sim --enable-eap-sim-file --enable-eap-simaka-pseudonym --enable-eap-simaka-reauth --enable-eap-simaka-sql --enable-eap-tls --enable-eap-tnc --enable-eap-ttls
make && make install

这里需要注意下,官方教程编译configure时没有带这么多参数,我实测如果不带参数,安装成功后,在生成证书的时候,ipsec pki –gen 命令将不会成功,也不会提示任何错误。

配置相关证书

每一个完整的 ssl 证书都有一个公钥和一个私钥。公钥是在网络上传输的,而私钥是藏好用来和接收到的公钥配对的(因此私钥里也有整个公钥,用来配对)。

  1. 生成CA证书的私钥,并使用私钥,签名CA证书
    ipsec pki --gen --outform pem > ca.key.pem
    ipsec pki --self --in ca.key.pem --dn "C=CN, O=VPN, CN=StrongSwan CA" --ca --lifetime 3650 --outform pem >ca.cert.pem

    这里C 表示国家名,同样还有 ST 州/省名,L 地区名,STREET(全大写) 街道名。O 表示组织名。CN 为通用名

  2. 生成服务器证书所需的私钥,并用CA证书签发服务器证书
    ipsec pki --gen --outform pem > server.key.pem  
    ipsec pki --pub --in server.key.pem | ipsec pki --issue --lifetime 1200 --cacert ca.cert.pem \
        --cakey ca.key.pem --dn "C=CN, O=VPN, CN=vpn.linsir.org" \
        --san="1.2.3.4" --san="vpn.linsir.org" --flag serverAuth --flag ikeIntermediate \
        --outform pem > server.cert.pem

    第二句是从我们刚生成的私钥里把公钥提取出来,然后用公钥去参与后面的服务器证书签发。

    - iOS 客户端要求 CN 也就是通用名必须是你的服务器的 URL  IP 地址;
    - Windows 7 不但要求了上面,还要求必须显式说明这个服务器证书的用途(用于与服务器进行认证),–flag serverAuth;
    -  iOS  Mac OS X 要求了“IP 安全网络密钥互换居间(IP Security IKE Intermediate)”这种增强型密钥用法(EKU),–flag ikdeIntermediate;
    - Android  iOS 都要求服务器别名(serverAltName)就是服务器的 URL  IP 地址,–san

    所以这里C、O的值要跟第一步的一致,CN值及–san值是服务器公网地址或url,另外这里可以设置多个–san值。否则会出现错误 13801:IKE身份验证凭证不可接受.

3. 生成客户端证书

ipsec pki --gen --outform pem > client.pem
         ipsec pki --pub --in client.pem | ipsec pki --issue --cacert ca.cert.pem \
        --cakey ca.pem --dn "C=CN, O=VPN, CN=VPN Client" \
        --outform pem > client.cert.pem

这里CO的值要跟第一步的一致

 

  1. 生成 pkcs12 证书 pkcs12 证书用来导入手机或电脑的。
    openssl pkcs12 -export -inkey client.pem -in client.cert.pem -name "VPN Client"\
             -certfile ca.cert.pem -caname "vpn.linsir.org"  -out client.cert.p12

安装证书

把证书复制到strongswan目录下。

cp -r ca.cert.pem /etc/strongswan/ipsec.d/cacerts/
cp -r server.cert.pem /etc/strongswan/ipsec.d/certs/
cp -r server.key.pem /etc/strongswan/ipsec.d/private/

配置StrongSwan

设备/操作系统使用的 ike 版本

  • Linux: 命令行客户端就是 strongswan 本身,因此完美兼容,支持 ikev1/ikev2 和所有加密方法的连接。
  • Android: 只支持 ikev1(没有最新andriod手机,可能已经支持ikev2)。
  • iOS/Mac OS X: IPsec 客户端为自己修改的racoon。它只支持 ikev1,最新的IOS 9 Mac OS X 支持ikev2.
  • Windows: 只在 Windows 7 以后支持ikev2, Win XP需要用l2tp方式。

ipsec.conf

vim /etc/strongswan/ipsec.conf

# ipsec.conf - strongSwan IPsec configuration file
# basic configuration
config setup
    uniqueids=never              #允许多个客户端使用同一个证书,多设备同时在线

#所有项目共用的配置项
conn %default
    keyexchange=ike              #ikev1 或 ikev2 都用这个
    left=%any                    #服务器端标识,%any表示任意
    leftsubnet=0.0.0.0/0         #服务器端虚拟ip, 0.0.0.0/0表示通配.
    right=%any                   #客户端标识,%any表示任意

conn IKE-BASE
    ikelifetime=60m
    keylife=20m
    rekeymargin=3m
    keyingtries=1
    leftcert=server.cert.pem     #服务器端证书
    rightsourceip=10.0.0.0/24    #分配给客户端的虚拟 ip 段

# for IOS9 and Win 7 or later
conn ike2-eap
    also=IKE-BASE
    keyexchange=ikev2
    ike=aes256-sha1-modp1024,aes128-sha1-modp1024,3des-sha1-modp1024!
    esp=aes256-sha256,aes256-sha1,3des-sha1!
    leftsendcert=always
    leftid=vpn.linsir.org
    leftauth=pubkey
    leftfirewall=yes
    rightauth=eap-mschapv2
    rightsendcert=never
    eap_identity=%any
    rekey=no
    dpdaction=clear
    fragmentation=yes
    auto=add

# for IOS, use PSK key
conn IPSec-IKEv1-PSK
    also=IKE-BASE
    keyexchange=ikev1
    fragmentation=yes
    leftauth=psk
    rightauth=psk
    rightauth2=xauth
    auto=add

# for andriod 
conn IPSec-xauth
    also=IKE-BASE
    leftauth=psk
    leftfirewall=yes
    right=%any
    rightauth=psk
    rightauth2=xauth
    auto=add


# for win xp l2tp,use psk
conn L2TP-PSK
    keyexchange=ikev1
    authby=secret
    leftprotoport=17/1701 #l2tp端口
    leftfirewall=no
    rightprotoport=17/%any
    type=transport
    auto=add

这里说明一下:

ike: Win7 is aes256, sha-1, modp1024; iOS is aes256, sha-256, modp1024; OS X is 3DES, sha-1, modp1024

esp: Win 7 is aes256-sha1, iOS is aes256-sha256, OS X is 3des-shal1 iOS支持的IKE为aes256-sha256-modp1024,OS X为3des-sha1-modp1024,Win7为aes256-sha1-modp1024。

注意ESP的顺序与IKE的一致。leftid@后跟着就是服务器证书的CN(Common Name)也是IOS9设置时的远程ID(Remote ID).

具体配置说明可以参考https://zh.opensuse.org/SDB:Setup_Ipsec_VPN_with_Strongswan官方文档

strongswan.conf

vim /etc/strongswan/strongswan.conf

# strongswan.conf - strongSwan configuration file
#
# Refer to the strongswan.conf(5) manpage for details
#
# Configuration changes should be made in the included files

charon {
    load_modular = yes
    duplicheck.enable = no #是为了你能同时连接多个设备,所以要把冗余检查关闭
    compress = yes
    plugins {
        include strongswan.d/charon/*.conf
    }
    dns1 = 223.5.5.5
    dns2 = 8.8.8.8
    # for Windows WINS Server
    nbns1 = 223.5.5.5
    nbns2 = 8.8.8.8
}

include strongswan.d/*.conf

密码认证文件

# /etc/ipsec.secrets - strongSwan IPsec secrets file


: RSA server.key.pem
: PSK "password"
: XAUTH "password"
vpn %any : EAP "password"
wp设备名称\user : EAP "password"  
# 仅对windowsphone8.1设备,设备名称在`设置-关于-手机信息` 中查看

启动Strongswan

ipsec start 
或者
systemctl start strongswan.service

IKEv1,v2就搭建好了,我们配置L2TP/IPSec

L2TP/IPSec

安装 xl2tpd

yum install ppp xl2tpd

如果提示找不到安装包,我们还可以手动下载安装。

wget http://dl.fedoraproject.org/pub/epel/7/x86_64/x/xl2tpd-1.3.6-8.el7.x86_64.rpm
rpm -ihv xl2tpd-1.3.6-8.el7.x86_64.rpm

/etc/strongswan/ipsec.conf

在/etc/strongswan/ipsec.conf最后添加

conn L2TP-PSK
    keyexchange=ikev1
    authby=secret
    leftprotoport=17/1701 #l2tp端口
    leftfirewall=no
    rightprotoport=17/%any
    type=transport
    auto=add

xl2tpd.conf

vim /etc/xl2tpd/xl2tpd.conf

[global]
ipsec saref = no
#listen-addr = 1.2.3.4
port =1701


[lns default]
ip range = 10.0.1.2-10.0.1.254
local ip = 10.0.1.1
require chap = yes
refuse pap = yes
require authentication = yes
name = vpn
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
length bit = yes

这里注意下 ip range不要跟上面的strongswan冲突了,不然会部分上不了网。

options.xl2tpd

vim /etc/ppp/options.xl2tpd

require-mschap-v2
ms-dns 223.5.5.5
ms-dns 223.6.6.6
asyncmap 0
auth
crtscts
lock
hide-password
modem
debug
name l2tpd
proxyarp
lcp-echo-interval 30
lcp-echo-failure 4
mtu 1400
noccp
connect-delay 5000
debug
logfile /var/log/xl2tpd.log

设置用户名,密码

vim /etc/ppp/chap-secrets

# client    server  secret          IP addresses
vpn         *       admin           *

启动xl2tpd

首先添加文件

vim /usr/lib/systemd/system/xl2tpd.service

[Unit]
Description=Level 2 Tunnel Protocol Daemon (L2TP)
After=syslog.target network.target
After=ipsec.service
# Some ISPs in Russia use l2tp without IPsec, so don't insist anymore
#Wants=ipsec.service

[Service]
Type=simple
PIDFile=/run/xl2tpd/xl2tpd.pid
ExecStart=/usr/bin/xl2tpd -D
Restart=on-abort

[Install]
WantedBy=multi-user.target

然后 执行:

systemctl start xl2tpd

配置转发及防火墙

为转发数据包,我们需要开启内核转发。

编辑/etc/sysctl.conf

net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0

然后sysctl -p使之生效。

ipatables

iptables -A INPUT -p esp -j ACCEPT
iptables -A INPUT -p udp --dport 500 -j ACCEPT
iptables -A INPUT -p udp --dport 4500 -j ACCEPT
# L2tp
iptables -A INPUT -p udp -m udp --dport 1701 -j ACCEPT
# 转发规则
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o enp7s0f0 -j MASQUERADE

注意 CentOS 网卡名称,我这里是enp7s0f0,而有的是eth0,具体根据实际情况来,另外有多网卡的,需要自己根据实际情况来设置iptables转发规则。

开机启动

systemctl enable xl2tpd
systemctl enable strongswan

客户端配置及连接及测试

win7

导入证书

新建一个内容如下的bat批处理文件,然后把ca.cert.pem放在同一目录下,然后右键管理员运行。

@echo off
@setlocal enableextensions
@set current_dir="%~dp0"
@cd /d "%current_dir%"
@echo %current_dir%
@certutil -addstore root ca.cert.pem
if %ERRORLEVEL% EQU 0 @echo not ok
pause

然后新建vpn即可。

注意:win8 win10 Ikev2有bug tcp/ip协议不能设置属性,关闭远程网关,我的连接上之后,需要自己手动添加路由表。 Win10系统VPN连接IPV4属性无法打开,需要关闭远程网关解决方法

http://www.nicklitten.com/blog/how-fix-windows-10-problem-vpn-failed-initialize-connection-subsystem-cisco-anyconnect

经测试,win8+使用证书登录的穿透性很差,而使用ca证书+EAP账号密码认证,连接速度很快,而且稳定。

iOS/Mac

把 CA 证书发邮件给自己,。在 iOS 上收邮件,导入两者注意是两个证书,一定要导入CA,或者后者不能使用,然后新建 IPSec VPN

在这里可以使用四种方式建立VPN:

  1. IPSec+EAP
    • 服务器是 IP 或都是 URL
    • 账户和密码填 ipsec.secrets 里 EAP 前后的那两个
    • 密钥输入 ipsec.secrets 里设置的 PSK 密码。
  2. IPSec+证书
    • 服务器是 IP 或都是 URL
    • 账户和密码填 ipsec.secrets 里 EAP 前后的那两个(XAUTH的那个密码也行)
    • 勾选使用证书并选择之
  3. L2TP
    • 服务器是 IP 或都是 URL
    • 账户和密码填 etc/ppp/chap-secrets 里的
    • 密钥输入 ipsec.secrets 里设置的 PSK 密码。
  4. IEKV2(IOS9) 首先是导入服务器ca.cert.pem证书,在设置-通用-描述文件中可以查看
    • 类型 IKEv2
    • 服务器是 IP 或都是 URL
    • 远程ID是 IP 或都是 URL
    • 账户和密码填 ipsec.secrets 里 EAP 前后的那两个

Android

IPSec Xauth PSK

IPSec 预共享密钥:写 ipsec.secrets 里 PSK 后面的那个密码.

调试

服务器端的日志就足够检测出绝大多数问题的来源。

tail -f /var/log/strongswan-charon.log
or
tail -f /var/log/syslog #debian
tail -f /var/log/messages #centos

或者直接

journalctl -f

粗暴观察。

扩展

  • FreeRadius:账户认证和计费
  • daloRadius:用户账单管理

遇到的坑:

Dec 16 15:41:53 debian charon: 09[NET] sending packet: from *.*.*.*[4500] to *.*.*.*[4500] (1180 bytes)
Dec 16 15:42:23 debian charon: 13[JOB] deleting half open IKE_SA after timeout

一直报这样子的错误,甚至我重新编译升级StrongSwan5.3.3到5.3.5,放狗搜索半天,https://ttz.im/2015/10/1335 这个哥们成功了,可是我一样的配置还是不行,搞得我都装了个freeRadius来测试了。

最后才发现上次手机刷机之后,ca证书已经不存在了。导入,就成功!

关于freeRadius的可以参考这个链接:

http://freeradius.akagi201.org/index.html

参考链接:

 

linux磁盘满时,如何定位并删除文件

@1.一般情况
一般情况下先df看一下,然后cd到要满的盘,执行:
du -shx *
这样可以列出所有文件夹的大小(x参数会去除掉mount上去的目录,如samba挂上去的盘,这会干扰统计的)
进去如果有子文件夹,那就继续执行du -shx * 一级一级地找
@2.特殊情况(有文件被删除,却被某进程占用,并且还在写)
这种情况的表现是,用1中的方法无法找到占用磁盘的文件,而且du -shx整个盘得到的结果和df的结果差别很大,那肯定是有文件被删除,但被进程占用,而且还在写。这样的被删除文件仍然会占用磁盘,被写入时,空间自然下降了,这种情况用前面的方法是无法找到文件的。
方法:
lsof | grep deleted
这样就可以找到被删除的却还被进程占用的文件了,进程也被列出,把相关的进程重启一遍,空间就被释放了。