iptables 学习

发布时间 2023-12-09 15:38:23作者: LukeZhang_sz

iptables

一、图

二、规则写法

格式:iptables [-t table] COMMAND chain CRETIRIA -j ACTION

-t table : 3个 filter nat mangle

COMMAND: 定义如何对规则进行管理

chain 指定你接下来的规则到底是在哪个链上操作的,当定义策略的时候是可以省略的

CRETIRIA: 指定匹配标准

-j ACTION: 指定如何进行处理

三、详解COMMAND

3.1 链管理命令(立即生效的)

-P :设置默认策略的(设定默认门是关着的还是开关的)

默认策略一般只有两种

iptables -P INPUT (DROP|ACCEPT)  #默认是关的/默认是开的

-F:FALSH ,清空规则链的(注意每个链的管理权限)

iptables -t nat -F PREROUTING  # 清空nat表的所有链

-N: NEW 支持用户新建一个链

iptables -N inbound_tcp_web

-X: 用于删除用户自定义的空链

使用方法跟-N相同,但是在删除之前必须要将里面的链给清空了

-E: 用来rename chain 主要是用来给用户自定义的链重命名

-E oldname newname

-Z: 清空链,及链中默认规则的计数器的(两个计数器,被匹配到多少个数据包,多少个字节)

iptables -Z #清空

3.2 规则管理命令

-A : 追加,在当前链的最后新增一个规则

-I num : 插入,把当前规则插入为第num条

-R num: 替换/修改 第num条规则

iptables -R 3 .........

-D num : 删除,明确指定删除第num条规则

3.3 查看管理命令“-L"

附加子命令

-n: 以数字的方式显示ip,它会将ip直接显示出来,如果不加-n,则会将ip反向解析成主机名

-v: 显示详细信息

-vv

-vvv: 越多越详细

-x : 在计数器上显示精确值,不做单位换算

--line-numbers: 显示规则的行号

-t nat: 显示所有的关卡信息

四、详解匹配标准

4.1 通用匹配:源地址目标地址的匹配

-s : 指定作为源地址匹配,这里不能指定主机名称,必须是IP

IP|IP/MASK|0.0.0.0/0.0.0.0

而且地址可以取反,加一个”!“表示除了哪个IP之外

-d: 表示匹配目标地址

-p: 用于匹配协议的(这里的协议通常有3种, TCP/UDP/ICMP)

-I eth0: 从这块网卡流入的数据

流入一般用在INPUT和PREROUTING上

-o eth0: 从这块网卡流出的数据

流出一般在OUTPUT和POSTROUTING上

4.2 扩展匹配

4.2.1 隐含扩展;对协议的扩展

-p tcp: TCP协议的扩展

一般有三种扩展

--dport XX-XX :指定目标端口,不能指定多个非连续端口,只能指定单个端口或者连续端口

--dport 21   --dport 21-23

--sport: 指定源端口

--tcp-flags: TCP的标志位(SYN,ACK,FIN,PSH,RST,URG)

一般要跟两个参数

1.检查的标志位

2.必须为1的标志位

--tcpflags syn,ack,fin,rst  syn  # = --syn

表示检查这4个位,这4个位中syn必须为1,其他的必须为0。意思是检测三次握手的第一次的包,另外一种简写方式为

--syn

-p udp : UDP协议的扩展

--dport

--sport

-p icmp: ICMP数据报文的扩展

--icmp-type: echo-request(请求回显),一般用8来表示 echo-reply(响应的数据包) 一股用0来表示

4.2.2 显示扩展

扩展各种模块

-m multiport: 表示启用多端口扩展

五、详解-j ACTION

常用的ACTION

DROP : 悄悄的丢弃

一般我们多用DROP来隐藏我们的身份,以及隐藏我们的链表

REJECT:明示拒绝

ACCEPT:接受

custom_chain: 转向一个自定义的链

DNAT

SNAT

MASQUERADE:源地址伪装

REDIRECT:重定向:主要用于实现端口重定向

MARK:打防火墙标记的

RETURN:返回

在自定义链执行完毕后使用返回,来返回原规则链

六、 状态检测

检测是一种显式扩展,用于检测会话之间的连接关系的,有了检测我们可以实现会话间功能的扩展。

TCP协议来讲,它是一个有连接的协议,三次握手中,第一次握手,叫NEW连接,从第二次握手以后的ACK都为1 和TCP的第二次第三次握手叫做已建立的连接ESTABLISHED,无法识别的状态叫INVALID,FTP特征的端口独立,都是一去一回,他们之间有关系的叫做RELATED

所以我们一共有4种状态

NEW

ESTABLISHED

RELATED

INVALID

#如进来的拒绝出去的允许,进来的只允许ESTABLISHED进来,出去只允许ESTABLISHED出去,默认规则都使用拒绝
#改写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
#此时如果想再放行一个80端口如何放行
iptables -A INPUT -d 172.160.100.1 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -R INPUT 1 -d 172.16.100.1 -p udp --dport 53 -j ACCEPT

#允许自己ping别人,但是别人ping自己ping不通
#在出去的端口上
iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT
#在进来的端口上
iptables -A INPUT -P icmp --icmp-type 0 -j ACCEPT
#ping 自己
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT

七、SNAT和DNAT的实现

7.1 SNAT基于原地址的转换

基于原地址的转换一般用在我们的许多内网用户通过一个外网的口上网的时候,这时我们将我们内网的地址转换为一个外网的IP,我们就可以实现连接其他外网IP的功能。

#如我们现在要将所有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
#如果172.16.100.1不是固定的,则就要将外网地址换成MASQUERADE(动态伪装),它可以实现自动寻找到外网地址而自动将其改成正确的外网地址
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE
#地址伪装并不适用于所有的地方

7.2 DNAT目标地址转换

对于目标地址转换,数据流向是从外向内的,外面的是客户端,里面的是服务器端通过目标地址转换,我们可以让外面的IP通过我们对外的外网IP来访问我们服务器不同的服务器,而我们的服务却放在内网服务器的不同的服务器上。

iptables -t nat -A PREROUTING -d 192.168.10.18 -p tcp --dport 80 -j DNAT --todestination 172.16.100.2

目标地址转换要做在到达网卡之前进行转换,所以要做在PREROUTING这个位置上

八、控制规则的存放以及开启

注意:你所定义的所有内容,当你重启的时候都会失效,要想我们能够生效,需要使用一个命令将它保存起来

service iptables save
#它会保存在/etc/sysconfig/iptables这个文件中
iptables-save >/etc/sysconfig/iptables

iptables-restore < /etc/sysconfig/iptables.2
#让一个自己写的配置文件iptables.2手动生效