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

快速入门linux系统的iptables防火墙 1 本机与外界的基本通信管理

概述

iptables是一种运行在linux下的防火墙组件,下面的介绍可以快速的学习iptables的入门使用。

特点(重要)

  1. 它的工作逻辑分为 链、表、规则三层结构。
  2. 数据包通过的时候,在对应表中,规则从上向下匹配,匹配到即跳出,后续规则忽略。
  3. 常用于过滤数据包和转发数据包(代理服务器)。
  4. 工作方式基于IP 端口 和MAC

结构

链名PREROUTINGFORWARDPOSTROUTINGINPUTOUTPUT
含义

一般是指从外网发送到当前主机上

并且在路由规则处理之前

一般指从外网发送到当前主机上

路由规则处理的情况,这种情况

大概有两种可能性

  1. 本机处理外部来源的网络数据
  2. 转发外部来源的网络数据到其他地址

一般是指从外网发送到当前主机上

并且在路由规则处理之后,这种情

况出现的可能性也有两种

  1. 本机主动向外请求时产生
  2. 转发网络数据的时候产生
发送给本机的数据本机向外主动发送的数据
默认可用表
  1. mangel(特殊数据包标记 )
  2. NAT(地址转换)
  1. mangel(特殊数据包标记 )
  2. filter(过滤)
  1. mangel(特殊数据包标记 )
  2. NAT(地址转换)
  1. mangel(特殊数据包标记 )
  2. filter(过滤)
  1. mangel(特殊数据包标记 )
  2. filter(过滤)

iptables的工作流程大体上可以表达为三种

  1. 源地址发送数据--> {PREROUTING-->路由规则-->POSTROUTING} -->目的地址接收到数据
  2. 源地址发送数据--> {PREROUTING-->INPUT-->本机}
  3. {本机-->OUTPUT-->POSTROUTING} -->目的地址接收到数据

从上表当中我们可以看到,对于不考虑地址转发的情况下,例如一台独立的主机的网络管理,我们只需要配置INPUT和OUTPUT两条链即可完成对网络的管理,本次的重点也是这两条链接。

实例

1, 管理规则

iptables  [-t 表名]  [选项]   -n

选项:

  1. -L  查看

  2. -F  清除所有规则

  3.  -X  清除自定义链

  4. -Z  清除所有链统计

-n的含义是用ip和端口的方式来显示规则

例:

查看filter表中的所有规则

iptables -t filter -L -n

清空filter表中的规则

iptables -t filter -F

2,定义表的默认规则

首先要牢记iptables是有链 有表的结构 , 那么定义每一条链上的每一条表的默认规则的格式为

iptables -t 表 -P 链  动作类型

-t 就不说了 -P 这里要大写  链的名称也是大小写敏感的注意不要写错  动作类型有ACCEPT允许通过 DROP丢弃 也就是禁止 还有一种动作是LOG作为日志记录,目前我还没有用过。

例:

设置INPUT链上filter表默认规则

iptables -t filter -P INPUT ACCEPT

这里要注意的是,默认允许了所有的链接都可以通过,到达服务器。这样的设置在正式生产服务器环境上是十分危险的,不建议这么设置,应当设置为DROP,但是默认允许所有的链接都禁止的后果就是把自己的远程操作也踢掉了,服务器在本地还无所谓,但是在远程这就麻烦了。于是要牢记,默认规则要在设置好自己访问的规则以后再设置,最好是在最后设置。

3,自定义规则

下面我们来真正设置某一条链上的某个表中一个基于IP和端口的规则,也是iptables最常见的用途

格式:

iptables  [-AI  链]  [-io  网卡]  [-p  协议]  [-s  源IP]  [-d  目标ip]  -j  动作

例:

禁止ip为192.168.1.110的计算机访问本机eth0网卡

分析:

  1. 禁止XXX访问本机 所以是INPUT链 增加规则使用-A
  2. 网卡是eth0因为是INPUT链 所以参数应该是 -i 
  3. 源ip是 192.168.1.110
  4. 动作是  DROP

于是应该这样写

 iptables -A INPUT -i eth0 -s 192.168.1.110 -j DROP 

反过来,禁止本机访问192.168.1.110可以这么写

iptables -A OUTPUT -o eth0 -d 192.168.1.110 -j DROP

例:

允许本机访问本地回环网卡 localhost

iptables -A INPUT -i lo -j ACCEPT

iptables -A OUTPUT -o lo -j ACCEPT

现在我们可以添加一个针对固定IP的策略了,那么如何添加一个网段的策略的,例如禁止192.168.1.xxx 这个网段所有的IP访问本机,这里是要用下面的写法的

iptables -A INPUT -i eth0 -s 192.168.1.0/24 -j DROP

这里的192.168.0/24是代表网段,具体含义可以去了解 计算机网络原理,24其实指的是二进制的从左到右 有24个1 ,在IPV4的ip地址表示方法下 有32位,那么32-24=8 也就是十进制IP最后一段位置代表是0

于是我们可以 1 针对IP  2 针对IP段 设置策略

下面来添加对端口的策略,这个往往也是最细节最有用的内容

格式:

iptables  -A  链 -io 网卡 -p 协议  -s 源ip  --sport  源端口  -d  目标ip  --dport  目标端口  -j  动作

这里有几个点要注意

  1. 和IP一样 链的不同(可能是INPUT也可能是OUTPUT) 使用不同的-i或者-o
  2. -p是小写的。 代表协议,类型可以是tcp、udp、icmp或者all,特别是要注意的是我们平时使用的ping命令 其实是icmp协议,而这个协议比较特殊,不使用端口 所以在使用all的时候(包含icmp)同时设置端口可能会出错!
  3. INPUT要有源,OUTPUT要有目标,但是INPUT往往是限制目标端口,OUTPUT往往是限制源端口,注意逻辑不要乱。

例:

web服务器添加80服务

iptables -A INPUT -p tcp --dport 80 -j ACCEPT

允许192.168.1.x网段访问mysql数据库

iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 3306 -j ACCEPT

最后说明一下,当有多条规则匹配一次访问的时候,以最前面的规则为准,当无法匹配到对应规则的时候,使用默认规则

在前面的例子中相信你已经发现了-A 往往是代表 ADD的意思,每次ADD都是增加规则到列表的最后,那么除了ADD 其实还有-I  INSERT插入规则

具体用法是将I替换成A 同时在链名后添加数字排序

-I 链名  1

1代表了第一位顺序 也就是最优先的匹配规则

例如

iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT

======================我是分割线====================

上面的介绍都是具体的规则配置,这些配置在防火墙重启的时候会丢失,那么如何管理防火墙服务是下面的内容

开机自启动

chkconfig iptables on

规则保存

service iptables save

上面的命令其实是把规则保存在/etc/sysconfig/iptables文件中,重启会自动读取

如果是业务相对固定的服务器这样做无所谓,但如果需要经常切换规则,那么讲规则都写在这一个文件中并不是十分容易管理

可以把规则写成单独的文件,在开机的时候自动载入(/etc/rc.local中添加),但是要注意权限设置(755),这样做的好处是便于管理,缺点是只有开机的时候有效

如果是重启防火墙服务,则无法载入对应规则。

总结:iptables看似复杂,实际上找好逻辑对应关系还是不难的关键是5条链的几个表要理解含义,这里只简单的介绍了本机和外界通信的基本管理。

附加 debain系统的保存防火墙规则 方法 https://www.vmvps.com/save-iptables-setting-under-debian-environment.html

1)保存iptables现有规则到/etc/iptables.up.rules

iptables-save > /etc/iptables.up.rules

2)建立系统启动加载文件/etc/network/if-pre-up.d/iptables

vi /etc/network/if-pre-up.d/iptables

输入以下内容

#!/bin/bash
/sbin/iptables-restore < /etc/iptables.up.rules

3)让文件具备执行权限

chmod +x /etc/network/if-pre-up.d/iptables

转载于:https://www.cnblogs.com/toumingbai/p/3890823.html

相关文章:

iOS 根据数组中的字典的value值进行排序

NSMutableArray *resArr [NSMutableArray array];// 先把所有值的装进一个数组中NSMutableArray *valArr [NSMutableArray array];for (int i 0; i < arr.count; i ) {NSDictionary *dic arr[i];NSString * str [NSString stringWithFormat:"%-%d",dic["…

矢量数编码有哪几种类型_6种最理想的编码工作(以及吸引每个人的类型)

矢量数编码有哪几种类型by David Venturi大卫文图里(David Venturi) 6种最理想的编码工作(以及吸引每个人的类型) (The 6 most desirable coding jobs (and the types of people drawn to each)) Free Code Camp问了15,000个人&#xff0c;他们是谁&#xff0c;以及他们如何学…

sleep和wait到底什么区别

wait是在当前线程持有wait对象锁的情况下&#xff0c;暂时放弃锁&#xff0c;并让出CPU资源&#xff0c;并积极等待其它线程调用同一对象的notify或者notifyAll方法。注意&#xff0c;即使只有一个线程在等待&#xff0c;并且有其它线程调用了notify或者notifyAll方法&#xff…

Swift Code Snippet

1 swi_crecell func numberOfSections(in tableView: UITableView) -> Int {return 1;}func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {return 5;}// cell高度func tableView(_ tableView: UITableView, heightForRowAt indexPa…

Cocos2d-x lua 编译到Android设备

需要完成Android下ant,ndk,sdk(adt)的环境配置.Java环境配置. 也可以搭建VS下的Lua开发环境. 首先新建项目 cocos new -l lua -d (...address) 然后编译 cocos run -p win32 -s (...address) --ap 19 后面的--ap 19是版本控制. 然后在Eclipse中Import项目,右键项目Build Path添…

c# 数据可视化_#OpenVisConf上的22位数据可视化从业者的10点收获

c# 数据可视化by Siena Duplan通过锡耶纳杜普兰(Siena Duplan) #OpenVisConf上的22位数据可视化从业者的10点收获 (10 Takeaways from 22 Data Visualization Practitioners at #OpenVisConf) Update | May 13, 2016: Videos of all talks are officially live!更新| 2016年5月…

CentOS中Mysql常用操作

安装mysqlyum -y install mysql-server 修改mysql配置vi /etc/my.cnf 这里会有很多需要注意的配置项,后面会有专门的笔记暂时修改一下编码(添加在密码下方): default-character-set utf8设置mysql随系统启动# chkconfig mysqld on ← 设置MySQL服务随系统启动自启动# chkcon…

RXSwift基本使用1

1 cocoapod 安装 import RxSwift import RxCocoa 2 给一个按钮添加点击事件 // 添加点击事件self.rightBtn.rx.tap.subscribe { (event) in}

添加MySql数据库超时设置的相关问题

最近在工作中&#xff0c; 遇到MySql数据库连接超时的问题&#xff0c;申同事帮忙解决了一下&#xff0c;看到原来的MySqlHelper里面没有封装相关的超时方法&#xff0c;就添加了一个&#xff0c;我在这里记录了一下&#xff0c;希望对像我一样入门级的程序员有所帮助&#xff…

了解ES6 The Dope Way Part II:Arrow功能和'this'关键字

by Mariya Diminsky通过玛丽亚迪明斯基(Mariya Diminsky) 了解ES6 The Dope Way Part II&#xff1a;Arrow功能和this关键字 (Learn ES6 The Dope Way Part II: Arrow functions and the ‘this’ keyword) Welcome to Part II of Learn ES6 The Dope Way, a series created t…

[转载]Matlab之静态文本多行输出

转载文章&#xff0c;原文链接&#xff1a;Matlab中的静态文本框中显示多行内容 有时候&#xff0c;我们在GUI中利用静态文本框显示程序的结果&#xff0c;但是结果很长&#xff0c;一行未必可以显示的开&#xff0c;而静态文本框不像edit或listbox那样通过滚动条来显示多行内容…

1-Swift中的Struct 和 Class

1 为什么swift 推荐使用struct类型 在swift中是推荐使用struct类型的&#xff0c;值类型的变量在赋值的时候会自动进行一次低消耗的值拷贝 对比与对象的拷贝更加高效且不存在线程安全问题。 2 Struct 的概述 Swift语言中非常重视结构体&#xff0c;把结构体作为实现面向对象…

rwkj 1422搜索(素数环)

算法分析与设计&#xff1a;搜索&#xff08;素数环&#xff09; 时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte 总提交:178 测试通过:35 描述 将1-n这n个数摆成一个环&#xff0c;要求相邻的两个数的和是一个素数&#xff0c;编程输出所有可…

不断的困惑:为什么我仍然使用JavaScript函数语句

Back in the late 90’s — when I learned JavaScript — we were taught to write the “Hello World” function using a function statement. Like this…上世纪90年代后期(当我学习JavaScript时)&#xff0c;我们被教导使用函数语句编写“ Hello World”函数。 像这样… …

Tif文件合并类

using System; using System.Collections; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Linq;namespace Common {/// <summary>/// Title Tif文件合并类/// Author&#xff1a;ward/// </…

ubuntu /boot 空间清理

本文引用自 blog.csdn.net/yypony/article/details/17260153方法&#xff1a; 1&#xff1a; 在终端下察看已经安装的旧的内核&#xff1a; ctrlaltt——>进入终端——>输入命令&#xff1a;dpkg --get-selections|grep linux给 /boot文件目录分配空间的时候&#xff0c;…

Swift default参数

swift 支持默认参数&#xff0c;在声明方法的时候&#xff0c;可以给某个参数制定一个默认的使用值&#xff0c;当没有传入值的时候&#xff0c;使用默认的参数&#xff0c;当传入值存在的时候&#xff0c;使用对应的传入值 import UIKitvar str "Hello, playground&quo…

vs2017 open从v_宣布#Open2017,这是面向开发人员的除夕直播流

vs2017 open从vHere are a few reasons to stay home this New Year’s Eve:这是除夕之夜留在家里的一些理由&#xff1a; It’s the worst day of the year for fatal drunk driving deaths 这是致命的酒后驾车致死的一年中最糟糕的一天 It’s crowded 拥挤 It’s freaking c…

Laravel Predis Error while reading line from the server.

问题 Laravel说明文档中的 Redis 发布与订阅案例&#xff0c;命令行运行php artisan redis:subscribe 到60s自动断开并报错 [Predis\Connection\ConnectionException]Error while reading line from the server. [tcp://127.0.0.1:6379]解决 在config/database.php配置文件中&a…

android 带边框的圆角按钮

新建buttonstyle.xml 代码如下 <?xml version"1.0" encoding"UTF-8"?> <layer-list xmlns:android"http://schemas.android.com/apk/res/android"> <!-- 连框颜色值 --><item> <shape> <solid andr…

Swift 字面量表达

字面量是一个很强大的特性&#xff0c;对于缩短代码很有帮助 // // 1 字面量就是 简洁明了指出自己的类型并且为变量赋值的的值 // tom false 称之为字面量 let dog:String "tom"; let ok false;// Array 和 Dictionary 赋值的时候也是使用的字面量 let animals:Ar…

韩国文档的编码方式_像韩国学生学习英语一样学习编码

韩国文档的编码方式by Stephen Mayeux斯蒂芬马约(Stephen Mayeux) 像韩国学生学习英语一样学习编码 (Learn to code like a Korean student learns English) If this is the first you’ve heard of me, then there’s only one thing you need to know: I am an ESL Teacher …

mysql乱码解决

在 /etc/my.cnf加上下面二句&#xff1a; skip-character-set-client-handshakecharacter-set-server utf8转载于:https://www.cnblogs.com/sweetXiaoma/p/6170979.html

LoaderManager使用具体解释(三)---实现Loaders

这篇文字将介绍Loader<D>类&#xff0c;而且介绍自己定义Loader的实现。这是本系列的第三篇文章。一&#xff1a;Loaders之前世界二&#xff1a;了解LoaderManager三&#xff1a;实现Loaders四&#xff1a;实例&#xff1a;AppListLoader重中之重&#xff0c;假设你还没有…

Swift 条件编译,编译标记

1 swift 中的条件编译跟OC中的形式是相同的 #if DEBUGself.navigationView.backgroundColor Color_ff3b30;#elseself.navigationView.backgroundColor Color_main;#endif条件可以接受 os(MacOS) ,参数iOS tvOS等平台 arch(),参数为平台架构组合 arm64 ,i386 swift(),参数为版…

代码简介:向圣诞老人和他的精灵学习Google Analytics(分析)

Here are three stories we published this week that are worth your time:这是我们本周发布的三个值得您关注的故事&#xff1a; Learn Google Analytics from Santa and his elves: 12 minute read 向圣诞老人和他的精灵学习Google Analytics(分析)&#xff1a; 阅读12分钟…

生物信息大数据数据库(NCBI、EBI、UCSC、TCGA)

想系统的学习生信数据库可以先看一下北大的公开课&#xff0c;有一章专门讲的数据库与软件&#xff1a; 1-生物信息学&#xff1a;导论与方法 北大\10 生物信息数据库及软件资源 一个优秀的生信开发者能够解决如下问题&#xff1a; 如何鉴定一个重要的且没有被解决的生物学问题…

Dispatch 执行ABC任务,执行完成之后刷新UI,指定任务D

在swift中分组管理异步任务的方式 1 group enter 和 leave 进行同步管理 func method1() {// 创建一个组 &#xff0c;要是在一个控制器中去规划请求顺序&#xff0c;则这个组要是全局的组let group DispatchGroup();let queue DispatchQueue.global();//let imgsArr [&qu…

关于页游垂直同步的若干问题

这个问题要从人眼感觉抖动的原因来分析第一种情况是常说的屏幕撕裂&#xff0c;就是垂直同 步的事情&#xff0c;可以简单理解为显存的数据更新跟屏幕的绘制刷新缺少同步&#xff0c;一次屏幕刷新的结果可能是多次显存更新的片段集合&#xff0c;这种情况只能使用更接近垂直同步…

javascript函数式_JavaScript中的函数式编程—结合实际示例(第1部分)

javascript函数式by rajaraodv通过rajaraodv JavaScript中的函数式编程—结合实际示例(第1部分) (Functional Programming In JavaScript — With Practical Examples (Part 1)) Functional Programming(FP) can change the way you program for the better. But it’s hard t…