分类目录归档:OpenWrt

对OpenWRT的研究

openwrt 国内镜像源

原文:https://mirrors.tuna.tsinghua.edu.cn/help/openwrt/

由于某些众所周知的原因,openwrt直接从国外源下载的时候通常都会出现缓慢,短线之类的情况。清华大学的同学十分友好地建立了软件源,如此一来,软件的安装就变得友好了很多~

原文可能是由于字符之类的原因导致命令明显的不对,稍作修正,就得到下方的命令:

cp /etc/opkg/distfeeds.conf /etc/opkg/distfeeds.conf.backup
sed -i 's/downloads.openwrt.org/mirrors.tuna.tsinghua.edu.cn\/openwrt/g' /etc/opkg/distfeeds.conf

完了之后就可以十分愉快地安装软件包了~

在openwrt路由上运行shairplay作为远程音箱

参考:

  1. https://blog.csdn.net/luotong86/article/details/53207387
  2. https://zhuanlan.zhihu.com/p/103121214

因为手里空闲着一条漫步者的M16,现在我又用着iPhone,就想尝试一下airplay,没想道意外的简单,这里做个简单的记录。

首先,使用opkg更新软件包缓存

opkg update

然后,安装kmod-usb-audio:

opkg install kmod-usb-audio

这将安装usb声卡的驱动,如无意外,就可以看到/dev/audio的出现,这意味着系统能够正常识别到声卡。如果没认出来,那可能是系统尚不支持声卡,推荐换一只,毕竟重新移植驱动这种事情还是比较麻烦的,如果官方没有Linux驱动那就更没希望了。

下一步就是安装shairplay:同样非常简单,因为有对应的luci管理界面,顺便装上。

opkg install luci-app-shairplay

接着就可以去网页进行管理了:

这里只要简单的修改一下Airport Name,AO Driver选择alsa,然后勾选上enabled,保存并应用即可。

下一步就能在播放器上选择Airport后,点击播放就能听到音箱响起来啦~

openwrt上使用dnscrypt来处理dns污染

现在dns污染真的很烦人,总是会莫名其妙地遇到然后导致访问失败,折腾了相当久都没有什么好办法。dnsmasq上加上了chinalist,可以搞定国内的大部分域名,大部分CDN也能用,但是国外的地址解析一直都不是很稳定。

试过直接经梯子用国外的dns服务器,但是由于梯子本身的不稳定,上网的体验太差了,动不动就解析不了ip地址。然后经过一番搜索,得知了dnscrypt已经移植到了openwrt上,于是果断已看,还真有。

root@Belkin ~ # opkg list | grep dnscrypt
dnscrypt-proxy - 1.4.3-1 - dnscrypt-proxy provides local service which can be used directly as your local resolver or as a DNS forwarder, encrypting and authenticating requests using the DNSCrypt protocol and passing them to an upstream server. The DNSCrypt protocol uses high-speed high-security elliptic-curve cryptography and is very similar to DNSCurve, but focuses on securing communications between a client and its first-level resolver.

结果装上之后一试,哎呦,速度还可以,也比较稳定,没出现什么经常性的抽风。

安装的过程非常简单,opkg install dnscrypt-proxy之后修改/etc/config/dnscrypt-proxy,只需要取消注释一行就可以用了

config dnscrypt-proxy
    option address '127.0.0.1'
    option port '5353'
    option resolver 'cisco'
    # option resolvers_list '/usr/share/dnscrypt-proxy/dnscrypt-resolvers.csv'
    # option ephemeral_keys '1'

至于可以用的公用解析器,可以参考public DNSCrypt resolvers。

dig了一下,查询时间大概在200-ms,效果良好~

root@Belkin /etc/config # dig youtube.com -p 5353 127.0.0.1

; <<>> DiG 9.9.8-P3 <<>> youtube.com -p 5353 127.0.0.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40410
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;youtube.com.                   IN      A

;; ANSWER SECTION:
youtube.com.            300     IN      A       216.58.203.14

;; Query time: 194 msec
;; SERVER: 127.0.0.1#5353(127.0.0.1)
;; WHEN: Thu Jun 30 23:51:44 CST 2016
;; MSG SIZE  rcvd: 56

;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 6494
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;127.0.0.1.                     IN      A

;; AUTHORITY SECTION:
.                       2158    IN      SOA     a.root-servers.net. nstld.verisign-grs.com. 2016062901 1800 900 604800 86400

;; Query time: 188 msec
;; SERVER: 127.0.0.1#5353(127.0.0.1)
;; WHEN: Thu Jun 30 23:51:44 CST 2016
;; MSG SIZE  rcvd: 113

然后配置dnsmasq,修改/etc/dnsmasq.conf,添加一行

conf-dir=/etc/dnsmasq.d

然后把https://raw.githubusercontent.com/felixonmars/dnsmasq-china-list/master/accelerated-domains.china.conf下载到/etc/dnsmasq.d/,再去修改dnsmasq的转发为127.0.0.1#5353

dnsmasq转发

或者直接修改/etc/config/dhcp

config dnsmasq
    option domainneeded '1'
    option boguspriv '1'
    option localise_queries '1'
    option local '/lan/'
    option domain 'lan'
    option expandhosts '1'
    option authoritative '1'
    option readethers '1'
    option leasefile '/tmp/dhcp.leases'
    option resolvfile '/tmp/resolv.conf.auto'
    option rebind_protection '0'
    list server '127.0.0.1#5353'

在openwrt上使用EAP加密wifi

参考资料:

https://wiki.openwrt.org/oldwiki/wpa2enterprise

http://mailing.unix.freeradius-users.narkive.com/6aB8aIhP/eap-mschap-v2-mschap-failed-no-nt-lm-password-cannot-performauthentication

暂时来说,EAP是起来了,但是还是没搞懂怎么用该死的sql来做储存。而且我根据教程用原版配置文件慢慢改出来的配置超他妈神奇的不能接受localhost的请求,偏偏来自其他机器的请求就能收到,真是理解不能。

废话不多说,直接开始:

 

1:替换掉原有的mini工具包,官方出场的固件自带的不支持EAP。如果没有openssl的话,也顺便装上。

opkg remove wpad-mini hostapd-mini
opkg install wpad hostapd openssl-util

2:安装freeradius

opkg install freeradius2 freeradius2-common freeradius2-democerts freeradius2-mod-always freeradius2-m
od-attr-filter freeradius2-mod-attr-rewrite freeradius2-mod-chap freeradius2-mod-detail freeradius2-mod-eap freeradiu
s2-mod-eap-gtc freeradius2-mod-eap-md5 freeradius2-mod-eap-mschapv2 freeradius2-mod-eap-peap freeradius2-mod-eap-tls
freeradius2-mod-eap-ttls freeradius2-mod-exec freeradius2-mod-expiration freeradius2-mod-expr freeradius2-mod-files f
reeradius2-mod-ldap freeradius2-mod-logintime freeradius2-mod-mschap freeradius2-mod-pap freeradius2-mod-passwd freeradius2-mod-preprocess freeradiu
s2-mod-radutmp freeradius2-mod-realm freeradius2-mod-sql freeradius2-mod-sql-mysql freeradius2-mod-sql-pgsql freeradi
us2-mod-sql-sqlite freeradius2-mod-sqlcounter freeradius2-mod-sqllog freeradius2-utils

可以酌情减掉不需要的部分,这次主要用到的有chap eap-mschapv2 eap-tls files这几个。

3.把全部的配置文件备份起来包括/etc/freeradius2/下面的几个.conf还有sites里面的那个default,通通移到别的地方,因为完全不需要这么臃肿的配置文件(而且我试过用了反而连不上这种糟糕的状况)。然后创建下面几个配置文件

radiusd.conf

prefix = /usr
exec_prefix = /usr
sysconfdir = /etc
localstatedir = /var
sbindir = /usr/sbin
logdir = ${localstatedir}/log/radius
raddbdir = /etc/freeradius2
dictionary = /usr/share/freeradius2/
db_dir = ${raddbdir}/db
libdir = /usr/lib/freeradius2
radacctdir = ${logdir}/radacct
confdir = ${raddbdir}
run_dir = ${localstatedir}/run
listen {
        ipaddr = *
        port = 0
        type = auth
}
thread pool {
        start_servers = 1
        max_servers = 4
        min_spare_servers = 1
        max_spare_servers = 3
        max_requests_per_server = 0
}
$INCLUDE  ${confdir}/clients.conf
modules {
        mschap {
                authtype = MS-CHAP
        }
        $INCLUDE ${confdir}/eap.conf
        mschapv2 {
        }
        files {
                usersfile = ${confdir}/users
                compat = no
        }
}
authorize {
        files
        mschap
        eap
}
authenticate {
        Auth-Type MS-CHAP {
                mschap
        }
        eap
}

clients.conf

client 127.0.0.1 {
        secret          = thisisafuckingsecrectpasswordyoudontknow
        shortname       = localhost
        nastype     = other     # localhost isn't usually a NAS...
}

eap.conf

eap {
        default_eap_type = peap
        timer_expire     = 60
        ignore_unknown_eap_types = no
        cisco_accounting_username_bug = no
        mschapv2 {
        }
        tls {
                rsa_key_length = 2048
                dh_key_length = 1024
                private_key_password = whatever
                private_key_file = ${raddbdir}/certs/radius.key
                certificate_file = ${raddbdir}/certs/radius.crt
                CA_file = ${raddbdir}/certs/radius.crt
                dh_file = ${raddbdir}/certs/dh
                fragment_size = 1024
        }
        peap {
                default_eap_type = mschapv2
        }
}

PS:记得创建证书和dh文件

openssl req -x509 -newkey rsa:2048 -keyout radius.key -out radius.crt -days 3650
openssl dhparam -out dh 1024

user

DEFAULT Group == "disabled", Auth-Type := Reject
 Reply-Message = "Your account has been disabled."
fruser Cleartext-Password := "fruser"
 Reply-Message = "Hello, %{User-Name}",
 Fall-Through = no

PS:如果后面还有其他的用户,Fall-Through就用yes,否则用no

配置文件都写好之后,用 radiusd -XX 来检查服务器是否能够正常工作。如果没问题的话就下一步,如果有问题……自己google吧。

3:修改openwrt的无线设置,选择EAP作为加密方式,就像下面这样

捕获

保存并应用,搞定收工。

新玩具到手,Buffalo WZR-1750DHP

突然发现很久都没折腾过路由了,手上一直上个世代的WZR-HP-AG300H一直服役的很好,有线千兆和150Mbps+300Mbps无线的组合基本上非常够用,文件服务已经转交到一只迷你主机上(给这货上了Windows再加个显示器结果变成了主力机器真是感觉伤不起)。而且这只AG300H还创造过uptime200+日的记录然后被一次停电终结了。

最近开始瞄中这个WZR-1750DHP,128MB的Flash+512MB的RAM+800Mhz的ARM双核感觉堪比那只闲置的RaspberryPi B,但是看到淘宝最低的报价都超过500还是让我一阵犹豫。结果没过多久就看到有家报价报380(当然是二手货),比我3年前入手AG300H(当然还是二手货)的时候还要便宜20,果断入手了。

到手之后发现店主很好心地帮忙把机器固件升到了最新的2.27,这是个非常坑爹的固件,我尝试使用网页刷DD-WRT的时候,告诉我,不能刷到版本比2.27低的固件。坑爹呢这是,我买回来就是要用第三方固件的啊!拿原厂固件这货有个毛用啊,这配置上傻瓜路由固件简直是天大的浪费啊。

在做了大量的Google之后,发现很多人有相同的问题,也有的人表示我这样照刷没问题啊怎么你刷就有问题呢。还有的说你找Buffalo的技术人员就可以啦,然后又有人说这个不行啦,太多人找他们了,然后他们也表示不能再给我们这样搞。找来找去都并没有找到什么靠谱的解决方案。

error_after_227_612

在一阵子不死心之后,我还是没找到刷固件的方法。然后我就想起了之前对AG300H的hack,TTL接口登陆真是个好东西。于是我开始琢磨怎么打开这货。

大概是这货还是比较新的东西,Google上的资料比较少而且需要仔细甄别,在研究了一个小时之后,我发现了这篇还有这篇,才找到了打开盖子的方法(真是纠结)。

给张正面特写(摘自网络,型号不是1750DHP)Opening-3大概是我手艺不精,反正我是和恩山上的那位大大一样,暴力KO了一堆卡扣才打开了盖子,还有中间CPU粘着的散热片是固定在盖子上了,开的时候慢慢来。

打开了之后,照着这篇TTL登陆到CFE然后强行刷掉了原厂固件之后,DD-WRT就搞起来了。

附上Google来的TTL定义wzr1750dhp_3_serial_929

半路上发生了一个诡异的情况,当我跳好TTL后,上电无法开机,只有在启动之后再插上杜邦线,才能正常使用,这令我百思不得其解,不过还是能用于是就先不管了。

不知是天性使然还是我和DD-WRT八字不合,用起来我表示DD-WRT这管理方式非常不习惯,想刷回Openwrt,但是刷回Openwrt之后看起来RC3还是跟wiki里面的RC2一样没有解决无线的问题。这……尼玛死,我要不要刷回DD呢,我现在非常纠结。

pxe启动archlinux的配置字段

参考:http://www.cianmcgovern.com/serving-live-arch-linux-environment-pxe/

另外参照之前关于建立pxe服务器的文章:https://ferrets.space/2014/04/07/%e5%9c%a8%e5%ae%b6%e9%87%8c%e5%81%9a%e4%ba%86%e4%b8%aapxe%e6%9c%8d%e5%8a%a1%e5%99%a8/

其中,pxelinux.cfg/default中关于archlinux启动字段是这样的

LABEL archlinuxlive
menu label Arch Linux Live 64bit
kernel archlinuxlive/arch/boot/x86_64/vmlinuz
append initrd=archlinuxlive/arch/boot/x86_64/archiso.img archisobasedir=arch archiso_nfs_srv=NFS_SERVER_IP:/home/pxeroot/archlinuxlive ip=:::::eth0:dhcp -

不同的linux的append字段都不一样呢

在家里做了个pxe服务器

参考:http://wiki.openwrt.org/doc/howto/tftp.pxe-server

https://wiki.archlinux.org/index.php/NFS_(简体中文)

http://archlinuxarm.org/forum/viewtopic.php?f=31&t=3854

https://wiki.archlinux.org/index.php/Tftpd_server

新到手了只pogoplug,只用来做samba的话感觉稍微有点浪费,偶尔看到了网络启动系统这种东西,于是也想做一个来玩。

材料:一个dhcp服务器,一个tftp服务器,一个nfs服务器。

网上很多教程都是让pxe服务器自己包揽全部工作,这让我不高兴,dhcp这东西就该由openwrt做,文件服务就该让pogo来做,但是网上相关的教程都没有分工的内容,于是看着很多教程,自己研究了一下,终于成功了。

pxe网络拓扑

 

首先,在openwrt上改动一下dnsmasq的配置

/etc/config/dhcp

在末尾加上一段

config boot linux
        option filename 'pxelinux.0'
        option serveraddress 'tftp服务器地址'
        option servername '服务器名称'

至于服务器名称有没有要求……这个没试过,就照着本地的DNS名称填好了。

好了之后,重启dnsmasq,openwrt端的服务就算完成了。

接下来是pogoplug这边:

首先,是tftp服务器。安装tftp-hpa软件包,然后修改

/usr/lib/systemd/system/tftpd.service

中的tftpd根目录

[Unit]
Description=hpa's original TFTP daemon

[Service]
ExecStart=/usr/sbin/in.tftpd -s /srv/tftp/
StandardInput=socket
StandardOutput=inherit
StandardError=journal

先用/srv/tftp/做例子,先去下载https://www.kernel.org/pub/linux/utils/boot/syslinux/syslinux-6.02.tar.gz,然后解压。这里只需要里面的部分文件,包括这些:

syslinux-6.02/bios/core/pxelinux.0
syslinux-6.02/bios/com32/elflink/ldlinux/ldlinux.c32
syslinux-6.02/bios/com32/menu/vesamenu.c32
syslinux-6.02/bios/com32/lib/libcom32.c32
syslinux-6.02/bios/com32/libutil/libutil.c32

讲这几个文件拷贝到/srv/tftp/,然后在/srv/tftp/里面新建一个文件夹,来存放kernel和initrd。例如/srv/tftp/ubuntu,或者直接将ubuntu的镜像文件挂载到/srv/tftp/disks/ubuntu,可以让tftp客户端直接访问到。

然后,新建一个文件夹/srv/tftpd/pxelinux.cfg,在里面新建一个default的配置文件,内容如下:

DEFAULT vesamenu.c32
PROMPT 0
MENU TITLE OpenWRT PXE-Boot Menu

label Ubuntu
        MENU LABEL Ubuntu Live 13.10 64-Bit
        KERNEL disks/ubuntu/casper/vmlinuz.efi
        APPEND boot=casper ide=nodma netboot=nfs nfsroot=192.168.1.1:/mnt/extstorage/tftp/disks/ubuntu1310-64/ initrd=disks/ubuntu/casper/initrd.lz
        TEXT HELP
                Starts the Ubuntu Live-CD - Version 13.10 64-Bit
        ENDTEXT

说明文字可以自行更改,kernel和initrd会通过tftp获取,在获取到kernel和initrd之后,会通过nfs加载系统。

然后启动服务器

systemctl start tftpd.socket tftpd.service

如果需要自启动tftp服务器,则使用

systemctl enable tftpd.socket

至此,tftp服务器配置完成。

然后,是配置nfs服务器:

archlinux的nfs帮助似乎出了点问题,教程不是很完整,在网友的帮助下,发现原来服务没启动完成。

要安装nfs服务,需要安装nfs-utils。

然后,修改/etc/exports,这将会控制那些目录可以被访问,例如新增这段(根据上面pxelinnux的配置):

/mnt/extstorage/tftp/disks/ubuntu1310-64/ 192.168.1.0/24(ro,fsid=0,no_subtree_check)

将会允许192.168.1.*的客户端访问/mnt/extstorage/tftp/disks/ubuntu1310-64/。完成之后,用

systemctl enable nfsd.service rpc-idmapd.service rpc-mountd.service rpcbind.service
systemctl start nfsd.service rpc-idmapd.service rpc-mountd.service rpcbind.service

启动并自启动nfs服务器(吐槽:没密码真的大丈夫?)

配置过程中发生了许多问题,这里给后人稍微提供一下解决的思路:

1:openwrt的dnsmasq配置,有没有指向正确的tftp服务器,tftp服务器能不能访问;

2:nfs服务器的挂载有没有问题。

基本上都是权限或者配置文件出错……折腾了快2天……

在OpenWrt的WiFi上使用非英文字符作为SSID和密码

最近又给同学刷了一只路由,在设置wifi的时候突然来了兴致,不如用中文来做SSID吧~然后就干了,在luci上使用中文写了SSID,然后应用之后,发现luci的页面上能够正确的显示中文,但还到了windows上就变成了一串英文,然后用手机一搜,哟~中文哎。

显然是字符编码的问题了。

总所周知,windows使用的是GB的字符编码,而Linux一般使用的是UTF-8,除非你手动改成了GB。用Linux做底层的Android果然跟随了Linux的步伐,编码使用了UTF-8,而Openwrt的Luci也用的是UTF-8的编码,如此一来,便解释得通了。

用notepad++打开/etc/config/wireless,编码切换到GB,将SSID改成了中文,保存,然后重启WiFi,然后一搜:

中文SSID

果了个然,于是中文的SSID就出来了,别人看到都觉得很惊奇。这时候就可以给你的WiFi一个有趣的SSID,比如之前看到的“网络无法连接”,估计可以让相当一部分的人放弃连接你家WiFi的念头。

另外一件很有趣的事情就是,虽然使用了GB编码的SSID,但是Ubuntu却表示我能够正确的认出中文的SSID,并显示出来。UTF-8编码的中文SSID,Ubuntu同样能够正确地显示中文,这实在太不可思议了。

===========================接下来就是把密码给玩坏===============================

最初的时候,就尝试直接使用GB的编码来写中文密码。ok,windows说他能连上。但是Linux表示我们 UTF-8的编码没法通过密码验证。

问题就来了,怎么办呢?

把密码换成UTF-8如何?

然后Ubuntu就表示,嗯,我们没问题!

中文WiFi密码

啧……这可难办了,难道就没有两者都能兼容的办法么?

然后在来回切换编码的时候,我发现了一个问题,UTF-8转成GB之后是乱码,但是看起来却都是正确的中文字符……要不旧直接用这个乱码来试试连接吧……Windows说:没问题!然后就连上了。

GB编码下的SSID和密码

GB编码下的SSID和密码

UTF-8编码下的SSID和密码

UTF-8编码下的SSID和密码

乱码密码

乱码密码

看来连接是没有问题呢~

也就是说使用GB编码的SSID和UTF-8编码的中文密码是最优的组合~无论linux和windows都可以连接到。

最后就是客人的问题……

移动设备的话估计没什么问题,但是捧着运行着Windows的电脑过来的孩子……有的麻烦了呢……

==============================追加移动设备的研究================================

很可惜的是,android和IOS都可以认出UTF-8编码的SSID,但是无法认出GB编码的SSID,只能看到一串乱码,这个实在是太糟糕了。微软你赶紧投奔UTF-8的怀抱吧。

与此同时,测试了UTF-8编码的密码,Android和IOS都能够使用中文密码来连接,但是IOS在输入密码的时候,只能输入英文字符,所以,需要使用复制粘贴的方法,来完成密码的填写。Android的话,可以强制切换键盘来输入中文。

另外的就是,即使使用中文字符,也必遵循WPA2密码最少8个字符的原则,所以最短密码是八个中文字,而不是4个中文字。

等我以后能装OSX的之后再补上MAC的研究报告。

在Nginx中使用客户端证书认证

其实这个东西很久以前就想搞的了,一直没动手,直到最近总在外面跑,有时候就考虑连回家里,于是稍微动了一下手。

选nginx是因为这个服务器够轻型,做前端最好了,而且做前端的话以前也做过,有经验。

上连接:

http://blog.csdn.net/kunoy/article/details/8239653



http://blog.csdn.net/jinhill/article/details/2573777
签证书什么的感觉略微有点麻烦了,于是果断的用了openvpn的easyrsa,这套脚本帮我很轻松的完成了证书的签署。主要用到了build-ca build-key-server build-key,根据名字就看出来了,生成ca证书,生成服务器证书,生成私有证书。这部分根据不用的系统,生成的证书在不同的位置,详情再自行Google之。我是在openwrt上做的,签好的证书在/etc/easyrsa/keys下。

如果真心想认真学习签证书的话还是去做多点的Google吧。

证书和密钥到手,这时候比较推荐导出一下客户端证书,使用以下命令

openssl pkcs12 -export -inkey client.key -in client.crt -CAfile ca.crt -chain -out client.pfx

就能得到一份可以导入的私有证书了。(暂时我只找到这种笨办法)

 

证书都准备好之后就是服务器的配置了。

先要处理一下openssl.conf,主要是这几行

dir            = /etc/easy-rsa/keys         # top dir  
database       = $dir/index.txt          # index file.  
new_certs_dir  = $dir/newcerts           # new certs dir  

certificate    = $dir/ca.crt         # The CA cert  
serial         = $dir/serial             # serial no file  
private_key    = $dir/ca.key  # CA private key  
RANDFILE       = $dir/.rand      # random number file 

countryName = match  
stateOrProvinceName = match  
organizationName = match  
organizationalUnitName = match  
localityName            = optional  
commonName              = supplied  
emailAddress            = optional

上半部分是证书文件的位置,下半部分是认证哪些内容是相同,自己看着修改。

openssl弄好之后就是重头戏了,nginx本身的配置。

默认的配置文件里有https服务器的实例,参照着就能弄好一个认证服务器端证书的,只要稍微加上几行就能加上私有证书的认证了。

    # HTTPS server

    server {
        listen       443;
        server_name  Router;

	charset utf8;

        ssl                  on;
        ssl_certificate      /etc/easy-rsa/keys/ferrets.imzone.in.crt;
        ssl_certificate_key  /etc/easy-rsa/keys/ferrets.imzone.in.key;

	ssl_client_certificate /etc/easy-rsa/keys/ca.crt; #客户端证书认证所需要的ca证书

        ssl_session_timeout  5m;
        ssl_protocols  SSLv2 SSLv3 TLSv1;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers   on;
	ssl_verify_client on; #启用客户端证书认证

        location / {
            proxy_pass ;
		proxy_redirect default;
        }
		location /transmission {
			proxy_pass ;
			proxy_redirect default;
		}
    }

嗯,像上面一样的配置文件我就是做的代理服务器,转发到192.168.1.1和192.168.1.1:9091,方便远程管理路由和transmission。

感觉一下子强力了好多啊。

openwrt的gre穿透

参考:http://www.openwrt.org.cn/bbs/forum.php?mod=viewthread&tid=1456

最近在另外一台机器上开了一个pptp的VPN,于是重操旧业,折腾起pptp来。
但是有个很蛋疼得问题是,电脑不知为何连不上。同时,iPod使用同一个路由,但是iPod却能连上。

于是研究了半天,后来才知道这个。

后来是用tcpdump在路由上抓包,才发现了这个问题。
顺便贴上以下记录

从wan抓到的包

11:04:10.898392 IP 10.1.12.41.1723 > 10.1.145.203.50116: Flags [S.], seq 450513921, ack 3307070933, win 5840, options [mss 1460,nop,nop,sackOK,nop,wscale 1], length 0
11:04:10.900618 IP 10.1.12.41.1723 > 10.1.145.203.50116: Flags [.], ack 157, win 3456, length 0
11:04:10.907780 IP 10.1.12.41.1723 > 10.1.145.203.50116: Flags [P.], seq 1:157, ack 157, win 3456, length 156: pptp CTRL_MSGTYPE=SCCRP PROTO_VER(1.0) RESULT_CODE(1) ERR_CODE(0) FRAME_CAP() BEARER_CAP() MAX_CHAN(1) FIRM_REV(1) HOSTNAME(local) VENDOR(linux)
11:04:10.911337 IP 10.1.12.41.1723 > 10.1.145.203.50116: Flags [P.], seq 157:189, ack 325, win 3992, length 32: pptp CTRL_MSGTYPE=OCRP CALL_ID(6016) PEER_CALL_ID(52009) RESULT_CODE(1) ERR_CODE(0) CAUSE_CODE(0) CONN_SPEED(100000000) RECV_WIN(64) PROC_DELAY(0) PHY_CHAN_ID(0)
11:04:10.936723 IP 10.1.12.41 > 10.1.145.203: GREv1, call 52009, seq 0, length 37: LCP, Conf-Request (0x01), id 1, length 23
11:04:10.955328 IP 10.1.12.41.1723 > 10.1.145.203.50116: Flags [.], ack 349, win 3992, length 0
11:04:13.956479 IP 10.1.12.41 > 10.1.145.203: GREv1, call 52009, seq 1, length 37: LCP, Conf-Request (0x01), id 1, length 23
11:04:16.963507 IP 10.1.12.41 > 10.1.145.203: GREv1, call 52009, seq 2, length 37: LCP, Conf-Request (0x01), id 1, length 23
11:04:19.972620 IP 10.1.12.41 > 10.1.145.203: GREv1, call 52009, seq 3, length 37: LCP, Conf-Request (0x01), id 1, length 23
11:04:22.982073 IP 10.1.12.41 > 10.1.145.203: GREv1, call 52009, seq 4, length 37: LCP, Conf-Request (0x01), id 1, length 23
11:04:25.990972 IP 10.1.12.41 > 10.1.145.203: GREv1, call 52009, seq 5, length 37: LCP, Conf-Request (0x01), id 1, length 23
11:04:27.115016 IP 10.1.12.41.1723 > 10.1.145.203.50116: Flags [.], ack 373, win 3992, length 0
11:04:28.999748 IP 10.1.12.41 > 10.1.145.203: GREv1, call 52009, seq 6, length 37: LCP, Conf-Request (0x01), id 1, length 23
11:04:32.009025 IP 10.1.12.41 > 10.1.145.203: GREv1, call 52009, seq 7, length 37: LCP, Conf-Request (0x01), id 1, length 23
11:04:34.947339 IP 10.1.12.41.1723 > 10.1.145.203.50116: Flags [.], ack 389, win 3992, length 0
11:04:34.947441 IP 10.1.12.41.1723 > 10.1.145.203.50116: Flags [F.], seq 189, ack 389, win 3992, length 0
11:04:35.950801 IP 10.1.12.41.1723 > 10.1.145.203.50116: Flags [.], ack 390, win 3992, length 0

从lan抓到的包

11:08:17.425044 IP 10.1.14.156.1723 > 192.168.11.9.50131: Flags [S.], seq 1960838183, ack 194080576, win 5840, options [mss 1460,nop,nop,sackOK,nop,wscale 1], length 0
11:08:17.426306 IP 10.1.14.156.1723 > 192.168.11.9.50131: Flags [.], ack 157, win 2920, length 0
11:08:17.437070 IP 10.1.14.156.1723 > 192.168.11.9.50131: Flags [P.], seq 1:157, ack 157, win 2920, length 156: pptp CTRL_MSGTYPE=SCCRP PROTO_VER(1.0) RESULT_CODE(1) ERR_CODE(0) FRAME_CAP() BEARER_CAP() MAX_CHAN(1) FIRM_REV(1) HOSTNAME(local) VENDOR(linux)
11:08:17.444973 IP 10.1.14.156.1723 > 192.168.11.9.50131: Flags [P.], seq 157:189, ack 325, win 3456, length 32: pptp CTRL_MSGTYPE=OCRP CALL_ID(1408)PEER_CALL_ID(22594) RESULT_CODE(1) ERR_CODE(0) CAUSE_CODE(0) CONN_SPEED(100000000) RECV_WIN(64) PROC_DELAY(0) PHY_CHAN_ID(0)
11:08:17.488828 IP 10.1.14.156.1723 > 192.168.11.9.50131: Flags [.], ack 349, win 3456, length 0
11:08:17.494178 IP 10.1.14.156.1723 > 192.168.11.9.50131: Flags [.], ack 373, win 3456, length 0
11:08:41.767662 IP 10.1.14.156.1723 > 192.168.11.9.50131: Flags [.], ack 397, win 3456, length 0
11:08:41.880301 IP 10.1.14.156.1723 > 192.168.11.9.50131: Flags [.], ack 413, win 3456, length 0
11:08:41.882110 IP 10.1.14.156.1723 > 192.168.11.9.50131: Flags [F.], seq 189, ack 413, win 3456, length 0
11:08:42.871931 IP 10.1.14.156.1723 > 192.168.11.9.50131: Flags [.], ack 414, win 3456, length 0

发现有gre的包到了路由那里就没有转发过来了。于是上网查了一下:

解决办法是安装 kmod-gre kmod-ipt-conntrack-extra kmod-ipt-nat-extra iptables-mod-conntrack-extra
然后在防火墙中启用gre的转发

在iptables中打开gre的转发

在iptables中打开gre的转发

之后就能连上了。