iptables实验3 关于内网外网的地址转换及端口转换

地址属于内核,而不属于网卡!!!!

 

 

网络防火墙的实现(主要是forward链)

172.16.100.68(A)和172.16.100.67(B)

192.168.12.10(B)和192.168.12.77(C)(VNET2)

B作为C的网关

 

配置B主机的网卡一个为192.168.1.72,另一个为172.16.25.72

配置C主机的网卡一个

 

[root@B ~]# sysctl -w net.ipv4.ip_forward=1 打开转发

[root@B ~]# tcpdump -i eno16777736 -nn icmp

此时可以转发,但是A主机的网关不是192.168.1.72.故它的回应报文此时回不去。

  

 blob.png

 

————————————————————————————————————————————————-

源地址(端口)转换和目标地址(端口)转换都不考虑回应报文;而仅考虑第一次接到(DNAT)或发出(SNAT)的报文

 

 

端口映射

 

 blob.png

 

 

NetFilter

NAT :NetWork Address Translation

 

SNAT:源地址转换,一般发生在POSTROUTING(路由决策才可以决定是否更改地址,PREROUTING和FORWARD和POSTROUTING都有路由决策)和OUTPUT(本机多块网卡的地址转换)

使用场景:本地网络中的主机通过某一特定地址访问外部网络时使用;

 DNAT:目标地址转换,一般发生在PREROUTING,(在路由决策之前,否则会转入本机)

让本地网络中的某些主机的某些服务开放给外部网络中的用户访问时;

PNAT:端口 转换,比如web服务的服务端口为80,可将真正的web服务器主机的web服务监听端口设置为8080,而后当客户端访问时是80端口,在经过网关时转换为8080来访问真正的web服务。

 

NAT表的target:

SNAT

 –to-source [ipaddr[-ipaddr]][:port[-port]]

—random

DNAT

–to-destination [ipaddr[-ipaddr]][:port[-port]]

—random

MASQUERADE

–to-ports port[-port]

–random

 

SNAT示例:

~]# iptables -t nat -A POSTROUTING -s 192.168.12.0/24 -j SNAT –to-source 172.16.100.67        

 

MASQUERADE示例:

源地址转换:当外网源地址为动态获取的地址时,MASQUERADE可自行判断要转换为的外网地址;

 

~]# iptables -t nat -A POSTROUTING -s 192.168.12.0/24 -j MASQUERADE

 

DNAT示例:

~]# iptables -t nat -A PREROUTING -d 172.16.100.67 -p tcp –dport 80 -j DNAT –to-destination 192.168.12.77

 

~]# iptables -t nat -A PREROUTING -d 172.16.100.67 -p tcp –dport 80 -j DNAT –to-destination 192.168.12.77:8080

~]# iptables -t nat -A PREROUTING -d 172.16.100.67 -p tcp –dport 22012 -j DNAT –to-destination 192.168.12.78:22

 

 

REDIRECT:

本机的端口重定向

web: 8080

80 –> 8080

 

 

补充:利用iptables的recent模块来抵御DOS攻击: 22,建立一个列表,保存有所有访问过指定的服务的客户端IP

 

 

ssh: 远程连接,

 

iptables -I INPUT -p tcp –dport 22 -m connlimit –connlimit-above 3 -j DROP

 

 

iptables -I INPUT  -p tcp –dport 22 -m state –state NEW -m recent –set –name SSH

iptables -I INPUT  -p tcp –dport 22 -m state –state NEW -m recent –update –seconds 300 –hitcount 3 –name SSH -j LOG –log-prefix "SSH Attach: "

iptables -I INPUT  -p tcp –dport 22 -m state –state NEW -m recent –update –seconds 300 –hitcount 3 –name SSH -j DROP

 

1.利用connlimit模块将单IP的并发设置为3;会误杀使用NAT上网的用户,可以根据实际情况增大该值;

 

2.利用recent和state模块限制单IP在300s内只能与本机建立2个新连接。被限制五分钟后即可恢复访问。

 

下面对最后两句做一个说明:

 

1.第二句是记录访问tcp 22端口的新连接,记录名称为SSH

–set 记录数据包的来源IP,如果IP已经存在将更新已经存在的条目

 

2.第三句是指SSH记录中的IP,300s内发起超过3次连接则拒绝此IP的连接。

–update 是指每次建立连接都更新列表;

–seconds必须与–rcheck或者–update同时使用

–hitcount必须与–rcheck或者–update同时使用

 

3.iptables的记录:/proc/net/xt_recent/SSH

 

————————————————————————————————————————————————

CentOS 6:

 

http://ftp.redhat.com/redhat/linux/enterprise/6Server/en/os/SRPMS/

 

layer7:第三方扩展;

 

iptables实现七层访问过滤:

 

模块:layer7

识别应用层协议

 

iptables/netfilter

iptables -m state,

netfilter state

 

对内核中的netfilter,打补丁layer7,重新编译内核

对iptables打补丁,补上layer7模块,重新iptables

 

 

diff/patch:文本操作工具

 

 

diff是Unix系统的一个很重要的工具程序。它用来比较两个文本文件的差异,是代码版本管理的核心工具之一。其用法非常简单:

  # diff <变动前的文件> <变动后的文件>

 

由于历史原因,diff有三种格式:

  * 正常格式(normal diff)

  * 上下文格式(context diff)

  * 合并格式(unified diff)

 

1、正常格式的diff

例如,对file1(变动前的文件)和file2(变动后的文件)进行比较可使用如下命令:

           # diff file1 file2

显示结果中,第一行是一个提示,用来说明变动位置。它分成三个部分:前面的数字,表示file1的第n行有变化;中间的"c"表示变动的模式是内容改变(change),其他模式还有"增加"(a,代表addition)和"删除"(d,代表deletion);

 

2、上下文格式的diff

上个世纪80年代初,加州大学伯克利分校推出BSD版本的Unix时,觉得diff的显示结果太简单,最好加入上下文,便于了解发生的变动。因此,推出了上下文格式的diff。它的使用方法是加入-c选项(即context)。

           # diff -c f1 f2

结果分成四个部分。第一部分的两行,显示两个文件的基本情况:文件名和时间信息,"***"表示变动前的文件,"—"表示变动后的文件。第二部分是15个星号,将文件的基本情况与变动内容分割开。第三部分显示变动前的文件,即file1。

另外,文件内容的每一行最前面,还有一个标记位。如果为空,表示该行无变化;如果是感叹号(!),表示该行有改动;如果是减号(–),表示该行被删除;如果是加号(+),表示该行为新增。

第四部分显示变动后的文件,即file2。

 

3、合并格式的diff

如果两个文件相似度很高,那么上下文格式的diff,将显示大量重复的内容,很浪费空间。1990年,GNU diff率先推出了"合并格式"的diff,将f1和f2的上下文合并在一起显示。

它的使用方法是加入u参数(代表unified)。

  # diff -u f1 f2

其结果的第一部分,也是文件的基本信息。"—"表示变动前的文件,"+++"表示变动后的文件。第二部分,变动的位置用两个@作为起首和结束。第三部分是变动的具体内容。

除了有变动的那些行以外,也是上下文各显示3行。它将两个文件的上下文,合并显示在一起,所以叫做"合并格式"。每一行最前面的标志位,空表示无变动,减号表示第一个文件删除的行,加号表示第二个文件新增的行。

 

diff

-u

 

patch

 

尽管并没有指定patch和diff的关系,但通常patch都使用diff的结果来完成打补丁的工作,这和patch本身支持多种diff输出文件格式有很大关系。patch通过读入patch命令文件(可以从标准输入),对目标文件进行修改。通常先用diff命令比较新老版本,patch命令文件则采用diff的输出文件,从而保持原版本与新版本一致。

 

patch的标准格式为

patch [options] [originalfile] [patchfile]

 

如果patchfile为空则从标准输入读取patchfile内容;如果originalfile也为空,则从patchfile(肯定来自标准输入)中读取需要打补丁的文件名。因此,如果需要修改的是目录,一般都必须在patchfile中记录目录下的各个文件名。绝大多数情况下,patch都用以下这种简单的方式使用:

 

 

patch命令可以忽略文件中的冗余信息,从中取出diff的格式以及所需要patch的文件名,文件名按照diff参数中的"源文件"、"目标文件"以及冗余信息中的"Index:"行中所指定的文件的顺序来决定。

 

-p参数决定了是否使用读出的源文件名的前缀目录信息,不提供-p参数,则忽略所有目录信息,-p0(或者-p 0)表示使用全部的路径信息,-p1将忽略第一个"/"以前的目录,依此类推。如/usr/src/linux-2.4.15/Makefile这样的文件名,在提供-p3参数时将使用linux-2.4.15/Makefile作为所要patch的文件。

 

patch

-p

-R

 

mockbuild

 

总结:操作步骤

 

1、获取并编译内核

 

# useradd mockbuild

# rpm -ivh kernel-2.6.32-431.5.1.x86_64.el6.src.rpm

# cd rpmbuild/SOURCES

# tar linux-2.6.32-*.tar.gz -C /usr/src

# cd /usr/src

# ln -sv

 

2、给内核打补丁

# tar xf netfilter-layer7-v2.23.tar.bz2

# cd /usr/src/linux

# patch -p1 < /root/netfilter-layer7-v2.23/kernel-2.6.32-layer7-2.23.patch

# cp /boot/config-*  .config

# make menuconfig

 

按如下步骤启用layer7模块                

Networking support → Networking Options →Network packet filtering framework → Core Netfilter Configuration

<M>  “layer7” match support

 

3、编译并安装内核

# make

# make modules_install

# make install

 

4、重启系统,启用新内核

 

5、编译iptables

 

# tar xf iptables-1.4.20.tar.gz

# cp /root/netfilter-layer7-v2.23/iptables-1.4.3forward-for-kernel-2.6.20forward/* /root/iptables-1.4.20/extensions/

# cp /etc/rc.d/init.d/iptales /root

# cp /etc/sysconfig/iptables-config /root

# rpm -e iptables iptables-ipv6 –nodeps

# ./configure  –prefix=/usr  –with-ksource=/usr/src/linux

# make && make install

 

# cp /root/iptables /etc/rc.d/init.d

# cp /root/iptables-config /etc/sysconfig

 

6、为layer7模块提供其所识别的协议的特征码

 

# tar zxvf l7-protocols-2009-05-28.tar.gz

# cd l7-protocols-2009-05-28

# make install                

 

7、如何使用layer7模块

 

ACCT的功能已经可以在内核参数中按需启用或禁用。此参数需要装载nf_conntrack模块后方能生效。

net.netfilter.nf_conntrack_acct = 1

 

 

 

l7-filter uses the standard iptables extension syntax

# iptables [specify table & chain] -m layer7 –l7proto [protocol name] -j [action]

 

 

# iptables -A FORWARD -m layer7 –l7proto qq -j REJECT

 

 

 

编译内核:

make menuconfig

make -j #

make modules_install

make install

 

清理内核源码树:

 

提示:xt_layer7.ko依赖于nf_conntrack.ko模块

原创文章,作者:sjfbjs,如若转载,请注明出处:http://www.178linux.com/54321

赞 (0)
sjfbjssjfbjs
上一篇 2016-10-30 21:02
下一篇 2016-10-30 21:03

相关推荐

  • shell脚本编程入门

    什么是shell脚本,其实,shell脚本就是利用shell的功能所写的一个程序,这个程序是使用纯文本文件,将一些shell的语法与命令(包含外部命令)写在里面,搭配正则表达式、管道命令与数据流重定向等功能等这些命令的组合起来,以达到我们所想要的目的。 程序编程风格有两种: 过程式:以指令为中心,数据服务于指令。 对象式:以数据为中心,指令服务于数据。 过程…

    Linux干货 2016-08-18
  • 第三周作业

    1.列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。  2、取出最后登录到当前系统的用户的相关信息。  3、取出当前系统上被用户当作其默认shell的最多的那个shell。  4、将/etc/passwd中的第三个字段数值最大的后10个用户的信息全部改为大写后保存至/tmp/max…

    Linux干货 2016-12-21
  • linux运维

    linux运维大纲,学习路线图

    Linux干货 2017-10-21
  • httpd服务归纳:httpd简介与基本安装

    一、httpd 简介  1. httpd 历史: httpd daemon 最早诞生于1995年二月, 伊利诺伊大学香槟分校的美国国家超级计算应用中心(NCSA),由Rob McCool开发。当这个项目完成后,Rob 老兄离开RCSA以后,这个项目组就解散了,这个项目也随之终止。 但是,由Brian Behlendorf 和 Cliff …

    Linux干货 2015-05-07
  • Mysql cmake 编译安装、

    基于cmake的mysql安装 1.1 前言 从mysql5.5起,mysql源码安装的编译工具configure开始向cmake过渡。安装方式和之前的略有不同。在这里简单介绍总结下。 安装之前,检查下GNU make, GCC, Perl, libncurses5-dev,cmake-2.8.4是否都已经安装,如果没有安装,用yum install 安装补…

    Linux干货 2017-08-29
  • shell脚本编程初步

    shell脚本编程初步    随着课程学习的深入,我们已经学习了一些常用的命令,会去解决了一部分简单的问题,但是这不能满足复杂的工作,它可以帮助我执行自动化的常用命令、执行系统管理和故障排除、创建简单的应用程序、处理文本或文件。所以我们开始了shell脚本的编程,帮助我们更好的去完成工作。简单地说,shell编程相当于帮我们之前…

    Linux干货 2016-08-15