Iptalbes防火墙

87 阅读5分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

下面聊一聊Linux的防火墙,Linux防火墙有很多种,下面对IPtables介绍一下。

iptables概念

1. 什么是 iptables

举个例子,如果把Netfilter看成是某个小区的一栋楼。那么表(tables)就是楼里的其中的一套房子。这套房子"表(tables)"属于这栋楼“Netfilter/iptables”。

2. 什么是表(tables)

表(tables)是链的容器,即所有的链(chains)都属于其对应的表(tables).如上,如果把Netfilter看成是某个小区的一栋楼.那么表(tables)就是楼里的其中的一套房子。

3 什么是链(chains)

链(chains)是规则(Policys)的容器。如果把表(tables)当作有一套房子,那么链(chains)就可以说是房子里的家具(柜子等)。

4 什么是规则(Policy)

规则(Policy)就比较容易理解了,就是iptables系列过滤信息的规范和具体方法条款了.可以理解为柜子如何增加并摆放柜子东西等。

默认情况下,iptables根据功能和表的定义划分包含三个表,filter,nat,mangle,其每个表又包含不同的操作链(chains )。 实际iptables包含4张表和五个链,主要记住filter即可。

iptables 表和链

四表
必须是小写
raw  	 ------------追踪数据包, ----此表用处较少,可以忽略不计。
mangle   ------------给数据包打标记,做标记。
nat 	 ------------网络地址转换即来源与目的的IP地址和port的转换。
filter   ------------做过滤的,防火墙里面用的最多的表。
#表的应用顺序:raw-》mangle-》nat-filter

五链:(必须是大写)链里面写的是规则。
PREROUTING  -----------------进路由之前数据包
INPUT  		-----------------就是过滤进来的数据包(输入)
FORWARD 	-----------------转发
OUTPUT  	-----------------发出去的数据包
POSTROUTING -----------------路由之后数据包
#所有的访问都是按顺序:
入站:比如访问自身的web服务流量。先PREROUTING(是否改地址),再INPUT(是否允许)到达程序。
转发:经过linux网关的流量.先PREROUTING(是否改地址),然后路由。转发给FORWARD(转发或者丢弃),最后经过POSTROUTING(看看改不改地址。)
出站:源自linux自身的流量.先OUTPUT,再给POSTROUTING(是否改IP)。
#规则顺序:逐条匹配,匹配即停止。

四表五链

raw表里面:
PREROUTING
OUTPUT
总结:数据包跟踪  内核模块iptables_raw
===============================================================================
mangel表里面有5个链:
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
路由标记用的表。内核模块iptables_mangle
================================================================================
nat表里面的链:
PREROUTING
INPUT
OUTPUT
POSTROUTING
转换地址的表(改IP,改端口。当网关使用的linux。保护内外网流量。内核模块叫iptable_nat)
=================================================================================
filter表有三个链:重点
INPUT    #负责过滤所有目标是本机地址的数据包通俗来说:就是过滤进入主机的数据包
FORWARD  #负责转发经过主机的数据包。起到转发的作用
OUTPUT   #处理所有源地址是本机地址的数据包通俗的讲:就是处理从主机发出的数据包
总结:根据规则来处理数据包,如转或者丢。就是实现主机型防火墙的主要表。
内核模块 iptable_filter

规则匹配条

1、通用匹配(协议),可以独立使用
协议:-p (小p)
tcp ---用的最多
udp
icmp    ---ping的时候用的协议
#使用协议的时候可以不指定端口,使用端口的时候必须指定协议。
案例:
禁止自己被ping,在filter表的INPUT链插入一个丢弃icmp的规则。
 # iptables -F
 # iptables -A INPUT -p icmp -j REJECT    ----拒绝
  验证:
[root@iptables-test ~]# ping 192.168.246.200
PING 192.168.246.200 (192.168.246.200) 56(84) bytes of data.
From 192.168.246.200 icmp_seq=1 Destination Port Unreachable


2、通过端口规则匹配:
端口:
--sport    ---源端口
--dport    --目标端口
案例:
拒绝192.168.246.201这台机器通过ssh连接到这台服务器
# iptables -I INPUT -s 192.168.246.201 -p tcp --dport 22 -j REJECT

例子:端口的范围: 拒绝192.168.246.201这台机器通过22端口到80端口的访问,包括22和80端口在内
# iptables -I INPUT -s 192.168.246.201 -p tcp --dport 22:80 -j REJECT

验证:
# curl -I http://192.168.246.200
curl: (7) Failed connect to 192.168.246.200:80; Connection refused
# ssh root@192.168.246.200
ssh: connect to host 192.168.246.200 port 22: Connection refused
===========================================================================
拒绝所有机器通过ssh连接到这台服务器
# iptables -I INPUT  -p tcp --dport 22 -j REJECT

例子:端口的范围: 拒绝所有机器通过22端口到80端口的访问,包括22和80端口在内
# iptables -I INPUT  -p tcp --dport 22:80 -j REJECT--拒绝   ACCEPT--允许


3、通过ip地址
1.#禁止源246.201主机进来。(换个主机ping一下,就可以通信)
[root@iptables-server ~]# iptables -I INPUT -s 192.168.246.201  -p icmp -j REJECT
-s: 源ip地址
在源ip机器验证:
[root@iptables-test ~]# ping 192.168.246.200
PING 192.168.246.200 (192.168.246.200) 56(84) bytes of data.
From 192.168.246.200 icmp_seq=1 Destination Port Unreachable
===========================================================================
2.拒绝多个ip地址:后面跟ip地址可以更多个ip地址用逗号隔开
# iptables -t filter -I INPUT -s 192.168.246.201,192.168.246.133  -p icmp -j REJECT
# iptables -t filter -I INPUT -s 192.168.246.201,192.168.246.133  -p tcp --dport 22:80 -j REJECT

验证:在源ip地址通过curl访问。在246.133和246.201机器分别验证
# curl -I http://192.168.246.200
curl: (7) Failed connect to 192.168.246.200:80; Connection refused
# ssh root@192.168.246.200
ssh: connect to host 192.168.246.200 port 22: Connection refused
============================================================
3.举例::#限制源10网段的数据包。
# iptables -I INPUT -s 192.168.10.0/24  -j REJECT


4、修改规则:
# iptables -L
target     prot opt source               destination         
REJECT     tcp  --  192.168.246.133      anywhere             tcp dpts:ssh:http reject-wi
REJECT     tcp  --  192.168.246.201      anywhere             tcp dpts:ssh:http reject-wi
REJECT     icmp --  192.168.246.201      anywhere             reject-with icmp-port-unreachable
将修改第二条规则访问80端口:
# iptables -R INPUT 2 -p tcp --dport 80 -s 192.168.246.201 -j ACCEPT
# iptables -L 
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
REJECT     tcp  --  192.168.246.133      anywhere             tcp dpts:ssh:http reject-with icmp-port-unreachable
ACCEPT     tcp  --  192.168.246.201      anywhere             tcp dpt:http
REJECT     icmp --  192.168.246.201      anywhere             reject-with icmp-port-unreachable
验证在修改为允许访问的源ip机器上:
# curl -I http://192.168.246.200
HTTP/1.1 200 OK
=======================================================================================
# iptables -R INPUT 1 -p tcp -s 192.168.62.185 --dport 22 -j ACCEPT
验证在修改为允许访问的源ip机器上:
# ssh 192.168.62.135
The authenticity of host '192.168.62.135 (192.168.62.135)' can't be established.
ECDSA key fingerprint is SHA256:cUexa/Lv/EtkmiiTrsHUJ1zOWsjT9cihPqLxi23w5ws.
ECDSA key fingerprint is MD5:8c:9c:65:99:b7:6e:df:93:86:c1:7f:38:d9:73:4c:3d.
Are you sure you want to continue connecting (yes/no)?