基础知识

Linux系统内核内建了netfilter防火墙机制。Netfilter(数据包过滤机制),所谓的数据包过滤,就是分析进入主机的网络数据包,将数据包的头部数据提取出来进行分析,以决该连接为放行或阻挡的机制。Netfilter提供了iptables这个程序来作为防火墙数据包过滤的命令。Netfilter是内建的,效率非常高。

我们可以通过iptables命令来设置netfilter的过滤机制。

iptables里有3张表:

Filter(过滤器),进入Linux本机的数据包有关,是默认的表。 
NAT(地址转换),与Linux本机无关,主要与Linux主机后的局域网内计算机相关。 
Mangle(破坏者),这个表格主要是与特殊的数据包的路由标志有关(通常不用涉及到这个表的修改,对这个表的修改破坏性很大,慎改之)。

每张表里都还有多条链:

Filter:INPUT, OUTPUT, FORWARD 
NAT:PREROUTING, POSTROUTING, OUTPUT 
Mangle:PREROUTING, OUTPUT, INPUT, FORWARD

iptables命令的使用

基本格式:iptables [-t table] -CMD chain CRETIRIA -j ACTION

-t table:3张表中的其中一种filter, nat, mangle,如果没有指定,默认是filter。 
CMD:操作命令。查看、添加、替换、删除等。 
chain:链。指定是对表中的哪条链进行操作,如filter表中的INPUT链。 
CRETIRIA:匹配模式。对要过滤的数据包进行描述 
ACTION:操作。接受、拒绝、丢弃等。

各个钩子点业务处理流程图

这里写图片描述

修改

添加

格式:iptables [-t table] -A chain CRETIRIA -j ACTION

将新规则加入到表table(默认filter)的chain链的最后位置

插入

格式:iptables [-t table] -I chain pos CRETIRIA -j ACTION

将新规则插入到table表(默认filter)chain链的pos位置。原来之后的规则都往后推一位。pos的有效范围为:1 ~ num+1

替换

格式:iptables [-t table] -R chain pos CRETIRIA -j ACTION

用新规则替换table表(默认filter)chain链的pos位置的规则。pos的有效范围为:1 ~ num

删除

格式:iptables [-t table] -D chain pos

删除table表(默认filter)chain链的pos位置的规则。pos的有效范围为:1 ~ num

包匹配(CRETIRIA)

上面没有介绍CRETIRIA的规则,在这小节里详细介绍。包匹配就是用于描述需要过滤的数据包包头特殊的字段。

指定网口

-i :数据包所进入的那个网络接口,例如 eth0、lo等,需与INPUT链配合 
-o: 数据包所传出的那么网络接口,需与OUTPUT链配合

指定协议

-p:tcp, udp, icmp或all

指定IP网络:

-s:来源网络。可以是IP或网络 
IP: 192.168.0.100 
网络: 192.168.0.0/24 或 192.168.0.0/255.255.255.0 均可 
可以在前加 ! 表示取反

-d:目标网格。同 -s

指定端口:

–sport:指定来源端口。可以是单个端口,还可以是连续的端口,例如:1024:65535。

–dport:指定目标端口。同–sport

注意:要指定了tcp或udp协议才会有效。

指定MAC地址:

-m mac –mac-source aa:bb:cc:dd:ee:ff

指定状态:

-m state –state STATUS

STATUS可以是:

INVALID,无效包 
ESTABLISHED,已经连接成功的连接状态 
NEW,想要新立连接的数据包 
RELATED,这个数据包与主机发送出去的数据包有关,(最常用)

例如:只要已建立连接或与已发出请求相关的数据包就予以通过,不合法数据包就丢弃

-m state –state RELATED,ESTABLISHED

ICMP数据比对

ping操作发送的是ICMP包,如果不想被ping到,就可以拒绝。

–icmp-type TYPE

TYPE如下:

8    echo-request(请求)
0    echo-reply(响应)
  • 1
  • 2
  • 3

注意:需要与 -p icmp 配合使用。

操作(ACTION)

DROP,丢弃

ACCEPT,接受

REJECT,拒绝

LOG,跟踪记录,将访问记录写入 /var/log/messages

保存配置

将新设置的规则保存到文件

格式:iptables-save [-t table]

将当前的配置保存到 /etc/sysconfig/iptables

其它

格式:iptables [-t table] [-FXZ]

-F :请除所有的已制订的规则 
-X :除掉所有用户“自定义”的chain 
-Z :将所有的统计值清0

操作举例

(1)查看本机IPTABLES的设置情况 
[root@tp ~]# iptables -L -n 
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 
什么规则都没有.

或者 
[root@localhost ~]# service iptables status 
Table: filter 
Chain INPUT (policy ACCEPT) 
num target prot opt source destination 
1 ACCEPT tcp – 0.0.0.0/0 0.0.0.0/0 tcp dpt:22

Chain FORWARD (policy ACCEPT) 
num target prot opt source destination

Chain OUTPUT (policy ACCEPT) 
num target prot opt source destination

(2)清除原有规则. 
不管你在安装linux时是否启动了防火墙,如果你想配置属于自己的防火墙,那就清除现在filter的所有规则. 
[root@tp ~]# iptables -F 清除预设表filter中的所有规则链的规则 
[root@tp ~]# iptables -X 清除预设表filter中使用者自定链中的规则 
[root@tp ~]# iptables -L -n 
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

什么都没有了吧,和我们在安装linux时没有启动防火墙是一样的.(提前说一句,这些配置就像用命令配置IP一样,重起就会失去作用),怎么保存. 
[root@tp ~]# /etc/rc.d/init.d/iptables save 
这样就可以写到/etc/sysconfig/iptables文件里了.写入后记得把防火墙重起一下,才能起作用.

[root@tp ~]# service iptables restart 
现在IPTABLES配置表里什么配置都没有了,那我们开始我们的配置吧

(3)添加规则. 
首先添加INPUT链,INPUT链的默认规则是DROP,所以我们就写需要ACCETP(通过)的链 
为了能采用远程SSH登陆,我们要开启22端口. 
[root@tp ~]# iptables -A INPUT -p tcp –dport 22 -j ACCEPT 
[root@tp ~]# iptables -A OUTPUT -p tcp –sport 22 -j ACCEPT 
[root@tp ~]# iptables -A OUTPUT -p tcp –sport 80 -j ACCEPT ,其他同理

如果做了WEB服务器,开启80端口. 
[root@tp ~]# iptables -A INPUT -p tcp –dport 80 -j ACCEPT 
如果做了邮件服务器,开启25,110端口. 
[root@tp ~]# iptables -A INPUT -p tcp –dport 110 -j ACCEPT

如果做了FTP服务器,开启21端口 
[root@tp ~]# iptables -A INPUT -p tcp –dport 21 -j ACCEPT

如果做了DNS服务器,开启53端口 
[root@tp ~]# iptables -A INPUT -p tcp –dport 53 -j ACCEPT 
如果你还做了其他的服务器,需要开启哪个端口,照写就行了. 
上面主要写的都是INPUT链,凡是不在上面的规则里的,都DROP

允许icmp包通过,也就是允许ping, 
[root@tp ~]# iptables -A OUTPUT|INPUT -p icmp -j ACCEPT

减少不安全的端口连接 
[root@tp ~]# iptables -A OUTPUT -p tcp –sport 31337 -j DROP 
[root@tp ~]# iptables -A OUTPUT -p tcp –dport 31337 -j DROP 
有些些特洛伊木马会扫描端口31337到31340(即黑客语言中的 elite 端口)上的服务。既然合法服务都不使用这些非标准端口来通信,阻塞这些端口能够有效地减少你的网络上可能被感染的机器和它们的远程主服务器进行独立通信的机会

当然出入更安全的考虑你也可以包OUTPUT链设置成DROP,那你添加的规则就多一些,就像上边添加 
允许SSH登陆一样.照着写就行了. 
下面写一下更加细致的规则,就是限制到某台机器 
如:我们只允许192.168.0.3的机器进行SSH连接 
[root@tp ~]# iptables -A INPUT -s 192.168.0.3 -p tcp –dport 22 -j ACCEPT 
如果要允许,或限制一段IP地址可用 192.168.0.0/24 表示192.168.0.1-255端的所有IP.

其他的规则连接也一样这么设置.

在下面就是FORWARD链 
[root@tp ~]# iptables -A FORWARD -i eth1 -o eh0 -j ACCEPT

丢弃坏的TCP包 
[root@tp ~]#iptables -A FORWARD -p TCP ! –syn -m state –state NEW -j DROP

处理IP碎片数量,防止攻击,允许每秒100个 
[root@tp ~]#iptables -A FORWARD -f -m limit –limit 100/s –limit-burst 100 -j ACCEPT

设置ICMP包过滤,允许每秒1个包,限制触发条件是10个包. 
[root@tp ~]#iptables -A FORWARD -p icmp -m limit –limit 1/s –limit-burst 10 -j ACCEPT

二,配置一个NAT表放火墙 
1,查看本机关于NAT的设置情况 
[root@tp rc.d]# iptables -t nat -L 
Chain PREROUTING (policy ACCEPT) 
target prot opt source destination 
Chain POSTROUTING (policy ACCEPT) 
target prot opt source destination 
SNAT all – 192.168.0.0/24 anywhere to:211.101.46.235 
Chain OUTPUT (policy ACCEPT) 
target prot opt source destination

清除命令 
[root@tp ~]# iptables -F -t nat 
[root@tp ~]# iptables -X -t nat 
[root@tp ~]# iptables -Z -t nat

2,添加规则 
添加基本的NAT地址转换 
添加规则,我们只添加DROP链.因为默认链全是ACCEPT. 
防止外网用内网IP欺骗 
[root@tp sysconfig]# iptables -t nat -A PREROUTING -i eth0 -s 10.0.0.0/8 -j DROP

如果我们想,比如阻止MSN,QQ,BT等的话,需要找到它们所用的端口或者IP, 
例: 
禁止与211.101.46.253的所有连接 
[root@tp ~]# iptables -t nat -A PREROUTING -d 211.101.46.253 -j DROP 
禁用FTP(21)端口 
[root@tp ~]# iptables -t nat -A PREROUTING -p tcp –dport 21 -j DROP 
这样写范围太大了,我们可以更精确的定义. 
[root@tp ~]# iptables -t nat -A PREROUTING -p tcp –dport 21 -d 211.101.46.253 -j DROP 
这样只禁用211.101.46.253地址的FTP连接,其他连接还可以.如web(80端口)连接. 
按照我写的,你只要找到QQ,MSN等其他软件的IP地址,和端口,以及基于什么协议,只要照着写就行了. 
最后: 
drop非法连接 
[root@tp ~]# iptables -A INPUT|OUTPUT|FORWARD -m state –state INVALID -j DROP

允许所有已经建立的和相关的连接 
[root@tp ~]# iptables-A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT 
[root@tp ~]# /etc/rc.d/init.d/iptables save 
这样就可以写到/etc/sysconfig/iptables文件里了.写入后记得把防火墙重起一下,才能起作用. 
[root@tp ~]# service iptables restart

禁止mgm6688.com DNS请求 
[root@tp ~]# iptables -t raw -I PREROUTING -p udp –dport 53 -m string –to 512 –algo bm –icase –hex-string ‘|07|mgm6688|03|com’ -j DROP

参考文章

http://www.cnblogs.com/JemBai/archive/2009/03/19/1416364.html 
http://my.oschina.net/hevakelcj/blog/313212

GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐