**本博客是学习慕课网课程 用iptables搭建一套强大的安全防护盾 整理而成 **

iptables相当于在ip层挂载一个hook point对用户进行控制

组成: 四张表+ 五条链(hook point) + 规则

四张表: filter表, nat表, mangele表, raw表

默认操作的是filter表, 其他表需要通过-t参数指定

五条链: INPUT, OUTPUT, FORWARD, PREROUTING, POSTROUTING

fileter表: 访问控制,规则匹配

nat 表: 地址转发

数据包在规则表,链匹配流程

数据包访问控制: ACCEPT, DROP, REJECT

数据包改写: SNAT, DNAT

信息记录: LOG

iptables 规则组成

command:

-A 增加,最后一条增加

-D 删除

-L 列出目前的 table 的规则

-F 清空

-P 设置默认的iptables规则

-I 插入规则,在第一条位置插入

-n 一般与-L同时用,让主机名等不显示出来,例如会将anywhere显示为0.0.0.0,ssh端口直接显示为22,类似的netstat这个选项也是这个意思

-v :列出更多的信息,包括通过该规则的封包总位数、相关的网络接口等

–line-number:查看规则列表时,同时显示规则在链中的顺序号

parameter:

-p 协议

-s 源地址

-i :封包所进入的那个网络接口,例如 eth0, lo 等接口。需与 INPUT 链配合

-o :封包所传出的那个网络接口,需与 OUTPUT 链配合

-d 目标地址

--sport 源端口

--dport 目标端口

--dports 目标端口,后面加一个范围

--m tcp | state | multiport 补充协议,

场景一:

规则1: 对所有地址开发本地的tcp(80,22,10-21)端口的访问

规则2: 允许对所有的地址开放本机的基于ICMP协议的数据包访问

规则3: 其他未被允许的端口则禁止访问

设计思路: 先设置白名单,然后是拒绝所有。

iptables -L #列出iptables的规则,可以加-n表示不让主机名显示出来
iptables -F #清除之前设置的规则
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
iptables -I INPUT -p tcp --dport 22 -j ACCEPT # 22是ssh端口,服务器程序最后开通该端口
iptables -I INPUT -p tcp --dport 10:21 -j ACCEPT
iptables -I INPUT -p icmp -j ACCEPT
iptables -A INPUT -j REJECT

位置顺序很重要,注意最后一条REJECT需要使用-A参数将拒绝的加在最后面,如果用-I加在前面直接拒绝所有

同时注意允许所有icmp并不会产生特殊的条目在iptables中,在拒绝的语句后面会备注允许icmp包进入,

如下:

target     prot opt source     destination
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable

此时就设置完毕了,可以nmap -sS -p 0-1000 10.10.163.233 来进行端口扫描,查看端口是否开放

如果此时需要更改规则,比如说拒绝80端口的访问,需要先删除再添加

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

iptables -I INPUT -p tcp --dport 80 -j REJECT

经过上面的设置目前网路的连接还有两个问题:

问题1: telnet 127.0.0.1 22 访问失败,虽然上面开发22端口,但是本机无法访问本机

问题2: curl http://www.imooc.com/ 本机往外发请求也是无法的,本地无法访问其他主机

本地访问本机,需要设置本地lo网卡允许访问

iptables -I INPUT -i lo -j ACCEPT

-i 参数后加一个设备,上面表示允许所有从lo来的访问

iptables -I INPUT -m state --sate ESTABLISHED,RELATED -j ACCEPT

表示状态为ESTABLISHED和RELATED的连接进行放行,允许其数据包进来

一般ESTABLISHED表示本机主动建立的连接,允许外部练级发送数据进来,否则本机无法主动与外部建立连接,这样就使得curl可以运行,RELATED 是ftp用到的协议

补充: 在场景一的基础上,修改只允许10.103.188.233访问本机的httpd服务:

首先去掉之前允许所有80端口的连接: iptables -D INPUT -p tcp --dport 80 -j ACCEPT

然后允许来自指定ip的连接: iptables -I INPUT -p tcp -s 10.10.188.233 --dport 80 -j ACCEPT

场景二

1.ftp主动模式下iptables的规则配置

2.ftp被动模式下iptables的规则配置

主动模式示意图, client 通过PORT指令上报自己listen的端口,然后ftp server与该端口主动建立连接,发送数据过来

ftp被动模式示意图, client通过PASV指令被动模式,然后ftp server会开一个随机端口进行listen, 并告知client这个端口,client就与该端口建立连接

主动模式

注意:

  • ftp连接的默认模式为被动模式
  • vsftpd服务支持主动模式需要注意配置选项: port_enable=yes和 connect_from_port_20=yes
  • 主动模式下iptables需要开启21端口的访问权限: iptables -I INPUT -p tcp -dport 21 -j ACCEPT, 主动模式下20端口不需要开放,因为主动模式下是通过20端口发送数据而不是接收数据

主动模式需要设置的规则如下:

iptablse -I INPUT -p tcp -dport 21 -j ACCEPT
iptables -I INPUT -p tcp -dport 22 -j ACCEPT # ssh的端口
iptables -I INPUT -p icmp -j ACCEPT
iptables -I INPUT -m stats --state ESTABLISHED,RELATED, -j ACCEPT
iptables -A INPUT -j REJECT
iptables -nL

被动模式

为vsftp指定数据端口,并且通过iptables 开放相应需要传输的端口段

iptables -I INPUT -p tcp -dport 21 -j ACCEPT

vim /etc/vsftpd/vsftpd.conf # 设置pasv_min_port=50000, pasv_max_port=60000这个端口范围

iptables -I INPUT -p tcp --dport 50000:60000 -j ACCEPT

还可以通过内核的连接追踪模块实现被动模式

场景三

模拟公司常用简单iptables规则场景

要求一: 员工在公司内部(10.10.155.0/24, 10.10.188.0/24) 能访问服务器上的任何服务

要求二: 当员工出差例如在上海,通过VPN连接到公司

外网(员工) == 拨号到==> VPN 服务器 ===> 内网FTP, SAMBA, NFS, SSH

要求三: 公司有一个门户网站需要允许公网访问

常见允许外网访问的服务

网站www: http: 80, https: 443

邮件main: smatp: 25, smtps: 465, pop3: 110, pop3s: 995, imap: 143

iptables -I INPUT -i lo -j ACCEPT
iptables -I INPUT -m state --sate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -S 10.10.155.0/24 -j ACCEPT
iptables -A INPUT -S 10.10.188.0/24 -j ACCEPT
iptablse -I INPUT -p tcp -dport 80 -j ACCEPT
iptablse -I INPUT -p tcp -dport 1723 -j ACCEPT # vpn端口
iptables -I INPUT -p icmp -j ACCEPT
iptables -A INPUT -j REJECT

在redhat下可以使用/etc/init.d/iptables save 将这些配置信息存储起来,下次机器重启自动加载

默认的保存位置是在/etc/sysconfig/iptables中存储

可以设置iptabels开机启动: chkconfg iptables on

iptables 防火墙nat表规则配置

SNAT : 源地址转换, 作用出口POSTROUTING链

DNAT : 目标地址转换, 作用于进口PREROUTING链

SNAT场景模拟

上面的场景中因为10.10.177.233与10.10.188.173不是在一个网段,所以用client无法直接访问web server

在Nat servers上有两张网卡,与两个子网都能通信,所以需要在nat server上进行设置iptables

如果使用redhat要进行转发需要将/etc/sysctl.conf下的net.ipv4.ip_forward打开,设置为1即可

然后sysctl -p 让配置生效,然后sysctl -a | grep ip_forward进行查看是否生效

iptables -t nat -A POSTROUTING -s 10.10.177.0/24 -j SNAT --to 10.10.188.232

对于本机ip经常变动,指定SNAT IP不太方便,可以用MASQUERADE动态获取,将上面那句改为

iptables -t nat -A POSTROUTING -s 10.10.177.0/24 -j MASQUERADE

使用iptables -t nat -nL 进行查看

这样就对来自177网段的数据包源地址进行改写,改写成从188网段出去,

同时需要在10.10.177.233上设置默认网关,进行路由,将数据包都从nat server进行转发

route add 0.0.0.0 gw 10.10.177.232

netstat -rn 可以查看路由表

也可以用 cat /etc/sysconfig/network进行查看

设置好之后就可以正常访问web server了

DNAT场景模拟

SNAT的反向场景的模拟, client 直接访问的是nat Server的ip地址,然后由nat server通过Iptables转换dnat请求http server

这样直接curl nat server的ip地址就可以了

iptables -t nat -A PREROUTING -d 10.10.188.232 -p tcp --dport 80 -j DNAT --to 10.10.177.233:80

对于设置一个反向代理来说这上面的还不够,只是设置了反向代理的进入的流量,还需要设置当返回数据的时候再将源地址转换为proxy的地址

iptables -t nat -I POSTROUTING -p tcp --dport 80 -j MASQUERADE

利用iptables 防CC攻击

关于SYN和DDOS攻击,请查看《linux系统扫描技术与安全防范》课程的第六章: http://www.imooc.com/learn/344

connlimit模块

参数: -connlimit-above n #限制并发个数

例:

用于限制不同ip的并发连接数:

iptables -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 100 -j REJECT

对于来自10.10.163.232的目标端口为80的连接进行限制,只允许10个连接,可以有效控制并发量:

iptables -I INPUT -p tcp --dport 80 -s 10.10.163.232 -m connlimit --connlimit-above 10 -j REJECT

limit 模块

作用: 限速, 控制流量

例: iptables -A INPUT -m limit --limit 3/hour # 同一个小时允许三个包过来

--limit-burst 默认值为5,表示初始允许多少个包

iptables -A INPUT -p icmp -m limit --limit 1/m --limit-burst 10 -j ACCEPT

iptables -A INPUT -p icmp -j DROP

表示在初始时刻允许10个包过来,随后每分钟允许1个, 不满足这个规则的包直接DROP掉

iptables实例脚本

/bin/sh
modeprobe ipt_MASQUERADE
modeprobe ip_conntrack_ftp
modeprobe ip_nat_ftp
iptables -F
iptables -t nat -F
iptables -X
iptables -t nat -X ####################
iptables -P INPUT DROP # 默认的规则的设置,如果没有满足下面的规则则DROP
iptables -A INPUT -m stat --stat ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -p tcp -m multiport --dports 110,80,25 -j ACCEPT
iptables -A INPUT -p tcp -s 10.10.0.0/24 --dport 139 -j ACCEPT iptables -A INPUT -i eth1 -p udp -m multiport --dports 53 -j ACCEPT iptables -A INPUT -p tcp --dport 1723 -j ACCEPT
iptables -A INPUT -p gre -j ACCEPT iptables -A INPUT -s 192.168.0.0/24 -p tcp -m stat --stat ESTABLISHED.RELATED -j ACCEPT
iptables -A INPUT -i ppp0 -p tcp --syn -m connlimit --connlimit-above 15 -j DROP # 限速,限制同一个ip发起的连接个数 iptables -A INPUT -p icmp -j DROP iptables -t nat -A POSTROUTING -o ppp0 -s 10.10.0.0/24 -j MASQUERADE # MASQUERADE即表示SNAT转发,10.10.0.0/24出去的包更改源地址用ppp0转发出去 iptables -N syn-flood # 自定义一个新链
iptables -A INPUT -p tcp --syn -j syn-flood    #将syn包都转发到该链
iptables -I syn-flood -p tcp -m limit --limit 3/s --limit-burst 6 -j RETURN
iptables -A syn-flood -j REJECT iptables -P FORWARD DROP
iptables -A FORWARD -p tcp -s 10.10.0.0/24 -m multiport --dport 80,110,21,25,1723 -j ACCEPT
iptables -A FORWARD -p udp -s 10.10.0.0/24 --dport 53 -j ACCEPT
iptables -A FORWARD -p gre -s 10.10.0.0/24 -j ACCEPT
iptables -A FORWARD -p icmp -s 10.10.0.0/24 -j ACCEPT iptables -A FORWARD -m stat --stat ESTABLISHED,RELATED, -j ACCEPT
iptables -I FORWARD -p udp --dport 53 -m string "tencent" -m time --timestart 8:15 --timestop 12:30 --days Mon,Tue,Wed,Thu,Fri,Sat -j DROP
iptables -I FORWARD -p udp --dport 53 -m string "TENCENT" -m time --timestart 8:15 --timestop 12:30 --days Mon,Tue,Wed,Thu,Fri,Sat -j DROP
iptables -I FORWARD -p udp --dport 53 -m string "tencent" -m time --timestart 13:30 --timestop 20:30 --days Mon,Tue,Wed,Thu,Fri,Sat -j DROP
iptables -I FORWARD -p udp --dport 53 -m string "TENCENT" -m time --timestart 13:15 --timestop 20:30 --days Mon,Tue,Wed,Thu,Fri,Sat -j DROP
iptables -I FORWARD -s 10.10.0.0/24 -m string "qq.com" -m time --timestart 8:15 --timestop 12:30 --days Mon,Tue,Wed,Thu,Fri,Sat -j DROP
iptables -I FORWARD -s 10.10.0.0/24 -m string "qq.com" -m time --timestart 13:15 --timestop 20:30 --days Mon,Tue,Wed,Thu,Fri,Sat -j DROP iptables -I FORWARD -s 10.10.0.0/24 -m string "ay200.net" -j DROP
iptables -I FORWARD -s 10.10.0.0/24 -m string "eratucism" -j DROP iptables -A FORWARD -m ipp2p --edk --kazaa --bit -j DROP sysctl -w net.ipv4.ip_forward=1 &>/dev/null
sysctl -w net.ipv4.tcp_syncookies=1 &>/dev/null iptables -I INPUT -s 10.10.0.50 -j ACCEPT # 本机始终可以联系
iptables -I FORWARD -s 10.10.0.50 -j ACCEPT

iptables 学习的更多相关文章

  1. Linux防火墙iptables学习笔记(三)iptables命令详解和举例[转载]

     Linux防火墙iptables学习笔记(三)iptables命令详解和举例 2008-10-16 23:45:46 转载 网上看到这个配置讲解得还比较易懂,就转过来了,大家一起看下,希望对您工作能 ...

  2. Linux防火墙iptables学习

    http://blog.chinaunix.net/uid-9950859-id-98277.html 要在网上传输的数据会被分成许多小的数据包,我们一旦接通了网络,会有很多数据包进入,离开,或者经过 ...

  3. iptables学习02-nat表应用

    nat表应用实验 第一步 准备工作 A机器两块网卡ens33(192.168.2.106).再添加一块自定义网卡ens37(192.168.100.1),添加到LAN内网区段(自定义名字,写什么无所谓 ...

  4. Linux下iptables学习笔记

    Linux下iptables学习笔记 在Centos7版本之后,防火墙应用已经由从前的iptables转变为firewall这款应用了.但是,当今绝大多数的Linux版本(特别是企业中)还是使用的6. ...

  5. 【转】IPtables学习笔记

    写在前面,大家测试玩iptables时要记得自己配置了那些东西,测试完成后记得删除啊,博主忘了删除一个input REJECT链的一条记录,后续测试搭建了apache服务器,始终无法访问,最后抓包发现 ...

  6. LInux iptables学习

    作者原文 : http://blog.chinaunix.net/uid-9950859-id-98277.html       要在网上传输的数据会被分成许多小的数据包,我们一旦接通了网络,会有很多 ...

  7. iptables学习笔记

    为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/SJQ. http://www.cnblogs.com/shijiaqi1066/p/3812510.html ...

  8. iptables学习笔记_____摘自朱双印个人日志 ____http://www.zsythink.net/

    iptables为我们预先定义了四张表 raw.mangle.nat.filter filter表负责过滤:允许那些ip访问.拒绝那些ip访问.允许那些端口...是最常用的表 #查看表里面所有的规则i ...

  9. iptables学习

    droidwall.sh #!/system/bin/sh IPTABLES=iptables BUSYBOX=busybox GREP=grep ECHO=echo # Try to find bu ...

随机推荐

  1. tomcat使用cookies缓存的时候中文报错解决办法 java.lang.IllegalArgumentException: Control character in cookie value or attribute.

    报错出现 java.lang.IllegalArgumentException: Control character in cookie value or attribute. at org.apac ...

  2. yii2 查询构建器

    Query Builder $rows = (new \yii\db\Query()) ->select(['dyn_id', 'dyn_name']) ->from('zs_dynast ...

  3. Egret学习笔记 (Egret打飞机-4.添加主角飞机和实现飞行效果)

    今天继续写点击了开始之后,添加一个飞机到场景中,然后这个飞机的尾巴还在冒火的那种感觉 先拆解一下步骤 1.首先完成飞机容器的图片加载 2.然后把容器添加到场景中 3.然后实现动画 -首先,我们新建一个 ...

  4. 如何通过SpringBoot官方手册集成RabbitMQ

    众所周知,SpringBoot是对Spring的一层封装,用来简化操作. 随着SpringBoot的越发成熟,很多的流行技术都提供了SpringBoot的版本. 可以点击下方的连接查看spring-b ...

  5. Python后端(一)——客户端/服务端

    网址组成(四部分) 协议      http, https(https 是加密的http) 主机      g.cn zhihu.com之类的网址 ,因此一般不用填写 路径      下面的「/」和「 ...

  6. spring cloud熔断监控Hystrix Dashboard和Turbine

    参考: http://blog.csdn.net/ityouknow/article/details/72625646 完整pom <?xml version="1.0" e ...

  7. Spark源码编译(未完待续)

    在这里我们不需要搭建独立的Spark集群,利用Yarn Client调用Hadoop集群的计算资源. Spark源码编译生成配置包: 解压源码,在根去根目录下执行以下命令(sbt编译我没尝试) ./m ...

  8. 网络基础tcp/ip协议二

    物理层解析: 物理层是TCP/IP模型的最低层,物理层为数据提供数据传输可靠通路. 物理层关心的介质: 信号 接口 传输介质 信号的分类:(信号是信息传递的媒介.) 模拟信号:连续变化的物理量 数字信 ...

  9. 1_类的定义(Defining Class)

    C++ 提供了一种类class机制,让程序员可以定义真正意义上的数据类型.即不但可以定义数据的复合,还可以定义该复合数据的操作,以便让本应由使用该数据类型的程序员做得工作分出来,让定义类型的程序员去做 ...

  10. VTK显示mhd,mha格式文件

    下一篇文章将详细介绍mhd,mha文件的构成以及如何制作void renderMhd () { // read input image vtkSmartPointer<vtkMetaImageR ...