- 基本原理
防火墙
工作在主机或网络边缘,对进出的报文按事先定义的规则进行检查,并且由匹配到的规则进行处理的一组硬件或软件,甚至可能是二者的结合。规则包括处检查条件和处理机制,无论硬件还是软件需要定义规则之后,让其生效,才能真正工作起来 。
防火墙默认规则
通:默认为堵,对能识别的进行放行。
堵,默认为通,只对能识别的进行阻塞。
iptables
防火墙规则编写工具,工作于用户空间,编写规则并发送到内核空间netfilter中。
netfilter
工作于内核空间,让规则能够生效的网络框架。
二 iptables规则功能
规则链
数据包进入linux主机可能经过5个过滤点,又称为hook_function 钩子函数,5个规则,而这每个规则组合起来就是一个链,叫规则链。
数据进入linux主机后,首先使用PREROUTING钩子函数,然后内核自动查看路由,选择forward(转发目的ip非本机)或input(目的ip为本机)。如路由forward,则调用FORWARD钩子函数;input,则调用INPUT钩子函数。注意,一旦使用FORWARD,则数据不再进入INPUTt函数中,反之亦然。若数据由服务器发出,则进入OUTPUT函数中处理,最后与FORWARD函数处理后的数据一同进入POSTROUTING钩子函数。从整体上看,凡是进入服务器网卡的数据包必定先要通过PREROUTING,凡从服务器网卡出去的数据包必定最后通过POSTROUTING。
表
iptable可以定义4个表,每个表可以由不同的链构成,因此这个表分别是:
filter(过滤)表 主要和主机自身有关,主要负责防火墙功能 过滤本机流入流出的数据包是默认使用的表
·INPUT
· OUTPUT
· FORWARD
nat(地址转换) 表负责网络地址转换,即来源于目的IP地址和端口的转换,一般用于共享上网或特殊端口的转换服务
· PREROUTING
·OUTPUT
· POSTROUTING
mangle(拆开、修改、封装)表 将报文拆开来并修改报文标志位,最后封装起来
· PREROUTING
·INPUT
· FORWARD
·OUTPUT
· POSTROUTING
raw(还原原始)表
·PREROUTING
·OUTPUT
多条链整合起来叫做表,比如,在input这个链,既有magle的规则也可能有fileter的规则。因此在编写规则的时候应该先指定表,再指定链。
4个表的优先级由高到低的 顺序为:raw-->mangle-->nat-->filter
Raw 数据包进行连接跟踪前处理
Mangle 对数据包进行修改(如tos、mark)
Nat Nat 功能(IP转换、端口映射)
Filter 数据包过滤(接收、丢弃)
三 iptables基本应用
1.查看链
iptables [-t table] -L -n -v -x --line-numbers -------------TABLE默认是”filter“
-n:数字格式显示IP和port
-v:以详细格式显示
-vv ,-vvv 更详细的格式显示
-x,精确值,不执行单位换算
--line-numbers:显示规则行号
2.管理链
iptables [-t table] -N chain----------------创建一条自定义的规则链 注:自定义的链,但只能在被调用时才能发挥作用,而且如果没有被自定义链中的任何 规则匹配,还应该有返回机制;用户可以删除自定义的空链,默认链无法删除。
iptables [-t table] -X [chain]--------------------删除一条自定义的规则链
iptables [-t table] -E old-chain-name new-chain-name-----修改自义链名
iptables [-t table] -P chain target--------------------------为链指定默认策略,指定默认规则,DROP/ACCEPT
iptables [-t table] {-F|-Z} [chain [rulenum]] [options...]
-F [chain] :清空制定规则链,如果省略chain,则可以实现删除对应表中的所有链
-Z :置零制定链中所有规则的计数器
3.管理规则
iptables [-t table] -A chain rulenum 匹配条件 -j 处理机制- 附加一条规则,在链的尾部
iptables [-t table] -I chain rulenum 匹配条件 -j 处理机制- ------------插入一条规则,插入为对应chain上的第几条,如果省略则表示插入为第一条
iptables [-t table] -D chain rulenum------- 删除制定链中第num条规则,如果省略表示删除第一条
iptables [-t table] -R chain rulenum 匹配条件 -j 处理机制-------替换指定规则
iptables [-t table] -S [chain [rulenum]]------只显示指定链的规则添加命令
3.1匹配条件包括通用匹配和扩展匹配
通用匹配
-s | --src | --source [!] 匹配源地址,可以是ip也可以是网络地址,可以取反
-d ----------------------------目的地址----------------------------------
-p :匹配 ,通常使用{tcp|udp|icmp}三者之一
-i :指定数据报文流入接口 通常只用在INPUT、FORWARD和PREROUTING
-o :指定数据报文流出接口 通常只用在OUTPUT、FORWARD和POSTROUTING
扩展匹配
隐含扩展: 使用-p {tcp|udp|icmp}指定某特定协议后,自动能够对协议进行的扩展
-p tcp
--dport m[-n] :匹配的目标端口,可以是连续的多个端口
--sport ----- :------ 源端口,----------------------
--tcp-flags mask comp:tcp的标志位,只检查mask指定的标志位,是逗号分隔的标志位列表:comp:此表中出现的标志位必须为1,comp中没出现,而mask中出现的,必须为0
ALL:表示所有tcp标识位为1
NONE:表示所有tcp标识位为0
常用的tcp标识位:SYN表示建立连接,FIN表示关闭连接,ACK表示响应,PSH表示有 DATA数据传输,RST表示连接重置
eg --tcp-flags rst,syn,ack,fin syn = --syn --------SYN=1,其他为0
放行来自于172.16.0.0/16网络的主机对本机ssh服务的请求
iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.6.1 -p tcp --dport 22 -j ACCEPT
iptables -t filter -A OUTPUT -s 172.16.6.1 -d 172.16.0.0/16 -p tcp --sport 22 -j ACCEPT
-p udp
--dport
--sport
放行本机dns服务
iptables -A INPUT -d 172.16.6.1 -p udp --sport 53 -j ACCEPT ------------根返回结果给DNS服务器
如果为tcp 则将以上udp改为tcp即可
-p icmp
--icmp-type 8|0
8: ping请求
0:ping响应
主机可以ping通外面,外面不可以ping通主机
iptables -A OUTPUT -s 172.16.6.1 -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -d 172.16.6.1 -p icmp --icmp-type 0 -j ACCEPT
外面可以ping通主机,主机不可以ping通外面
iptables -A OUTPUT -d 172.16.6.1 -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -s 172.16.6.1 -p icmp --icmp-type 0 -j ACCEPT
显式扩展:必须要明确指定的扩展模块
-m 扩展模块名称 --专用选项1 --专用选项2
multiport: 多端口匹配,一次指定多个(15个以内)离散端口
--source-ports , --sports port[,port|,port:port]
--destination-ports, --dports
--ports
放行本机ssh和www服务
iptables -I INPUT -d 172.16.6.1 -p tcp -m multiport --dports 22,80 -j ACCEPT
iptables -I OUTPUT -s 172.16.6.1 -p tcp -m multiport --sports 22,80 -j ACCEPT
iprange: ip地址范围
[!] --src-range from[-to]
[!] --dst-range from[-to]
放行本机对某网段的telnet服务
iptables -A INPUT -d 172.16.6.1 -p tcp --dport 23 -m iprange --src-range 172.16.6.1-172.16.6.100 -j ACCEPT
iptables -A OUTPUT -s 172.16.6.7 -p tcp --sport 23 -m iprange --dst-range 172.16.6.1-172.16.6.100 -j ACCEPT
time: 指定时间范围
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
[!] --weekdays day[,day..]
每周周一至周五8点到18点开启swat服务(smaba web管理工具)
iptables -A INPUT -d 172.16.6.1 -p tcp --dport 901 -m time --weekdays Mon,Tus,Wed,Thu,Fri --timestart 08:00:00 --time-stop 18:00:00 -j ACCEPT
iptables -A OUTPUT -s 172.16.6.1 -p tcp --sport 901 -j ACCEPT
string: 字符串匹配
--algo {bm|kmp}:字符匹配查找时使用算法
--string "STRING": 要查找的字符串
--hex-string “HEX-STRING”: 要查找的字符,先编码成16进制格式
connlimit: 每IP对指定服务的最大并发连接数;
[!] --connlimit-above [n]
limit: 报文速率控制
--limit #[/second|/minute|/hour|/day]
--limit-burst #
state: 状态匹配
--state状态扩展,结合ip_conntrack, nf_conntrack追踪会话的状态
会话有4种状态
NEW:当你在使用UDP,TCP,ICMP等协议时,发出的第一包的状态是“NEW”
ESTABLISHED:当你在使用TCP、UDP、ICMP等协议时:假设你的主机发出的第一个包成功穿越防火墙,那么接下来你的主机 发出和接收 到的包的状态都是“ESTABLISHED”
RELATED:当执行traceroute时,这个traceroute会发出一个封包,该封包TTL为1,这个封包遇到路由器时,它的TTL会减1,这时TTL为0,丢弃这个包的路由器会返回一个ICMP Type 11的封包给你,并告诉你那个发出的数据包气数已尽。而这个ICMP Type 11的链接状态就是“RELATED”。
INVALID:这类包一般会被视为恶意包而被丢弃。
进来的拒绝出去的允许,进来的只允许ESTABLISHED进来,出去只允许ESTABLISHED出去。默认规则都使用拒绝
iptables -L -n --line-number :查看之前的规则位于第几行
改写INPUT
iptables -R INPUT 2 -s 172.16.0.0/16 -d 172.16.100.1 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -R OUTPUT 1 -m state --state ESTABLISHED -j ACCEPT
3.2 -j 处理机制
ACCEPT:放行
DROP:丢弃数据包,不回复任何消息REJECT:拒绝数据包,给源回应一个消息
DANT:目标地址转换
SNAT:源地址转换REDIRECT:端口重定向
MASQUERADE IP伪装,即是常说的NAT技术,MASQUERADE只能用于ADSL等拨号上网的IP伪装,也就是主机的IP是由ISP分配动态的;如果主机的IP地址是静态固定的,就要使用SNATLOG 日志功能,将符合规则的数据包的相关信息记录在日志中,以便管理员的分析和排错
比如我们现在要将所有192.168.10.0网段的IP在经过的时候全都转换成172.16.100.1这个假设出来的外网地址:
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.100.1
iptables -t nat -A PREROUTING -d 192.168.10.18 -p tcp --dport 80 -j DNAT --to destination 172.16.100.2
我们都知道当我们使用联通或者电信上网的时候,一般它都会在每次你开机的时候随机生成一个外网的IP,意思就是外网地址是动态变换的。这时我们就要将外网地址换成 MASQUERADE(动态伪装):它可以实现自动寻找到外网地址,而自动将其改为正确的外网地址。所以,我们就需要这样设置:
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE
把访问本机80 端口的数据 dnat到 1.1.1.2(本机为1.1.1.1)
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to1.1.1.2
iptables -t nat -A POSTROUTING -d 1.1.1.2 -p tcp --dport 80-j SNAT --to 1.1.1.1
本机做网关,源IP段为192.168.1.0/24 从 eth0 出源IP转为为192.168.10.18
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to 1.1.1.1
从ppp0出去都进行伪装
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
目标端口为 80做标记1
iptables -t mangle -A OUTPUT -p tcp --dport 80 -j MARK --set-mark1
源IP为172.16.1.0/24、从eth0出的记录日志
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth1 -jLOG --log-level 4
记录日志默认日志写到 /var/log/message,可以修改
iptables -t nat -A POSTROUTING -s 172.0.0.0/24 -o eth1 -j LOG --log-level 4
控制规则的存放以及开启
Iptables-save #输出当前iptables 的配置或写的一文件供iptables-restore使用
Iptables-save> iptables.txt
Iptables-restore从 iptables-save 的文件中加载规则
/etc/init.d/iptablessave #保存 iptables 规则到 /etc/sysconfig/iptables,iptables 服务启动时会从这个文件读取规则
/etc/init.d/iptablesstop 停止iptables 服务
/etc/init.d/iptablesstart 开启iptables 并从/etc/sysconfig/iptables 加载规则