引言:kernel2.4以后用的防火墙
1 组成
用户空间:用iptables命令编写策略和规则以控制服务的使用
内核空间:netfilter用于存储规则,并根据规则对数据包进行过滤。简而言之就是,用netfilter处理用户空间传过来的命令并返回一个结果。
2 iptables的表和链
1)链(chains):是数据包传播的路径。每一条链中可以有若干规则。当一个数据包到达一个链时,iptables就会从链中的第一条规则开始检查,看该数据包是否满足规则所定义的条件,如果满足,系统就会根据该条规则所定义的方法处理该数据包,否则iptables将继续检查下一条规则;如果该数据包不符合链中的任一条规则,iptables就会根据该链预先定义的默认策略来处理数据包。
2)表(tables):提供特定的功能,iptables内置了3个表,filter表(用于实现数据包过滤),NAT表(用于实现网络地址转换)和mangle表(用于修改数据包的服务类型、TTL、且可以配置路由实现QOS)。
filter表——3个链:INPUT链(流入自己的数据包走这个链中的规则), OUTPUT链(从自己这里流出的数据包走这个链中的规则), FORWARD链(转发链,数据包通过自己转发出去就走这个链中的规则,自己既不是起点也不是终点)。
NAT表——4个链:PREROUTING(路由前链,对数据包作路由选择前应用这个链中的规则。用NAT技术由内网访问外网时应用这个链中的规则),POSTROUTING链(路由后链,对数据包作路由选择后应用这个链中的规则。利用端口转发,由外网访问内网时应用这个链的规则),OUTPUT,INPUT
mangle表(了解)——5个链:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD。
3)iptables中的状态说明
ESTABLISHED: 这个状态是指出这个信息包属于已经建立的连接 . 这个连接一直用于发送很接收信息包并且完全有效。
INVALID: 这个状态指出该信息包与任何已经知道的流或者连接都不相关联,它可能饱含错误的数据或者头
NEW: 这个状态指出该信息包已经或者准备启动新的连接,或者它与尚未用于发送和接受的信息包的连接相关联
RELATED: 这个状态指出该信息包正在启动新的连接 , 以及它与已经建立的连接相关联 。
accept 允许 reject 拒绝 drop 拒绝
3 配置iptables服务
3.1 网络拓扑图
A(外网web server)-------(e0)Router(e1)--------B(内网客户端)
其中,A的IP地址——202.0.0.1/24 B的IP地址——192.168.1.2/24
R e0的IP——202.0.0.2/24 R e1的IP——192.168.1.1/24
注:使用iptables务必关掉其他防火墙,除了firewalld外默认都是关闭的,所以一般只需关闭firewalld—— #systemctl mask firewalld
3.2 配置服务器端
第一步 安装iptables软件 #yum install iptables-services -y
第二步 查看所有规则集: #iptables -L
重启iptables服务: #systemctl restart iptables
设置iptables服务开机自启:#systemctl enable iptables
第三步 在编写iptables策略规则前先执行以下操作:
iptables -F :清除预设表 (filter) 中的所有规则链中的规则
iptables -X :清除预设表 (filter) 中的所有使用者定义的链
iptables -Z :将指定链中所有规则的包字节计数器清零
第四步 设定链和规则
命令格式: #iptables 表名 参数 链名 规则 动作
表 名: filter nat mangle
参 数:-L 列出指定链的规则 -F 清除指定链/表中的规则
-N自定义链 -X 删除自定义链
-P 设定默认策略 -Z 清空指定链中的所有计数
-t 指定表名
链 名: PREROUTING INPUT FORWARD OUTPUT POSTROUTING
匹配规则: -p protocol 指定匹配的协议(tcp/udp/icmp……)
-s address [/mask] 指定匹配的源地址
-i interface_name[+] 指定入流的网卡接口或类型,如eth+
-d address[/mask] 指定配置的目的地址
--dport 端口号[:port] 指定目的端口或端口范围
--sport 端口号[:port] 指定源端口或端口范围
--icmp-type 类型名 指定icmp的类型,可以用#iptables –p tcmp –h来查看icmp的类型
动 作: ACCEPT 允许通过 DROP 拒绝, 并不告知对方
REJECT 拒绝, 告知对反 MASQUERAD 伪装 LOG 将匹配的信息记录到日志
SNAT (Source NAT,源NAT),指修改包中源地址(POSTROUTING)
DNAT (Destination NAT,目的NAT) ,指修改包中目的地址(PREROUTING) 。对于端口转发, 负载均衡, 透明代理都 是DNAT。
举例1:FORWARD相关的设置是在具有转发功能的设备上进行
1)修改链的默认规则 #iptables -P FORWARD DROP/ACCEPT
2)拒绝一切通信 #iptables -A FORWARD -i/-o eno16777736 -j DROP
//-A 指attach,添加;-i 指input流入接口;-o 指output流出接口
3)只拒绝某一个IP
#iptables -A FORWARD -i eno16777736 -s 202.0.0.1 -j DROP
4)拒绝来自202.0.0.0/24子网的通信
#iptables -A FORWARD -i eno16777736 -s 202.0.0.0/24 -j DROP
5)拒绝与192.168.1.2的通信
#iptables -A FORWARD -i eno16777736 -d 192.168.1.2 -j DROP
6)拒绝0.1和1.2之间的通信
#iptables -A FORWARD -i eth0 -s 202.0.0.1 -d 192.168.1.2 -j DROP
7)只允许0.1和1.2之间的通信
#iptables -A FORWARD -i eno16777736 -s 202.0.0.1 -d 192.168.1.2 -j ACCEPT
8)在指定位置插入规则
#iptables -I FORWARD 1 -i eno16777736 -s 202.0.0.1 -d 192.168.1.2 -j ACCEPT
//-I是大写的i,FORWARD后面的1表示是第一位;-j 指定动作
9)删除指定位置的规则 #iptables -D FORWARD 2(第二条)
举例2:控制协议和端口(指的是第3、4层的)
1)拒绝所有的tcp通讯
#iptables -A FORWARD -i eno16777736 -p tcp -j DROP
2)只拒绝tcp 80号端口通讯
#iptables -A FORWARD -i/o eno16777736 -p tcp --dport 80 -j DROP
举例3:
1)审核标记位——syn(请求);ack(确认回复)
#iptables -A FORWARD -i/o eno16777736 -p tcp --syn -j DROP
2)控制icmp(ping)
#iptables -A FORWARD -o eno16777736 -p icmp --icmp -type 8 -j DROP
3)nat网络地址转换(内访问外)A:外网 B:内网
#iptables -t nat -A POSTROUTING -p tcp -o eno16777736 -j SNAT --to 202.0.0.2:1024-1025
//在nat表中的POSTROUTING链中添加一条规则,将数据包的包头改为192.168.1.2,并且将数据包的源端口改为1024到 1025中的任何一个可用端口
测试:第二台未配置iptables前,使用第三台主机连接第一台机器 的httpd服务,在第一台主机上使用命令netstat -lantu|grep 80, 可见源IP地址为192.168.1.2:随机端口;在第二台上配置iptables 后,使用第三台主机访问第一台的httpd服务,在第一台上使 用命令netstat -lantu|grep 80,可见源IP地址变为 202.0.0.2:1024(当1024端口未被占用时)
注意:查看nat的iptables规则策略用 #iptables -L -t nat
4)端口映射(外访内)
#iptables -t nat -A PREROUTING -i eno16777736 -d 202.0.0.2 -p tcp --dport 8000 -j DNAT --to -destination 192.168.1.2:80
//-i 指定r的外网卡;--dport 8000 指定路由上开的映射口;-destination 192.168.1.2:80 指定B的IP和服务端口。
//用 #natstat -lantu | grep 80 是看不出来有端口映射的。这个叫透明代理。
4 iptables规则的保存与恢复
1)保存 #iptables-save //保存到了/etc/sysconfig/iptables这个文件中
2)恢复 #iptables-restore
5 NAT与端口映射的工作原理
网络拓扑图:
A(外网web server)-------(e0)Router(e1)--------B(内网客户端)
5.1 NAT的工作原理
1)当B访问外网web serverA时,B会用自己的子网掩码与A的IP进行与运算,判断后得知是外网,然后发送一个广播包(里面是询问谁能到达A),所有客户端以及router接收到广播包后会查看,如果自己不能到达A就会丢弃广播包,如果能到达就给B一个反馈。
2)然后B开始封装数据包,源IP是B自己的IP,目的IP是A的IP,源MAC就是B的MAC,目的MAC就是router的e1端口的MAC。然后B发送封装好的数据包。
3)数据包被router接收后,router进行解封,判断是不是给自己的,解封时发现MAC地址与自己相符,进而查看3层封装,发现要去外网A。这时router会开启Nat功能,Nat会让router开启自己的某个外网卡IP代替B去访问外网,同时Nat会将router的哪个外网卡的哪个端口代理了B的哪个网卡的哪个端口进行外网访问记录在自己的Nat表中。
4)当A反馈给B时,是首先反馈给router的那个Nat代理网卡,然后由Nat根据Nat表的记录,用代理网卡反馈给B。从而实现了B访问外网的过程。
注:如果A不是外网,那么就是内网通讯,根据之前讲的路由器工作原理进行数据传输。
5.2 端口映射工作原理
A访问B时,会将数据包传给R的e0端,e0端接收到数据包后,R会开启一个随机端口并将该端口映射到B的某个端口上,然后数据包根据该逻辑映射所指通过物理通道传输到B
6 代理的概念
1)正向代理:代理服务器替代访问方去访问目标服务器
2)反向代理:与正向代理相反,对于客户端而言代理服务器就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端。
3)透明代理:透明代理的意思是客户端根本不需要知道有代理服务器的存在,它改编你的request fields(报文),并会传送真实IP。
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
//-A是attached,-s指定源地址,-j 指定动作
转载请注明出处,谢谢!