0416日常运维(二、firewalld和netfilter、iptables)

本文详细介绍iptables与防火墙配置的实战技巧,涵盖iptables的基本语法、常见操作、链与表的功能,以及如何通过iptables实现网段限制、状态匹配、端口开放与限制、IP伪装、端口转发等功能。同时,文章探讨了SELINUX、firewalld和netfilter的概念与应用,为读者提供了丰富的防火墙管理和网络安全实践指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

4.16任务
10.12 firewalld和netfilter
10.13 netfilter5表5链介绍
10.14 iptables语法
10.15 iptables filter表案例
10.16/10.17/10.18 iptables nat表应用

扩展(selinux了解即可)
selinux教程  http://os.51cto.com/art/201209/355490.htm
selinux pdf电子书  http://pan.baidu.com/s/1jGGdExK
iptables应用在一个网段  http://www.aminglinux.com/bbs/thread-177-1-1.html
sant,dnat,masquerade   http://www.aminglinux.com/bbs/thread-7255-1-1.html
iptables限制syn速率  http://www.aminglinux.com/bbs/thread-985-1-1.html   http://jamyy.us.to/blog/2006/03/206.html

 

 

 

1 针对网段

iptables -I INPUT -m iprange --src-range 61.4.176.0-61.4.191.255 -j DROP

192.168.1.0/24

iptables -I INPUT -p tcp --dport 80 -s 192.168.1.0/24 -j ACCEPT

-m 后面跟模块名字,iprange是一个模块名字,用来支持一个网段

--src-range 指定来源的ip范围

--dst-range 指定目标ip范围

2、iptables中DNAT、SNAT和MASQUERADE的理解 http://ask.apelearn.com/question/7255

3、在iptables上一共有四种状态,分别被称为NEW、ESTABLISHED、INVALID、RELATED

NEW:NEW说明这个包是我们看到的第一个包。意思就是,这是conntrack模块看到的某个连接的第一个包,它即将被匹配了。比如,我们看到一个SYN 包,是我们所留意的连接的第一个包,就要匹配它。

ESTABLISHED: ESTABLISHED已经注意到两个方向上的数据传输,而且会继续匹配这个连接的包。处于ESTABLISHED状态的连接是非常容易理解的。只要发送并接到应答,连接就是ESTABLISHED的了。一个连接要从NEW变为ESTABLISHED,只需要接到应答包即可,不管这个包是发往防火墙的,还是要由防火墙转发的。ICMP的错误和重定向等信息包也被看作是ESTABLISHED,只要它们是我们所发出的信息的应答。

RELATED: RELATED是个比较麻烦的状态。当一个连接和某个已处于ESTABLISHED状态的连接有关系时,就被认为是RELATED的了。换句话说,一个连接要想是RELATED的,首先要有一个ESTABLISHED的连接。这个ESTABLISHED连接再产生一个主连接之外的连接,这个新的连接就是 RELATED的了,当然前提是conntrack模块要能理解RELATED。ftp是个很好的例子,FTP-data 连接就是和FTP-control有关联的,如果没有在iptables的策略中配置RELATED状态,FTP-data的连接是无法正确建立的,还有其他的例子,比如,通过IRC的DCC连接。有了这个状态,ICMP应答、FTP传输、DCC等才能穿过防火墙正常工作。注意,大部分还有一些UDP协议都依赖这个机制。这些协议是很复杂的,它们把连接信息放在数据包里,并且要求这些信息能被正确理解。

INVALID:INVALID说明数据包不能被识别属于哪个连接或没有任何状态。有几个原因可以产生这种情况,比如,内存溢出,收到不知属于哪个连接的ICMP错误信息。一般地,我们DROP这个状态的任何东西,因为防火墙认为这是不安全的东西。

4、限速

iptables限制syn速度 http://ask.apelearn.com/question/985%20;

iptables -N syn-flood
iptables -A syn-flood -m limit --limit 5/s --limit-burst 500 -j RETURN
iptables -A syn-flood -j DROP
iptables -I INPUT -j syn-flood

 

 

iptables 的limit模块  https://www.centos.bz/2018/10/iptables-%E7%9A%84limit%E6%A8%A1%E5%9D%97/

 

 

 

 1、SELINUX
安全增强型Linux (SecurityEnhanced Linux)简称SELinux,它是一个Linux内核模块,也是Linux的一个安全子系 统。SELinux主要由美国国家安全局开发。2.6及以上版本的Linux内核都已经集成了 SELinux模块。SELinux的结构及 配置非常复杂,而且大量概念性的东西,要学精难度较大。很多Linux系统管理员嫌麻烦都把SELinux关闭了。

临时关闭SELINUX    setenforce 0

查看状态    getenforce

selinux永久关闭  设置配置文件 vi /etc/selinux/config

三个状态:
1)enforcing 开启
2)permissive 开启状态,但是不生效,只记录日志。临时关闭,会调整到这个状态。
3)disabled 关闭
更改完配置后,需要重启系统,方可生效。

9ad2ed04ce712e761a1c1acd16f3943f493.jpg

2、firewalld和netfilter

centos7默认使用的firewalld防火墙,netfilter是不开启的

Linux防火墙-netfilter

开启centos6上的防火墙netfilter,netfilter才是防火墙的名字,iptables只是netfilter的工具

禁止firewalld开机启动 systemctl disable firewalld
关掉firewalld服务  systemctl stop firewalld

b4f7a8ba96ba5e01bebb980c20662ec4c8c.jpg

开启netfilter之前,需要安装    yum install -y iptables-services

安装完成后产生iptables服务  systemctl enable iptables

88f55807b3a444dd2037701c91f064f0f08.jpg

开启iptables 服务    systemctl start iptables

 查看默认规则  iptables -nvL,服务启动后,自带的规则
0f0a8ce35c91dfdd795b5a3bbe784ae06a9.jpg

3、netfilter5表5链介绍

netfilter的5个表

man iptables 可以查看

iptables详解  http://www.cnblogs.com/metoy/p/4320813.html

ef15e823336059307c7d7100697f170f045.jpg

1)filter表
三个链:有 INPUT、 FORWARD、 OUTPUT
作用:过滤数据包 

2)nat表
三个链:    PREROUTING、 OUTPUT、 POSTROUTING
作用:用于网络地址转换(IP、端口)


3)mangle表
五个链:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
作用:用于给数据包做标记,修改数据包的服务类型、TTL、并且可以配置路由实现QOS,几乎用不到

4)raw表
两个链: OUTPUT、PREROUTING 
作用:可以实现不追踪某些数据包,决定数据包是否被状态跟踪机制处理,几乎不用 

5)security表
三个链:INPUT、OUTPUT和FORWARD
作用:security表在centos6中并没有,用于强制访问控制(MAC)的网络规则,几乎不用 


数据包流向与netfilter的5个内置的链
 PREROUTING:数据包进入路由表之前
 INPUT:通过路由表后目的地为本机
 FORWARD:通过路由表后,目的地不为本机
 OUTPUT:由本机产生,向外发出
 POSTROUTING:发送到网卡接口之前
 

iptables 相关的命令应用及语法

 

iptables [-t table]命令[chain] [rules] [j target]
格式说明:
table:指定表名,iptables内置包括filter表、nat表、mangle、raw表和security表。
命令:对链的操作命令
chain:链名
rules:匹配规则
target:动作如何进行

操作命令选项说明:
-P或--policy <链名>:定义默认策略
-L或--list    <链名>  :查看iptables规则列表
-A或--append <链名>:在规则列表的最后增加1条规则
-I或--insert <链名>:在指定的位置插入1条规则
-D或--delete <链名>:从规则列表中删除1条规则
-R或--replace <链名>:替换规则列表中的某条规则
-F或--flush <链名>:删除表中所有规则(临时删除,重启iptables后复原) 
-Z或--zero <链名>:将表中数据包计数器和流量计数器归零

规则选项说明:
-i或--in-interface<网络接口名>:指定数据包从哪个网络接口进入,如ppp0、eth0和ethl等 -o或--out-interface <网络接口名>:指定数据包从哪块网络接口输出,如ppp0、eth0和ethl等
-p或--proto协议类型 <协议类型>:指定数据包匹配的协议,如TCP、UDP和ICMP等 -s或--source<源地址或子网>:指定数据包匹配的源地址
--sport<源端口号>:指定数据包匹配的源端口号,可以使用“起始端口号:结束端口号”的格式指定一个范围的端口 
-d或--destination <目标地址或子网>:指定数据包匹配的目标地址
--dport<目标端口号>:指定数据包匹配的目标端口号,可以使用“起始端口号:结束端口号”的格式指定一个范围的端口

动作选项说明:
ACCEPT:接受数据包 
DROP:丢弃数据包
REDIRECT:与DROP基本一样,区别在于它除了阻塞包之外,还向发送者返回错误信息。
SNAT:源地址转换,即改变数据包的源地址 
DNAT:目标地址转换,即改变数据包的目的地址
MASQUERADE:IP伪装,即是常说的NAT技术,MASQUERADE只能用于ADSL等拨号上网的IP伪装,也就是主机的IP是由ISP分配动态的;如果主机的IP地址是静态固定的,就要使用SNAT

 

 

 

查看iptables规则    iptables -nvL    

规则保存位置cat /etc/sysconfig/iptables

选项说明:
n:数字输出。IP地址和端口会以数字的形式打印
v:详细输出。这个选项让list命令显示接口地址、规则选项等信息
L -list:显示所选链的所有规则。如果没有选择链,则会显示所有链的所有规则

c9fb1f121b629012d8f3199ebe4f878dcad.jpg
2)iptables -F     清空iptables规则,清空后/etc/sysconfig/iptables文件中还是有的

这里清空的只是当前iptables中设置的规则,不会清空以及保存的规则。重启iptables服务后还会去加载/etc/sysconfig/iptables配置文件中的规则,即可恢复保存过的规则25048970f0fe1ded9c82d4c1647c48e7e45.jpg

service iptables restart      iptables服务重启后,规则恢复

e958c8d3afa739a3f2b343c46a1276be73d.jpg

 

service iptables save 保存规则,重启后依然生效,执行此命令会把当前iptables的所有规则保存到/etc/sysconfig/iptables文件中

 iptables -Z  可以把计数器清零 

a9f96db08f9c4e3fa58dcd1056452b434b7.jpg

 iptables -t nat -nvL   查看nat表的规则, -t指定表,不加-t 默认filter表

9c26e67d699c15e13b0a7826161c3197af1.jpg

 

增加一条规则 :    iptables -A INPUT -s 192.168.86.3 -p tcp --sport 1234 -d 192.168.86.31 --dport 80 -j DROP

 

-A前不加-t默认filter表,-A(add)增加一条规则,针对INPUT链,指定来源IP :-s,-p指定协议,--sport来源端口,-d目标ip,--dport 目标端口,-j DROP把数据扔掉/REJECT(拒绝),DROP和REJECT效果一样,都是让数据包过不来,封掉ip

iptables -I INPUT -p tcp --dport 80 -j DROP        可以不写目标ip只写目标端口,-p tcp一定要写,使用dport前面一定要指定协议

-I(把规则放在最前面,插入)和-A (把规则放在最后面,添加),谁在前面谁就会被先匹配和加载

iptables -D INPUT -p tcp --dport 80 -j DROP   删除一条规则

iptables -D INPUT -s 192.168.86.3 -p tcp --sport 1234 -d 192.168.86.31 --dport 80 -j DROP  删除一条规则

a6d4bc13266da17dce6a951691f2cffb675.jpg

 

 

iptables -nvL --line-numbers   把规则中的序列号打印出来

58c1303d0a79c7358eb9a2c3b50816d5769.jpg

iptables -D INPUT 5  根据编号来删除规则

890176164059bb45fead29e6d2888fd4e45.jpg

iptables -I INPUT -s 192.168.1.0/24 -i eth0 -j ACCEPT

添加默认规则
默认策略是ACCEPT

f41df6680fd09a17117484fff8f367e0d37.jpg
更改默认策略为DROP   iptables -P OUTPUT DROP  此处执行后会让远程连接断开再也连不上

需要再服务器上    iptables -P OUTPUT ACCEPT        默认允许所有OUTPUT链的数据包通过,放行
默认允许所有FORWARD链的数据包通过    iptables -P FORWARD ACCEPT
默认丟弃INPUT链的数据包    iptables -P INPUT DROP

 

iptables filter表小案例

案例1:放行端口
只放行80、21、22三个端口的数据包,且22端口只有指定的IP段才能通过 这个案例可以编写一个shell脚本来实现。
vi /usr/local/sbin/iptables.sh    加入如下内容

案例1:放行端口
只放行80、21、22三个端口的数据包,且22端口只有指定的IP段才能通过 这个案例可以编写一个shell脚本来实现。
vi /usr/local/sbin/iptables.sh    加入如下内容


#! /bin/bash                                    定义执行脚本的shell
ipt="/usr/sbin/iptables"                 定义一个变量,绝对路径
$ipt -F                                            清空iptables规则
$ipt -P INPUT DROP                      默认规则,INPUT策略DROP,丢弃所有数据包
$ipt -P OUTPUT ACCEPT                默认规则,放行所有OUTPUT链的数据包
$ipt -P FORWARD ACCEPT            默认规则,放行所有FORWARD链的数据包
$ipt -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT    这条规则允许RELATED和ESTABLISHED状态的数据包给放行,这条规则必加,否则可能导致某些服务连不上  
$ipt -A INPUT -s 192.168.86.0/24 -p tcp --dport 22 -j ACCEPT                仅允许192.168.86.0/24网段链接22端口
$ipt -A INPUT -p tcp --dport 80 -j ACCEPT                                               允许通过所有80端口的数据包
$ipt -A INPUT -p tcp --dport 21 -j ACCEPT                                                允许通过所有21端口的数据包

ceeb1a491dca4fcf6eb9b552a958d274793.jpg

f0324919dcf96fa000a4a8249111b68c80c.jpg


禁ping
让本机可以ping通别的机器,但是别的机器ping不通本机
 icmp示例
 service iptables restart  先把规则恢复成默认状态
 eab4b56dadd028ce8050e5e91bb5a7c926d.jpg

此时在windows可以ping通本机

044d65b137f9a3fff79fe32bd3f483e689a.jpg
 

丟弃icmp包类型为8的数据包。icmp类型为8的数据包是icmp请求,类型为0的是应答包
 iptables -I INPUT -p icmp --icmp-type 8 -j DROP   添加完此规则后,windows无法ping通本机,本机可以ping外网,不影响连接使用,只禁听

551402f3bbe9a2eaa0b36680efa3c5e2ec2.jpg

be897a29675a47feb037161f805344bc0f3.jpg

 

 

iptables nat表应用

需求1:可以让B机器连接外网

A机器两块网卡ens33(192.168.159.3)、ens37(192.168.100.1),ens33可以上外网,ens37仅仅是内部网络,

B机器只有ens37(192.168.100.100),和A机器ens37可以通信互联

步骤1:在虚拟机。A机器添加一个内网网卡,B机器也添加内网网卡。网卡模式并设置为LAN区段,自定义名字一样。

按下图:添加网络适配器

ce3de1e056366df13e51c946d8d85343a71.jpg

选择新添加的网卡,选择LAN区段,相当于给网卡连到了一个内网的交换机上,让两台电脑都连接这个交换机进行通信

 

f2a0f83af51274e1ddea3868c24fc3c3129.jpg

A机器设置完成

767565d82ef20c09056eaf3a4d2708f4258.jpg

设置B机器的网卡

禁掉B机器的启动时连接,同样按之前设置,添加新的网卡,选择相同LAN区段,目的是保证AB机器的处于同一网段

28bfbebbfbe63d6603799957939ac676aed.jpg

设置完成,启动两台机器

ed1e7e55787a479d5bf762155da721c9ceb.jpg

查看A机器的网卡,可以远程连接,B机器因为没有windows可以连接的ip,无法远程连接

8238d60c6fe57e3c8d3d23a9149c6c6dd30.jpg

给ens37设置IP

ifconfig    ens37 192.168.100.1/24       24网段,此ip重启后就没有了,永久生效需要更改配置文件

882d97be50125fa51705fa2c4cae74d38a5.jpg

查看B机器,end33虽然存在,但是已经给关掉了,保险起见可以使用ifdown ens33  禁掉

2ba1062e5ee14db6df44450f627adc5cb70.jpg

给B机器的ens37设置IP : 192.168.100.100

6493587bcf8f0658572514cb692b1585e45.jpg

可以使用mii-tool ens37的网络状态。

6fb5106ebe49870b176e62a43efb9f0ba6c.jpg

此时两台机器可以互联

6ef51c57129e3cd3ac74fd7dd16893c9ad0.jpg

但是两台机器都无法连接外网

34e6033ca92c42e49e447ba23e31e6a7947.jpg

设置方法

A机器上打开路由转发     echo "1">/proc/sys/net/ipv4/ip_forward   修改内核参数为1

ip_forward默认为0,表示没有开启端口转发(nat的应用),然后执行命令打开

f13d51d3c139f35502d0e460ac3609c617d.jpg

增加规则:

A机器上执行     iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens33 -j MASQUERADE   目的是让100.0网段能够上网

bf08695767b634ae0d1623c5d78369e6c5a.jpg

B上设置网关为192.168.100.1

route add default gw 192.168.100.1

d77792d889d8651d98d2b7ff5878b0dc190.jpg

设置完成后可以ping通 A机器 192.168.159.3

ca144bd8cba1635e49a2459494c7779e9bb.jpg

给B机器设置DNS,公共的DNS119.29.29.29,vi /etc/resolv.conf

d982f530c3a5280f9028bf4294860fcc80c.jpg

 

需求2:C机器和B机器连接

C机器只能和A通信,让C机器可以直接连通B机器的22端口  

192.168.86.31的端口22映射到端口1122,连接B机器的192.168.100.100

B机器的192.168.100.100的端口22,映射为1122的端口,用192.168.86.31连接1122端口,也就是连接192.168.100.100的22端口

1、A上打开路由转发    echo "1">/proc/sys/net/ipv4/ip_forward  

2、A上添加规则

添加之前要把之前的规则删掉:

iptables -t nat -D POSTROUTING -s 192.168.100.0/24 -o ens33 -j MASQUERADE

12f1cd7d88c0af71441491c85e265475079.jpg

然后添加规则:    iptables -t nat -A PREROUTING -d 192.168.86.31 -p tcp --dport 1122 -j DNAT --to 192.168.100.100:22  , 端口转发,转发到100.100的22端口

A上执行iptables -t nat -A POSTROUTING -s 192.168.100.100 -j SNAT --to 192.168.86.31 

e325879360311a65a7966f8ee22530a10e8.jpg

 B上设置网关为192.168.100.1,设置网关才能联网

此时使用客户端链接即可

w查看负载,看到来源自192.168.86.1就是C机器

b198887678001f08b7ebdbb4737eb6764d2.jpg

这说明机器C:192.168.86.1已经和机器B:192.168.100.100相连,机器C和机器A能够通信,而通过机器A来连接机器B的映射端口1122,达到了C和B通信,而且B机器也通过映射端口1122能够连接外网。

转载于:https://my.oschina.net/u/4093217/blog/3037155

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值