SSH 端口转发

简介

ssh 端口转发是建立了一个 ssh 隧道,原来传输的数据通过这个隧道来传输。先来说说大家最熟悉的动态转发。

动态转发

ssh -D <local port> <SSH server>

这种使用方法应该都很熟悉,(能干嘛?:D),它能动态地将各种数据转发到远程的端口上,相当于在本发建立了一个 sock5 的代理。

本地转发

本地端口转发的命令格式是:

ssh -L <local port>:<remote host>:<remote prot> <SSH server>

使用场景:假设我们现在有一台 smtp 服务器 server,但它被监听在 127.0.0.1:25,也就是说只允许来自自己的请求,所以我们不能在远程访问到它的 25 端口。但是 server 允许远程的 ssh 连接。这个时候在本地执行:

ssh -L 2525:localhost:25 server

这个时候我们就能通过访问 localhost:2525 来访问到 server 中的 25 端口了。

还有一种情况:假设现在 local 不能访问到 ser2 的 23 端口,但 local 能访问到 ser1 的 ssh,而且 ser1 也能访问到 ser2 的 23 端口。

这个时候,我们只需要在本地运行:

ssh -L 2323:ser2:23 ser1

这个时候,我们只要访问 localhost:2323 就能通过 ser1 访问 ser2:23 了。

远程转发

它的命令格式是:

ssh -R <local port>:<remote host>:<remote port> <SSH server>

使用场景:假设现在有一台 web 服务器(srv1)处于局域网中,它不能被广域网访问到,另一台服务器(srv2)处于广域网中。srv1 能 ssh 到 srv2,这个时候想让 srv2 访问到 srv1 的 web 服务。在 srv1 中执行

ssh -R 8088:srv1:80 ser2

这个时候就能在 srv2 中访问 localhost:8088 就能访问到 srv1 中的 web 服务器了。

这个时候 srv2 的 8088 只能监听在 127.0.0.1 的,要想允许外部访问,可改写为 -R *:8088:srv1:80,并确保在服务器的 sshd_config 中打开了 GatewayPorts yes 选项。

X 协议转发

ssh -X <SSH Server>

登录完成后,就可以直接在 shell 里执行远程的 X 应用,这里建立的 X 转发会自动设置 DISPLAY 环境变量,通常会被设置成 localhost:10.0,我们无需也不应该在连接之后再进行修改此环境变量。

常用参数

端口转发常与以下参数配合使用:

选项 说明
-f ssh将在后台运行
-N 不执行命令,仅转发端口
-C 压缩传送的数据
-i 使用指定的密钥登录
-g 创建监听 0.0.0.0 的端口

参考资料

  1. SSH端口转发
  2. 实战 SSH 端口转发

Max OSX Mavericks 搭建 nginx + php-fpm + mysql

虽然 Mac 下自带了 apache + php,得总归还是 nginx 用得顺手,所以打算在 Mac 下安装 nginx + php-fpm + mysql

安装 ningx

为了方便起见我直接从 brew 中安装了 ningx,Homebrew 的安装可以参见 Mac OS 中 Homebrew 的安装与使用

  1. 安装,终端下执行

    brew search nginx
    brew install nginx
  2. 配置

    配置文件在 /usr/local/etc/nginx 目录下面,依自己的喜好配置。

  3. 运行,终端下运行 ningx 即可,若 ningx 的运行端口指定为小于 1024 那么还需要 sudo 权限

  4. 其它

    #重新加载配置|重启|停止|退出
    nginx -s reload|reopen|stop|quit
    #测试配置是否有语法错误
    nginx -t

php-fpm

Mac OSX 10.9的系统自带了PHP、php-fpm,所以也省去了安装php-fpm的麻烦。

配置

cd /private/etc/
sudo cp php-fpm.conf.default php-fpm.conf
vim php-fpm.conf

然后依照自己的喜好做完配置,还有一点需要修改的是 error_log 的设置,默认编译的时候 log 所在的路径是不存在的,将它反注释,并手动指定一个路径,比如 /usr/local/var/log/php-fpm.log,所以这行看上去应该是这样的:

error_log = /usr/local/var/log/php-fpm.log

运行

sudo php-fpm

安装 mysql

  1. 安装

    mysql 我也从 brew 中安装了:

    brew install mysql
  2. 配置

    初始化 mysql 数据库

    mysql_install_db --verbose --user=`whoami` --basedir="$(brew --prefix mysql)" --datadir=/usr/local/var/mysql --tmpdir=/tmp

    这个时候 root 用户是没有密码的,这里给 mysql 的 root 用户设置密码:

    /usr/local/opt/mysql/bin/mysqladmin -u root password 'PASSWORD'

    进行一个安全设置,终端运行,它全引导我们进行一系列设置

    /usr/local/opt/mysql/bin/mysql_secure_installation

    设置 mysql 的配置文件 my.cnf (默认在 /usr/local/Cellar/mysql/版本号/my.cnf)

    设置开机启动(可选)

    ln -sfv /usr/local/opt/mysql/*.plist ~/Library/LaunchAgents
    Then to load mysql now:
    launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist

    常用命令

    mysql.server start #启动mysql服务
    mysql.server stop #关闭mysql服务

EOF

使用 .htaccess 封禁某 User-Agent 访问网站

有时候想要禁掉一些 user agent 访问网站,可以直接在 .htaccess 中设置就可以 deny 掉来自这些 user agent 的访问:

SetEnvIfNoCase User-Agent "^GbPlugin" bad_user
SetEnvIfNoCase User-Agent "^Wget" bad_user
SetEnvIfNoCase User-Agent "^EmailSiphon" bad_user
SetEnvIfNoCase User-Agent "^EmailWolf" bad_user
SetEnvIfNoCase User-Agent "^libwww-perl" bad_user
Deny from env=bad_user

这样符合上述User-Agent头的访问都将直接返回 403。

Mac OS 中 Homebrew 的安装与使用

Homebrew (http://brew.sh/) 可以看作是 OSX 中的包管理器,它可以安装很多系统中不自带的软件,类似于 apt/pacman 等工具,在 OSX 中还有有MacPorts、Fink、Homebrew等管理工具。

1. 安装 Homebrew:

安装 Homebrew 非常简单,依据官网中的介绍,只要在命令行中执行:
ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
安装过程中,可能需要输入密码以使用 root 权限。
继续阅读Mac OS 中 Homebrew 的安装与使用

systemd 执行自定义自动脚本 rc.local

Archlinux 迁移到 systemd 后,原来的 rc.local 就不能用了。但又想在启动的时候执行一些脚本,这个时候,我们可以自己写一个 rclocal.service 的启动控制。

新建一个 /usr/lib/systemd/system/rclocal.service 文件:

[Unit]
Description=/etc/rc.local Compatibility
After=network.target
ConditionPathExists=/etc/rc.local
 
[Service]
Type=forking
PermissionsStartOnly=true
ExecStart=/etc/rc.local
TimeoutSec=0
#StandardOutput=tty
RemainAfterExit=yes
Restart=on-abort
SysVStartPriority=99
 
[Install]
WantedBy=multi-user.target

好了,再去建立 /etc/rc.local,这个文件其实就是一般的 shell 脚本。

添加执行权限:chmod 755 /etc/rc.local

添加 rclocal.service 为开机启动:systemctl enable rclocal.service

完成后,重启电脑进行检验。

通过 SMTP 来检测邮箱的有效性

如何来检测一个 email 地址?一般就需要从邮件地址的 smtp 服务器来获取一些信息来判断。

假设我要检测 testmail@douban.com 这个地址是不是真存在:

首先需要取得 douban.com 这个域的 MX 记录:
dig douban.com MX

然后根据得到的 MX 地址来检测,用 telnet MX记录 端口号 来连接,然后输入命令:
verify

从结果中基本可以看到 testmail@douban.com 这个地址返回的是 250 状态,是存在的;而下面的 jfksdjglfdgld@douban.com 则返回了 550 状态,同时也可以从下面的描述语句中得到这个地址则是不存在的。
继续阅读通过 SMTP 来检测邮箱的有效性

Debian 下安装 NFS 服务器

NFS是网络文件共享系统。在网络中,这个协议的使用非常广泛,也是基于共享,网络才有了今天的发展。下面是 Debian NFS 服务器的一些安装和设置。

Debian下安装NFS服务器

安装Debian NFS服务器端:
# aptitude install nfs-common nfs-kernel-server portmap

在客户端则需要安装:
# aptitude install nfs-common portmap

启动服务: # /etc/init.d/nfs-kernel-server start
停止服务: # /etc/init.d/nfs-kernel-server stop
重启服务: # /etc/init.d/nfs-kernel-server restart

Debian NFS服务器配置:

1、创建共享目录:

# mkdir /home/share
# chown nobody.nogroup /home/share

2、创建或修改/etc/exports配置文件

当将同一目录共享给多个客户机,但对每个客户机提供的权限不同时,可以这样:

[共享的目录] [主机名1或IP1(参数1,参数2)] [主机名2或IP2(参数3,参数4)]

Debian NFS服务器共享的常用参数:

ro                    只读访问 
rw                    读写访问 
sync                  所有数据在请求时写入共享 
async                 NFS在写入数据前可以相应请求 
secure                NFS通过1024以下的安全TCP/IP端口发送 
insecure              NFS通过1024以上的端口发送 
wdelay                如果多个用户要写入NFS目录,则归组写入(默认) 
no_wdelay             如果多个用户要写入NFS目录,则立即写入,当使用async时,无需此设置。 
hide                  在NFS共享目录中不共享其子目录 
no_hide               共享NFS目录的子目录 
subtree_check         如果共享/usr/bin之类的子目录时,强制NFS检查父目录的权限(默认) 
no_subtree_check      和上面相对,不检查父目录权限 
all_squash            共享文件的UID和GID映射匿名用户anonymous,适合公用目录。 
no_all_squash         保留共享文件的UID和GID(默认) 
root_squash           root用户的所有请求映射成如anonymous用户一样的权限(默认) 
no_root_squas         root用户具有根目录的完全管理访问权限 
anonuid=xxx           指定NFS服务器/etc/passwd文件中匿名用户的UID 
anongid=xxx           指定NFS服务器/etc/passwd文件中匿名用户的GID

Debian NFS服务器配置文件/etc/exports内容如下:

$ cat /etc/exports
/home/share 192.168.102.15(rw,sync) *(ro)

配置说明: 对192.168.102.15赋予读写权限,其他机器仅有只读权限。

重启服务器: # /etc/init.d/nfs-kernel-server restart

3、在客户机上查看NFS服务器的资源共享情况:# showmount -e 192.168.102.47

4、在客户端使用mount命令挂载共享目录:# mount 192.168.102.47:/home/share /mnt

是不是我们每次修改了配置文件都需要重启Debian NFS服务器服务呢? 这个时候我们就可以用exportfs命令重新扫描/etc/exports文件,来使改动立刻生效。

比如:

# exportfs -au #卸载所有共享目录
# exportfs -rv #重新共享所有目录并输出详细信息

exportfs 命令有软件包 nfs-kernel-server 提供,详细的 exportfs 命令说明请查看:

# man exportfs

参考:http://wiki.debian.org.hk/w/Share_files_with_NFS

RHEL/CentOS 6.x 添加 EPEL & remi 安装软件

在使用 RHEL/CentOS 的时候总是会嫌弃自身源里的软件包版本过旧,比如 php 官方最新稳定版本为 5.5.0,而 CentOS 上还是 5.3.3,而我又是一个版本控。解决这个问题就可以给系统加上 EPEL & remi 的源了。

EPEL(Extra Packages for Enterprise Linux) 是由 Fedora 社区打造,为 RHEL 及衍生发行版如 CentOS、CloudLinux 等提供软件包的项目,地址:http://fedoraproject.org/wiki/EPEL。

一、添加并启用 EPEL 源:

1. RHEL/CentOS/CL Linux 6.x 下安装 EPEL yum 源,根据不同的系统选择:

32bit:

# rpm -ivh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm

或 64bit:

# rpm -ivh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

导入key:

# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6

2. 安装好后会在/etc/yum.repos.d/下创建 epel.repoepel-testing.repo 两个配置文件,更改 epel.repo 的 [epel] 下的 enabled 为1:

[epel]
name=Extra Packages for Enterprise Linux 6 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch
failovermethod=priority
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
...

这样 EPEL 的源就安装完成了。
继续阅读RHEL/CentOS 6.x 添加 EPEL & remi 安装软件