当前位置: 首页 > 编程日记 > 正文

iptables防火墙策略

环境:

foundation1     172.25.1.250    172.25.254.1

server1             172.25.1.1

server2             172.25.1.2

server3             172.25.1.3

四个主机都做解析

iptables简介:

netfilter/iptables(简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。

iptables采用“表”和“链”的分层结构,在linux中iptables主要有三张表五条链:

三张表即filter表、nat表、mangle表,分别用于实现包过滤,网络地址转换、包重构(修改)功能

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

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

Mangle表有五个链:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
作用:修改数据包的服务类型等

iptables命令中设置数据过滤或处理数据包的策略叫做规则,将多个规则合成一个链,叫规则链。

规则链则依据处理数据包的位置不同分类:

PREROUTING: 在进行路由判断之前所要进行的规则(DNAT/REDIRECT)
INPUT:处理入站的数据包
OUTPUT:处理出站的数据包
FORWARD:处理转发的数据包
POSTROUTING: 在进行路由判断之后所要进行的规则(SNAT/MASQUERADE)

iptables中的规则表是用于容纳规则链,规则表默认是允许状态的,那么规则链就是设置被禁止的规则,而反之如果规则表是禁止状态的,那么规则链就是设置被允许的规则。

raw表:确定是否对该数据包进行状态跟踪

mangle表:为数据包设置标记(较少使用)

nat表:修改数据包中的源、目标IP地址或端口

filter表:确定是否放行该数据包(过滤)

另外注意:

1.没有指定规则表则默认指filter表。

2.不指定规则链则指表内所有的规则链。

3.在规则链中匹配规则时会依次检查,匹配即停止(LOG规则例外),若没匹配项则按链的默认状态处理。

注意:

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

1.service iptables save 命令

它会保存在/etc/sysconfig/iptables这个文件中

2.iptables-save 命令

iptables-save > /etc/sysconfig/iptables

为了不影响实验去除干扰,将 firewalld 关闭,安装 iptables,并启动

[root@server1 ~]# systemctl stop firewalld
[root@server1 ~]# systemctl status firewalld

[root@server1 ~]# yum install iptables-services                      //下载防火墙服务,server1、server2、server3均下载

[root@server1 ~]# systemctl start iptables.service                //开启服务

[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

[root@server1 ~]# iptables -F            //刷新策略
[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

[root@server1 ~]# yum install -y httpd                      //下载http服务

[root@server1 ~]# systemctl enable httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.

[root@server1 ~]# systemctl start httpd                     //开启http服务
[root@server1 ~]# iptables -P INPUT ACCEPT         //设置接受模式

此时所有主机浏览器都可以访问httpd页面,这里用curl命令

给server1写一个Apache的发布页面

[root@server1 ~]# cd /var/www/html/
[root@server1 html]# ls
[root@server1 html]# vim index.html

[root@foundation1 Desktop]# curl server1

[root@server2 ~]# curl server1
server1

[root@server3 ~]# curl server1
server1

[root@server1 ~]# iptables -A INPUT -p tcp --dport 80 -j REJECT               //添加策略,使http为拒绝

[root@server1 ~]# iptables -nL           //查看策略是否已添加
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
REJECT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80 reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

此时:

[root@server2 ~]# curl server1

[root@server3 ~]# curl server1
curl: (7) Failed connect to server1:80; Connection refused

[root@server1 ~]# iptables -A INPUT -s 172.25.1.2 -p tcp --dport 80 -j ACCEPT        //指定ip为server2可以访问该主机的http服务

[root@server1 ~]# iptables -nL

[root@server2 ~]# curl server1
curl: (7) Failed connect to server1:80; Connection refused

防火墙策略读取方式:

读取时从第一条开始读取,当满足第一条时停止读取。

可以看到虽然有策略,但是server2还是不能访问,因为第一条策略读完就拒之门外,所以因采用:

[root@server1 ~]# iptables -D INPUT 2
[root@server1 ~]# iptables -I INPUT 1 -s 172.25.1.2 -p tcp --dport 80 -j ACCEPT [root@server1 ~]# iptables -nL

[root@server1 ~]# iptables -nL

此时:

[root@server2 ~]# curl server1

[root@server3 ~]# curl server1

[root@server1 ~]# iptables -R INPUT 2 -s 172.25.1.3 -p tcp --dport 80 -j ACCEPT      //修改第二条策略,修改为允许server3访问

[root@server1 ~]# iptables -nL

此时server3也可进行访问

[root@server3 ~]# curl server1

[root@server1 ~]# iptables -F       //刷新策略
[root@server1 ~]# iptables -nL     //察看是否已刷新

[root@server1 ~]# iptables -N xx            //添加名为xx的链
[root@server1 ~]# iptables -nL

[root@server1 ~]# iptables -E xx cc                  //修改链名,将名为xx的链修改为cc
[root@server1 ~]# iptables -nL

[root@server1 ~]# iptables -X cc                //删除链cc
[root@server1 ~]# iptables -nL

NAT (Net Address Trancelate:网络地址转换)

*************************源地址转换:SNAT*********************************

(源地址转换)是指在数据包从网卡发送出去的时候,把数据包中的源地址部分替换为指定的 IP,这样,接收方就认为数据包的来源是被替换的那个 IP 的 主机

*************************目的地址转换:DNAT*******************************

(目标地址转换),就是指数据包从网卡发送出去的时候,修改数据包中的目的 IP,表现为如果你想访问 A,可是因为网关做了 DNAT,把所有访问 A 的数 据包的目的 IP 全部修改为 B,那么,你实际上访问的是 B

注意:实现配置iptables的NAT功能需要 开启内核的转发功能

1、SNAT

环境:

server1:172.25.1.1

server2: 172.25.1.2        172.25.254.2                 开启iptables服务

server3:172.25.254.3

## 所有主机刷新策略,并关闭防火墙firewalld

##  打开转发IP功能(IP forwarding):

echo "1" > /proc/sys/net/ipv4/ip_forward

要想永久有效:

vim /etc/sysctl.conf

net.ipv4.ip_forward = 1

如果使用PPP、DHCP等动态IP,需要打开:

echo "1" > /proc/sys/net/ipv4/ip_dynaddr

[root@server2 ~]# echo "1" > /proc/sys/net/ipv4/ip_forward

[root@server2 ~]# systemctl status iptables

[root@server2 ~]# ip address add 172.25.254.2/24 dev eth1                   //添加网卡eth1:172.25.254.2

[root@server1 ~]# ip addr

[root@server3 ~]# ip addr

原本不同网段ip是ping不通的,即server1和server3是ping不通的

[root@server1 ~]# ping 172.25.254.3

[root@server2 ~]# iptables -nL -t nat         //查看nat策略

[root@server2 ~]# iptables -t nat -I POSTROUTING -s 172.25.1.0/24 -j MASQUERADE

//在路由后,将172.25.1.0/24网段过来的主机转发出去

[root@server2 ~]# iptables -nL -t nat

[root@server1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0          //添加网关

GATEWAY=172.25.1.2

[root@server1 ~]# systemctl restart network

[root@server2 ~]# route -n
-bash: route: command not found
[root@server2 ~]# yum install -y net-tools                 //下载route 命令所需的工具

[root@server1 ~]# route -n               //查看网关

[root@server1 ~]# ping 172.25.254.3

//此时虽然是不同网段,但是可以ping通

2、DNAT

环境:

server1 内网 172.25.1.1/24

server2 路由 172.25.1.2/24   172.25.254.2/24

server3 外网 172.25.254.3/24

分别给三个主机写一个http页面,内容为各自的ip,方便判断连接到的是哪个主机

[root@server1 ~]# yum install -y httpd

[root@server1 ~]# systemctl start httpd

[root@server1 ~]# echo 172.25.1.1 > /var/www/html/index.html              //写一个http页面,内容为172.25.1.1

[root@server2 ~]# yum install -y httpd

[root@server2 ~]# systemctl start httpd

[root@server2 ~]# echo 172.25.1.2 > /var/www/html/index.html              //写一个http页面,内容为172.25.1.1

[root@server3 ~]# yum install httpd

[root@server3 ~]# systemctl start httpd

[root@server3 ~]# systemctl status httpd

[root@server3 ~]# echo 172.25.254.3 > /var/www/html/index.html              //写一个http页面,内容为172.25.254.3

给路由主机添加策略:

现在要把外网访问172.25.254.2的所有流量映射到172.25.1.1上

[root@server2 ~]#  iptables -t nat -A PREROUTING -d 172.25.254.2 -j DNAT --to-destination 172.25.1.1      
[root@server2 ~]#  iptables -t nat -A POSTROUTING -d 172.25.1.1 -j SNAT --to 172.25.1.2

[root@server2 ~]# iptables -nL -t nat

[root@server2 ~]# service iptables save                    //保存策略

[root@server2 ~]# cat  /etc/sysconfig/iptables              //可以查看策略保存的内容

此时,外网用curl命令访问路由主机,相当于http访问:

[root@server3 ~]# curl 172.25.254.2

curl命令查看172.25.1.2内容时出现的不是172.25.1.2而是server1的内容,即172.25.1.1的httpd发布内容

也可以通过ssh远程连接:

[root@server3 ~]# ssh root@172.25.254.2

//本应连接到server2,但此时远程连接上的是server1而不是server2,因为目标地址进行了转换,将172.25.254.2转换成了172.25.1.1

相关文章:

ubuntu(16.04.01)学习-day1

1.修改root用户密码 sudo passwd root 按提示进行设置。 2.从Ubuntu 16.04开始,用户可以实现改变启动器的位置,可以将启动器移到屏幕底部,但是无法移到右边或顶部。打开终端,然后输入下面这个命令,即可将启动器移到屏幕…

HDU 1090 A+B for Input-Output Practice (II)

#include <cstdio> int main() {int n,a,b;scanf("%d",&n);for (int i1; i<n; i){ scanf("%d%d",&a,&b);printf("%d\n",ab);}return 0; } 转载于:https://www.cnblogs.com/forever97/p/3539605.html

监听UIWebView点击视频播放的事件

最近项目需要统计在跳转UIWebView后&#xff0c;用户点击网页上的视频进行播放的概率。找了很多监听进入视频播放的方法&#xff0c;最后在stackoverflow找到下面这个使用Notification的可行方法(如果是弹出)&#xff1a; #pragma mark Notification - (void)addNotification {…

linux系统下redhat7之虚拟机控制

基础操作&#xff1a; [kioskfoundation0 Desktop]$ rht-vmctl start desktop ###开启desktop虚拟机 Error: desktop not started (is already running) ###报错&#xff0c;desktop已经运行 [kioskfoundation0 Desktop]$ rht-vmctl view desktop …

如何设计一个 iOS 控件?(iOS 控件完全解析)

前言 一个控件从外在特征来说&#xff0c;主要是封装这几点&#xff1a; 交互方式显示样式数据使用 对外在特征的封装&#xff0c;能让我们在多种环境下达到 PM 对产品的要求&#xff0c;并且提到代码复用率&#xff0c;使维护工作保持在一个相对较小的范围内&#xff1b;而一个…

Chapter12:动态内存

智能指针——shared_ptr为了更容易地使用动态内存&#xff0c;新的标准提供了智能指针来管理动态对象。智能指针的行为类似常规指针&#xff0c;重要的区别是它负责自动释放指向的对象。 智能指针的使用方式与普通指针类似。解引用一个智能指针返回它指向的对象。 1 if (p1 &am…

判断JS对象是否拥有某属性两种方式

方式&#xff0c;但稍有区别 1&#xff0c;in 运算符 1 2 3 var obj {name:jack}; alert(name in obj); // --> true alert(toString in obj); // --> true 可看到无论是name&#xff0c;还是原形链上的toString&#xff0c;都能检测到返回true。 2&#xff0c;hasOwnP…

Linux之redhat7系统结构

一.linux系统结构 linux是一个倒树结构 linux中所有的东西都是文件 这些文件都在系统顶级目录“/” /就是根目录 /目录以下为二级目录这些目录都是系统装机时系统自动建立的 二级目录的作用 /bin ##二进制可执行文件也就是系统命令 /sbin ##系统管理命令存放位置 /boot …

ASP.NET优化

源地址&#xff1a;http://www.cnblogs.com/wangjingblogs/archive/2013/02/27/2934706.html http://jingyan.baidu.com/article/2d5afd69bfd0ff85a3e28e6d.html转载于:https://www.cnblogs.com/haizine/p/5841771.html

3D Touch介绍: 一个数字压力器App和Quick Actions

随着iPhone 6s and 6s Plus的发布&#xff0c;苹果介绍了全新的手机交互方式&#xff1a;重按手势。你应该知道&#xff0c;这个特性其实早已应用在苹果手表和MacBook产品中&#xff0c;名字叫Force Touch。它给用户交互添加了全新的维度&#xff01; 或许你对Force Touch为什么…

一些LUA函数(转载)

转自http://hi.baidu.com/chevallet/item/9a3a6410c20d929198ce3363 一些LUA函数 1、assert (v [, message])  功能&#xff1a;相当于C的断言&#xff0c;当表达式v为nil或false将触发错误,  message&#xff1a;发生错误时返回的信息&#xff0c;默认为"assertion f…

cifs------网络文件系统(1)

SMB文件共享 SMB&#xff08;Server Message Block&#xff09;通信协议是微软&#xff08;Microsoft&#xff09;和英特尔(Intel)在1987年制定的协议&#xff0c;主要是作为Microsoft网络的通讯协议。SMB 是在会话层&#xff08;session layer&#xff09;和表示层&#xff0…

Swift 教學:如何使用iOS Charts API 製作漂亮的圖表

在應付許多的資料時&#xff0c;比起只在表格中呈現&#xff0c;使用圖表來顯示資料&#xff0c;可以幫助使用者容易地了解資訊。有了圖表&#xff0c;相對於讀取整個資料表&#xff08;或幾個資料表&#xff09;你可以輕鬆地一眼便見到以圖形表示的資料&#xff0c;取得所需的…

在Proteus中添加标号

1.Proteus中添加组件后双击引脚可以快速生成一个最近的端口。 2.按A调出设置界面 3.在String中写&#xff1a;netH#,"H"可以换成自定义前缀。count为起始值&#xff0c;increment为增量。 4.依次点击想要编号的引脚。转载于:https://www.cnblogs.com/viaduct/p/58424…

九度OJ 1525 子串逆序打印 -- 2012年Google校园招聘笔试题目

题目地址&#xff1a;http://ac.jobdu.com/problem.php?pid1525 题目描述&#xff1a; 小明手中有很多字符串卡片&#xff0c;每个字符串中都包含有多个连续的空格&#xff0c;而且这些卡片在印刷的过程中将字符串的每个子串都打印反了&#xff0c;现在麻烦你帮小明将这些字符…

cifs------网络文件系统(2)

接着上篇博客继续&#xff1a; Samba 基本配置 [rootserver2 ~]# rpm -qc samba-common //查看smb的配置文件 1、黑、白名单的设定 默认白名单&#xff0c;设置的ip是黑名单用户&#xff1a;hosts deny ip 默认黑名单&#xff0c;设置的ip是白名单用户&#xff…

iOS网络缓存扫盲篇--使用两行代码就能完成80%的缓存需求

原文地址&#xff1a;https://github.com/ChenYilong/ParseSourceCodeStudy/blob/master/02_Parse的网络缓存与离线存储/iOS网络缓存扫盲篇.md 目录 当我们在谈论缓存的时候&#xff0c;我们在谈论什么&#xff1f;GET网络请求缓存 80%的缓存需求&#xff1a;两行代码就可满足…

YARN集群维护部分问题汇总

云梯开发人员在云梯Yarn集群的搭建和维护过程中做了许多工作&#xff0c;本文选择这期间部分较为典型的问题&#xff0c;通过对这些问题的分析和解决方案&#xff0c;为大家分享分布式系统问题调查的经验。 调查的问题 1. 2013年初引入社区0.23时&#xff0c;调查ResourceManag…

linux系统管理及vim

1.管理输入输出 在linux系统中&#xff0c;正确输出的编号为1&#xff0c;错误输出编号为2 在系统中用普通用户执行 "student" find /etc -name passwd 因为student用户权限问题会有以下输出 find: ‘/etc/pki/CA/private’: Permission denied ##没有进入权力…

如何用 OS X 的 Xcode 写C语言程序

這篇是給新手看的。 如果你在 Windows 習慣使用 Visual C 或 Dev-C 的話&#xff0c;到了 Mac OS X 可能會突然不知道要怎麼寫程式&#xff0c;尤其當你已經用 Visual C 的 Debugger 用得很上手的話。 最近我們系上的課充滿了 C programming&#xff0c;我也稍微摸懂了 Xcode 的…

【转】初等数论 ——原根、指标及其应用

转自&#xff1a;http://blog.163.com/gc_chdch126/blog/static/172279052201641935828402/ 学习总结&#xff1a;初等数论&#xff08;3&#xff09;——原根、指标及其应用 2016-05-19 15:58:28| 分类&#xff1a; 信息学——学习总 | 标签&#xff1a;初等数论 数学 |…

互联网产品评论索引

这里收集一些评论文章&#xff0c;定期查看文章观点的正确性&#xff0c;索引持续更新中 网站前期如何获得推广资源 专访陶瑾&#xff1a;微信公众平台开发先行者转载于:https://www.cnblogs.com/needrunning/p/3000353.html

Apache服务器部署(1)

apache&#xff08;web服务器&#xff09;简介&#xff1a; Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上&#xff0c;其跨平台和安全性被广泛使用&#xff0c;是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩充&…

JavaScript关键字this指向

在js中this始终指向一个调用函数的那个对象 var a有种你干掉我啊; //纯粹调用函数 function test(){ console.log(this.a);//默认指向全局对象 } //test();//>windows.test() //作为对象的方法被调用 Function.prototype.logfunction(){ console.log(this.a); } //此时t为一…

项目开发过程中的收获与思考

2013年7月&#xff0c;我正式毕业了&#xff0c;到公司入职&#xff0c;也就正式成为了一名菜鸟程序员。到今天&#xff0c;2014年1月3日&#xff0c;目前主要的工作是公司一个项目中的一个功能模块&#xff0c;到我进入项目组算起&#xff0c;已经过了四个月了。因此&#xff…

【仿汽车之家】价格区间选择控件

仿照汽车之家iOS客户端“找车”栏目的价格区间选择控件&#xff0c;最终实现效果如下&#xff1a; 一、界面实现 *根据屏幕大小以及刻度的大小&#xff0c;宏定义需要用到的一些值 #define SCREENW [UIScreen mainScreen].bounds.size.width #define SCREENH [UIScreen mainScr…

Apache服务器部署(2)

签名CA证书 环境&#xff1a;server1:172.25.1.1 重置虚拟机 挂载yum源 [rootserver1 ~]# yum install mod_ssl -y //下载ssl模块 [rootserver1 ~]# yum install crypto-utils -y //安装加密软件 [rootserver1 ~]# genkey …

ASCII、Unicode、GBK和UTF-8字符编码的区别联系

一直对编码这块晕晕乎乎&#xff0c;今天终于看到一篇写的很清楚也很风趣的文章&#xff0c;转过来mark一下。 很久很久以前&#xff0c;有一群人&#xff0c;他们决定用8个可以开合的晶体管来组合成不同的状态&#xff0c;以表示世界上的万物。他们看到8个开关状态是好的&…

【iOS】快速集成轮播控件

自己写的一个轮播控件&#xff0c;初始化后只要实现两个数据源方法&#xff0c;几行代码就能快速集成&#xff0c;支持本地图片和网络图片&#xff0c;支持点击事件&#xff0c;可定制播放速度、指示器颜色/位置、默认加载图等&#xff0c;效果&#xff1a; 1.下载地址&#xf…

Hibernate中get方法和load方法的区别

一、get和load方法都是根据id去获得对应数据的&#xff0c;但是获得机制不同&#xff1a;如果使用get方法&#xff0c;hibernate会去确认该id对应的数据是否存在&#xff0c;它首先会去session中去查询(session缓存其实就hibernate的一级缓存)&#xff0c;如果没有&#xff0c;…