**本博客是学习慕课网课程 用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. Java基础(含思维导图)

    很早之前整理的Java基础的一些知识点,思维导图: 1.'别名现象' 对一个对象赋值另一个对象,会指向新的对象引用,赋值前的对象引用会由于不再被引用而被gc回收: 而基本类型则不同.基本类型存储了实际 ...

  2. 基于MATLAB2016b图形化设计自动生成Verilog语言的积分模块及其应用

    在电力电子变流器设备中,常常需要计算发电量,由于电力电子变流器设备一般是高频变流设备,所以发电量的计算几乎时实时功率的积分,此时就会用到一个积分模块.发电量计算的公式如下:Q=∫P. FPGA由于其并 ...

  3. PHP 是一门弱类型语言

    PHP 是一门弱类型语言 我们注意到,不必向 PHP 声明该变量的数据类型. PHP 会根据变量的值,自动把变量转换为正确的数据类型. 在强类型的编程语言中,我们必须在使用变量前先声明(定义)变量的类 ...

  4. ElasticSearch 5.0.0 集群安装部署文档

    1.  搭建环境 3台物理机 操作系统 centos7 es1   192.168.31.141   4g内存   2核 es2   192.168.31.142   4g内存   2核 es3    ...

  5. xadmin与admin设置

    xadmin : 导入xadmin pip install xadmin 路由设置: import xadmin urlpatterns = [ url(r'^xadmin/', xadmin.sit ...

  6. Office 365 共享链接直接进入编辑

    首先在Word online共享文档(不多赘述) 但这个链接打开的是预览视图,要点击右上角的"在浏览器中编辑"才能真正编辑. 但是很多情况都是没必要进入这个预览界面再编辑的.这多点 ...

  7. CodeForces-747A

    从sqrt(n)枚举到1,一旦满足一定是差最小的数. AC代码: #include<cstdio> #include<cmath> int main(){ int n; whi ...

  8. 历届试题 剪格子 IDA*

    思路:限制当前能剪下的最大格子数,保证能得到最少数目.IDA*的典型运用. AC代码 #include <cstdio> #include <cmath> #include & ...

  9. MyCat 枚举分片设计思考,查询命中条件

    Mycat多租户实现的两种方式 MyCat,各种分片规则,仅保证插入的时候分片.表关联,join,查询怎么命中分片条件,还是需要设计. 今天稍微测了一下. ER 分片,此方式,插入的时候能分片,但是查 ...

  10. 天气类API调用的代码示例合集:全国天气预报、实时空气质量数据查询、PM2.5空气质量指数等

    以下示例代码适用于 www.apishop.net 网站下的API,使用本文提及的接口调用代码示例前,您需要先申请相应的API服务. 全国天气预报:数据来自国家气象局,可根据地名.经纬度GPS.IP查 ...