Archive for the 主机网络 Category

家庭级无墙网络方案

有没有想过将翻墙这一行为在路由器端完成,这样一来下游的所有接入设备就自然处于无墙的网络环境了,答案是肯定的,本文作为抛砖引玉来浅层次探讨,技术细节不在讨论范围之内。

目前最成熟和稳定的翻墙方法是VPN,但市面上的路由器几乎都不提供VPN的连接功能,好在有一个叫做DD-WRT的第三方路由器固件,我们可以通过刷机的方法来将自己的路由器固件升级为DD-WRT,以获得包括VPN连接在内的多种客制化功能。以实用性为出发点,基于VPN的无墙网络方案有两种:

DD-WRT是一个基于linux的开源路由器固件,提供VPN,OpenVPN,无线中继,QoS流量控制,甚至增大发射功率等等功能。并且你可以telnet或是ssh登陆DD-WRT,执行各种命令或是hack。包括TP-Link, D-Link, Buffalo, Cisco Linksys在内的不少路由器已经支持刷DD-WRT固件,这里是详细的设备支持列表

第一种方案属于技术型,需要自己手动给路由器升级固件,配置autoddvpn:

技术架构:VPN + DD-WRT + autoddvpn

将路由器升级至DD-WRT固件以支持VPN连接功能后,即实现了全局VPN上网,但全局VPN有个问题:一旦连上VPN,下游设备的所有流量都会路由到VPN线路上,也就是上国内的网站也需要到美国(以美国为例,严格来说是VPN所在地)去绕一圈,浪费VPN流量事小,还会影响到上国内网站的速度,解决这个恼人问题的项目叫做autoddvpn,你需要做的仅仅是在浏览器上登陆路由器的管理页面,在防火墙的页面上添加一行命令,然后保存。autoddvpn 的原理是,按IP地址的物理属性进行路由,即所有中国大陆的IP地址直接走本地网关,其余的则全部走VPN通道。

资金投入:支持DD-WRT的家用(无线)路由器,200元左右;VPN,目前的市价约为150元每年。

第二种方案属于懒人型,你只需要掏钱而已:

国内已经有团队将整套翻墙方案集成到家用路由器里面,提供一条龙的完美无墙网络,做这个事情的是威众安全路由器。你只需要购买他们的路由器,然后以年为单位支付服务费用,其余所有问题都不用你操作和担心。值得推荐的是,威众安全路由器除适合家庭环境外,也相当适合咖啡馆或是小型公司。

资金投入:官方公布的标准版价格是360元每台,包括一年的服务费用。

AWS EC2 Sendmail 域名配置

sendmail是Linux下优秀的邮件系统,因为aws ec2使用的是动态DNS,在不做设定的情况下,sendmail发出邮件的邮箱源地址形如 ec2-user@domu-12-31-39-0c-71-51.compute-1.internal 这种地址几乎会被所有的邮箱认定为SPAM。

配置sendmail使用自己的域名分两步,修改sendmail的配置文件和添加域名MX记录。

sendmail 可以直接使用 “–r account@domain.com” 参数来以任意源地址发送邮件,但目前主流的邮箱都会将源地址和反向解析IP进行比较,如果解析不到或是解析的IP不匹配,轻则将邮件直接归为SPAM,严重的就直接拒绝接收。

MX记录(Mail Exchanger Record)主要是接收邮件时使用,即当投递一封新邮件时,会查询收件人域名的MX记录,然后通过MX记录得到的IP地址进行投递。同时邮件厂商在接收邮件的时候也会将源地址和MX记录进行比较,作为垃圾邮件的判断标准之一。

第一步:sendmail配置文件修改,配置文件所在目录为/etc/mail,使用域名以ph6.org为例子

1. 将域名加入到local-host-names文件

cat local-host-names
ph6.org

2. 修改 submit.cf 文件

找到行 #Dj$w.Foo.COM
修改为 Djph6.org

至此,sendmail 配置完毕,使用如下命令来重启使配置生效。

sudo service sendmail restart

第二步:添加域名MX记录

找到修改域名信息的页面(不同的域名注册商页面不相同),修改结果因域名商的不同最迟会在24小时内生效。

1. 添加域名A记录 mail  直接指向你的ec2实例的静态IP地址。

2. 添加(或是修改)域名的MX记录,形如

整个配置很简单,但因搜索到的结果较为杂乱,还是走了很多弯路,特记录在此。最后,IT JUST WORKS。

用于网站监控的shell脚本

分享一个用于监控网站运行情况的shell脚本,功能和结构都很简单,但很大程度上能够让监控自动化。此脚本的作用是按固定频率不停访问给出的URL,当网站不可访问时自动给设定邮箱发送告警邮件以通知用户。

脚本的完整内容如下:

#!/bin/sh
# Author:       Bill JaJa
# Purpose:      Moniter the web status, send a alert mail when it's not available.
export LANG=C

EMAIL=”xxx@xxxmail.com”
LOG_FILE="/var/monitor/log/web_status_`date '+%Y%m'`.log"
TMP_EMAIL="/var/monitor/.tmp.mail.`date '+%s'`"
URL="$1" # DO NOT CHANGE IT.

if [ $2 ]
then
        sleep $2
fi

# Define function "ECHO", append the timestamp at the head of every record.
ECHO () {
printf "%s " `date '+%Y-%m-%d %H:%M:%S'`
echo $1
}

# Define function HTTP_CODE, obtain the status of web service.
HTTP_CODE () {
http_code=`curl -m 20 -o /dev/null -s -w %{http_code} $URL`
}

# Define function MAIL.
MAIL () {
echo "$URL is not available now, pls pay attention." > $TMP_EMAIL
echo "And the Server 's time is: " >> $TMP_EMAIL
date >> $TMP_EMAIL
echo >> $TMP_EMAIL
echo "------" >> $TMP_EMAIL
echo "BR" >> $TMP_EMAIL
echo "Shell Robot." >> $TMP_EMAIL
mail -s "Server Alert: $URL" $EMAIL < $TMP_EMAIL
rm $TMP_EMAIL
}

n=0
HTTP_CODE
if [ $http_code -eq 200 ]
then
        ECHO "|http_code:200|+$n|webpage visit success.|$URL" >> $LOG_FILE
else
        while [ $http_code -ne 200 ]
        do
                n=`expr $n + 1 `
                ECHO "|http_code:$http_code|+$n|webpage visit failed. |$URL" >> $LOG_FILE
                if [ $n -eq 5 ]; then
                        MAIL $1; exit 0
                fi
                sleep 10
                HTTP_CODE
        done
fi
# THE END.

这段脚本的核心其实只有如下一行:

http_code=`curl -m 20 -o /dev/null -s -w %{http_code} $URL`

也就是使用Linux自带的curl工具访问给出网址,并返回http_code,当http_code不等于200时即可认为网站存在访问故障,但考虑到实际的不稳定因素,当第一次返回http_code不等200时,脚本休眠10秒钟,然后继续访问,累计连续不可访问次数达到5次后触发告警邮件。

可配置字段,脚本第二段中有如下三个可配置字段:

EMAIL:接收告警信息的email地址。
LOG_FILE:日志文件,建议使用绝对路径;最后的web_status_`date ‘+%Y%m’`.log代表以月为单位分割日志,如web_status_201105.log
TMP_EMAIL:临时邮件文件,同样建议使用绝对路径,保持所在目录有写权限即可。

使用方法:

脚本后面需跟两个参数:第一个参数为监控网站的URL,第二个参数为延时时间(可选,以秒为单位,建议在对多个网站进行监控时添加),将此脚本添加到操作系统的crontab里面,按需求设定运行频率,建议2分钟一次。若有多个网站需监控,在crontab里面添加多行即可,每个URL一行,如下为同时对三个网站进行监控:

*/2 * * * * sh /var/monitor/web_monitor.sh http://www.qq.com
*/2 * * * * sh /var/monitor/web_monitor.sh http://www.qqq.com 5
*/2 * * * * sh /var/monitor/web_monitor.sh http://www.qqqq.com 10

同时此脚本会将所有访问结果记录至日志文件,日志片段如下:

[bill@JAJA log]$ tail -f web_status_201105.log
2011-05-23 19:28:01 |http_code:200|+0|webpage visit success.|http://www.qq.com
2011-05-23 19:28:05 |http_code:200|+0|webpage visit success.|http://www.qqq.com
2011-05-23 19:28:11 |http_code:200|+0|webpage visit success.|http://www.qqqq.com
2011-05-23 19:28:20 |http_code:200|+0|webpage visit success.|http://www.qq.com
2011-05-23 19:28:20 |http_code:200|+0|webpage visit success.|http://www.qqq.com
2011-05-23 19:30:01 |http_code:200|+0|webpage visit success.|http://www.qqqq.com

补充:使用此脚本前请确保系统的邮件服务可行,Linux 邮件服务为sendmail
查看邮件服务运行状态的命令:service sendmail status
启用邮件服务:service sendmail start

在Github上查看源代码:https://github.com/bostoneboy/shell-scripts/blob/master/web-monitor.sh