随笔-179  评论-666  文章-29  trackbacks-0

关于IP Tables

在初始化设置系统后,为了让系统更安全,Ubuntu把Iptabls作为发行版的默认防火墙。起初,尽管Ubuntu防火墙已经被配置了,但是它设置为通过一个虚拟主机允许所有的进入与流出流量。要打开服务器上某些更强的保护功能,我们需要在IP Table山增加一些基础的规则。

IP Table 规则来自于一系列可以组合起来创建各自的特定的处理方法的选项。每一个通过防火墙的包被所有的规则按顺序检查,一旦符合某个规则,这个报文包就遵循相关的动作,否则就处理下一行。

IP Table 命令

尽管这个教程只会涉及有限的一些命令,这些命令能够提供给服务器一些基本安全,然后却可以为IP Table提供大量的细致与具体的用例。下面是配置VPS防火墙最有用的命令中的一部分,请在脑海中保持一根弦:下面只是一个很短的列表,还有大量的其他可选参数。

-A:(Append), 增加一条规则到IP Table中;
-L:(List),显示当前规则;
-m conntrack: 允许规则基于当前的连接状态,详细指定使用 --cstate 命令;
--cstate: 解释当前连接可以进入的状态,有4种,分别是: New, Related, Established, Invalid;
-p:(protocal),指向要被检查的规则或包的协议,指定的协议可以是tcp,upd,updlite,icmp,esp,ah,sctp,中的一种或者特殊的关键词
"all"
--dport:(port),指向机器连接通过的端口;
-j:(junp),这个参数指明当有满足一条规则的事件发生,那么就要采取的动作。它被转换为如下四种可能中的一种

  • -ACCEPT:这个包被接收,没有更进一步的规则需要处理;
  • -REJECT:这个包被拒绝了,同时通知发送者,没有更进一步的规则需要处理;
  • -DROP:这个包被拒绝了,但是不会通知发送者,没有更进一步的规则需要处理;
  • -LOG:这个包被接收,同时被日志记录,接下来的规则会继续被执行;

-I:(Insert),在前两个之间插入一条规则;
-I INPUT 3:插入一条规则到IP Table中,并且让它成为列表中的第三个;
-v:(verbose),提供关于一条规则的更多的细节;

建立一个IP Table

如果你输入以下命令,可以在虚拟主机上看到当前的IP Table

sudo iptables -L

显示出来的内容应该类似下面这样:

Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

如果你在某处有一个不同的规则集或者你想要开始一个新的,你总是可以通过刷新与删除所有规则以使规则被还原为默认的。

sudo iptables -F

更进一步,如果你想用IP Table来提高你的工作速度,你可以在命令中使用 -n,这个参数屏蔽掉DNS查询,阻止那些尝试从规则集中反转找出每一个ip的命令,你可以用这个命令列出规则来,比如下面这样:

iptables -L -n

一个基本的防火墙

基于表示当前运行所有连接的规则,即传入和传出。无论怎样都么有安全可言。在我们建立table时,需要随时保持一根弦的就是,一旦一个包被ACCEPTED,REJECTED,DROPPED,那么就不会有更进一步的规则被执行了。即规则中第一个比后一个有优先权。

当创建规则时,我们必须保证不因意外的屏蔽SSH而阻止了我们自己。

开始时,我们必须要保证允许当前所以的连接,当创建规则时所有的连接会保持在线。

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

让我们开始来分析这段命令的意思:

  1. -A 告诉IP Table增加一条规则到table中;
  2. INPUT 指定这条规则是输入链的一部分;
  3. m conntrack 后续跟着 -csstat ESTABLISHED,RELATED表明这条规则只能当前存在的连接和与它相关的连接起作用;
  4. -j ACCEPT 判断这个包跳转到接收,而这个连接不会改变;

在我们保证了当前vps上连接不会被中断后,我们可以着手开始屏蔽掉不安全的连接。

我们假设想要屏蔽掉除了给ssh用的22端口和web服务的80端口外的其他传入流量。我们通过使用下面的规则来允许指定端口上的所有流量:

sudo iptables -A INPUT -p tcp --dport ssh -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT

在这两条命令中, -p 参数代表连接使用的协议,在这里是tcp,--dport指定传递的包通过的端口

在我们保证了有价值的通信将会通过防火墙后,我们可以通过屏蔽掉所有剩下的进入vps的通信来结束规则。因为这是规则列表中的最后一条,任何一个满足上面一条规则的通信都不会被此条规则影响到,它们会被我们之前的定义所处理。

下面就开始定义屏蔽掉所有剩下通信的规则:

sudo iptables -A INPUT -j DROP

通过上面的定义,我们更新后的规则类似于下面这样:

sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
ACCEPT tcp -- anywhere anywhere tcp dpt:http
DROP all -- anywhere anywhere

我们基本上快结束了。然后,我们忘记了一个规则,我们需要提供我们的vps的回环访问。如果我们现在打算添加的规则没有更多的限定语,它将是规则列表的最后一条,因为它在屏蔽掉所有通信的后面,所以它不会产生作用。

为了避免这种情况,我们需要把这条规则添加到列表的第一条,使用如下的命令:

sudo iptables -I INPUT 1 -i lo -j ACCEPT

  1. -I INPUT 1 把这条命令放在规则表的第一条;
  2. lo 指向回环接口;
  3. -j ACCEPT保证回环通信能被接收;

到目前为止,我们已经创建了一个基本的防火墙,你的规则应该类似于这样(我们可以使用 -v来查看iptable的详细信息):

sudo iptables -L -v

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- lo any anywhere anywhere
1289 93442 ACCEPT all -- any any anywhere anywhere ctstate RELATED,ESTABLISHED
2 212 ACCEPT tcp -- any any anywhere anywhere tcp dpt:ssh
0 0 ACCEPT tcp -- any any anywhere anywhere tcp dpt:http
47 2422 DROP all -- any any anywhere anywhere

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 157 packets, 25300 bytes)
pkts bytes target prot opt in out source destination

然而,当vps重启后,IP Table就被清除掉了,下一步就是保存与恢复IP Tables。

保存IP Tables

虽然IP Tables非常的有用,如果服务器重启,那么他们会被自动的删除。为了保证他们永远有效,我们可以使用一个叫做IP-Tables persistent软件包。
我们可以通过apt-get 来安装这个软件包:

sudo apt-get install iptables-persistent
安装过程中,你将会被询是否同时保存IPv4和IPv6规则,选择yes。

你的规则稍后就可以被保存在 /etc/iptables/rules.v4和/etc/iptables/rules.v6中。

当安装完成后,运行下面这个命令启动iptables-persistent:
sudo service iptables-persistent start
后续无论怎么重启服务器,你的规则都保存在那里。

保存您的防火墙股则到一个文件 

# iptables-save > /etc/iptables.up.rules 

接着修改 /etc/network/interfaces 脚本自动应用这些规则(末行是添加的) 

auto eth0 
iface eth0 inet dhcp 
pre-up iptables-restore < /etc/iptables.up.rules 

你也可以准备一组规则冰并自动应用它 

auto eth0 
iface eth0 inet dhcp 
pre-up iptables-restore < /etc/iptables.up.rules 
post-down iptables-restore < /etc/iptables.down.rules 


封单个IP的命令是:

 代码如下复制代码
iptables -I INPUT -s 211.1.0.0 -j DROP

封IP段的命令是:

 代码如下复制代码

iptables -I INPUT -s 211.1.0.0/16 -j DROP 
iptables -I INPUT -s 211.2.0.0/16 -j DROP 
iptables -I INPUT -s 211.3.0.0/16 -j DROP

封整个段的命令是:

 代码如下复制代码

iptables -I INPUT -s 211.0.0.0/8 -j DROP

封几个段的命令是:

 代码如下复制代码

iptables -I INPUT -s 61.37.80.0/24 -j DROP 
iptables -I INPUT -s 61.37.81.0/24 -j DROP


vi /etc/sysconfig/iptables里:RH-Firewall-1-INPUT - [0:0]下面添加一行

下面是只允许某个IP访问xx端口

 代码如下复制代码

-A INPUT -s 192.168.5.244 -j DROP

以上是临时设置。

解封的话:

 代码如下复制代码

iptables -D INPUT -s IP地址 -j REJECT 
iptables -F 全清掉了  


防止同步包洪水(Sync Flood)

 代码如下复制代码
# iptables -A FORWARD -p tcp –syn -m limit –limit 1/s -j ACCEPT

防止各种端口扫描

 代码如下复制代码
# iptables -A FORWARD -p tcp –tcp-flags SYN,ACK,FIN,RST RST -m limit –limit 1/s -j ACCEPT

Ping 洪水攻击(Ping of Death)

 代码如下复制代码
# iptables -A FORWARD -p icmp –icmp-type echo-request -m limit –limit 1/s -j ACCEPT


1. 查看本机关于IPTABLES的设置情况

 代码如下复制代码
# iptables -L -n

2. 清除原有规则
# iptables -F 清除预设表filter中的所有规则链的规则
# iptables -X 清除预设表filter中使用者自定链中的规则

=========================================================================================================================================

Iptables是一个防火墙,所有的Ubuntu官方发行版(Ubuntu,Kubuntu,Xubuntu)都默认自带Iptables。当你安装完Ubuntu以后,Iptables就已经装好了,但是默认设置是允许所有的通讯。从Ubuntu 8.04版本开始,Ubuntu有了一个防火墙配置的GUI工具UFW

ubuntu下跟其他linux系统的操作基本相同,可能略有不同。
iptables命令的选项很多,多使用man吧。

查看本机设置

查看本机的Iptables设置使用下面的命令:

iptables -L -n

通过iso文件刚安装完的纯净的ubuntu,查看一下防火墙设置的话,是这样没有任何规则的:

Chain INPUT (policy ACCEPT)
target       prot opt source                 destination         
Chain FORWARD (policy ACCEPT)
target       prot opt source                 destination         
Chain OUTPUT (policy ACCEPT)
target       prot opt source                 destination

没有任何规则。

清除规则

不管有没有配置过规则,在重新进行配置之前,需要先清除规则:

iptables -F        //清除预设表filter中的所有规则链的规则
iptables -X        //清除预设表filter中使用者自定链中的规则

设定预设规则

这样就清除干净了,下面开始配置,先设定预设规则。
对于防火墙的设置,有两种策略:一种是全部通讯口都允许使用,只是阻止一些我们知道的不安全的或者容易被利用的口;另外一种,则是先屏蔽所有的通讯口,而只是允许我们需要使用的通讯端口。

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

注意-P中的P需要大写,表示Protocol。

可以看出INPUT,FORWARD两个链采用的是允许什么包通过,而OUTPUT链采用的是不允许什么包通过。
当超出了IPTABLES里filter表里的两个链规则(INPUT、FORWARD)时,不在这两个规则里的数据包怎么处理呢,那就是DROP(放弃)。应该说这样配置是很安全的,我们要控制流入数据包。
而对于OUTPUT链,也就是流出的包我们不用做太多限制,而是采取ACCEPT,也就是说,不在这个规则里的包怎么办呢,那就是通过。

添加规则

先来添加INPUT规则,因为INPUT预设的是DROP,所以要添加ACCEPT规则。
首先是22端口,这个的用处地球人都知道。

iptables -A INPUT -p tcp --dport 22 -j ACCEPT

或者,你不写22,写ssh也可以。

iptables -A INPUT -p tcp --dport ssh -j ACCEPT

给Web服务器开启80端口

iptables -A INPUT -p tcp --dport 80 -j ACCEPT

给FTP服务开启20和21端口

iptables -A INPUT -p tcp --dport 20 -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT

给邮件服务开启25和110端口

iptables -A INPUT -p tcp --dport 25 -j ACCEPT
iptables -A INPUT -p tcp --dport 110 -j ACCEPT

对于OUTPUT规则,因为预设的是ACCEPT,所以要添加DROP规则,减少不安全的端口链接。

iptables -A OUTPUT -p tcp --sport 31337 -j DROP
iptables -A OUTPUT -p tcp --dport 31337 -j DROP

具体要DROP掉哪些端口,可以查询相关的资料,可以把一些黑客常用的扫描端口全部DROP掉,多多少少提高一点服务器的安全性。

我们还可以把规则限制到只允许某个IP:

iptables -A INPUT -s 192.168.0.18 -p tcp --dport 22 -j ACCEPT

这表示只允许192.168.0.18的机器进行SSH连接。

如果要允许一个IP段,可以使用下面的写法:

iptables -A INPUT -s 192.168.0.1/255 -p tcp --dport 22 -j ACCEPT

这表示允许192.168.0.1/255IP段的机器进行连接。
但是,注意我们前面已经添加一条规则来允许所有IP连接22端口,需要把这条规则删除掉。

iptables -D INPUT -p tcp --dport 22 -j ACCEPT

对于FORWARD规则,因为预设的是DROP,所以要添加ACCEPT规则。
开启转发功能

iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth1 -o eh0 -j ACCEPT

丢弃坏的TCP包

iptables -A FORWARD -p TCP ! --syn -m state --state NEW -j DROP

处理IP碎片数量,防止攻击,允许每秒100个

iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT

设置ICMP包过滤,允许每秒1个包,限制触发条件是10个包

iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT

Iptables的保存和调用

现在该提一下保存的问题了。
我们用命令来添加的设置,都不会自动保存,一旦退出,设置都将不存在了,需要手动去保存一下。

iptables-save >/etc/iptables.up.rules

把刚才设置的规则保存到指定的地方,文件名可以自定义。

调用Iptables设置

iptables-restore >/etc/iptables.up.rules

由于每次开机或重启后都需要去调用一次,我们把它设置自动的,执行

sudo gedit /etc/network/interfaces

auto ath0
     iface ath0 inet dhcp

后面,加上

pre-up iptables-restore >/etc/iptables.up.rules //开机时自动调用已经存在的Iptables设置
post-down iptables-save >/etc/iptables.up.rule  //关机时自动保存当前的Iptables设置

=====================================================================================================

防范CC攻击

当apache站点受到严重的cc攻击,我们可以用iptables来防止web服务器被CC攻击,实现自动屏蔽IP的功能。

1.系统要求

(1)LINUX 内核版本:2.6.9-42ELsmp或2.6.9-55ELsmp(其它内核版本需要重新编译内核,比较麻烦,但是也是可以实现的)。

(2)iptables版本:1.3.7

2. 安装

安装iptables1.3.7和系统内核版本对应的内核模块kernel-smp-modules-connlimit

3. 配置相应的iptables规则

示例如下:

(1)控制单个IP的最大并发连接数

iptables -I INPUT -p tcp --dport 80 -m connlimit  --connlimit-above 50 -j REJECT #允许单个IP的最大连接数为 30

   iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 10 -j DROP #限制与80端口连接的IP最大连接数为10,可自定义修改。

#默认iptables模块不包含connlimit,需要自己单独编译加载,请参考该地址
http://sookk8.blog.51cto.com/455855/280372不编译内核加载connlimit模块


(2)控制单个IP在一定的时间(比如60秒)内允许新建立的连接数

iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --update --seconds 60 --hitcount 30 -j REJECT iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --set -j ACCEPT
#单个IP在60秒内只允许最多新建30个连接


posted on 2015-10-31 15:51 Alpha 阅读(2555) 评论(0)  编辑  收藏 所属分类: Linux Nginx

只有注册用户登录后才能发表评论。


网站导航: