定义:工作于网络或主机边缘,对进出本网络或本主机的网络报文按照事先设定好的匹配规则进行检查,对能够被规则所匹配的报文按照规则定义的处理机制进行处理的组件
1、处理tcp、ip数据是工作在内核层次上的,所以linux处理防火墙必须在内核实现,2.0之前没有实现
2、用于匹配报文的 有 源ip,目标ip,源端口,目标端口,TCP。防火墙工作再传输层和网络层
3、越是工作在低层的防火墙(网络层),性能越好,越是高层的防火墙(应用层),越能理解实际需求
4、并不是有防火墙就可以万无一失了,还应该有入侵防御系统
5、进入电脑的5个布局位置
6、默认规则是关闭的,还需要写关闭的规则,规则是有次序的。规则越严格的,越早判断越好
7、iptables 就是写这些规则并管理这些规则的次序的一个管理软件,最后还是要经过netfilter来实现,netfilter的实现离不开iptables的规则,所以防火墙的实现对于他们俩是相辅相成的
8、规则的功能(四个表,放置在5个检查点)
filter:过滤
nat:转换
SNAT:源地址ip
DNAT:目标地址ip
PAT:端口转换(一般目标端口)
mangle:把报文首部拆开,改标志位等,改完后再封装起来(5个位置都可以)
raw:
在一个地方实现两个功能,比如filter 和 mangle
9、五个内置链:(每个点可以放不同功能)
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
10、在写iptables要指明那个点,和那个功能(表)
11、iptables
大写字母选项:子命令
小写字母选项:定义匹配标准及其它:
-t{filter|nat|mangle|raw}默认filter
-L:list 不加-t 是默认的filter的chain
-n:数字格式,不做反向解析显示ip和端口,如果不加,都会反解析为主机名和服务名
-v:详细信息。(显示两个计数器 package和bytes)
--line-numbers:显示链中规则的行号
-x:显示精确值,不要做单位换算
其他子命令:
管理链:
-F:清空链
iptables -t filter -F INPUT 清空filter表的INPUT链
iptables -F 清空filter(默认)表的所有链
-P:设定默认策略
iptables -t filter -P INPUT DROP 设定INPUT链的默认策略为丢弃{ACCEPT|DROP}
-N:新建一条自定义链(只能附加在内置链才能工作) iptables -N FILTER_WEB
-X:删除自定义空链(删除之前先清空)
-Z:重置计数器(-v 显示的那个计数器)
-E:重命名自定义链
管理规则:
-A:append 添加到尾部
-I[n]:插入为第n条,原来的第n条变为+1条
-D[n]:删除第n条规则
-R[n]:替换第n条规则
12、表和链对应的关系:
filter:INPUT,FORWARD,OUTPUT
nat:PREROUTING,POSTROUTING,OUTPUT
mangle:PREROUTING,POSTROUTING,OUTPUT,INPUT,FORWARD
raw:PREROUTING,OUTPUT
13、每个链都有其默认策略,policy ACCEPT 通常只需要修改filter表的默认策略
14、规则和默认策略都有两个计数器:
package:被本规则所匹配到的包的个数
bytes:所有被匹配到的包的大小和
15、编写规则语法:
目标:DROP(上策)、ACCEPT、REJECT、RETURN(自定义链返回主链)
REDIRECT:端口重定向
DNAT:目标地址转换
SNAT:源地址转换
LOG:记录日志(--log-prefix "日志前缀")
MARK:标记(负载均衡要用) 也可以是自定义链(要返回RETURN)
iptables [-t 表] 大写选项字命令 [规则号] 链名 匹配标准 -j 目标
匹配标准:
通用匹配:
-s|--src|--source [!] IP/NETWORK 叹号表示取反
-d|--dst|--destination [!] IP/NETWORK
例:iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.1 -j ACCEPT
设定默认:iptables -P INPUT DROP
service iptables save 将目前rules写入到配置文件中 /etc/sysconfic/iptables
iptables-save>/root/iptables.rules 将目前rules写入到重定向的文件中
iptables-restore < /path/to/iptables.rules 生效文件中的规则
-i incoming_interface:指定数据报文流入接口 INPUT FORWARD PREROUTING
-o outing_interface:指定数据报文流出接口 OUTPUT FORWARD POSTROUTING
iptables -R INPUT 1 -s 172.16.0.0/16 -d 172.16.100.1 -i eth0 -j ACCEPT
-p {tcp|udp|icmp}明确说明哪一种协议
扩展匹配:要使用 -m 扩展名称来引用,而每个模块一般都具有自己的专用选项,这些选项中,有些是必备的
隐含扩展
-p tcp
--sport 连续端口,不能间断,而且可以取反
--dport 连续端口,不能间断,而且可以取反
--tcp-flags 要检查的标志 必须为1的标记 (除了为1的标记,其他的标记都是0)
--tcp-flags SYN,ACK,RST,FIN SYN
(前边是一个要检查的标记的表,后边是必须为1的标记,剩下的要必须为0 简写:--syn)
ALL 所有标志位 NONE 所有标志位都为0
例:放行对web服务器的访问:
iptables -A INPUT -d 192.168.159.12 -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -s 192.168.159.12 -p tcp --sport 80 -j ACCEPT
-p udp
--sport
--dport 用法机制和tcp一样的
例如: 本地DNS服务器,INPUT OUTPUT 默认为DROP,本机地址172.161.100.1,要本地客户端做递归查询
iptables -A INPUT -d 172.16.100.1 -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT-s 172.16.100.1 -p udp --sport 53 -j ACCEPT
iptables -A OUTPUT-s 172.16.100.1 -p udp --dport 53 -j ACCEPT
iptables -A INPUT -d 172.16.100.1 -p udp --sport 53 -j ACCEPT
-p icmp
--icmp-type
请求:8 响应:0
例:放行192.168.159.0/24 网段的主机可以ping 本机,本机也可以ping 0/24的所有主机
iptables -A OUTPUT -s 192.168.159.12 -d 192.168.159.0/24 -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -s 192.168.159.0/24 -d 192.168.159.12 -p icmp --icmp-type 0 -j ACCEPT
iptables -A OUTPUT -s 192.168.159.12 -d 192.168.159.0/24 -p icmp --icmp-type 0 -j ACCEPT
iptables -A INPUT -s 192.168.159.0/24 -d 192.168.159.12 -p icmp --icmp-type 8 -j ACCEPT
显式扩展
-m state --state
NEW,ESTABLISHED,RELATED,INVALID
ftp服务器需要装载,nf_conntrack_ftp模块,可以使用modprobe命令,也可以编辑/etc/sysconfig/iptables-config文件实现
-m mulitport:可以指定15个以内的离散端口 21-23,80
--source-ports
--destination-ports
--ports
iptables -I INPUT -s 172.16.0.0/16 -d 172.16.100.1 -p tcp -m state --state NEW -m multiport --destination-prots 21,22,80 -j ACCEPT
-m iprange:指定匹配的ip地址范围
172.16.100.1-172.16.109.254
--src-range
--dst-range
-m limit
--limit 20/min
--limit-burst 2
iptables -I INPUT 2 -s 172.16.0.0/16 -d 172.16.100.1 -p tcp -m state --state NEW -m limit --limit 12/min --limit-burst 2 设置每分钟最多的次数,还有一次性进来的次数
-m string 报文中字符串匹配 应用层
--string '' --algo kmp/bm
iptables -I OUTPUT 1 -d 172.16.0.0/16 -s 172.16.100.1 -p tcp --sport 80 -m string --string 'hello' --algo kmp -j REJECT http服务器返回字符串包含hello就不会被放行
-m time
--datestart
--datestop
--timestart
--timestop
--weekdays
--monthdays
-m connlimit
--connlimit-above [num] 限制一个客户端最高发起的连接数
iptables -A INPUT -s 172.16.0.0/16 -p tcp --dport 80 -m connlimit ! --connlimit-above 5 -j ACCEPT
-m hashlimit
原来的limit 只能限制总共访问的速率,而不能限制单个ip的访问速度,hashlimit 可以限制每个ip的速率
-m recent
利用iptables的recent模块来抵御DOS攻击:22,建立一个列表,保存有所有访问过指定服务的客户端IP
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
建立一个名字为SSH的列表,存储新建立的访问22端口的ip地址
iptables -I INPUT -p tcp --dport 22 -m state NEW -m recent --uptate --seconds 300 --hitcount 3 --name SSH -j LOG --log-prefix "SSH Attack" 先记录日志然后在DROP 日志放在var/log/message下
iptables -I INPUT -p tcp --dport 22 -m state NEW -m recent --uptate --seconds 300 --hitcount 3 --name SSH -j DROP
当用户访问22端口的时候会给列表中的字段自动更新,当在300秒之内,计数器打到3以后,就会拒绝此ip的访问(默认拒绝5分钟?)
练习:
1、限制本地主机的web服务器在周一不允许访问;且新请求的速率不能超过100个每秒;web服务器包含了admin字符串的页面不允许访问;web服务器仅允许响应报文离开本机;
2、在工作时间,既周一到周五的8:30-18:00,开放本机的ftp服务给172.16.0.0网络中的主机访问;数据下载请求的次数每分钟不得超过5个;
3、开放本机的ssh服务给172.16.x.1-172.16.x.100中的主机,x为你的座位号,新请求建立的速率一分钟不得超过2个;仅允许相应报文通过其服务端口离开本机;
4、拒绝TCP标志位全部为1及全部为0的报文访问本机;
5、允许本机ping别的主机;但不开放别的主机ping本机;
SNAT:代理内部客户端访问外部网络。在iptables的POSTROUTING
-j SNAT --to-source IP 适用static地址
-j MASQUERADE 自动将source ip 设置为外网ip(拨号)
DNAT:将内部服务器发布至外部网络。在iptables的PREROUTING
-j DNAT --to-destination IP:port
不但能转换目标地址,还能映射目标端口
iptables -t nat -A PREROUTING -d 192.168.10.254 -p tcp --dport 22 -j DNAT --to-destination 172.16.100.17
转换目标地址 然后就是在FORWARD链上加数据过滤规则就可以打到既转发又过滤的效果
映射目标端口
iptables -t nat -A PREROUTING -d 192.168.10.254 -p tcp --dport 80 -j DNAT --to-destination 172.16.100.177:8080
(将真实服务器的80端口改成8080,然后访问前一个主机的80)
iptables -t nat -A PREROUTING -d 192.168.10.254 -p tcp --dport 6789 -j DNAT --to-destination 172.16.100.17:3306
(将mysql服务器的真实3306端口隐藏起来,让用户去访问前一个主机的6789端口)
iptables -A FORWARD -d 172.16.100.17 -p tcp --dport 3306 -m state --state ESTABLISHED
(放行转换了端口的数据)
主机实现不同网络间的转发
/proc/sys/net/ipv4/ip_forward 设置为1
iptables -t nat -A POSTROUTING -s 192.168.117.0/24 -j SNAT --to-source 192.168.253.2
将所有192.168.117.0网段的访问外网的请求的源地址改成192.168.253.2
iptables -P FORWARD DROP 报文转发全部拒绝
FTP设置防火墙
ftp链接的默认模式为被动模式
主动模式配置
port_enable=yes
connect_from_port_20=YES
iptables需要开启21端口的访问权限
iptables -I INPUT -p tcp --dport 22 -j ACCEPT
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
被动模式设置
1、设置开放端口
iptables -I INPUT -p tcp --dport 21 -j ACCEPT
/etc/vsftpd/vsftpd.conf
pasv_min_port=50000
pasv_max_port=60000
iptables -I INPUT -p tcp --dport 50000:60000 -j ACCEPT
2、加入内核追踪模块
iptbales -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -I INPUT -p tcp --dport 21 -j ACCEPT
modprobe nf_conntrack_ftp
vim /etc/sysconfig/iptables-config(开机自动加载)
IPTABLIS_MODULES="nf_conntrack_ftp"
NAT
SNAT
iptables -t nat -A POSTROUTING -s 10.10.177.0/24 -j SNAT --to 10.10.188.232
DNAT
iptables -t nat -A PREROUTING -d 10.10.188.232 -p tcp --dport 80 -j DNAT --to 10.10.177.233:80