您的位置:首页 > 运维架构 > Linux

linux 的iptables防火墙

2015-11-29 15:53 691 查看
.a文件就是*.o文件的集合, 是object文件的归档文件,

所以, 用nm -A ???.a看到的 symbolic符合名称都是 相应的, 包含的 .o文件....

linux 2.4内核中驱动是直接生成的 *.o文件, 而2.6内核做了扩展, 生成的是*.ko文件: kernel object驱动.

其中, 模块是: /lib/modules/$(uname -r)/build --> 软连接-->/usr/src/....

hostile: [hastl]: 敌对的,敌意的: hostile army, hostile action hostile aircraft.

we lea the whole hostile army captive. [k2eptiv]: adj. 被监禁的...

--------------------------------------------------------

重点看这个视频: 优库: 网络安全 Linux .iptables 防火墙原理与基本测_标清.flv

linux防火墙分成两大模块 : netfilters: 内核空间和iptables工具(用户空间). 是信息包的过滤工具.

iptables包含4个表,5个链。

其中表是按照对数据包的操作区分的,

链是[b]按照不同的Hook点来区分的[/b],表和链实际上是netfilter的两个维度

共4个表, 优先级依次为 : filter(默认表) < nat< magnle< raw表.

filter: 为一般的过滤表

nat: 端口映射, 地址映射 (__ _ _ _ _ _ _ ____ _ 主要是这两个表对信息包的过滤作用).

mangle: 对特定数据包的修改

raw: 优先级最高,设置raw时一般是为了不再让iptables做数据包的链接跟踪处理,提高性能

共5个链:

  prerouting - Accept - Forward - output - postrouting.

5个链:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING。

PREROUTING:数据包进入本地的linux主机的 路由表之前

INPUT:通过路由表后目的地为本机

FORWARDING:通过路由表后,目的地不为本机

OUTPUT:由本机产生,向外转发

POSTROUTIONG:发送到网卡接口之前。如下图: ** 本地套接字, 就相当于本地的网卡 代理人.



由此: 可以看出: prerouting链: 是进入本机路由表之前, 是做目的地址转换的, 如原来是1.1.1.x, 在这个链中, 会将它转换为 192.168.1.100. 因为它是(可能的) 入站包;

      postrouting链:是做源地址转换的,因为它是出站的包....

iptables中表和链的对应关系如下:



loading mirror speeds from cached hostfile:从hostfile缓存文件中载入镜像速度:speeds: n. 速度.

udf: 是一种文件系统格式, 一种光盘格式, 和iso9660相类似, 意思是: universal disk format.

文件系统: ReiserFS: 是一种基于平衡树的文件系统, 由Hans Reiser 汉斯.雷斯开发. 对小文件以打包的方式进行管理, 而不是对每个小的文件都分配

一个inode, 适合像服务器那样的 巨型文件系统. reiserfs是Linux操作系统上面性能最好、设计最先进的文件系统,特别是reiserfs4 版本具备了很多领先的文件系统特性。reiserfs的作者是Hans Reiser,Hans是从俄裔美国人,他领导的Namesys公司致力于开发和维护reiserfs文件。

ReiserFS对空间利用率和速度非常在意,因此,它在磁盘利用率和性能方面都非常出色。当我把文件系统从ReiserFS转换到ext3 时,发现我的可用空间变少了

网吧中的路由器和防火墙, 由一台比较稳定的计算机,安装routerOS来实现: 路由/交互/防火墙的作用

routerOS是由linux/bsd内核做修改而来的: 是一种操作系统, 要空白盘安装. 如同安装windows, linux一样的.

有命令行.web界面的配置. 如同配置cisco, ruijie等路由器/交换机一样..

而实际上, 真正的硬件路由器也是由硬件+软件构成的, 其软件也是由linux改写的. 硬件就如同一台计算机加个铁皮而已.

linux的防火墙内核是: netfilter, iptables是软件包, 只是用户用来编写netfilter防火墙的编辑工具, 它的语法规则不同的厂商是可以修改的.

专表专用:



FFmpeg ("FF"代表"Fast Forward") 是一套可以用来记录、转换数字音 频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/ 视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多codec都是从头开发的。

入站数据包: 进入防火墙(linux, 路由器等当前正在配置的设备)的数据包: 目的地址为防火墙的包;

出站数据包: 源地址为防火墙的包

转发数据包: 目的地址和源地址都不是防火墙的包.



共有6项: iptables [-t 表名] 管理选项 [链名] [条件匹配] [-j 目标动作或跳转][options]: zhuyi :最后的options是目标动作的选项, 如: --to-xource=222.222.22.1

1. iptables -t filter/nat/mangle/raw -L -n

2. -F和-X的区别: -F [链] 是删除指定链或所有链中的规则 而-X是删除用户自定义的链 (一个是链, 一个是规则)

防火墙的层次是: 表-> 链-> 规则.

硬件防火墙 : 就是一台(无屏幕的)计算机. 嵌入式设备.(计算机硬件) , 在里面安装 iptables软件和RouterOS系统, 进行配置的机器



硬件防火墙,可以用一台计算机安装routerOS来实现, 要求它要有两块网卡, 一块连接外网, 另一块连接内网.

pack, package, packet, pocket: pocket: 衣服的口袋.

pack: 包装/打包, 一般是动词

package: n. 表示打包/装箱的动作.

package: 一大包,包裹,一大箱:

packet: 一小包, 一小袋:

a package of instant noodle: 一大箱方便面, a packet of instant noodle: 一小包/一小袋方便面.

----------------------------------------

专门的防火墙/路由器, 是安装的RouterOs操作系统 , 但是:普通的PC 机: : 安装 linux操作系统也可以做防火墙和路由器, 只要你打开了系统的nat路由功能, 并做iptable的配置就可以!!

第一, 启用linux系统的ip数据包转发[就是路由功能]功能?

/proc下是当前正在运行的进程列表....

/proc/sys/net/ipv4/.....有很多文件, 其中ip_forward文件=0, 禁用ip包的转发. ip_forward=1启用包的转发

配置文件: /etc/sysctl.conf 中的 : net.ipv4.ip_forward=1 (注意是点, 不是斜杠路径)

第二, 配置iptables 的 postrouting链做端口映射:目的是: 让防火墙内网的机器: 跟防火墙内网接口相连的交换机上的所有机器都能够访问外网

   # iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j SNAT --to-source=222.22.22.1

第三, 配置iptables的preROUTING链做端口映射: 目的是: 让防火墙外网的机器都能够访问防火墙内网的服务器. 这个就是传说中的"内网服务器的发布"publish"

      如何实现呢?就是当外网的机器访问防火墙的外网接口的公网ip地址时,防火墙要把这个目的地址转换为防火墙内网的服务器的私有ip地址:

        即当访问 http://222.22.22.1 --->> http://192.168.10.1
  # iptables -t nat -A PREROUTING -p tcp(注意这里是-p ,我经常把它写成-t) -d 222.22.22.1 --dport 80 -i eth0 -j DNAT --to-destination=192.168.10.1 [注意: -d是目标的ip地址, --dport是目标的端口]

  :::: 也就说: 匹配条件可以根据你的需要, 尽可能的详细, 尽可能的精确.... 注意如果没有说哪个选项匹配条件, 就是表示匹配所有的!

masquerade: [m2eskw2' reid]: masquerader 面具, 化妆舞会

i'll still trying to con'vince him go to the masquerade party.

防火墙如果是通过dial up拨号上网的, 就要用 masquerade 目标:

  # iptables -t nat -A POSTROUTING -s 192.168.10.1 -o PPP0 -j MASQUERADE (--random)

-----------------------------------------------------------------

  # iptables -t nat -D POSTROUTING 2

filter 表的配置:

1. 配置默认策略:

  # iptables -t filter -P FORWARD DROP

  # iptables -t filter -P INPUT DROP

DROP

2. 配置方法:

  先全部拒绝 , 然后添加允许规则:

  # iptables -t fitler -A FORWARD -s 191.168.10.0/24 -o eth0 -p tcp --dport 53 -j ACCEPT

# iptables -t fitler -A FORWARD -s 191.168.10.0/24 -o eth0 -p udp --dport 53 -j ACCEPT

3. 对同一个协议, 同一个端口的的配置,::: 通常要写两条相对应的命令, 一条是通过防火墙从内部到外网出去的, 另一条对应的是从防火墙外网的通过防火墙进来的:

    ::: 既要考虑包的出去, 同时也要考虑包的进来.那样, 才能双向ping通...

  为什么呢?::: 因为对于非网关型的机器,,即我们自己使用的pc机:

      第一, 我们只需要配置INPUT链就可以了: output链是从我们的机器上出去的包, 我们根本就不用管的...

      第二, "不能"配置forward包....不是网关!

      第三,由于我们最开始的时候,默认对input链的包是 DROP的.

    所以,你配置了允许出去的包,但是从外部的某个协议,某个"源端口"来的数据包,并没有被防火墙所放行,所允许,....

      所以,这个外网来的包也要配置filter的forward ,或input链同意接受....

  # 防火墙外部的服务器 建立的是 DNS 服务器:


  # iptables -t filter -A FORWARD -i eth0 -p tcp --sport 53 -j ACCEPT (从外面进来的包入口是eth0: -i eth0 --sport=source port 源端口)

  # iptables -t filter -A FORWARD -i eth0 -p ucp --sport 53 -j ACCEPT (因为不知道源主机的地址, 所以不写,表示any)

-----------------------------------------------------

  # iptables -t filter -A FORWARD -o eth0 -s 192.168.10.0/24 -p tcp --dport 53 -j ACCEPT

  # iptables -t filter -A FORWARD -o eth0 -s 192.168.10.0/24 -p udp --dport 53 -j ACCEPT

4. 注意: 要注意区分 --sport 和--dport的区别!! 而且对于某个协议而言: --sport和dport一定是对应的, 一个是sport , 那么另一个一定是dport.

5. 区别INPUT OUTPUT FORWARD链的区别:

    forward链:只有对于 "处在网关位置的机器" 或者说 "作为网关/防火墙 (由此意义来说, 网关和防火墙的区别也就没有过分的必要了, 你可以说网关机器,

        其实也是 防火墙...也就不大了) 使用的linux主机, 才有意义: 将外部的包 --> forward--> 内部的机器(注意, 包的目的地址 不是你配置的机器本身) 或者:

            将内部的包 --> forward--> 外网(注意, 包的起始地址 不是你配置的机器本身)

  

    而对于不是网关的机器: 就在你工作的linux机器上配置: 就没有forward链,或者说, FORWARD链就没有意义了,而且,好像是不能配FORWARD链的,只有配input和output链才有意义!!!!

6. -d和-o的区别:

  如果知道外网的目的地址是一个确切的地址, 就用-d,

    但是如果内网要访问的外网地址,不确定,只是知道要出去: 就用-o eth0

7. 端口范围: iptables -t filter -A FORWARD -s 192.168.10.0/24 -o eth0 -t tcp --dport 20:21 -j ACCEPT

      <端口以下的 :1024, 端口以上的 1024: 端口范围之间的 1024:2000>

8. 如何修改规则:

  可以两种方法: 先-D Forward number=11, 然后, -I FORWARD 11 ....<先删除, 然后插入>

  二是: 直接 iptables -t filter -R FORWARD 11 -s 192.168.10.0/24 -o eth0 -p tcp --dport 110 -j ACCEPT <直接替换规则>

iptables链中的target 是指的 目标动作: 包括: ACCEPT, DROP, REJECT, SNAT , DNAT等等.

iptables脚本???

在命令行界面下, 写iptables比较麻烦, 难于调试, 所以, 对于大量的防火墙规则的书写, 是采用iptabls脚本来实现的:

#!/bin/bash

## 可能会定义一些" 常量变量, 便于在语句中引用

IPT="/sbin/iptables"

EXTIF="eth0"

HTTP_IP="172.16.10.1"

FTP_IP="172.16.10.2"

#.......等等

# 要bash执行iptables的命令, 必须要载入iptables的相关模块:

/sbin/modprobe ip_tables

/sbin/modprobe iptables_filter

/sbin/modprobe iptables_nat

....

/sbin/modprobe ipt_LOG

/sbin/modprobe ipt_state

/sbin/modprobe ipt_limit

### 最后就是根据上面的这些设置书写配置/规则,

###---ALLOW_P
$IPT -A ALLOW_P -p tcp --syn -j ACCEPT
$IPT -A ALLOW_P -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT $IPT -A ALLOW_P -p tcp -j DROP

$IPT -A ALLOW_P -p tcp --syn -j ACCEPT

注意: 上面的ALLOW_P是自定义的链, 便于理解:

$IPT -N ALLOW_P

关于邮件服务的端口号:

发送: smtp协议: 25

接受: pop3协议: 110 , 主要用于邮件客户端软件, 如: outlook, hotmail等等

   imap: 143, 主要用于web browser中的邮件服务, 如: 新浪邮箱, 网易邮箱等

:::: 我们所说的这些邮件服务都是 : 指服务器上的服务, 分别需要 smtp传送邮件的服务器,和 接受邮件的pop3, imap服务器,

    而客户端,在使用smtp协议进行邮件的发送,使用pop3, imap协议进行邮件的接受的时候, 使用的是>1024端口的随机端口(动态端口).

    也就是说,客户机上是没有使用: 25, 110 , 143等端口的,因为这些端口是服务器上的端口,而你又不是服务器.!!

具体就是:

    当客户端发送邮件的时候, 1024以上 的一个动态端口,向smtp服务器上的25端口发起连接请求,当连接建立后,客户端 就开始发送邮件 到 服务器上

    当客户端要接受邮件的时候, 它的1024以上的一个动态端口,向pop3或者 imap服务器上的相应端口发起连接请求,当连接建立后,客户端 从邮件服务器上下载邮件到本地 /或在线浏览, 操作邮件

  也据说说, 发送和接受邮件, 就想端关于和 服务器之间的一个 : 上传, Upload, 下载: download.

就是: 邮件总是保存在服务器上的,

  imap和pop3的区别:

    pop3要下载后才能操作,而imap可以在线操作:浏览,移动,删除

    pop3下载到本地的是邮件的拷贝,对服务器上的原始邮件无关! 而imap可以通过browser对服务器上的原始邮件进行处理...

为了防止黑客对邮件上传/ 下载的时候进行拦截, 要使用基于ssl的更安全的邮件服务协议:

    smtps: .... ,而且可以防抵赖发送

    pop3s, imaps: ...,而且可以放抵赖接受

0.0.0.0/0: 表示任意的ip地址, 或者没有指定ip地址, 但是这个跟端口无关!

根据匹配连接的状态来写防火墙规则....

-m state --state INVALID,NEW,ESTABLISED,RELATED

-m state表示当前规则是匹配包所在的连接状态.

--state后面是用comma分割的列表: INVALID是无效的包, NEW表示这个包是将要新建的一个连接:已经发出packets, 但是没有收到回应的包, 或者收到包但是还没有发出回应的/ ESTABLISED ,

    RELATED: 发出的包 , 将要开始一个新的连接, 但是这个连接和一个已经建立的连接是相关联的..主要是指:ftp和icmp.

iptables 删除某条规则, 不是-D rules... , 而是通过规则号, 规则的排序number来删除的, 排序号是从1开始的

在iptables -L -n中看到的目标端口号是: dpt:80. 但是在配置的时候, 要写: --dport 80

iptables -[ACD] chain rule-specification [options]
iptables -I chain [rulenum] rule-specification [options]
iptables -R chain rulenum rule-specification [options]
iptables -D chain rulenum [options]
由此可以看出, iptables 在最后, [target 目的动作] 的最后面, 是允许 有额外的选项的!! (这个选项不同于前面的规则:) 最后可以带选项: 如 --recjetc-with...

woman 和 women: 本来women的发音音标[wimin], 但是在美式英语中的发音好像都读成了 [men们]音.只要记住前面那个音节的不同就好了: [u] [i].

Times have changed and today men and women are equal.

Women are usually paid less than men when doing e'quivalent work. // 在可能的情况下, 尽量使用分词短语, 节此短语,独立主格等结构来代替 从句.

Changing his job like that is equivalent to giving him the sack.

sack: n/v . 麻袋; 解雇; 洗捷;

: a sack of potatoes; they gave mike the sack for punching the foreman : the enemy put the city to sack.

REJECT 和Drop的区别?
Reject: This is used to send back an error packet in response to the matched packet: otherwise it is equivalent to DROP so it is a terminating TARGET, ending rule tra'versal.
This target is only valid in the INPUT, FORWARD and OUTPUT chains, and user-defined chains which are only called from those chains.

--reject-with type : 返回icmp拒绝的原因: 有: icmp-net, icmp-host, unreachable, prohibited...
The type given can be icmp-net-unreachable, icmp-host-unreachable, icmp-port-unreachable, icmp-proto-unreachable, icmp-net-prohibited, icmp-host-prohibited or
icmp-admin-prohibited (*) which return the appropriate ICMP error message (port-unreachable is the default). (这个-- reject-with是为了给icmp的发送发

      返回一个提示信息用的).

   The option tcp-reset can be used on rules which only match the TCP protocol: this causes a TCP RST (reset: 重置) packet to be sent back.

在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG.

其中,对于我们日常的分析有用的就是前面的五个字段。

它们的含义是:

SYN表示建立连接,

FIN表示关闭连接,

ACK表示响应,

PSH表示有 DATA数据传输,

RST表示连接重置。

其中,ACK是可能与SYN,FIN等同时使用的,比如SYN和ACK可能同时为1,它表示的就是建立连接之后的响应,

如果只是单个的一个SYN,它表示的只是建立连接。

TCP的几次握手就是通过这样的ACK表现出来的。

但SYN与FIN是不会同时为1的,因为前者表示的是建立连接,而后者表示的是断开连接。

RST一般是在FIN之后才会出现为1的情况,表示的是连接重置。

一般地,当出现FIN包或RST包时,我们便认为客户端与服务器端断开了连接;而当出现SYN和SYN+ACK包时,我们认为客户端与服务器建立了一个连接

PSH为1的情况,一般只出现在 DATA内容不为0的包中,也就是说PSH为1表示的是有真正的TCP数据包内容被传递。

驱动模块是*.ko??? linux内核到2.6.32时, 硬件驱动变成了kernel object: ko.

纯终端下, 关闭terminal和vi下的警告提示音:

  setterm -blength/-bfreq 0

  或者: xset b off ...

tail 有一个比较好的参数: -f: -

f, --follow[={name|descriptor}]
output appended data as the file grows; 输出文件增长时追加的内容: 也就是最近一次操作的日志内容!
-f, --follow, and --follow=descriptor are
equivalent

如: dmesg | tail -f

dmesg: dump (kernel startup) message: 输出系统启动时, 保存在内核环缓存中的信息. kernel ring buffer. 还可以修改这个

dmesg - print or control the kernel ring buffer The program helps users to print out their bootup messages.

dmesg 共有三个参数: -c(clear ring buffer), -s(设置buffer的大小), -n(设置显示到控制台的信息级别)
-n level
Set the level at which logging of messages is done to the console. For example, -n 1 prevents
all messages, except panic messages, from appearing on the console. All levels of messages are
still written to /proc/kmsg, so syslogd(8) can still be used to control exactly where kernel
messages appear. When the -n option is used, dmesg will not print or clear the kernel ring buffer.

  When both options are used, only the last option on the command line will have an effect.

设置级别为记录控制台启动信息的级别。比如,-n 1指的就是将此级别设为最低级,除了内核恐慌信息之外不会向控制台显示信息。

所有级别的启动信息还将记录到/proc/kmsg,文件中,因 此,syslogd(8)同样可以用来对信息的输出进行控制。

当使用-n选项时,dmesg将不会 清除内核环缓冲区中的内容。当同时使用以上两个选项时,只有最后一个选项才会产生效果。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: