Linux包过滤防火墙
1,什么是包过滤防火墙
2,包过滤的工作层
工作在网络层
3,工作原理
数据包过滤通过对数据包的IP头和TCP或UDP头的检查来实现的主要有:
IP源地址
IP目标地址
协议(tcp包,udp包,和icmp包)
tcp或udp的源端口
imcp消息类型
tcp包头中的ack位
数据包到达的端口
数据包出去的端口
包过滤技术的优缺点
使用iptables实现包过滤
相关的TCP/IP支持
假如A要和B通信
1,(SYN) B要和A通信时,B首先向A发一个SYN标记的包,告诉 A请求建立连接
2,(SYN/ACK) A收到后回发送一对SYN包的确认包(SYN/ACK)回去,表示对第一个SYN包的确认,并继续握手操作
3,(ACK) B收到SYN/ACK包后,B发一个确认包ACK,通知 A连接已建立。三次握手完成,一个TCP连接完成
TCP连接的每个包都会设置ACK位,这就是连接跟踪的重要意义,放火墙将无法判断收到的ACK属于一个已经建立的连接
结束TCP连接
iptables语法
一条iptables规则基本上因该包含5个要素
指定表 table 分别是 filter,nat和mangle
指定操作命令 command 包括添加,删除,更新
指定链 chains 对于包过滤防火墙可操作filter表中的INPUT链,OUTPUT链和 FORWARD链
指定规则匹配器 mather 可以指定各种规则匹配,如IP地址,端口,包类型
指定目标动作 target 当规则匹配一个包时,真正要执行的任务用目标标识。最常目标 为ACCEPT,DROP,REJECT表示拒绝,丢弃包的同时给发送没有接 受的通知,LOG表示包的有关信息被记录日志,TOS表示改写包的TOS值
语法:
iptables [-t table] CMD [chain] [rule-matcher] [-j target]
table为表名,CMD为操作命令,chain为链名,rule-matcher为规则匹配器,target为目标动作
iptables的常用操作命令
-A 或 --append 在所有的链的结尾加入一条或多条规则
-D 或 --delete 在所有的链删除
-R 或 --replace 替换一条匹配的规则
-I 或 --insert 以给出的规则号在所选链中插入一条或多条规则。如果规则号是1,插入的规则的链的头部
-L 或 --list 列出指定链的所有规则,如果没有指定链,将列出所有链中的所有规则
-F 或 --flush 清除指定链和表中的所有规则,假如不指定,将全部删除
-N 或 --new-chain 以给定的名字创建一条新的用户自定义链。不能与已有的链同名
-X 或 --delete-chain 删除指定的用户定义链
-P 或 --policy(n政策,方针) 为永久链指定默认规则。用户定义链没有默认规则。缺剩 规则也是规则链中的最后一条规则用-L命令显示时它在第一 行显示
-C 或 --check 检测给定的包是否与指定链的规则相匹配
-X 或 --zero 将指定链中所有规则的包字节(byte)计数器清零
-h 显示帮助信息
iptables常用的规则匹配器
-p,[!]protocol 指出要匹配的协议,可以是tcp,udp,icmp,all.协议名前缀"!", 为逻辑非
-s[!]address[/mask] 根据源地址或地址范围确定是否允许或拒绝数据包通过过滤器
--sport[!]port[:port] 指定匹配规则的源端口或端口范围。可以用端口号
-d[!]address[/mask] 根据目的地址或地址范围确定是否允许或拒绝数据包通过过滤器
-dport[!]port[:port] 指定匹配规则的目的端口或端口范围,可以用端口号,也可以 用/etc/services文件中的名字
--icmp-type[!]typename 指定匹配规则的ICMP信息类(可以使用iptables -p icmp -h 查看有效的icmp类型名)
-i[!]interface name[+] 匹配单独的接口或某种类型的接口设置过滤规则。此参数忽略 时,默认符合所有接口。接口可以使用否定符"!"来匹配不是指 定接口来包.参数interfacename是接口名,如eth0,eth1,ppp0 等。指定一个目前不存在的接口是完全合法的。规则直到接口时 才起作用,这种指定对于PPP及该选项只有对INPUT,FROWARD和 PREROUTING链是合法的
-o[!]interface name[+] 仅仅匹配设置了SYN位,清除了ACK,FIN位的TCP包.这些包表示请求初始化的TCP连接。阻止从接口来的这样的包将会组织外来的TCP连接请求。但输出的TCP连接请求将不受影响。这个参数仅仅当协议类型设置为TCP时才能用
-m --match -m选项引出了iptables的state扩展模块,比如mac扩展模块,它实现根据主机网卡的MAC地址进行权限控制的规则:
iptables -A INPUT -p tcp -m mac --mac-source 01:02:03:04:05:06 -j ACCEPT
扩展模块是iptables体系中的特色,它使得iptables成为一个可扩展的安全体系结构。你可以从这里了解更多关于iptables扩展模块的知识:http://www.iptables.org/document ... tensions-HOWTO.html
[!]-syn 仅仅匹配设置了SYN位,清除
--state state,state... 状态匹配
这里,state是一个用逗号分割的列表,表示要匹配的连接状态。有效的状态选项包括:INVAILD,表示分组对应的连接是未知的;ESTABLISHED,表示分组对应的连接已经进行了双向的分组传输,也就是说连接已经建立;NEW,表示这个分组需要发起一个连接,或者说,分组对应的连接在两个方向上都没有进行过分组传输;RELATED,表示分组要发起一个新的连接,但是这个连接和一个现有的连接有关,例如:FTP的数据传输连接和控制连接之间就是RELATED关系。
对于本地产生分组,在PREROUTING或者OUTPUT链中都可以对连接的状态进行跟踪。在进行状态检测之前,需要重组分组的分片。这就是为什么在iptables中不再使用ipchains的ip_always_defrag开关。UDP和TCP连接的状态表由/proc/net/ip_conntrack进行维护。稍后我们再介绍它的内容。状态表能够保存的最大连接数保存在/proc/sys/net/ipv4/ip_conntrack_max中。它取决于硬件的物理内存。
分组是否匹配状态表中的一个已经实现(ESTABLISHED)的连接。
它是否是和状态表中某个UDP/TCP连接相关(RELATED)的一个ICMP分组。
这个分组是否要发起一个新(NEW)的连接。
如果分组和任何连接无关,就被认为是无效(INVALID)的。
iptables -A INPUT -i eth0 -m state --state NEW -j DROP
//禁止从eth0进来的NEW状态,也就是禁止来自eth0的新的访问请求
指定永久性规则
/sbin/iptables-save > /usr/local/iptables_bat 导出
/sbin/iptables-restore < /usr/local/iptables_bat 导入
service iptables save
iptalbe命令使用举例
1,链的基本操作
要清除所有的配置
iptables -F
iptables -X 清除
iptables -Z 将指定链中所有规则的包字节计数器清零
(2)设置链的默认策略.一般地 有两种方法
首先允许所有的包,然后在禁止有危险的包通过防火墙。即没有被决绝的都允许,这种方法对用户而言比较灵活方便, 但对系统而言,容易引起严重的安全问题
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
首先禁止所有的包
iptalbes -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
列出表/链中的所有规则 包过滤防火墙只使用filter表,它是默认表 因此会显示filter表中所有规则
iptables -L
iptables -L -n 参数用于显示数字化的地址和端口
向链中添加规则。下面的语句用于开放网络接口.
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -i eth1 -j ACCEPT
iptables -A OUTPUT -o eht1 -j ACCEPT
iptables -A FORWARD -o eth1 -j ACCEPT
本地进程不会经过FORWARD链,因此lo只有INPUT和OUTPUT两个链上作用
用户自定义链
iptables -N custom(n习俗,风俗v定值) //新建coustom定义链
iptables -A coutom -s 0/0 -p icmp -j DROP //丢弃全部ICMP包
iptables -A INPUT -s 0/0 -d 0/0 -j custom //INPUT链中加入一条规则,使所有的包都由custom子定义链处理.结果全部的ICMP包都被丢弃
包的处理方式: DROP,ACCEPT,REIECT(弹回),LOG
iptables -A INPUT -p icmp -j DORP
iptables -A INPUT -p tcp -d 219.237.206.200 --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp -s
iptables -p INPUT DROP 改变防火墙默认策略
iptables -p ACCEPT DROP
iptables -p OUTPUT DROP
iptables -A INPUT -p tcp -d
iptables -A OUTPUT -p tcp -s
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT //允许DNS通过
iptables -A INPUT -p udp --sport 53 -j ACCEPT
iptables -A INPUT -p ud
iptables -A OUTPUT -p udp --sport 53 -j ACCEPT
iptables -D INPUT 5 //删除INPUT 5个编号
如果自己是某种客户机和服务器的话,需要在连上加两个条件
还需要开通本机的服务器
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
iptables -A OUTPUT -d 127.0.0.1 -s 127.0.0.1 -j ACCEPT
可以设置本机的包,不能从本机的22端口自动的出去,因为没有验证过
下面表示跟本机建立过连接的包,才能从22端口出去,防止本机自从动从22端口出去
iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
现在就可以删除原来的包了
iptables -D OUTPUT 1
下面是不允许本地产生包主动从80端口发送给别人!
iptables -A OUTPUT -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
删除原来的设置
上面是作为服务器有这个问题,做为客户机也会产生这个问题
iptables -A INPUT -p tcp --sport 22 -m state --state ESTABALIASHAED -j ACCEPT
LOG目标
iptables-save > /etc/sysconfig/iptalbes 保存
2,设置基本的规则匹配
指定协议匹配
iptables -A INPUT -p tcp // 匹配指定的协议
iptables -A INPUT -p !tcp // 匹配指定协议之外的所有协议
指定地址匹配
iptables -A INPUT -s 192.168.1.11 // 指定匹配的主机
iptables -A INPUT -s 192.168.10.0/24
iptables -A FORWARD -s ! 192.168.0.1
iptables -A FORWARD -s ! 192.168.0.0/24 //指定网络之外的网络
指定网络接口匹配
指定单一的网络接口匹配
iptables -A INPUT -i eth0
iptables -A FORWARD -o eth0
指定同类型的网络接口匹配
iptables -A FORWARD -o ppp+
指定单一的端口匹配
iptables -A INPUT -p tcp --sport www
iptables -A INPUT -p tcp --sport 80
iptables -A INPUT -p udp --sport 53
iptables -A INPUT -p udp --dport 53
匹配指定端口之外的端口
iptables -A INPUT -p tcp --dport ! 22
匹配指定的端口范围
iptables -A INPUT -p tcp --sport 22:80
匹配ICMP端口和ICMP类型
iptables -A INPUT -p icmp --icmp-type 8
指定ip碎片
在TCP/IP通信过程中,每一个网络接口都有严格最大传输单元(MTU),这个参数定义可以通过的数据包的最大尺寸。如果一个数据包大于这个参数值时,系统会将其划分成更小的数的数个数据包(成为IP岁片)
....................
设置扩展的规则匹配
包过滤防火墙配置举例
包过滤防火墙配置举例
touch /etc/rc.d/filter-firewall
chmod u+x /etc/rc.d/filter-firewall
echo "/etc/rc.d/filter-firewall" >> /etc/rc.d/rc.local
vi /etc/rc.d/filter-firewall
#!/bin/sh
echo "String iptables rules..."
echo "1" /proc/sys/net/ipv4/ip_forward
ipt=/sbin/iptables
www-server=192.168.0.100
ftp-server=192.168.0.200
email-server=192.168.0.210
ip_range="198.168.80.0/24"
##########################################################################
刷新所有的链的规则
iptables -F
首先禁止转发任何包,然后再一步步设置允许通过的包
所有首先设置防火墙FORWARD链的策略为DROP
iptables -P FORWARD DROP
下面设置关于服务器的包过滤规则
由于服务器/客户机交互是双向的,所有不仅仅要设置数据包
NAT与代理服务器
echo "1" > /proc/sys/net/ipv4/ip_forware
NAT表也有三个缺省的链
prerouting: 可以在这里面定义进行目的nat的规则,因为路由器进行路由时检查数据包的目的ip地址,所以为了使数据包得以正确路由,我们必须在路由之前就进行目的nat
postrouteing 可以在这里定义进行源nat的规则,系统在决定了数据包的路由以后在执行该链中的规则。
output: 定义对本地产生的数据包的目的的nat规则
Netfilter的Nat表
prerouting 和 postrouting表
SNAT原地址转换 destination:
DNAT目标地址转换
iptables -t nat -A POSTROUTING -s
把源的
内网翻译成外网地址 net nat
FORWARD
PREROUTING ----+--------------#########------+----------- POSTROUTING
|(routing) |
INPUT OUTPUT
两个特殊的转发点
源地址转换(SNAT) 在POSTROUTING点不能发生在PREROUTING
和目标地址转换(DNAT)只能在PREROUTING
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 219.237.206.200
把源地址翻译成外网地址
如果需要伪装或不知道要影射成什么地址,可以伪装,他支持动态地址
初始化工作
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
添加规则
iptables -A INPUT -i ! ppp0 -j ACCEPT //棘手接受所有的,来源不是网络接口ppp0的数据
nat配置
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to 219.237.206.200
//伪装局域网机器的ip地址进入互联网
//把目的ip 219.237.206.200端口为21影射到内网192.168.0.1的机器上
iptables -t nat -A PREROUTING -d 219.237.206.200 -p tcp --dport 80 -j DNAT --to 192.168.0.1:80
iptables -t nat -A POSTROUTING -p tcp -s 192.168.0.1 --sport 80 -j SNAT --to-source 219.237.206.200:80
iptables -t nat -A PREROUTING -d 219.237.206.200 -p tcp --dport 80 -j DNAT --to 192.168.0.1:80
//把目的 219.237.206.200端口为80(web服务)影射到内网192.168.0.1上
iptables -t nat -A POSTROUTING -p tcp --dst 219.237.206.200 --dport 80 -j SNAT --to-source 192.168.0.1
iptables -t nat -A PREROUTING --dst 192.168.0.1 -p tcp --dport 80 -j DNAT --to-destination 219.237.206.200
配置举例
iptables -t nat -A PREROUTING --dst 219.237.206.200 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.1
iptables -t nat -A PREROUTING --dst 219.237.206.200 -p tcp --dport 21 -j DNAT --to-destination 192.168.0.1
iptables -t nat -A PREROUTING --dst 219.237.206.200 -p tcp --dport 3306 -j DNAT --to-destination 192.168.0.1
iptables -t nat -A POSTROUTING -p tcp --dst 192.168.0.1 --dport 80 -j SNAT --to-source 192.168.0.168
iptables -t nat -A POSTROUTING -p tcp --dst 192.168.0.1 --dport 21 -j SNAT --to-source 192.168.0.168
iptables -t nat -A POSTROUTING -p tcp --dst 192.168.0.1 --dport 3306 -j SNAT --to-source 192.168.0.168
iptables -t nat -A POSTROUTING -p tcp --dst 192.168.0.1 --dport 22 -j SNAT --to-source 192.168.0.168
iptables -t nat -A PREROUTING --dst 219.237.206.201 -p tcp --dport 22 -j DNAT --to-destination 192.168.0.1
iptables -t nat -A PREROUTING --dst 219.237.206.200 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.1:80
iptables -t nat -A POSTROUTING -p tcp --dst 219.237.206.200 --dport 80 -j SNAT --to-source 192.168.0.1
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASAQUERADE
iptables -t nat -A PREROUTING -i eth0 -d 219.237.206.200 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.1:80
iptables -t nat -A POSTROUTING -s 219.237.206.202/32 -j SNAT --to-source 192.168.0.1
iptables 配置例子带vpn
#添加模块
modporbe ipt_MASQUERADE
modporbe ip_conntrack_ftp
modporbe ip_nat_ftp
#############################################################
iptables -F
iptables -t nat -F
iptables -X
iptables -t nat -X
#############################################################
iptables -p INPUT DROP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dport 110,80,25 -j ACCEPT
iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 139 -j ACCEPT
#允许内网samba,smtp,pop3连接
iptables -A INPUT -i eth1 -p udp -m multiport --dports 53 -j ACCEPT
#允许dns连接
iptables -A INPUT -p tcp --dport 1723 -j ACCEPT //vpn端口
iptables -A INPUT -p gre -j ACCEPT
#允许外网连接vpn
iptables -A INPUT -i ppp0 -p tcp --syn -m connlimit --connlimit-above 15 -j DROP
#为了防止dos太多连接近来,那么可以允许最多15个出始连接,超过则丢弃
iptables -t nat -A POSTROUTING -p tcp --dst $HTTP_IP --dport 80 -j SNAT \ --to-source $LAN_IP
iptables -I INPUT -s 192.168.0.12 -j ACCEPT
iptables -I FORWARD -s 192.168.0.12 -j ACCEPT
#192.168.0.12是我的机子,全部放行
iptables -A FORWARD -p icmp -s 192.168.0.0/24 -j ACCEPT
iptables的状态检测机制
Iptables 综合例子
#!/bin/sh
echo "String iptables rules..."
echo "1" /proc/sys/net/ipv4/ip_forward
Out_ip=219.237.206.200
In_ip=192.168.0.1
network_gateway=192.168.0.168
ip_range="198.168.80.0/24"
//先初始化工作
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
//禁止所有的包通过
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
联系客服