网络就是一条条信息高速公路,每台计算机,都是这个网络上的节点。这条网络上,还有很多路由器,网络桥接器,等各种杂七杂八的连接器。
现在我们单单聚焦到网络到Linux服务器的这个阶段。
对网络数据包的接收,是在底层进行的,也就是操作系统内核进行操作的。
还记得计网里学到的socket,端口,ip地址什么的么?
linux服务器,它也可以充当路由器的功能,做数据转发,内容修改什么的,如果再跟应用发生“化学反应”,那就可以做更多的事情。
如上图所示,有这么5个阶段
链 | 内容 |
---|---|
Prerouting | 数据进入内核空间前 |
Input | 数据过了pre那关之后,选择进入用户空间 |
Forward | 数据过了pre那关之后,选择离开 |
Postrouting | 数据离开linux前 |
Output | 用户应用发送数据出去 |
这五个阶段,相当于人类可以进行掌控的点,可以进行设置。
比如,我们可以修改包的目的地,修改包的源地址。
工作中遇到的,比如反向代理、负载均衡,也都是基于这种架构原理。
iptables是linux上的一个可以控制这几个阶段的工具,通俗点讲,也可以称之为防火墙设置器。
因为防火墙这东西,你开不开启,那代码都一直在那里等待着你。
不设置,充其量就是全都允许。
哪个阶段修改包的目的地
prerounting阶段。
因为需要在进路由表选择之前就将目的地进行修改。
哪个阶段修改包的源地址
postrouting阶段。
这样linux才知道,这个信息是外部发送过来的,而不是自发送的。
linux开启包转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
linux关闭包转发功能
echo 0 > /proc/sys/net/ipv4/ip_forward
安装iptables
yum -y install iptables-service
查看iptables的状态
systemctl status iptables
开启iptables服务
systemctl start iptables
关闭iptables服务
systemctl stop iptables
设置进入用户空间时的规则——input
iptables -A INPUT -s x.x.x.x/子网掩码位数 -j DROP
这是设置来自x.x.x.x/子网掩码位数ip的包不能进入用户空间
iptables -A INPUT -s x.x.x.x/子网掩码位数 -j ACCEPT
这是设置接受来自x.x.x.x/子网掩码位数ip的包进入用户空间
查看当前生效的规则
iptables -L
设置修改来自某ip的包的目标地址
iptables -t nat -A PREROUTING -p tcp -d x.x.x.x --dport 端口号 -j DNAT --to x.x.x.x:端口号
即做转发
iptables修改源地址转发
iptables -t nat -A POSTROUTING -s x.x.x.x/子网掩码 -p tcp -j SNAT --to-source x.x.x.x
将x.x.x.x/子网掩码 的包,改成了来自x.x.x.x的包
但是只修改一侧的话,就会出现只发包无法收到包的情况
设置回路
iptables -t nat -A PREOUTING -d 来的ip -p tcp --dport 来的端口 -j DNAT --to-destination 去的ip:端口
iptables -t nat -A POSTROUTING -d 去的ip -j SNAT --to-source 来的ip
DROP与REJECT的区别
drop会直接丢弃包,不会给发送这返回任何东西,比较适合用来防范真正的危险。
reject比较适合用来测试、调试。
删除iptable的规则配置
iptables -L -n --line-numbers
iptables -D 所属的chain 对应的行号
查看iptable配置路径
service iptables save
一般情况下,我们会把Ip的input的关闭,只开放对应的入端,然后output也关闭,设置对应的出端。
但是发出去的包从目标返回来怎么办?难道一个个都设置入端吗,这个不现实。
所以会有包状态这种东西。
表示这个包是从自身请求得到的。
状态分别有,new,related,established
我们需要设置,关联的状态包可以通过入端
iptables -A INPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
相应的,有跟踪状态,就有不跟踪状态的设置
iptables -t raw -A PREROUTING -d 入ip -j NOTRACK
讲了这么多链的阶段,状态,其实他们外层还套了一层表的逻辑
表名 | 用处 |
---|---|
raw | 跳过追踪,跳过转发 |
mangle | 修改标记位,可以达到从应用层区分路由选择 |
nat | 转发 |
filter | 过滤 |
表里面再是链逻辑,状态逻辑。