Ubuntu 16.04 配置L2TP VPN Server

之前在Ubuntu机器上配置过L2TP VPN Server,参考的是下面这篇文章:

https://raymii.org/s/tutorials/IPSEC_L2TP_vpn_with_Ubuntu_14.04.html

从标题可以看出,这是针对14.04系统的。在升级到16.04之后,我发现其中的openswan软件包不再包含在官方源里了,因此整个配置过程有了变化,为了方便之后再用,我将完整流程记录于此。

整个流程的部分过程仍与上述文章中描述的一样。

1、安装软件包

1
apt-get install strongswan xl2tpd ppp lsof

注意:这里用strongswan替代了openswan

2、配置

修改系统转发配置

1
2
3
4
5
6
7
8
9
echo "net.ipv4.ip_forward = 1" | tee -a /etc/sysctl.conf
echo "net.ipv4.conf.all.accept_redirects = 0" | tee -a /etc/sysctl.conf
echo "net.ipv4.conf.all.send_redirects = 0" | tee -a /etc/sysctl.conf
echo "net.ipv4.conf.default.rp_filter = 0" | tee -a /etc/sysctl.conf
echo "net.ipv4.conf.default.accept_source_route = 0" | tee -a /etc/sysctl.conf
echo "net.ipv4.conf.default.send_redirects = 0" | tee -a /etc/sysctl.conf
echo "net.ipv4.icmp_ignore_bogus_error_responses = 1" | tee -a /etc/sysctl.conf

for vpn in /proc/sys/net/ipv4/conf/*; do echo 0 > $vpn/accept_redirects; echo 0 > $vpn/send_redirects; done

启用配置:

1
sysctl -p

将以下命令添加至 /etc/rc.local ,以在开机时运行:

1
for vpn in /proc/sys/net/ipv4/conf/*; do echo 0 > $vpn/accept_redirects; echo 0 > $vpn/send_redirects; done

配置strongswan (ipsec)

修改 /etc/ipsec.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
version 2 # conforms to second version of ipsec.conf specification

config setup
conn L2TP-PSK-noNAT
authby=secret
#shared secret. Use rsasig for certificates.

auto=add
#the ipsec tunnel should be started and routes created when the ipsec daemon itself starts.

keyingtries=3
#Only negotiate a conn. 3 times.

ikelifetime=8h
keylife=1h

ike=aes256-sha1,aes128-sha1,3des-sha1

type=transport
#because we use l2tp as tunnel protocol

left=%any
#fill in server IP above

leftprotoport=17/1701
right=%any
rightprotoport=17/%any

dpddelay=10
# Dead Peer Dectection (RFC 3706) keepalives delay
dpdtimeout=20
# length of time (in seconds) we will idle without hearing either an R_U_THERE poll from our peer, or an R_U_THERE_ACK reply.
dpdaction=clear
# When a DPD enabled peer is declared dead, what action should be taken. clear means the eroute and SA with both be cleared.

此配置在原文章基础上删除了许多strongswan中已弃用或不支持的项目。另, left=%any 一项表示使用任意服务器地址。若仅针对某一个地址配置的话,可以将 %any 改为相应的地址。

然后配置共享密钥 /etc/ipsec.secrets

1
2
3
4
5
6
# This file holds shared secrets or RSA private keys for authentication.

# RSA private key for this host, authenticating it to any other host
# which knows the public part.

%any : PSK "PASSWORD"

同样,此配置与原文的格式也略有不同,且针对任意server地址。请将“PASSWORD”改为足够安全的长密码。

配置xl2tpd

修改 /etc/xl2tpd/xl2tpd.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[global]
ipsec saref = yes
saref refinfo = 30

;debug avp = yes
;debug network = yes
;debug state = yes
;debug tunnel = yes

[lns default]
ip range = 192.168.100.100 - 192.168.100.200
local ip = 192.168.100.1
refuse pap = yes
require authentication = yes
;ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
length bit = yes

请注意修改ip rangelocal ip这两行。

然后修改 /etc/ppp/options.xl2tpd

1
2
3
4
5
6
7
8
9
10
11
12
13
require-mschap-v2
ms-dns 192.168.1.1
ms-dns 192.168.1.2
auth
mtu 1200
mru 1000
crtscts
hide-password
modem
name l2tpd
proxyarp
lcp-echo-interval 30
lcp-echo-failure 4

注意修改ms-dns为你想要vpn客户端使用的dns server。

添加用户

修改 /etc/ppp/chap-secrets 文件:

1
2
3
4
# Secrets for authentication using CHAP
# client server secret IP addresses
alice l2tpd password1 *
bob l2tpd password2 *

3、运行&测试

执行下述命令以重启服务

1
2
ipsec restart
service xl2tpd restart

然后就使用客户端连接试试吧!
若连接失败,可查看以下log:

1
2
/var/log/syslog
/var/log/auth.log

iRedMail设置:不丢弃垃圾邮件

最近发现在注册某些网站的时候总是会收不到注册邮件,登录到服务器可以看到log中有收到垃圾邮件并丢弃的记录,也就是垃圾邮件会被丢弃,而不是放到Spam(Junk)邮箱中。

照例Google了一下,解决这个问题很简单,只要在 /etc/amavis/conf.d/21-ubuntu_defaults 文件中修改一个配置即可,即将

1
$final_spam_destiny = D_DISCARD;

改为

1
$final_spam_destiny = D_PASS;

然后重启amavis服务即可:

1
sudo service amavis restart

iRedMail设置:防止误判来自Amazon AWS的邮件为非法邮件

有一次注册某个服务时没有收到注册邮件,反复试了几次都没有,也没有进入垃圾邮件,怀疑是iRedMail出了什么问题。于是去服务器上查看log,发现的确有相关的记录:

1
Helo command rejected: ACCESS DENIED. Your email was rejected because the sending mail server appears to be on a dynamic IP address that should not be doing direct mail delivery ……

看来是该网站的地址(应该是使用的Amazon AWS)被识别成了被封禁的动态IP。Google了一下,找到解决方案为修改 /etc/postfix/helo_access.pcre ,将以下行注释掉:

1
/(\d{1,3}[\.-]\d{1,3}[\.-]\d{1,3}[\.-]\d{1,3})/ REJECT ACCESS DENIED. Your email was rejected because the sending mail server appears to be on a dynamic IP address that should not be doing direct mail delivery (${1})

原文:

http://www.iredmail.org/forum/topic8108-iredmail-support-mail-rejected.html

iRedMail设置:邮箱别名、默认接收邮箱等

默认的免费版admin工具不支持一些额外的设置功能,比如别名等。但是这些都可以通过手动修改数据库等方式完成。

邮箱别名及邮件列表

使用如下SQL语句来设置邮箱列表:

1
2
3
4
5
6
sql> USE vmail;
sql> INSERT INTO alias (address, goto, domain, islist) \
VALUES ('original@example.com', \
'user1@example.com,user2@example.com,user1@test.com', \
'example.com', \
1);

这样发送给original@example.com的邮件将会被goto字段所指定的几个邮箱收到。

如果仅是创建一个别名,则goto字段只需要写一个邮件地址(即已存在的原邮件地址),且islist字段设置为0。如:

1
2
3
4
5
6
sql> USE vmail;
sql> INSERT INTO alias (address, goto, domain, islist) \
VALUES ('alias@example.com', \
'user@example.com', \
'example.com', \
0);

更多的设置(权限等)参考以下网址:

http://www.iredmail.org/docs/sql.create.mail.alias.html

默认邮箱

默认邮箱指的是当接收到的邮件收件人不存在时,用来接收的邮箱账号。同样用上述方式进行设置,其中address填写邮件域名(无收件人账号),goto填写用于接收邮件的默认邮箱地址(此账户需存在)。如:

1
2
3
4
5
6
sql> USE vmail;
sql> INSERT INTO alias (address, goto, domain, islist) \
VALUES ('example.com', \
'user@example.com', \
'example.com', \
0);

这样,当收到xxx@example.com的邮件,而xxx账号不存在时,此邮件将会被发送到 user@example.com。

防止邮件地址伪造

为了避免用户在Roundcube中修改自己的发件地址(伪装成其他人),需要修改默认的配置(位于 roundcube目录的config/defaults.inc.php):

1
$config['identities_level'] = 3;

搭建基于iRedMail的邮件服务器

虽说现在企业邮箱解决方案很多,但是作为一个技术死宅,怎么能不自己搭一套玩玩呢。

经过若干小时的研究,发现基于开源软件的邮件解决方案主要有以下三种:

  • Mail-in-a-Box
  • Modoboa
  • iRedMail

其中iRedMail感觉最为完善和成熟。作为企业应用,决定先拿它试验。

其实所有的安装配置过程都可在官网( http://iredmail.org/ )找到,这里汇总一下以便于再次操作。

环境

初始的Ubuntu 14.04 x64环境(已执行apt-get update && apt-get upgrade,但未安装任何服务软件)。

开始安装前需要设置hosts,将服务器完整域名(FQDN)添加至 /etc/hosts 中(FQDN需要在最前面),如(假设我们的服务器域名是 mail.xx.com,邮箱域名是 xx.com):

1
127.0.0.1 mail.xx.com mail

安装

首先下载最新的稳定版本:
http://www.iredmail.org/download.html

解压缩并运行安装脚本:

1
2
3
tar xjf iRedMail-xxx.tar.bz2
cd iRedMail-xxx
sudo bash iRedMail.sh

安装脚本会先更新及安装必须的系统软件,然后显示一个蓝色的界面以询问若干问题。在这里我选择了MySQL作为用户数据库,Nginx作为前端Web Server。

在完成问题之后,脚本会给出一个信息汇总,然后提示继续安装。在继续安装的过程中,还会提示是否启用iRedMail提供的防火墙,同样选择Yes。

安装过程共持续几分钟(取决于网络速度),完成后重启一次系统,即可通过浏览器访问邮箱和管理界面了(地址分别是 https://mail.xx.com/mail https://mail.xx.com/iredadmin)。初始管理账号是 postmaster@xx.com ,密码在安装过程中设置。

配置修改

SSL证书

如果你有购买域名的SSL证书,可在/etc/nginx/conf.d/default.conf中配置以启用。iRedMail默认会生成自签名的证书,使用浏览器打开时会有警告信息。

附件尺寸

默认情况下,附件尺寸不能超过10MB,既然是自己搭的服务,怎么能有此种限制呢!果断改之:

http://www.iredmail.org/docs/change.mail.attachment.size.html

参考以上网址,基本分为三步(假设我们改为100MB)。

1、修改postfix配置

1
2
3
4
sudo postconf -e message_size_limit='104857600'
sudo postconf -e mailbox_size_limit='104857600'

sudo /etc/init.d/postfix restart

2、修改Roundcube限制

先修改php设置(/etc/php5/fpm/php.ini):

1
2
3
memory_limit = 200M;
upload_max_filesize = 100M;
post_max_size = 100M;

然后修改 /opt/www/roundcubemail/.htaccess

1
2
3
php_value    memory_limit   200M
php_value upload_max_filesize 100M
php_value post_max_size 100M

重启服务

1
sudo service php5-fpm restart

3、修改Nginx配置

修改 /etc/nginx/nginx.conf 中的 client_max_body_size

1
client_max_body_size 100m;

重启服务

1
sudo service nginx restart

DNS设置

做完上面这些步骤之后,你的mail server已经可以正常访问和管理了,但是还无法收发邮件。所以这最后一步就是设置DNS。参考地址:
http://www.iredmail.org/docs/setup.dns.html

MX记录

这是邮件服务专用的DNS记录。将其指向你的邮件服务器即可。比如:

1
2
3
NAME            PRIORITY    TYPE    DATA

xx.com. 10 mx mail.xx.com

SPF记录

SPF用于防止别人盗用你的域名发垃圾邮件。一般可用TXT类型的DNS记录来设置:

1
xx.com.   3600    IN  TXT "v=spf1 mx mx:xx.com -all"

DKIM记录

也和垃圾邮件有关,详情看网站说明吧,懒得翻译了 哈哈

首先,需要获取签名信息

1
sudo amavisd-new showkeys

会得到一串类似下面的文本

1
2
3
4
5
6
dkim._domainkey.xx.com.   3600 TXT (
"v=DKIM1; p="
"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYArsr2BKbdhv9efugByf7LhaK"
"txFUt0ec5+1dWmcDv0WH0qZLFK711sibNN5LutvnaiuH+w3Kr8Ylbw8gq2j0UBok"
"FcMycUvOBd7nsYn/TUrOua3Nns+qKSJBy88IWSh2zHaGbjRYujyWSTjlPELJ0H+5"
"EV711qseo/omquskkwIDAQAB")

将子域名 dkim._domainkey 设置为TXT记录,内容为括号中的每一行内容去掉双引号连接起来的字符串。

设置完成后可使用以下命令测试是否正确:

1
sudo amavisd-new testkeys

PTR记录

反向域名解析,即将服务器的IP地址映射到域名。此步骤可选,可降低被认定为垃圾邮件的概率,但是需要联系服务器接入ISP进行设置。

测试

恭喜你,邮件服务器配置完成啦!

你可以先在邮箱界面给自己发个邮件测试一下,如果没有问题的话,再尝试向其他邮箱发信或者收信吧。

如果无法收发邮件,可查看 /var/log/mail.log 看看是否有可用的错误信息。

Ubuntu下使用mdadm更换软RAID1故障硬盘实战

参考文章:

https://www.howtoforge.com/replacing_hard_disks_in_a_raid1_array

背景

最近公司服务器的硬盘坏了一块,当时装系统时做的软RAID1阵列,一共是两块硬盘(sda、sdb),每块硬盘分了4个区,其中三个区用来做RAID,还有一个swap分区。

具体来说,每个硬盘的四个分区分别如下(以sda为例):

1
2
3
4
5
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1 * 2048 156250111 78124032 fd Linux raid autodetect
/dev/sda2 156250112 1328125951 585937920 fd Linux raid autodetect
/dev/sda3 1328125952 1359376383 15625216 82 Linux swap / Solaris
/dev/sda4 1359376384 1953523711 297073664 fd Linux raid autodetect

RAID设备md0、md1和md3分别对应sda1、sda2和sda4。

现在sdb出了故障,查看结果是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid1 sda2[0] sdb2[2](F)
585806656 blocks super 1.2 [2/1] [U_]

md0 : active raid1 sda1[0]
78058368 blocks super 1.2 [2/1] [U_]

md3 : active raid1 sda4[0]
296942400 blocks super 1.2 [2/1] [U_]

unused devices: <none>

可以看到,sdb1和sdb4都找不到了,sdb2处于故障状态。考虑到之前的两个硬盘都用了好几年了,于是决定全都换掉,买了两个新的硬盘(相同容量)。

之前也没有更换的经验,只能Google一下现学现用了。

更换过程

删除旧sdb

首先将故障的硬盘从md设备中移除:

1
sudo mdadm --manage /dev/md1 --remove /dev/sdb2

注:如果想要移除一个正常的设备(没有标记为F),则需要先设为Fail,如下:

1
sudo mdadm --manage /dev/md? --fail /dev/?

更换硬件

关机,并打开机箱,把坏的硬盘拆下,并装入新买的两个硬盘。

开机,进入系统后发现新的硬盘被识别为sdb和sdc。

加入并同步新sdb

首先需要为sdb创建与sda相同的分区表结构,使用以下命令可快速完成:

1
sudo sfdisk -d /dev/sda | sudo sfdisk /dev/sdb

使用 sudo fdisk -l确认分区正确。

然后使用mdadm添加新的设备:

1
2
3
sudo mdadm --manage /dev/md0 --add /dev/sdb1
sudo mdadm --manage /dev/md1 --add /dev/sdb2
sudo mdadm --manage /dev/md3 --add /dev/sdb4

然后观察状态可以看到已经开始同步了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid1 sdb2[2] sda2[0]
585806656 blocks super 1.2 [2/1] [U_]
resync=DELAYED

md0 : active raid1 sdb1[2] sda1[0]
78058368 blocks super 1.2 [2/1] [U_]
[=>...................] recovery = 3.9% (2423168/78058368) finish=15.4min speed=127535K/sec

md3 : active raid1 sdb4[2] sda4[0]
296942400 blocks super 1.2 [2/1] [U_]
resync=DELAYED

unused devices: <none>

几个小时后就都同步完成了:

1
2
3
4
5
6
7
8
9
10
11
12
cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid1 sdb2[3] sda2[2]
585806656 blocks super 1.2 [2/2] [UU]

md0 : active raid1 sdb1[3] sda1[2]
78058368 blocks super 1.2 [2/2] [UU]

md3 : active raid1 sdb4[3] sda4[2]
296942400 blocks super 1.2 [2/2] [UU]

unused devices: <none>

用sdc替换sda

下一步是将还没有挂掉的sda替换成新的硬盘。
首先初始化sdc分区表:

1
sudo sfdisk -d /dev/sda | sudo sfdisk /dev/sdc

接下来的替换过程与之前类似,但是因为sda还处于正常状态,所以在删除之前需要先置为Fail。以下是md0设备的替换过程:

1
2
3
sudo mdadm --manage /dev/md0 --fail /dev/sda1
sudo mdadm --manage /dev/md0 --remove /dev/sda1
sudo mdadm --manage /dev/md0 --add /dev/sdc1

对于md1、md3,用同样的方式操作。若干小时后,两个新硬盘就都正常工作了:

1
2
3
4
5
6
7
8
9
10
11
12
cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid1 sdc2[3] sdb2[2]
585806656 blocks super 1.2 [2/2] [UU]

md0 : active raid1 sdc1[3] sdb1[2]
78058368 blocks super 1.2 [2/2] [UU]

md3 : active raid1 sdc4[3] sdb4[2]
296942400 blocks super 1.2 [2/2] [UU]

unused devices: <none>

启用swap

此时我发现新硬盘的swap分区还没有启用(sdb3和sdc3)。由于分区表是通过sfdisk创建的,swap分区还没有初始化,所以需要使用以下命令:

1
2
3
4
sudo mkswap /dev/sdb3
sudo mkswap /dev/sdc3
sudo swapon /dev/sdb3
sudo swapon /dev/sdc3

然后使用 sudo blkid 获得两个swap分区的UUID,然后替换 /etc/fstab 中原硬盘的swap分区。

更新grub

为了能使系统正常从新硬盘启动,还需要在两个新硬盘上设置grub:

1
2
sudo grub-install /dev/sdb
sudo grub-install /dev/sdc

至此,所有设置均已完成。

使用ShadowSocks搭建局域网翻墙网关(含DNS及路由优化)

出于业务需求,公司需要经常访问Google和Facebook服务,之前使用的各种VPN(PPTP)均不稳定,且速度很慢。经过一番研究,决定试用ShadowSocks(后面简称SS)。

整个环境搭建包括三步,分别是在境外服务器安装SS Server、在局域网网关服务器安装shadowsocks-libev及配置IPTABLES。

以下假设密码使用”password”
本日志描述过程均基于Ubuntu系统

1 在境外服务器安装SS Server

首先,修改系统配置以提升最大连接数量。
修改 /etc/security/limits.conf ,添加或修改如下项目:

1
2
3
4
root soft nofile 999999
root hard nofile 999999
* soft nofile 999999
* hard nofile 999999

编辑 /etc/pam.d/common-sessioncommon-session-noninteractive ,添加如下内容:

1
session required pam_limits.so

修改 /etc/sysctl.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
net.ipv4.ip_local_port_range=1024 65000
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_fin_timeout=15
net.core.netdev_max_backlog=4096
net.core.rmem_max=16777216
net.core.somaxconn=4096
net.core.wmem_max=16777216
net.ipv4.tcp_max_syn_backlog=20480
net.ipv4.tcp_max_tw_buckets=400000
net.ipv4.tcp_no_metrics_save=1
net.ipv4.tcp_rmem=4096 87380 16777216
net.ipv4.tcp_syn_retries=2
net.ipv4.tcp_synack_retries=2
net.ipv4.tcp_wmem=4096 65536 16777216
vm.min_free_kbytes=65536

重启机器。
然后安装SS Server:

1
2
apt-get install python-pip
pip install shadowsocks

启动服务 (并添加至 /etc/rc.local):

1
/usr/local/bin/ssserver -p 443 -k password -m "aes-256-cfb" -d start

2 在网关服务器安装并配置 shadowsocks-libev 和 IPTABLES

注意:以下步骤可能需要翻墙才能访问 -_-
若无法翻墙,可根据网站指示从源码编译 https://github.com/shadowsocks/shadowsocks-libev

1
2
3
4
wget -O- http://shadowsocks.org/debian/1D27208A.gpg | sudo apt-key add -
echo "deb http://shadowsocks.org/debian wheezy main" >> /etc/apt/sources.list
apt-get update
apt-get install shadowsocks-libev

编辑 /etc/shadowsocks.json:

1
2
3
4
5
6
7
8
9
{
"server":"server_ip",
"server_port":443,
"password":"password",
"local_address": "0.0.0.0",
"local": "0.0.0.0",
"timeout":15,
"method": "aes-256-cfb"
}

停止安装的 /etc/init.d/shadowsocks-libev 服务并禁用。

使用以下命令启动redir服务及tunnel服务 (并添加至 /etc/rc.local):

1
2
nohup /usr/bin/ss-redir -c /etc/shadowsocks.json -l 12345 &>> /var/log/ss-redir.log &
nohup /usr/bin/ss-tunnel -c /etc/shadowsocks.json -l 15353 -u -L 8.8.8.8:53 &>> /var/log/ss-tunnel.log &

ss-redir 用于网络流量转发(配合IPTABLES,见下)
ss-tunnel 用于配合DNSKeeper进行DNS请求转发(见下节),如果本地有其他DNS服务的话,请先停止并禁用

3 DNS Keeper

DNS Keeper为一个DNS代理服务器,大致工作原理是根据关键字判断查询的域名是国内还是国外,然后分别查询不同的上游DNS服务器(国外的通过上述15353端口经shadowsocks查询境外DNS服务器)。

DNS Keeper的安装配置方法参见 https://github.com/billtt/dnskeeper

在配置的时候,记得将production.json配置文件的foreignServer设置为本机地址及15353端口,以确保经过shadowsocks。

4 网关服务器上配置IPTABLES

编辑IPTABLES配置文件 (save/restore 文件), 在nat表中添加如下内容

A 表示网关服务器出口(对外)子网地址段
B 表示局域网内网地址段

1
2
3
4
5
6
7
8
9
10
11
12
-N SHADOWSOCKS
-A SHADOWSOCKS -d A -j RETURN
-A SHADOWSOCKS -d B -j RETURN
-A SHADOWSOCKS -d server_ip/32 -j RETURN
-A SHADOWSOCKS -d 0.0.0.0/8 -j RETURN
-A SHADOWSOCKS -d 127.0.0.0/8 -j RETURN

# 中国区IP地址段

-A SHADOWSOCKS -p tcp -j REDIRECT --to-ports 12345
-A PREROUTING -p tcp -j SHADOWSOCKS
-A OUTPUT -p tcp -j SHADOWSOCKS

其中 # 中国区地址段 用以下生成的内容替换,以跳过中国区的流量(不走海外服务器):

1
curl http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest | grep 'apnic|CN|ipv4' | awk -F\| '{ printf("-A SHADOWSOCKS -d %s/%d -j RETURN\n", $4, 32-log($5)/log(2)) }' > cn_rules.conf

以上命令的执行结果保存在文件cn_rules.conf中。

5 多远端管理

如果你像我一样有多个境外服务器(或IP地址),平时经常需要根据服务状况来切换的话,可以安装如下服务以实现在Web快捷切换:

https://github.com/billtt/catapult

Android系统中mount共享文件夹

在Android上挂载(mount)一个CIFS文件系统(就是大家喜闻乐见的网上邻居)是不是很蛋疼?不过我倒是觉得蛮有用的。比如家里有一台装满各种高清电影(别问我怎么收集的,只是举个栗子)的PC,就可以通过这种方法在Android平板上通过Wifi随意播放啦。

以前用过一个叫CifsManager的应用,但是用起来很麻烦,还得自己去找系统对应的ko什么的,就干脆自己用命令行搞了。

首先,你需要root你的Android机器,这一步网上教程多得很。

然后,在设备上装个Terminal,或者使用adb shell,或者你想装ssh server也行,总之就是要能在上面执行脚本。

接着,使用如下命令看看你的系统是否支持cifs:

1
cat /proc/filesystems

如果你在列表里看到cifs就可以继续了,不然…… Google一下吧。

执行如下命令进入root环境:

1
su --mount-master

然后就可以mount了:

1
busybox mount -t cifs //192.168.1.10/share /mnt/cifs/share -o unc=\\\\192.168.1.10\\share,username=xxx,password=xxx

这里假设你的共享路径是 //192.168.1.10/share,用户名和密码自己替换去。

最后,说一下su命令的--mount-master参数。从Android某个版本(好像是4.2?)开始加入了一些限制,使得一个程序mount的目录无法被其他程序看到,而这个mount-master参数就是用来破这个的。至于这个参数在你的系统中是否好使,试试就知道啦。

更新:Lollipop支持

今天把系统升级到Lollipop之后发现从非root用户运行的应用无法访问mount的文件夹了。经过Google,找到原因是SELinux作怪。简单有效的解决方案是,暂时禁用SELinux:

1
setenforce Permissive

当然,为了安全起见,在用完mount之后别忘了恢复:

1
setenforce Enforcing

AWS EC2 添加新IP地址

在Amazon EC2上添加公共IP地址有一点小复杂,写下来备忘:

  1. 在需要添加地址的EC2实例名上右击并选择”Manage Private IP Addresses”
  2. 分配一个新的IP地址(私有IP)并更新
  3. 创建一个新的Elastic IP并关联到那个实例(以及刚创建的私有地址)
  4. 在EC2的实例中运行如下命令(注意以下的地址为第2步中的私有地址)
    1
    ip addr add dev eth0 172.xxx.xxx.xxx
  5. 将相关配置添加到 /etc/network/interfaces.d/eth0.cfg 以持久化:
    1
    2
    3
    4
    # The primary network interface
    auto eth0
    iface eth0 inet dhcp
    up ip addr add dev eth0 172.xxx.xxx.xxx

There you go!