Category Archives: Linux

Docker在Mac下挂在/Users之外的目录

Docker在Mac下是在VirtualBox虚拟机中运行的。VirtualBox是用共享的形式把宿主机的目录暴露给docker的container,因为默认只挂载了/Users目录,所以Docker的Data Volume都只能mount到/Users目录下面的东西。

Kitematic中的提示

Invalid directory. Volume directories must be under your Users directory

解决办法

  1. 修改VirtualBox的设置,给Docker虚拟机添加共享目录
  2. 修改Docker虚拟机设置,使其能自动自动挂载共享目录

注意:Kitematic中是禁止添加/Users以外的目录的,所以要通过docker命令来创建container才能挂载到我们增加的新目录。

操作步骤

先打开VirtualBox的管理界面,找到Docker的虚拟机(默认是default),进入设置。
在Shared Folders中添加你希望在Docker虚拟机中挂载的宿主机目录。
如:把宿主机的/workspace目录共享为www

docker-machine ssh default
cd /var/lib/boot2docker/
sudo vi bootlocal.sh #文件内容在后面,这个文件启动时会被自动执行
sudo chmod u+x bootlocal.sh
sudo reboot

bootlocal.sh

#!/bin/sh
mkdir -p /www
mount -t vboxsf /www /www

挂载示例

docker run --name nginx -P -v /workspace/www:/usr/share/nginx/html -v /workspace/nginx/default.conf:/etc/nginx/conf.d/default.conf nginx

参考链接

http://stackoverflow.com/questions/24212228/boot2docker-on-mac-accessing-local-files/29983253#29983253

Read: 68

解决阿里云postfix邮件发不出去的问题

执行mail输出错误信息

sendmail: fatal: parameter inet_interfaces: no local interface found for ::1

原因是神马给忘了,记得是跟IPv6有关,解决办法就是让postfix只用IPv4。

打开文件:/etc/postfix/main.cf

inet_protocols = all

改成

inet_protocols = ipv4

完了之后执行

service postfix restart

Read: 470

CentOS + Cacti 集中监控服务器 (笔记)

Cacti官方网站

官方文档——Installing Under Unix

Percona Monitoring Plugins (Plugins for Cacti)
Percona 为我们提供了很多包括linux,apache,mysql,redis,nginx等等常见服务的监控模板非常方便。
下载地址 | 官方文档

监控机配置
1. 下载Cacti
2. 解压到wwwroot目录(cacti默认URL是/cacti,不想改配置就同样解压到www/cacti好了)
3. 配置web服务(注意屏蔽cli目录访问)
4. 编译安装PHP SNMP扩展
5. 安装SNMP服务

yum install net-snmp net-snmp-libs net-snmp-utils

如何安装PHP SNMP扩展
进入PHP源代码目录下的ext/snmp目录,执行以下命令

phpize
./configure
make && make install

6. 修改cacti/include/config.php 配置mysql连接参数
7. 导入cacti.sql
8. 访问http://服务器地址/cati 开始安装

被监控机配置
1. 配置防火墙(打开UDP 161端口,其他端口根据需要打开)
对于运行在网络上的服务器来说对外开发的端口自然是越少越好,可能的话最好只对内部网络开放SNMP服务。
其他端口根据需要选择开放。
在/etc/sysconfig/iptables添加

-A INPUT -p udp -m state --state NEW -m udp -s 允许访问的IP --dport 161 -j ACCEPT

2. 安装SNMP服务

yum install net-snmp net-snmp-libs net-snmp-utils
service snmpd start

其他注意事项:
1. Percona的提供的脚本很多监控项目是通过ssh连接到远程服务器上,所以需要监控机有访问被监控机的权限,在Percona的脚本里是通过ssh密钥登陆的。
2. Percona默认访问的Nginx统计地址是/server-status,可以在cacti的data source里改或者偷懒直接改scripts/ss_get_by_ssh.php。
3. Percona为每种服务都提供了Host模板,在创建Host之后可以通过多次更改Host Template来合并不同的图表模板。当然,还是都分开比较好一点,都在一起太多了,乱。

待续。。。

Read: 37

CentOS 6.4 openvpn服务器搭建笔记

OpenVPN 源代码、安装包下载地址

官方安装手册

官方easy-rsa3 github

1. 安装openvpn、easy-rsa
yum install openvpn easy-rsa

easy-rsa是生成秘钥用的一系列脚本集合。openvpn2.3版之后程序包里不再捆绑,需要单独安装,官方2.3版本的easy-rsa3改动比较
大,网上也很少有用easy-rsa3的文章,为了避免麻烦,直接装源里的easy-rsa就好了。

easy-rsa默认安装在/usr/share/easy-rsa/2.0/,为了方便我复制了一份到/etc/openvpn下面

cp -R /usr/share/easy-rsa/2.0 /etc/openvpn/easyrsa

2. 生成证书、秘钥

. ./vars
./build-key-server server
./build-key client

3. 配置openvpn

4. 配置iptables
#开启路由转发
echo 1 > /proc/sys/net/ipv4/ip_forward
# 使用NAT 让vpn客户端可以通过vpn服务器的私网IP 192.168.1.101 访问服务端私网内其他机器
-A POSTROUTING -s 10.8.0.0/24 -j SNAT --to-source 192.168.1.101

配置路由表
route add -net 192.168.1.0/24 dev eth1
route add -net default gw 192.168.1.1
etc. 使用 用户名/密码 验证的方法

参考文章:
《OpenVPN服务器配置》

《配置OpenVPN使用User/Pass方式验证登录》

《Iptables之FORWARD转发链》

《OpenVPN 2.0 HOWTO-局域网互访(翻译)》

《OpenVPN服务端架设配置说明》 (图文手册,简单明了)

Read: 135

在Windows/Linux下程序指定IP地址

Windows/Unix* 系统都支持为一个网卡绑定多个IP地址,但是通常操作系统会根据路由表自动选择IP地址,应用程序使用哪个IP地址用户无法主动控制。本文分别讲解在Linux和Windows下为应用程序绑定指定IP地址的方法。

关于Windows如何选择IP地址可以参考这篇文章:《Source IP address selection on a Multi-Homed Windows Computer》

一、 如何让Linux下的程序指定使用的IP地址

英文原文:《BINDING APPLICATIONS TO A SPECIFIC IP》

作者Daniel Ryde采用了LD_PRELOAD进行HACK,为应用程序注入一个动态库bind.so,这个动态库中对bind和connect函数加钩子,程序建立socket连接前绑定指定的本地IP地址。

使用方法:

Hessian:bind/ $ BIND_ADDR="192.168.8.9" LD_PRELOAD=./bind.so YOUR_PROGRAME

程序源码可从这里下载

编译方法:

Hessian:bind/ $ gcc -nostartfiles -fpic -shared bind.c -o bind.so -ldl -D_GNU_SOURCE
Hessian:bind/ $ strip bind.so

二、 如何让Windows下的程序指定使用的IP地址

在Windows实现这个功能要相对麻烦一些,博主没有找到十分简单的办法,找了很久才发现这个高大上的东西——ForceBindIP - Bind any Windows application to a specific interface

程序原理就不翻译了,反正也没源码,不过大体跟linux版本的实现是差不多的,不过这边还多挂了WSA函数的钩子,覆盖的更完全。因为只会注入目标程序,如果网络访问是目标程序fork出去的进程发起的则不会受影响。

ForceBindIP works in two stages - the loader, ForceBindIP.exe will load the target application in a suspended state. It will then inject a DLL (BindIP.dll) which loads WS2_32.DLL into memory and intercepts the bind(), connect(), sendto(), WSAConnect() and WSASendTo() functions, redirecting them to code in the DLL which verifies which interface they will be bound to and if not the one specified, (re)binds the socket. Once the function intercepts are complete, the target application is resumed. Note that some applications with anti-debugger / injection techniques may not work correctly when an injected DLL is present; for the vast majority of applications though this technique should work fine.

作者声明支持的系统版本有:Windows NT/2000/XP/2003.

作者测试过可用的软件: DC++, uTorrent, Quake II, Quake III, Diablo II, StarCraft, Internet Explorer, Mozilla Firefox, Google Earth, Infantry, Real Player, Unreal Tournament 2004 (requires -i), Outlook 2000 (requires -i).

不可用的软件: GetRight (anti-debugger / forking techniques), WinCVS (forks cvs.exe)

博主测试过在Windows7上无法正常工作。搜狗浏览器也不知道是什么原因没有效果。

使用方法:

ForceBindIP 1.2.3.4 c:\full\path\to\app.exe

还可以通过网卡GUID进行绑定,GUID可以从注册表中找到[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces]

ForceBindIP {4FA65F75-7A5F-4BCA-A3A2-59824B2F5CA0} c:\path\to\app.exe

如果遇到程序崩溃或者什么意外情况可以尝试-i参数,这会让ForceBindIP等待目标程序进入它的消息循环后再注入DLL。

ForceBindIP -i 1.2.3.4 c:\full\path\to\app.exe

Read: 2297