其实Iptables只是一个应用层的程序,它属于用户空房间,通过iptables配置规则后都会调用Netfilter开放的接口来对存放在内核空间中的数据进行修改,Nefilter是linux操作系统核心层内部的一个数据包处理模块,在这些位置上我们可以数据包的内容进行修改达到控制的目的,这五个挂载点分别是PRE_ROUTING、INPUT、OUTPUT、FORWARD、POST_ROUTING。也就是我们常说的五条链链是放在表中的,总共有四个表,每个表有不同的优先级:RAW>MANGLE>NAT>FILTER>一张表会有若干个链。
四张表的功能:
| raw | mangle | nat | filter |
prerouting | Y | Y | Y |
|
input |
| Y |
| Y |
output | Y | Y | Y | Y |
forward |
| Y |
| Y |
postrouting |
| Y | Y |
|
FILTER表——过滤数据包,有DROP,ACCEPT,REJECT,LOG等,一般在input 和forward chain用得最多,也是出现频率最高的
Nat表——主要用于网络地址转换(IP、端口)(网络地址转换,如SNAT、DNAT、MASQUERADE、REDIRECT),一般在作为网关服务器上会用到,如果有搭建过openvpn的话,一般也会用到。
Mangle表——修改数据包的服务类型、TTL、并且可以配置路由实现QOS,应用并不广泛。
Raw表——决定数据包是否被状态跟踪机制处理,一般在高并发时有可能会用到,来设置一些连接不跟踪状态,防止ip_conntrack文件被撑爆。
INPUT链——进来的数据包应用此规则链中的策略
OUTPUT链——外出的数据包应用此规则链中的策略
FORWARD链——转发数据包时应用此规则链中的策略
PREROUTING链——对数据包作路由选择前应用此链中的规则(所有的数据包进来的时侯都先由这个链处理)
POSTROUTING链——对数据包作路由选择后应用此链中的规则(所有的数据包出来的时侯都先由这个链处理)
iptables数据包流向
下面是一个数据包到达时,如何依次穿过各个链和表的
我们结合上图举个例子:
假如有数据包从Network IN要通过iptables,数据包流向如下:
1.Network IN数据包到达服务器的网络接口
2.进入raw表的 PREROUTING 链,这个链的作用是决定数据包是否被状态跟踪。
进入 mangle 表的 PREROUTING 链,在此可以修改数据包,比如 TOS 等。
进入 nat 表的 PREROUTING 链,可以在此做DNAT(目标地址转换)
3.决定路由,查看目标地址是交给本地主机还是转发给其它主机。
4.到这里分两种情况,一种情况是数据包要转发给其它主机(一般情况下它是在担任网关服务器),数据包会依次经过:
5.进入 mangle 表的 FORWARD 链,
进入 filter 表的 FORWARD 链,在这里我们可以对所有转发的数据包进行过滤。
6.进入 mangle 表的 POSTROUTING 链 进入 nat 表的 POSTROUTING 链,在这里一般都是用来做 SNAT (源地址转换)
7.数据包流出网络接口,发往network out。
8.另一种情况,数据包的目标地址就是发给本地主机的,它会依次穿过:
9.进入 mangle 表的 INPUT 链,进入 filter 表的 INPUT 链,在这里我们可以对流入的所有数据包进行过滤, 数据包交给本地主机的应用程序进行处理。
10.应用程序处理完毕后发送的数据包进行路由发送决定。
11.进入 raw 表的 OUTPUT 链。 进入 mangle 表的 OUTPUT 链, 进入 nat 表的 OUTPUT 链,进入 filter 表的 OUTPUT 链。
12.进入 mangle 表的 POSTROUTING 链, 进入 nat 表的 POSTROUTING 链。
13.进入出去的网络接口,发送往network out。
IPTABLES命令相关
systemctl stop firewalld
systemctl mask firewalld
systemctl restart iptables
iptables -nL ###n:不做解析,L:list
iptables -F 或 > /etc/sysconfig/iptables ###清除策略,默认为filter
service iptables save ###保存策略到配置文件/etc/sysconfig/iptables
iptables -A INPUT -j ACCEPT ###添加策略
防火墙策略的基本配置
参数:-A:add -s:source dport:端口 -j:动作 -I:insert -p(小写):protocol,协议 -D:delete
iptables -t filter -nL ###不加-t默认filter
iptables -A INPUT -j REJECE ###拒绝所有
iptables -t filter -A INPUT -s 172.25.8.11 -j ACCEPT|DROP|REJECT ###对11的接受,忽略,拒绝
iptables -A INPUT -s 172.25.8.10 -p tcp --dport 22 -j ACCEPT
iptables -I INPUT 3 -s 172.25.8.11 -p tcp --dport 22 -j ACCEPT ###在第3行插入,p:协议,dport:端口
iptables -D INPUT 4 ###删除第4个
iptables -R INPUT 1 -s 172.25.8.11 -p tcp --dport 22 -j ACCEPT ###更改已有的规则
iptables -t nat -R POSTROUTING 1 -o eth0 -j SNAT --to-source 172.25.8.11
iptables -P INPUT DROP ###改变默认的权限P(大写)(只能ACCEPT和DROP)
iptables -t filter -N redhat ###添加自定义链名
iptables -t filter -E redhat dream ###改变链名
iptables -t filter -X dream ###删除自定义链
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT ###添加连接过的,正在连接到防火墙策略
iptables -A INPUT -m state --state NEW -i lo -j ACCEPT ###添加新的回旋接口
iptables -A INPUT -m state --state NEW -p tcp --dport 53 -j ACCEPT ###只要连接端口为53都可以连接
iptables -A INPUT ! -s 172.25.8.10 -j REJECT ###只有172.25.8.10能连接
不同网段互相访问
环境:192.168.0.225,加入网关:192.168.0.125
客户端:设置2个网卡,IP:172.25.254.125/192.168.0.125
iptables -F
service iptables save
地址伪装(路由后)
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 172.25.254.125 ###路由后,通过172.25.254.125的协议从eth0出去
sysctl -a |grep ip_forward
net.ipv4.ip_forward = 0
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1 ##开启路由转发功能
sysctl -p ###刷新
测试
客户端:192.168.0.225
ping 172.25.254.56 ###发现可以ping通真机
ssh root@172.25.254.56
w ###查看login
地址转发(路由前)
iptables -t nat -A PREROUTING -i eth0 -j DNAT --to-dest 192.168.8.250 ###把eth0过来的转移到192.168.8.250 也就是将进去的ip伪装成192.168.8.250
测试 IP:172.25.254.8(真机)
ssh root@172.25.254.8
ifconfig
w
通过w我可以发现我们只是地址发生了转发,而我们的登陆的IP还是172.25.254.8