使用PostgreSQL Writeable CTE实现upsert(merge/replace)

当客户端可以保证不会出现并发的时候,可以使用PostgreSQL的writeable CTE实现upsert功能。如果存在并发,writeable会出现race conditions而出现问题,这时就需要使用UDF实现。

WITH new_values (id, field1, field2) as (

values

(1, 'A', 'X'),

(2, 'B', 'Y'),

(3, 'C', 'Z')

),

upsert as

(

update mytable m

set field1 = nv.field1,

field2 = nv.field2

FROM new_values nv

WHERE m.id = nv.id

RETURNING m.*

)

INSERT INTO mytable (id, field1, field2)

SELECT id, field1, field2

FROM new_values

WHERE NOT EXISTS (SELECT 1

FROM upsert up

WHERE up.id = new_values.id)

原链接:http://stackoverflow.com/questions/1109061/insert-on-duplicate-update-postgresql/8702291#8702291

相关连接:

发表在 pgsql | 留下评论

软raid管理工具mdadm常见操作

停止raid设备

mdadm -S /dev/mdX

重新组装并启动raid设备(用在系统重启后)

mdadm -A /dev/mdX /dev/sd[bcdefghijkl]

创建并启动一个带spare的raid10设备

 mdadm –create –verbose /dev/md0 –level=raid10 –raid-devices=10 /dev/sd[bcdefghijk] –spare-devices=1 /dev/sdl

销毁raid设备

 mdadm –stop /dev/md0
mdadm –remove /dev/md0
mdadm –zero-superblock /dev/sd[bcdefghijkl]
发表在 linux | 留下评论

df卡住问题解决

我们在PostgreSQL机器上都会监控它的磁盘使用情况,其中一项是通过df检查磁盘的使用率。今天发现一台机器运行良好,但是负载达到5k多,pstree看了一下,df进程有有5k多个,自己运行了一下df命令,会卡住。系统上5k多个df,应该是监控卡了一段时间。

使用strace df命令,输出如下:

….
statfs(“/proc/sys/fs/binfmt_misc”, {f_type=0x42494e4d, f_bsize=4096, f_blocks=0, f_bfree=0, f_bavail=0, f_files=0, f_ffree=0, f_fsid={0, 0}, f_namelen=255, f_frsize=4096}) = 0
statfs(“/mnt”,  <unfinished …>

看来是卡在了/mnt这里。这时才想到这个机器过载的nfs搬迁到了新的地方,应该是卡在了nfs请求的地方。运行umount -f /mnt,killall -9 df后恢复。

发表在 linux | 留下评论

Postgresql9.3发布注记中文版

经过几天的努力,终于把9.3的release note翻译完成,顺便对9.3中的所有变动做了详细的了解。

目前是按照beta1翻译的,最终版仍然可能调整。

翻译的结果在这里:

http://amutu.com/blog/postgresql-9-3-release-note-zh-cn.html

发表在 pgsql | 留下评论

codeschool上的编程课程

codeschool.com上提供免费的编程课程,课程提供指引,让你自己动手输入命令,体验整个编程过程。今天体验了一下try git这个课程,挺不错的,常用的git命令都做了练习。它还跟github打通,在课程练习的过程中,将代码传送到github上。

网站链接:https://www.codeschool.com

发表在 linux | 留下评论

llvm与clang编译安装

wget http://llvm.org/releases/3.2/llvm-3.2.src.tar.gz

tar xvzf llvm-3.2.src.tar.gz

cd llvm-3.2.src/tools

svn co http://llvm.org/svn/llvm-project/cfe/tags/RELEASE_32/final/ clang

cd ../projects

svn co http://llvm.org/svn/llvm-project/compiler-rt/tags/RELEASE_32/final/ compiler-rt

cd ..

./configure

make -j4 REQUIRES_RTTI=1

sudo make install

发表在 linux | 标签为 , | 留下评论

Git常用命令

Git配置

git config –global user.name “robbin”
git config –global user.email “fankai@gmail.com”
git config –global color.ui true
git config –global alias.co checkout
git config –global alias.ci commit
git config –global alias.st status
git config –global alias.br branch
git config –global core.editor “mate -w”
用户的git配置文件~/.gitconfig

Git常用命令

查看、添加、提交、删除、找回,重置修改文件

git help <command> # 显示command的help
git show # 显示某次提交的内容
git show $id

git co — <file> # 抛弃工作区修改
git co . # 抛弃工作区修改

git add <file> # 将工作文件修改提交到本地暂存区
git add . # 将所有修改过的工作文件提交暂存区

git rm <file> # 从版本库中删除文件
git rm <file> –cached # 从版本库中删除文件,但不删除文件

git reset <file> # 从暂存区恢复到工作文件
git reset — . # 从暂存区恢复到工作文件
git reset –hard # 恢复最近一次提交过的状态,即放弃上次提交后的所有本次修改

git ci <file>
git ci .
git ci -a # 将git add, git rm和git ci等操作都合并在一起做
git ci -am “some comments”
git ci –amend # 修改最后一次提交记录

git revert <$id> # 恢复某次提交的状态,恢复动作本身也创建了一次提交对象
git revert HEAD # 恢复最后一次提交的状态

查看文件diff

git diff <file> # 比较当前文件和暂存区文件差异
git diff
git diff <$id1> <$id2> # 比较两次提交之间的差异
git diff <branch1>..<branch2> # 在两个分支之间比较
git diff –staged # 比较暂存区和版本库差异
git diff –cached # 比较暂存区和版本库差异
git diff –stat # 仅仅比较统计信息

查看提交记录

git log
git log <file> # 查看该文件每次提交记录
git log -p <file> # 查看每次详细修改内容的diff
git log -p -2 # 查看最近两次详细修改内容的diff
tig

Mac上可以使用tig代替diff和log,brew install tig

Git 本地分支管理

查看、切换、创建和删除分支

git br -r # 查看远程分支
git br <new_branch> # 创建新的分支
git br -v # 查看各个分支最后提交信息
git br –merged # 查看已经被合并到当前分支的分支
git br –no-merged # 查看尚未被合并到当前分支的分支

git co <branch> # 切换到某个分支
git co -b <new_branch> # 创建新的分支,并且切换过去
git co -b <new_branch> <branch> # 基于branch创建新的new_branch

git co $id # 把某次历史提交记录checkout出来,但无分支信息,切换到其他分支会自动删除
git co $id -b <new_branch> # 把某次历史提交记录checkout出来,创建成一个分支

git br -d <branch> # 删除某个分支
git br -D <branch> # 强制删除某个分支 (未被合并的分支被删除的时候需要强制)

分支合并和rebase

git merge <branch> # 将branch分支合并到当前分支
git merge origin/master –no-ff # 不要Fast-Foward合并,这样可以生成merge提交

git rebase master <branch> # 将master rebase到branch,相当于:
git co <branch> && git rebase master && git co master && git merge <branch>

Git补丁管理

git diff > ../sync.patch # 生成补丁
git apply ../sync.patch # 打补丁
git apply –check ../sync.patch # 测试补丁能否成功

Git暂存管理

git stash # 暂存
git stash list # 列所有stash
git stash apply # 恢复暂存的内容
git stash drop # 删除暂存区
Git远程分支管理

git pull # 抓取远程仓库所有分支更新并合并到本地
git pull –no-ff # 抓取远程仓库所有分支更新并合并到本地,不要快进合并
git fetch origin # 抓取远程仓库更新
git merge origin/master # 将远程主分支合并到本地当前分支
git co –track origin/branch # 跟踪某个远程分支创建相应的本地分支
git co -b <local_branch> origin/<remote_branch> # 基于远程分支创建本地分支,功能同上

git push # push所有分支
git push origin master # 将本地主分支推到远程主分支
git push -u origin master # 将本地主分支推到远程(如无远程主分支则创建,用于初始化远程仓库)
git push origin <local_branch> # 创建远程分支, origin是远程仓库名
git push origin <local_branch>:<remote_branch> # 创建远程分支
git push origin :<remote_branch> #先删除本地分支(git br -d <branch>),然后再push删除远程分支

Git远程仓库管理

git remote -v # 查看远程服务器地址和仓库名称
git remote show origin # 查看远程服务器仓库状态
git remote add origin git@github:robbin/robbin_site.git # 添加远程仓库地址
git remote set-url origin git@github.com:robbin/robbin_site.git

创建远程仓库

git clone –bare robbin_site robbin_site.git # 用带版本的项目创建纯版本仓库
scp -r my_project.git git@git.csdn.net:~ # 将纯仓库上传到服务器上

mkdir robbin_site.git && cd robbin_site.git && git –bare init # 在服务器创建纯仓库
git remote add origin git@github.com:robbin/robbin_site.git # 设置远程仓库地址
git push -u origin master # 客户端首次提交
git push -u origin develop # 首次将本地develop分支提交到远程develop分支,并且track

git remote set-head origin master # 设置远程仓库的HEAD指向master分支
也可以命令设置跟踪远程库和本地库

git branch –set-upstream master origin/master
git branch –set-upstream develop origin/develop

转载自自由的风

发表在 linux | 留下评论

vim中执行shell命令的几个技巧

:!command

功能

不退出vim,并执行shell命令command,将命令输出显示在vim的命令区域,不会改变当前编辑的文件的内容。

举例

:!ls -l

特别的可以运行:!bash来启动一个bash shell并执行命令,不需要退出vim。

:r !command

功能

将shell命令command的结果插入到当前行的下一行。

举例

:r !date

读取系统时间并插入到当前行的下一行。

:起始行号,结束行号 !command

功能

将起始行号和结束行号指定的范围中的内容输入到shell命令command处理,并将处理结果替换起始行号和结束行号指定的范围中的内容。

举例

:62,72 !sort

将62行到72行的内容进行排序。
可以只指定起始行,例如:62 !tr [a-z] [A-Z],将62行的小写字母转为大写字母
当前光标所在行,除可以指定行号外,也可以用.表示,例如:. !tr [a-z] [A-Z],将当前行的小写转为大写。

:起始行号,结束行号 w !command

功能

将起始行号和结束行号所指定的范围的内容作为命令command的输入。不会改变当前编辑的文件的内容。

举例

:62,72 w !sort

将62行到72行的内容进行排序,但排序的结果并不会直接输出到当前编辑的文件中,而是显示在vim敲命令的区域。

:62 w !bash

将会把第62行的内容作为bash命令来执行并显示结果,而且不会改变当前编辑的文件的内容。

:. w !bash

将当前行的内容作为bash命令来执行。
例如52行内容为ls -l
那么输入:52 w !bash就跟执行!ls -l是一样的效果,如果你用的shell是bash shell
如果输入的是:52 !bash,那么会把第52行的内容也就是ls -l作为命令执行,同时命令的输出结果会替换第52行的内容,注意其中的区别。

发表在 freebsd, linux | 一条评论

20个Linux防火墙应用技巧

Netfilter作为Linux内置的主机防火墙,它可以使用iptables命令处理IPv4协议,也可以使用ip6tables命令处理IPv6协议。在iptables之前,Linux 2.2中使用ipchains来配置防火墙,Linux 2.0中则使用ipfwadm,它基于BSD的ipfw命令实现。

以下命令在RHEL 6.x上执行通过,但也适用于其他Linux发行版。

1.显示防火墙的状态

以root权限运行下面的命令:

  1. # iptables -L -n -v

参数说明:

  • -L:列出规则。
  • -v:显示详细信息。此选项会显示接口名称、规则选项和TOS掩码,以及封包和字节计数。
  • -n:以数字形式显示IP地址和端口,不使用DNS解析。

如果希望输出的结果中显示行号,可以运行:

  1. # iptables -L -n -v –line-nmubers

这样,就可以按照行号在防火墙中添加、删除规则。

要显示输入或输出链规则,可以运行:

  1. # iptables -L INPUT -n -v
  2. # iptables -L OUTPUT -n -v –line-numbers

2.停止、开启和重启防火墙

如果你使用的是RHEL/Fedora/CentOS系统,可以运行:

  1. # service iptables stop
  2. # service iptables start
  3. # service iptables restart

我们也可以使用iptables命令停止防火墙并删除所有规则:

  1. # iptables -F
  2. # iptables -X
  3. # iptables -t nat -F
  4. # iptables -t nat -X
  5. # iptables -t mangle -F
  6. # iptables -t mangle -X
  7. # iptables -P INPUT ACCEPT
  8. # iptables -P OUTPUT ACCEPT
  9. # iptables -P FORWARD ACCEPT

参数说明:

  • -F:删除所有的规则
  • -X:删除链
  • -t table_name:匹配表(称为nat或mangle)
  • -P:设置默认策略(如DROP、REJECT或ACCEPT)

3.删除防火墙规则

以带行号的形式显示已有的防火墙规则,请运行:

  1. # iptables -L INPUT -n –line-numbers
  2. # iptables -L OUTPUT -n –line-numbers
  3. # iptables -L OUTPUT -n –line-numbers | less
  4. # iptables -L OUTPUT -n –line-numbers | grep 202.54.1.1

下面我们使用行号删除规则:

  1. # iptables -D INPUT 4

将IP地址202.54.1.1从规则中删除:

  1. # iptables -D INPUT -s 202.54.1.1 -j DROP

参数说明:

  • -D:从选择的链中删除一条或多条规则

4.插入防火墙规则

首先运行下面的命令:

  1. # iptables -L INPUT -n –line-numbers

得到运行结果:

  1. Chain INPUT (policy DROP)
  2. num  target    prot opt source     destination
  3. 1   DROP      all  –  202.54.1.1  0.0.0.0/0
  4. 2   ACCEPT    all  –  0.0.0.0/0    0.0.0.0/0

在行1和行2之间插入规则:

  1. # iptables -I INPUT 2 -s 202.54.1.2 -j DROP

查看更新后的规则,会发现插入成功,下面是示例:

  1. Chain INPUT (policy DROP)
  2. Num  target    prot opt source    destination
  3. 1     DROP    all  –  202.54.1.1  0.0.0.0/0
  4. 2     DROP    all  –  202.54.1.2  0.0.0.0/0
  5. 3     ACCEPT  all  –  0.0.0.0/0    0.0.0.0/0

5.保存防火墙规则

在RHEL/Fedora/CentOS Linux下,可以使用下面的命令保存防火墙规则:

  1. # service iptables save

在其它Linux发行版(如Ubuntu)上,可以使用iptables-save命令保存防火墙规则:

  1. # iptables-save > /root/my.active.firewall.rules
  2. # cat /root/my.active.firewall.rules

6.重新加载防火墙规则

我们可以使用iptables-restore命令重新加载使用iptables-save命令保存的防火墙规则:

  1. # iptables-restore < /root/my.active.firewall.rules

我们还可以利用这种特性来快速部署防火墙规则。

7.设置默认防火墙策略

我们首先来配置一个防火墙策略,它默认丢弃所有的网络数据包:

  1. # iptables -P INPUT DROP
  2. # iptables -P OUTPUT DROP
  3. # iptables -P FORWARD DROP
  4. # iptables -L -v -n
  5. #连接失败,因为防火墙丢弃所有的网络数据包
  6. # ping cyberciti.biz
  7. # wget http://www.kernel.org/pub/linux/kernel/v3.0/testing/linux-3.2-rc5.tar.bz2

在此基础上,我们只关闭入站连接:

  1. # iptables -P INPUT DROP
  2. # iptables -P FORWARD DROP
  3. # iptables -P OUTPUT ACCEPT
  4. # iptables -A INPUT -m state –state NEW,ESTABLISHED -j ACCEPT
  5. # iptables -L -v -n
  6. #ping和wget可以正常工作
  7. # ping cyberciti.biz
  8. # wget http://www.kernel.org/pub/linux/kernel/v3.0/testing/linux-3.2-rc5.tar.bz2

8.在公网网络接口上停用私有网络地址

我们可以从公网网络接口上删除私有IPv4网段,以防止IP欺骗。运行下面的命令,没有源路由地址的数据包会被丢弃:

  1. # iptables -A INPUT -i eth1 -s 192.168.0.0/24 -j DROP
  2. # iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

下面是私有网络IPv4地址范围,请确认在公网接口予以屏蔽:

  • 10.0.0.0/8 -j (A)
  • 172.16.0.0/12 (B)
  • 192.168.0.0/16 (C)
  • 224.0.0.0/4 (多播 D)
  • 240.0.0.0/5 (E)
  • 127.0.0.0/8 (回环)

9.屏蔽IP地址访问

如果我们想屏蔽一个IP地址,比如1.2.3.4,可以运行:

  1. # iptables -A INPUT -s 1.2.3.4 -j DROP
  2. # iptables -A INPUT -s 192.168.0.0/24 -j DROP

10.屏蔽入栈端口请求

如果我们想80端口上屏蔽所有的服务请求,可以运行:

  1. # iptables -A INPUT -p tcp –dport 80 -j DROP
  2. # iptables -A INPUT -i eth1 -p tcp –dport 80 -j DROP

只想屏蔽IP地址1.2.3.4对80端口的请求,可以运行:

  1. # iptables -A INPUT -p tcp -s 1.2.3.4 –dport 80 -j DROP
  2. # iptables -A INPUT -i eth1 -p tcp -s 192.168.1.0/24 –dport 80 -j DROP

11.屏蔽出栈IP地址

现在我们来演示如何屏蔽对主机名和IP地址的出栈访问。

首先,我们来获取一个域名的IP地址:

  1. # host -t a cyberciti.biz

输出示例:

  1. cyberciti.biz has address 75.126.153.206

要屏蔽访问域名cyberciti.biz的网络数据包,可以运行:

  1. # iptables -A OUTPUT -d 75.126.153.206 -j DROP

下面是使用子网掩码的示例:

  1. # iptables -A OUTPUT -d 192.168.1.0/24 -j DROP
  2. # iptables -A OUTPUT -o eth1 -d 192.168.1.0/24 -j DROP

下面我们以屏蔽facebook.com为例,进行说明。首先,我们需要facebook的所有IP地址:

  1. # host -t a www.facebook.com

示例输出:

  1. www.facebook.com has address 69.171.228.40

找出IP地址69.171.228.40的CIDR:

  1. # whois 69.171.228.40 | grep CIDR

示例输出:

  1. CIDR:69.171.224.0/19

现在我们来阻止对facebook.com的访问:

  1. # iptables -A OUTPUT -p tcp -d 69.171.224.0/19 -j DROP

我们也可以直接屏蔽域名:

  1. # iptables -A OUTPUT -p tcp -d www.facebook.com -j DROP
  2. # iptables -A OUTPUT -p tcp -d facebook.com -j DROP

12.记录并丢弃数据包

在公网网络接口上记录并丢弃IP地址欺骗数据包:

  1. # iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j LOG –log-prefix ”IP_SPOOF A: ”
  2. # iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

默认情况下日志记录在/var/log/messages文件中:

  1. # tail -f /var/log/messages
  2. # grep –color ’IP SPOOF’ /var/log/messages

我们还可以用-m参数对日志记录进行限制,以防止日志文件过度膨胀。

  1. # iptables -A INPUT -i eth1 -s 10.0.0.0/8 -m limit –limit 5/m –limit-burst 7 -j LOG –log-prefix ”IP_SPOOF A: ”
  2. # iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

13.根据MAC地址允许或阻止数据包的传入

我们可以根据MAC地址允许或阻止数据包的传入:

  1. # iptables -A INPUT -m mac –mac-source 00:0F:EA:91:04:08 -j DROP

14.屏蔽ICMP ping请求

我们可以通过允许下面的命令屏蔽ping请求:

  1. # iptables -A INPUT -p icmp –icmp-type echo-request -j DROP
  2. # iptables -A INPUT -i eth1 -p icmp –icmp-type echo-request -j DROP

也可以按照特定的网段和主机限制ping请求:

  1. # iptables -A INPUT -s 192.168.1.0/24 -p icmp –icmp-type echo-request -j ACCEPT

以下命令只接受受限制的ping请求:

  1. #假定默认INPUT策略为丢弃数据包
  2. # iptables -A INPUT -p icmp –icmp-type echo-reply -j ACCEPT
  3. # iptables -A INPUT -p icmp –icmp-type destination-unreachable -j ACCEPT
  4. # iptables -A INPUT -p icmp –icmp-type time-exceeded -j ACCEPT
  5. #所有的服务器都对ping请求作出应答
  6. # iptables -A INPUT -p icmp –icmp-type echo-request -j ACCEPT

15.开启端口序列

下面的命令可以允许7000到7010范围内的TCP端口访问:

  1. # iptables -A INPUT -m state –state NEW -m tcp -p tcp –dport 7000:7010 -j ACCEPT

16.允许一系列IP地址访问

下面的命令可以允许IP地址范围

  1. #运行IP地址范围192.168.1.100 到192.168.1.200 访问80端口
  2. # iptables -A INPUT -p tcp –destination-port 80 -m iprange –src-range 192.168.1.100-192.168.1.200 -j ACCEPT
  3. #NAT示例
  4. # iptables -t nat -A POSTROUTING -j SNAT –to-source 192.168.1.20-192.168.1.25

17.建立连接并重启防火墙

当重启iptables服务时,它会断开所有已建立的连接。这是因为在重启防火墙时,会卸载IPTABLES_MODULES_UNLOAD模块。

要解决这个问题,可以编辑/etc/sysconfig/iptables-config

  1. IPTABLES_MODULES_UNLOAD = no

18.使用Crit日志级别

  1. # iptables -A INPUT -s 1.2.3.4 -p tcp –destination-port 80 -j LOG –log-level crit

19.屏蔽或开启常见端口

屏蔽或开启常用的TCP、UDP端口:

  1. #可以使用DROP替换ACCEPT,实现端口屏蔽。
  2. #打开22端口(SSH)
  3. # iptables -A INPUT -m state –state NEW -m tcp -p tcp –dport 22 -j ACCEPT
  4. # iptables -A INPUT -s 192.168.1.0/24 -m state –state NEW -p tcp –dport 22 -j ACCEPT
  5. #打开TCP/UDP631端口(打印服务)
  6. # iptables -A INPUT -s 192.168.1.0/24 -p udp -m udp –dport 631 -j ACCEPT
  7. # iptables -A INPUT -s 192.168.1.0/24 -p tcp -m tcp –dport 631 -j ACCEPT
  8. # 打开123端口,允许局域网用户进行NTP时间同步
  9. # iptables -A INPUT -s 192.168.1.0/24 -m state –state NEW -p udp –dport 123 -j ACCEPT
  10. #打开25端口(SMTP)
  11. # iptables -A INPUT -m state –state NEW -p tcp –dport 25 -j ACCEPT
  12. # 打开DNS端口
  13. # iptables -A INPUT -m state –state NEW -p udp –dport 53 -j ACCEPT
  14. # iptables -A INPUT -m state –state NEW -p tcp –dport 53 -j ACCEPT
  15. #打开http/https端口
  16. # iptables -A INPUT -m state –state NEW -p tcp –dport 80 -j ACCEPT
  17. # iptables -A INPUT -m state –state NEW -p tcp –dport 443 -j ACCEPT
  18. #打开TCP110端口(POP3)
  19. # iptables -A INPUT -m state –state NEW -p tcp –dport 110 -j ACCEPT
  20. #打开TCP143端口
  21. # iptables -A INPUT -m state –state NEW -p tcp –dport 143 -j ACCEPT
  22. #为局域网用户开启Samba访问
  23. # iptables -A INPUT -s 192.168.1.0/24 -m state –state NEW -p tcp –dport 137 -j ACCEPT
  24. # iptables -A INPUT -s 192.168.1.0/24 -m state –state NEW -p tcp –dport 138 -j ACCEPT
  25. # iptables -A INPUT -s 192.168.1.0/24 -m state –state NEW -p tcp –dport 139 -j ACCEPT
  26. # iptables -A INPUT -s 192.168.1.0/24 -m state –state NEW -p tcp –dport 445 -j ACCEPT
  27. #为局域网用户开启代理服务器访问
  28. # iptables -A INPUT -s 192.168.1.0/24 -m state –state NEW -p tcp –dport 3128 -j ACCEPT
  29. #为局域网用户开启MySQL访问
  30. # iptables -I INPUT -p tcp –dport 3306 -j ACCEPT

20.限制客户端IP的并发连接数

我们可以使用connlimit模块限制客户端IP的并发连接数。下面的命令允许每个客户端只能并发3个ssh连接:

  1. # iptables -A INPUT -p tcp –syn –dport 22 -m connlimit –connlimit-above 3 -j REJECT

设置HTTP并发连接为20个:

  1. # iptables -p tcp –syn –dport 80 -m connlimit –connlimit-above 20 –connlimit-mask 24 -j DROP

参数说明:

  • –connlimit-above 3:连接数超过3个自动匹配
  • –connlimit-mask 24:子网掩码匹配

更好的使用iptables

首先,我们要学会查看man手册:

  1. $ man iptables

我们还可以这样查看帮助:

  1. # iptables -h

我们还可以查看特定命令的帮助:

  1. # iptables -j DROP -h

测试防火墙

测试端口是否开放:

  1. # netstat -tulpn

测试TCP 80端口是否开放:

  1. # netstat -tulpn | grep :80

如果80端口未开放,请确保启动Apache服务器:

  1. # service httpd start

并确保打开iptables防火墙80端口:

  1. # iptables -L INPUT -v -n | grep 80

如果80端口没有开放,可以运行下面的命令:

  1. # iptables -A INPUT -m state –state NEW -p tcp –dport 80 -j ACCEPT
  2. # service iptables save

下面使用telnet命令测试是否可以连接到80端口:

  1. $ telnet www.cyberciti.biz 80

下面是示例输出:

  1. Trying 75.126.153.206…
  2. Connected to www.cyberciti.biz.
  3. Escape character is ’^]’.
  4. ^]
  5. telnet> quit
  6. Connection closed.

最后,我们也推荐使用嗅探工具(如tcpdump、ngrep)对防火墙设置进行测试。

以上只是一些基本的防火墙配置策略,如果你想构造更复杂的防火墙策略,需要对TCP/IP和Linux内核配置文件sysctl.conf进行更深入的学习。

原文链接:http://www.csdn.net/article/2012-01-17/310905

发表在 linux | 留下评论

rsync级联时须注意exclude中转目录中的隐藏文件

今天发生一则磁盘告警,一台作为备份机器的磁盘满了。这个机器约有5T存储,前几天的印象是只使用了20%多,怎么一下子就告警了呢?

经过仔细定位,发现有一个目录有大量的.xxx.7Obwry,..xxx.xObwff.DHDpg9类似形式的隐藏文件,xxx文件都是比较大的日志文件,我做备份时是过滤掉的,为什么会在这里?从文件名可以看出来,.xxx.7Obwry是rsync过来的文件,..xxx.xObwff.DHDpg9是这类文件rsync过来时产生的临时文件。最后发现xxx这类文件我在rsync到备份机器时,虽然是做了exclude的,但是因为rsync到备份机器的客户端机器其实是一个中转机器,它也是通过rsync命令,从其他机器上获得数据的,在做rsync到备份机时,中转目录中会有.xxx类似的文件,这些我是没有exclude的,所以会rsync到备份机器,因为是隐藏文件,所以也很难觉察到。

改进措施:

1.在中转机器rsync到备份机器的参数中,增加 –exclude=‘.xxx*’类似的参数。

2.降低中转机器rsync到备份机器的运行频率。之前数据rsync到中转机器的频率是30分钟同步一次,中转机器rsync到备份机器是5分钟一次,这样使后者很容易看到前者rsync的中间文件。现在将后者从5分钟一次调整到30分钟一次。

3.rsync命令默认是会同步目录中的隐藏文件的,这点要牢记。

 

发表在 linux | 留下评论