1. iptables基本定义

Table (表名)

Explanation (注释)

nat

nat表的主要用处是网络地址转换,即Network Address Translation,缩写为NAT。做过NAT操作的数据包的地址就被改变了,当然这种改变是根据我们的规则进行 的。属于一个流的包只会经过这个表一次。如果第一个包被允许做NAT或Masqueraded,那么余下的包都会自 动地被做相同的操作。也就是说,余下的包不会再通过这个表,一个一个的被NAT,而是自动地完成。这就 是我们为什么不应该在这个表中做任何过滤的主要原因,对这一点,后面会有更加详细的讨论。PREROUTING 链的作用是在包刚刚到达防火墙时改变它的目的地址,如果需要的话。OUTPUT链改变本地产生的包的目的地 址。POSTROUTING链在包就要离开防火墙之前改变其源地址。

mangle

这个表主要用来mangle数据包。我们可以改变不同的包及包 头的内容,比如 TTLTOSMARK。 注意MARK并没有真正地改动数据包,它只是在内核空间为包设了一个标记。防火墙 内的其他的规则或程序(如tc)可以使用这种标记对包进行过滤或高级路由。这个表有五个内建的链: PREROUTINGPOSTROUTING OUTPUTINPUT FORWARDPREROUTING在包进入防火墙之后、路由判断之前改变 包,POSTROUTING是在所有路由判断之后。 OUTPUT在确定包的目的之前更改数据包。INPUT在包被路由到本地 之后,但在用户空间的程序看到它之前改变包。FORWARD在最初的路由判 断之后、最后一次更改包的目的之前mangle包。注意,mangle表不能做任何NAT,它只是改变数据包的 TTLTOSMARK,而不是其源目地 址。NAT是在nat表中操作的。

filter

filter表是专门过滤包 的,内建三个链,可以毫无问题地对包进行DROPLOGACCEPTREJECT等操作。FORWARD 链过滤所有不是本地产生的并且目的地不是本地(所谓本地就是防火墙了)的包,而 INPUT恰恰针对那些目的地是本地的包。OUTPUT 是用来过滤所有本地生成的包的。

下图可以帮助理解各个表及其链在iptables防火墙中的作用:

关于iptables的更多解释, 推荐看下iptables 指南 1.1.19

2. iptables在路由器上的应用

2.1 ACL(权限访问控制)

目的:控制对路由器的访问权限,比如限制访问路由器的telnet、ssh或者对路由器进行ping连通测试等。

实操:

  1. #创建名为acl_chain_的链
  2. iptables -t filter -N acl_chain_
  3. #从接口br0来的到目的端口80,443且协议为tcp,报文源ip地址范围在192.168.1.-192.168..150内的报文直接进入下一条链处理;又tcp ,443分别对应http和https, 若后面的链没有对其执行drop动作,将允许访问路由器的web页面。
  4. iptables -t filter -A acl_chain_ -i br0 -p tcp -m multiport --dports , -m iprange --src-range 192.168.1.100-192.168.1.150 -j RETURN
  5. #注意icmp type 8为ping应答, nas+为模糊匹配接口(包括nas10,nas10_0),其他如上
  6. iptables -t filter -A acl_chain_ -i nas+ -p icmp -m icmp --icmp-type -m iprange --src-range 0.0.0.0-223.255.255.255 -j RETURN
  7. #tcp 22为ssh端口,若后面的链没有对其执行drop动作,将允许通过ssh访问路由器
  8. iptables -t filter -A acl_chain_ -i br0 -p tcp -m multiport --dports -m iprange --src-range 0.0.0.0-223.255.255.255 -j RETURN
  9. #表示进入acl_chain_的报文,如果之前没有匹配到的,都将其drop掉
  10. iptables -t filter -A acl_chain_ -j DROP
  11.  
  12. #创建名为ACL_的链
  13. iptables -t filter -N ACL_
  14. #到tcp ,,,,,,,,,,21的报文都进入acl_chain_处理
  15. iptables -t filter -A ACL_ -p tcp -m multiport --dports ,,,,,,,,,, -j acl_chain_
  16. #到udp ,,,,,,,,,,21的报文都进入acl_chain_处理
  17. iptables -t filter -A ACL_ -p udp -m multiport --dports ,,,,,,,,,, -j acl_chain_
  18. #ping应答相关的报文也进入acl_chain_处理
  19. iptables -t filter -A ACL_ -p icmp -m icmp --icmp-type -j acl_chain_
  20.  
  21. #将ACL链追加在filter INPUT中
  22. iptables -t filter -A INPUT -j ACL_ ! -i lo
  23.  
  24. 若上述命令都执行成功,那么在路由器上的相关规则为:
  25. # iptables -t filter -S INPUT
  26. -P INPUT ACCEPT
  27. -A INPUT ! -i lo -j ACL_
  28. #
  29. # iptables -t filter -S ACL_
  30. -N ACL_
  31. -A ACL_ -p tcp -m multiport --dports ,,,,,,,,,, -j acl_chain_
  32. -A ACL_ -p udp -m multiport --dports ,,,,,,,,,, -j acl_chain_
  33. -A ACL_ -p icmp -m icmp --icmp-type -j acl_chain_
  34. #
  35. # iptables -t filter -S acl_chain_
  36. -N acl_chain_
  37. -A acl_chain_ -i br0 -p tcp -m multiport --dports , -m iprange --src-range 192.168.1.100-192.168.1.150 -j RETURN
  38. -A acl_chain_ -i nas+ -p icmp -m icmp --icmp-type -m iprange --src-range 0.0.0.0-223.255.255.255 -j RETURN
  39. -A acl_chain_ -i br0 -p tcp -m multiport --dports -m iprange --src-range 0.0.0.0-223.255.255.255 -j RETURN
  40. -A acl_chain_ -j DROP
  41. #

2.2 PortMapping(端口映射)

目的:使内网中某主机的某些端口暴露于外网,这样外网访问路由器的指定端口,便会被路由器转发到内网某主机上。

实操:如下图,192.168.1.2为LAN侧某个PC的IP地址,192.168.88.253为路由器上名为ppp1的wan interface的IP地址。

把路由器上名为ppp1的wan接口上收到的tcp 2211的数据转到lan侧pc 192.168.1.2上的tcp 1122上。

把路由器上名为ppp1的wan接口上收到的udp 8877的数据转到lan侧pc 192.168.1.2上的udp 7788上。

  1.  

# iptables -t filter -S FORWARD
-P FORWARD ACCEPT
-A FORWARD -i ppp1 ! -o ppp1 -j MINIUPNPD
# iptables -t filter -S MINIUPNPD
-N MINIUPNPD
-A MINIUPNPD -d 192.168.1.2/32 -p tcp -m tcp --dport 1122 -j ACCEPT
-A MINIUPNPD -d 192.168.1.2/32 -p udp -m udp --dport 7788 -j ACCEPT

  1.  

# iptables -t nat -S PREROUTING
-P PREROUTING ACCEPT
-A PREROUTING -i ppp1 -j MINIUPNPD
# iptables -t nat -S MINIUPNPD
-N MINIUPNPD
-A MINIUPNPD -p tcp -m tcp --dport 2211 -j DNAT --to-destination 192.168.1.2:1122
-A MINIUPNPD -p udp -m udp --dport 8877 -j DNAT --to-destination 192.168.1.2:7788

2.3 DMZ

目的: 将外网发往路由器的某接口的所有信息都转发到内网的某台主机上.

实操:

  1. 在表nat中创建一个名为DMZ_PRE2_0的链
  2. iptables -t nat -N DMZ_PRE2_0
  3. 从接口nas2_0来的通过链DMZ_PRE2_0的报文,将对其作DNAT转换,改变报文的目的地址为192.168.1.
  4. iptables -t nat -A DMZ_PRE2_0 -i nas2_0 -j DNAT --to-destination 192.168.1.5
  5.  
  6. 将链DMZ_PRE2_0追加到表nat的内建链PREROUTING
  7. iptables -t nat -A PREROUTING -j DMZ_PRE2_0
  8.  
  9. 若上述命令都执行成功,那么在路由器上的相关规则为:
  10. # iptables -t nat -S PREROUTING
  11. -P PREROUTING ACCEPT
  12. -A PREROUTING -j DMZ_PRE2_0
  13. # iptables -t nat -S DMZ_PRE2_0
  14. -N DMZ_PRE2_0
  15. -A DMZ_PRE2_0 -i nas2_0 -j DNAT --to-destination 192.168.1.5
  16. #

2.4 Filter(黑|白名单限制)

目的:通过IP、MAC等信息限制内网的某主机对路由器或者外网的访问

实操:

  1. ========ip
  2. # iptables -t filter -S ipfilter_chain
  3. 新建一个名为ipfilter_chain的链
  4. -N ipfilter_chain
  5. 从接口nas10_0出去且经过ipfilter_chain链的报文,协议为tcp,目的端口为100:,原ip范围在192.168.1.-192.168.1.50 目的ip范围在192.172.1.-192.172.1.30,将其转发下一个链, 如果之后没有对其drop的动作,此报文将被允许通过。
  6. -A ipfilter_chain -o nas10_0 -p tcp -m tcp --dport : -m iprange --src-range 192.168.1.5-192.168.1.50 -m iprange --dst-range 192.172.1.3-192.172.1.30 -j RETURN
  7. -A ipfilter_chain -s 192.168.1.4/ -o nas10_0 -j RETURN
  8. -A ipfilter_chain -o ppp80 -j RETURN
  9. -A ipfilter_chain -d 172.30.20.1/ -o nas10_0 -j RETURN
  10. -A ipfilter_chain -j DROP
  11. #
  12.  
  13. # iptables -t filter -S FORWARD
  14. -P FORWARD ACCEPT
  15. -A FORWARD -i br+ -j ipfilter_chain
  16. -A FORWARD -i ra+ -j ipfilter_chain
  17.  
  18. ========mac
  19. # iptables -t filter -S macfilter_chain
  20. 新建一个名为macfilter_chain的链
  21. -N macfilter_chain
  22. 通过链macfilter_chain的报文,如果其源mac地址为40::7E:::0B,就将其丢掉
  23. -A macfilter_chain -m mac --mac-source ::7E:::0B -j DROP
  24. #
  25.  
  26. 将链macfilter_chain追加到表filter的内建链中FORWARD
  27. # iptables -t filter -S FORWARD
  28. -P FORWARD ACCEPT
  29. -A FORWARD -i br+ -j macfilter_chain
  30. -A FORWARD -i ra+ -j macfilter_chain
  31.  
  32. 将链macfilter_chain追加到表filter的内建链中INPUT
  33. # iptables -t filter -S INPUT
  34. -P INPUT ACCEPT
  35. -A INPUT -i ra+ -j macfilter_chain
  36. -A INPUT -i br+ -j macfilter_chain

2.5 Firewall(防火墙)

目的: iptables规则也可以帮助建立一道防火墙,减少主机遭到恶意攻击的风险。

实操:

1.

说明: 防火墙通用的规则一般都有允许类型为RELATED,ESTABLISHED的报文直接ACCEPT,而把INVALID,NEW直接DROP掉。

规则:

# iptables -t filter -S INPUT
-P INPUT ACCEPT
-A INPUT -i nas+ -m state --state RELATED,ESTABLISHED -j ACCEPT
...
-A INPUT -i nas+ -m state --state INVALID,NEW -j DROP

2

类型:SYN/TCP reset attack

说明:攻击者可以给目标计算机发送0~65535端口发送TCP SYN或者UDP,如果收到了TCP RST或者UDP报文的ICMP不可达报文,则说明这个端口没有开放;相反,则说明TCP端口是开放的,或者UDP端口可能开放。这就是端口扫描攻击。

方法:限制TCP SYN报文的数据流量,但这个也不能完全避免端口扫描攻击。

规则:

# iptables -t filter -S INPUT
-A INPUT ! -i br+ -j DOS_FW

# iptables -t filter -S DOS_FW
-N DOS_FW
-A DOS_FW -p tcp -m state --state NEW -m limit --limit 15/sec --limit-burst 30 -j RETURN
-A DOS_FW -p tcp -j DROP

3

类型:SYN/RST attack:

说明:SYN在TCP三次握手中使用,RST是在TCP复位时使用,正常情况下SYN和RST不可能同时出现在一个TCP中,同时又SYN和RST标志的TCP报文应该被认为是一个异常报文。
方法:这种异常报文,建议直接DROP掉。

规则:

# iptables -t filter -S INPUT
-A INPUT ! -i br+ -j DOS_FW

# iptables -t filter -S DOS_FW
-N DOS_FW
-A DOS_FW -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j DROP

4

类型:SYN/FIN attack
说明:正常情况下,SYN标志(连接请求标志)和FIN标志(连接拆除标志)是不能同时出现在一个TCP报文中的。而且RFC也没有规定IP协议栈如何处理这样的畸形报文,因此,各个操作系统的协议栈在收到这样的报文后的处理方式也不同,攻击者就可以利用这个特征,通过发送SYN和FIN同时设置的报文,来判断操作系统的类型,然后针对该操作系统,进行进一步的攻击。(refer to https://www.cnblogs.com/ianthe/articles/3658307.html)
方法:一般都是将同时含有SYN和FIN标志的TCP报文直接DROP掉。

规则:

# iptables -t filter -S INPUT
-A INPUT ! -i br+ -j DOS_FW

# iptables -t filter -S DOS_FW
-N DOS_FW
-A DOS_FW -p tcp -m tcp --tcp-flags FIN,SYN FIN,SYN -j DROP

5

类型: Ping/Ping of Death attack:
说明: 当目标计算机一直收到了大量的PING报文,可能说明它遭受了恶意的攻击
方法: 限制ping报文的数据流量

规则:

# iptables -t filter -S INPUT
-A INPUT ! -i br+ -j DOS_FW

# iptables -t filter -S DOS_FW
-N DOS_FW
-A DOS_FW -p icmp -j DOS_PIN
# iptables -t filter -S DOS_PIN
-N DOS_PIN
-A DOS_PIN -p icmp -m icmp --icmp-type 8 -m limit --limit 10/sec --limit-burst 50 -j RETURN
-A DOS_PIN -p icmp -m icmp --icmp-type 0 -m limit --limit 10/sec --limit-burst 50 -j RETURN
-A DOS_PIN -p icmp -j DROP

6

类型:FIN/URG/PSH attack:

规则:

# iptables -t filter -S INPUT
-A INPUT ! -i br+ -j DOS_FW

# iptables -t filter -S DOS_FW
-N DOS_FW
-A DOS_FW -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,PSH,URG -j DROP

7

类型:Xmas attack:

规则:

# iptables -t filter -S INPUT
-A INPUT ! -i br+ -j DOS_FW

# iptables -t filter -S DOS_FW
-N DOS_FW
-A DOS_FW -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP
-A DOS_FW -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j DROP

8

类型:Null scanning attack:

规则:

iptables -t filter -S DOS_FW
-N DOS_FW
-A DOS_FW -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP

iptables及其在路由器上的应用 (待完善)的更多相关文章

  1. 教你如何在Drcom下使用路由器上校园网(以广东工业大学、极路由1S HC5661A为例)

    免责声明: 在根据本教程进行实际操作时,如因您操作失误导致出现的一切意外,包括但不限于路由器变砖.故障.数据丢失等情况,概不负责: 该技术仅供学习交流,请勿将此技术应用于任何商业行为,所产生的法律责任 ...

  2. 分析并实现 360 P1路由器上的朋友专享网络 功能

    笔者分析了360 P1路由器上的朋友专享网络功能,发现其主要由如下子功能组成: 1. APP点击“立即开启”,则路由器会多出一个新的SSID:360朋友专享网络-8463.此SSID不加密:同时,原有 ...

  3. 打破常规——大胆尝试在路由器上搭建SVN服务器

    注册博客园挺久了,一直比较懒,虽然有几次想写点文章,但是一直没有行动,今天给大家带来一篇比较有意思的文章,不涉及技术上的,希望大家轻拍.本文的文字和图片全部为原创,尊重作者转载请注明出处! 说起路由器 ...

  4. 在路由器上搭建SVN服务器

    在路由器上搭建SVN服务器 SVN托管服务大家都不陌生了,我最早开始用的是谷歌提供的SVN,因为在上面托管的项目都是开源的,所以当有些项目不方便在网上公开的时候,就需要自己搭建SVN服务器了.wind ...

  5. 将 DNSCrypt 部署到 Openwrt 路由器上+ DNSmasq 解析国内域名用本地 DNS[ZT+实践]

    原文地址: 1.https://typcn.com/legacy/blog/posts/openwrt-dnscypt.html 2.http://www.openwrt.pro/post-376.h ...

  6. 分析并实现 360 P1路由器上的测速功能(也可以针对金山测速功能)

    现在各种智能路由器以及一些PC上的防火墙软件,都提供网络测速功能.笔者对此进行了研究,并在自己的路由器上也实现了此功能.下面做一下总结 一般的网络测速,主要关注两个方面:网络延迟和下载速率 1.网络延 ...

  7. 交换机/路由器上的 S口 F口 E口

    S口是serial接口的意思,也叫高速异步串口,主要是连接广域网的V.35线缆用的,说白了就是路由器和路由器连接时候用的,可以用命令设置带宽,一般也就在10M.8M左右.F口是FastEthernet ...

  8. Openwrt路由器上安装python

    在路由器安装python之前,还是经过了一番折腾的.淘宝上买了个已经刷好系统的小米迷你路由器,但里面安装的不是预期的Pandorbox,而是LEDE. 这个固件已经带了大量自带的软件,128的内存实在 ...

  9. Pandorabox固件路由器上申请Let's Encrypt证书,为内网里的多个web服务提供SSL支持

    对于家中宽带有公网IP的用户,有时我们需要将路由器内部网络的某些web服务通过端口转发暴露到外网(例如NAS远程访问),但HTTP是明文传输,有被监听的风险:如果在NAS上使用自签名证书,再端口转发, ...

随机推荐

  1. var_dump

    1:var_dump 主要输出类型和.长度和变量的值: 2: var_dump() 能打印出类型print_r() 只能打出值echo() 是正常输出...需要精确调试的时候用 var_dump(); ...

  2. Java编程的逻辑 (79) - 方便的CompletionService

    ​本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...

  3. Linux磁盘概念及其管理工具fdisk

    Linux磁盘概念及其管理工具fdisk [日期:2016-08-27] 来源:Linux社区  作者:chawan [字体:大 中 小]   引言:冯诺依曼体系中的数据存储器就是我们常说的磁盘或硬盘 ...

  4. windows server 2008 R2 计划任务备份系统

    实验环境拓扑图: 实验效果: Windows Server Backup 可以设置备份计划,但只能按日进行备份,不能设置按周或月进行备份.所以,需要使用到 windows Server 2008 R2 ...

  5. Java Socket 死循环while如何判断客户端断开

    多线程的服务器程序 线程中等待客户端的消息    我的代码能实现服务器与客户端的通信    问题是: 当客户端中断或退出  以上代码却不能判断Socket中断 跳不出while的无限循环 解决方法: ...

  6. bootstrap-select 多选下拉框使用教程

    http://silviomoreto.github.io/bootstrap-select/ 一.使用bootstrap-select组件时,先引用下列文件 最后一个文件 defaults-zh_C ...

  7. Python 字符串转JSON; 先装字典在转JSON; json.dumps(d)

    #-*- coding:UTF-8 -*- import os; import json class MysqlUtil(): def __init__(self): pass if __name__ ...

  8. springboot logback 集成

    在 application.yml 中敲 logging.pattern.consle ,IDEA 会联想到对应的值.单击属性就可以跳到 LoggingApplicationListener.java ...

  9. day_11py学习

    ''' 字典增加和删除 1.添加 xxx[新的key] = value 2.删除 del xxx[key] 3.修改 xxx[已存在的key] = new_value 4.查询 xxx.get(key ...

  10. 6.13 py网络编程

    tcp的十种状态 python使用原始套接字才可以做黑客攻击!!!!!伪造数据包!!!!!直接越过底层!socket这个东西是经过linux过滤过得! TTL  每经过一个路由器就减1 谁先调clos ...