RHEL5.4配置iptables防火墙

2024-03-25 06:08

本文主要是介绍RHEL5.4配置iptables防火墙,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

                      RHCE学习笔记

 

关于linux下面配置iptables防火墙的讨论,

 

Iptablesnetfilter模块关系

linux下面的防火墙并不是一个服务,而是一个加载到内核中的模块。这个模块就是netfilter模块(网络过滤模块),我们使用iptables工具来管理这个netfilter模块。

 

Iptables的模式

Enabled     默认拒绝所有

Disabled    默认允许所有

我们可以通过system-config-securitylevel这条命令通过图形界面修改,

这里可以选择enabled模式和disabled模式。

 

关于netfilter表和netfilter

这张图就很清楚的显示了netfilter表和netfilter链。

Filter table里面有三条链:

INPUT                 目的地是访问防火墙本身的数据包

OUTPUT             源地址是防火墙出去的数据包

FORWARD         数据包的源地址和目的地址都不是防火墙的数据包

Nat table里面也有三条链:

OUTPUT              数据包在出网关之前被丢给代理服务器

PREROUTING     做目的NAT转换(路由判断之前)

POSTROUTING  做源NAT转换(路由判断之后)

Mangle talbe里面有五条链:

INPUT

OUTPUT

FORWARD

PREROUTING

POSTROUTING

 

关于iptables数据包的流程

这张图就显示了整个iptables防火墙在工作时候的数据包流程。

 

关于iptables的访问控制规则

当数据包要经过iptables防火墙,首先读取第一条策略,如果第一条策略匹配,则执行,不在读取下面的策略。如果第一条策略没有匹配,则读取第二条策略,如果匹配到第二条策略,则执行,不在读取下面的策略。如果数据包没有匹配到任何策略,则匹配默认策略。默认策略是允许或者拒绝可以由用户自己定义。

 

关于iptables的匹配规则

-s   192.168.0.0/24

源地址为192.168.0.0/24的网段

-d   192.168.0.10

目的地址为192.168.0.10的主机

-i   eth0

eht0进来的数据包

-o   eth0

eth0出去的数据包

‘!’  192.168.0.10

反向选择

-p  tcp  --dport  80

协议的类型,目标端口是80

-p  udp  --sport  53

协议类型,源端口是53

 

关于iptables的规则目标

DROP          拒绝

ACCEPT     允许

LOG            日志,匹配到这条策略后,还是会继续往下面读取策略。

REJECT      拒绝,但是会给用户回应的信息。

 

关于iptables基本链操作

Iptables  -L

查看iptables table(默认显示filter table)

Iptables  -nL

IP地址的方式显示

Iptables  -L  --line-numbers

显示策略条目的行号

Iptables  -vL

查看iptables table(显示更具体的信息)

Iptables   -A

追加iptables的策略条目(默认会追加策略的最后面)

Iptables   -I

插入iptables的策略条目(默认插入到策略的最前面)

Iptables   -I   INPUT  2

插入成iptables策略条目的第二条策略

Iptables   -D  INPUT  2

删除iptables策略条目的第二条策略

Iptables   -F

清空所有的策略,但是不会清空链的默认策略。

Iptables   -Z

清空计数器

Iptables   -N

添加用户自定义链

Iptables   -X

清空用户自定义链

 

关于iptables的默认的链策略

Iptables  -P   INPUT      DROP

改变INPUT链的默认策略,拒绝只可以用DROP,不可以用REJECT(这条策略最后被执行)

Iptables  -P   OUTPUT    DROP

改变OUTPUT链的默认策略

Iptables  -P   FORWARD  DROP

改变FORWARD链的默认策略

 

下面我们来做试验,写几个简单的策略。

[root@localhost ~]#

[root@localhost ~]# lftp 192.168.0.254

lftp 192.168.0.254:~> ls

drwxrwxrwx   23 0        0            4096 Mar 25 07:29 pub

lftp 192.168.0.254:/> cd pub/

lftp 192.168.0.254:/pub>

可以看到,现在我们的192.168.0.10这台主机访问服务器上面的ftp服务是没有问题的,现在我们写个策略拒绝这台主机访问。

[root@server1 ~]#

[root@server1 ~]# iptables -t filter -A INPUT -s 192.168.0.10 -p tcp --dport 21 -j REJECT

[root@server1 ~]#

[root@server1~]# iptables -nL

Chain INPUT (policy ACCEPT)

target        prot  opt   source                 destination        

REJECT   tcp    --   192.168.0.10         0.0.0.0/0           tcp dpt:21 reject-with icmp-port-unreachable

 

Chain FORWARD (policy ACCEPT)

target     prot opt source               destination        

 

Chain OUTPUT (policy ACCEPT)

target     prot opt source               destination        

[root@server1~]#

OK,这条简单的策略就写成功了。

现在我们来测试下,

[root@server1 ~]#

[root@server1 ~]# ssh 192.168.0.10

root@192.168.0.10's password:

Last login: Thu Mar 25 21:52:37 2010 from ftp.example.com

[root@localhost ~]# lftp 192.168.0.254

lftp 192.168.0.254:~> ls

`ls' at 0 [Delaying before reconnect:30]

刚才写的那条策略就生效了。现在192.168.0.10就不可以访问服务器ftp服务了。

 

刚才使用的INPUT链,现在我们使用OUTPUT链,

现在我们拒绝服务器ssh192.168.0.20上面,

[root@server1 ~]# ssh 192.168.0.10

root@192.168.0.10's password:

Last login: Thu Mar 25 22:04:53 2010 from server1.example.com

[root@localhost ~]#

现在我们是可以ssh192.168.0.10这台主机上面去的。

[root@server1 ~]#

[root@server1 ~]# iptables -t filter -A OUTPUT -d 192.168.0.10 -p tcp --dport 22 -j REJECT

[root@server1 ~]#

[root@server1 ~]# iptables -nL

Chain INPUT (policy ACCEPT)

target     prot opt source               destination        

 

Chain FORWARD (policy ACCEPT)

target     prot opt source               destination        

 

Chain OUTPUT (policy ACCEPT)

target         prot  opt  source               destination        

REJECT     tcp   --   0.0.0.0/0            192.168.0.10        tcp dpt:22 reject-with icmp-port-unreachable

[root@server1 ~]#

OK,这条策略就写完成了。

现在我们再来测试下,

[root@localhost ~]#

[root@localhost ~]# ssh 192.168.0.10

ssh: connect to host 192.168.0.10 port 22: Connection refused

[root@localhost ~]#

OK,现在就连接被拒绝了,说明刚才那条策略生效了。

 

现在还有个特殊的策略,

#iptables  -A  INPUT  -j  DROP/ REJECT

这个策略我们一般写在最后面,所有没有匹配到的用户全部拒绝。

这条策略会有一个副作用,就是服务器自己反而会访问不到自己。

现在我们来测试下,

首先来访问下自己的ftp服务,

[root@server1 ~]#

[root@server1 ~]# lftp localhost

lftp 192.168.0.254:~> ls

drwxrwxrwx   23 0        0            4096 Mar 25 07:29 pub

lftp 192.168.0.254:/> cd pub/

lftp 192.168.0.254:/pub>

OK,现在访问是没有问题的。

现在我们来加上刚才的那条策略。

[root@server1 ~]#

[root@server1 ~]# iptables -A INPUT -j REJECT

[root@server1 ~]#

[root@server1 ~]#

[root@server1 ~]# iptables -L

Chain INPUT (policy ACCEPT)

target        prot  opt  source                destination         

REJECT     all   --   anywhere             anywhere            reject-with icmp-port-unreachable

 

Chain  FORWARD  (policy ACCEPT)

target     prot opt source               destination        

 

Chain OUTPUT (policy ACCEPT)

target     prot opt source               destination        

[root@server1 ~]#

添加策略就完成了,现在我们再来访问下本地ftp服务,

[root@server1 ~]#

[root@server1 ~]# lftp localhost

lftp 192.168.0.254:~> ls

可以看到,现在就访问不了。

ls' at 0 [Connecting...]

这个是因为没有开启本地回环,所以必须写条策略开启本地回环。

[root@server1 ~]#

[root@server1 ~]# iptables -I INPUT -i lo -j ACCEPT

[root@server1 ~]#

[root@server1 ~]# iptables -L

Chain INPUT (policy ACCEPT)

target         prot  opt   source                destination        

ACCEPT    all    --    anywhere             anywhere           

REJECT     all     --    anywhere             anywhere            reject-with icmp-port-unreachable

 

Chain FORWARD (policy ACCEPT)

target     prot opt source               destination        

 

Chain OUTPUT (policy ACCEPT)

target     prot opt source               destination        

[root@server1 ~]#

现在我们插入了一条策略,再来测试下现在能否访问本地的ftp服务。

[root@server1 ~]#

[root@server1 ~]# lftp localhost

lftp localhost:~> ls

drwxrwxrwx   23 0        0            4096 Mar 25 07:29 pub

lftp localhost:/> cd pub/

lftp localhost:/pub>

OK,当我们允许了本地回环访问,现在就可以访问本地的ftp服务了。

默认的链策略也会有这个副作用。

 

写完iptables策略以后,重启计算机这些策略就都不会生效了。

可以使用这条命令,

#service  iptables  save

[root@localhost ~]#

[root@localhost ~]# service iptables save

Saving firewall rules to /etc/sysconfig/iptables:          [  OK  ]

[root@localhost ~]#

敲完这条命令以后,系统会将iptables的策略自动写入到/etc/sysconfig/iptables

 

我们只是对数据包的源地址和目的地址进行过滤。下面我们对数据包的状态进行过滤。这个叫做链接跟踪。

在使用状态过滤的时候,我们必须先加载相应的模块,

Modprobe  ip_conntrack_ftp 

Modprobe  ip_conntrack_tftp

Modprobe  ip_nat_ftp

Modprobe  ip_nat_tftp

关于数据包的状态

NEW                     第一次发起连接请求的数据包状态

ESTABLISHED    已经建立三次握手的数据包状态

RELATED            发送出去得到回应的数据包状态

INVALID             无效的数据包状态

关于连接跟踪的示例:

Iptables  -A    INPUT  -m  state  --state  ESTABLISHEDRELATED  -j  ACCEPT

Iptables  -A    INPUT  -m  state  --state  NEW  -p  tcp  --dport  25  -j  ACCEPT

Iptables   -A   INPUT  -m  state  --state  NEW  -j  DROP

现在我们以FTP为例,测试下,

正常情况下面,现在我们是可以访问服务器上面的ftp服务的,

[root@localhost ~]#

[root@localhost ~]# lftp 192.168.0.254

lftp 192.168.0.254:~> ls

drwxrwxrwx   23 0        0            4096 Mar 25 07:29 pub

lftp 192.168.0.254:/>

可以看到,现在访问的确没有问题的,

现在我们来写几条策略,

[root@server1 ~]#

[root@server1 ~]# iptables -A INPUT -s 192.168.0.10 -p tcp --dport 21 -j ACCEPT

[root@server1 ~]#

[root@server1 ~]# iptables -A INPUT -j REJECT

[root@server1 ~]#

[root@server1 ~]# iptables -L

Chain INPUT (policy ACCEPT)

target         prot   opt  source                  destination        

ACCEPT    tcp   --   192.168.0.10         anywhere            tcp dpt:ftp

REJECT     all     --    anywhere               anywhere            reject-with icmp-port-unreachable

 

Chain FORWARD (policy ACCEPT)

target     prot opt source               destination        

 

Chain OUTPUT (policy ACCEPT)

target     prot opt source               destination        

[root@server1 ~]#

现在我们再到192.168.0.10上面去测试下,

[root@localhost ~]#

[root@localhost ~]# lftp 192.168.0.254

lftp 192.168.0.254:~> ls

`ls' at 0 [Delaying before reconnect: 20] 

可以看到,现在就访问不到服务器的ftp服务了。

因为我只开放了21号端口,而ftp服务的21号端口是用来传输命令通道的,现在客户端与服务器是建立不起三次握手的。

现在我们就只能够使用状态防火墙来允许建立三次握手。

使用状态防火墙首先要加载模块,

[root@server1 ~]#

[root@server1 ~]# modprobe ip_conntrack_ftp

[root@server1 ~]#

[root@server1 ~]# iptables -I INPUT 2 -m state --state ESTABLISHED,RELATED -j ACCEPT

[root@server1 ~]#

[root@server1 ~]# iptables -L

Chain INPUT (policy ACCEPT)

target        prot  opt  source                 destination        

ACCEPT   tcp   --   192.168.0.10        anywhere         tcp dpt:ftp

ACCEPT   all    --    anywhere              anywhere        state RELATED,

ESTABLISHED

REJECT    all   --    anywhere                anywhere    reject-with icmp-port-unreachable

 

Chain FORWARD (policy ACCEPT)

target     prot opt source               destination        

 

Chain OUTPUT (policy ACCEPT)

target     prot opt source               destination        

[root@server1 ~]#

现在我们再到192.168.0.10上面去测试下,

[root@localhost ~]#

[root@localhost ~]# lftp 192.168.0.254

lftp 192.168.0.254:~> ls

drwxrwxrwx   23 0        0            4096 Mar 25 07:29 pub

lftp 192.168.0.254:/>

OK,现在就可以访问了,

这个就是状态防火墙的用法。

 

关于NAT(网络地址转换)

网络地址转换的类型:

目的地NAT(DNAT)  

PREROUTING链中进行设置,

NAT(SNATMASQUERADE)

POSTROUTING链中进行设置

 

DNAT示例:

INBOUND(进入)

Iptables  -t  nat  -A  PREROUTING  -p  tcp  --dport  80  -j  DNAT  --to-dest  192.168.0.10

OUTBOUD(输出,带有端口重定向)

Iptables  -t   nat   -A   OUTPUT  -p  tcp  --dport  80  -j  DNAT  --to--dest  192.168.0.100:3128

 

SNAT示例:

MASQUERADE(地址伪装)

Iptables  -t   nat   -A   POSTROUTING   -o   eth0   -j   MASQUERADE

SNAT

Iptables  -t   nat   -A   POSTROUTING   -j   SNAT  --to-source  1.2.3.45

 

关于linux下面简单iptables配置就是这么多了。

这篇关于RHEL5.4配置iptables防火墙的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/844066

相关文章

Vue 2 项目中配置 Tailwind CSS 和 Font Awesome 的最佳实践举例

《Vue2项目中配置TailwindCSS和FontAwesome的最佳实践举例》:本文主要介绍Vue2项目中配置TailwindCSS和FontAwesome的最... 目录vue 2 项目中配置 Tailwind css 和 Font Awesome 的最佳实践一、Tailwind CSS 配置1. 安

SpringBoot中HTTP连接池的配置与优化

《SpringBoot中HTTP连接池的配置与优化》这篇文章主要为大家详细介绍了SpringBoot中HTTP连接池的配置与优化的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、HTTP连接池的核心价值二、Spring Boot集成方案方案1:Apache HttpCl

Maven 插件配置分层架构深度解析

《Maven插件配置分层架构深度解析》:本文主要介绍Maven插件配置分层架构深度解析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Maven 插件配置分层架构深度解析引言:当构建逻辑遇上复杂配置第一章 Maven插件配置的三重境界1.1 插件配置的拓扑

Spring Boot集成Logback终极指南之从基础到高级配置实战指南

《SpringBoot集成Logback终极指南之从基础到高级配置实战指南》Logback是一个可靠、通用且快速的Java日志框架,作为Log4j的继承者,由Log4j创始人设计,:本文主要介绍... 目录一、Logback简介与Spring Boot集成基础1.1 Logback是什么?1.2 Sprin

VSCode中配置node.js的实现示例

《VSCode中配置node.js的实现示例》本文主要介绍了VSCode中配置node.js的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一.node.js下载安装教程二.配置npm三.配置环境变量四.VSCode配置五.心得一.no

Gradle在国内配置镜像加速的实现步骤

《Gradle在国内配置镜像加速的实现步骤》在国内使用Gradle构建项目时,最大的痛点就是依赖下载贼慢,甚至卡死,下面教你如何配置国内镜像加速Gradle下载依赖,主要是通过改写repositori... 目录引言一、修改 build.gradle 或 settings.gradle 的 reposito

使用easy connect之后,maven无法使用,原来需要配置-Djava.net.preferIPv4Stack=true问题

《使用easyconnect之后,maven无法使用,原来需要配置-Djava.net.preferIPv4Stack=true问题》:本文主要介绍使用easyconnect之后,maven无法... 目录使用easGWowCy connect之后,maven无法使用,原来需要配置-DJava.net.pr

史上最全nginx详细参数配置

《史上最全nginx详细参数配置》Nginx是一个轻量级高性能的HTTP和反向代理服务器,同时也是一个通用代理服务器(TCP/UDP/IMAP/POP3/SMTP),最初由俄罗斯人IgorSyso... 目录基本命令默认配置搭建站点根据文件类型设置过期时间禁止文件缓存防盗链静态文件压缩指定定错误页面跨域问题

nginx负载均衡及详细配置方法

《nginx负载均衡及详细配置方法》Nginx作为一种高效的Web服务器和反向代理服务器,广泛应用于网站的负载均衡中,:本文主要介绍nginx负载均衡及详细配置,需要的朋友可以参考下... 目录一、 nginx负载均衡策略1.1 基本负载均衡策略1.2 第三方策略1.3 策略对比二、 nginx配置2.1

Android开发环境配置避坑指南

《Android开发环境配置避坑指南》本文主要介绍了Android开发环境配置过程中遇到的问题及解决方案,包括VPN注意事项、工具版本统一、Gerrit邮箱配置、Git拉取和提交代码、MergevsR... 目录网络环境:VPN 注意事项工具版本统一:android Studio & JDKGerrit的邮