zoukankan      html  css  js  c++  java
  • iptables命令提取总结,包含扩展模块<取自朱双印博客>

    以下内容只是一些命令相关的,以朱双印博客中的iptables的教程提取出来的。纯粹只是命令的总结,如果需要看理论的知识,建议去看朱老师的博客,目前还没有看到写得比这个好的了。
    看完朱老师的博客,理论上面是理解过了,但是一些命令的东西总是要返回去找,所以自已就提取了下一些命令,写成下面的这篇了。
     
     
    报文流向
    1. 到本机某进程的报文: prerouting--> input
    2. 由本机转发的报文:prerouting-->forward-->postrouting
    3. 由本机某进程发出的报文:output-->postrouting
     
    表,所有的规则都是以下四种分类的规则,所有的表都存于这四个表中
    1. filter 表,负责过滤功能,防火墙,内核模块: iptables_filter
    2. nat表,network address translation,网络地址转换功能,内核模块iptables_nat
    3. mangle表,拆解报文,做出修改,并重新封装的功能:iptables_mangle
    4. raw表,关闭nat表上启用的连接追踪机制;iptables_raw
     
    下图是路由次序图:
     
    其实iptables相关的规则均由匹配条件和处理动作组成,条件包含通常所说的,端口号,IP地址,等.而动作的话,包含以下:
    ACCEPT: 允许
    DROP: 直接丢弃,不给回应信息,客户端过了超时时间才会有反应
    REJECT: 拒绝数据包通过,会有回应信息,客户端刚请求就会收到拒绝的信息
    SNAT: 源地址转换,解决内网用户用同一个公网地址上网的问题
    MASQUERADE: 是SNAT的一种特殊开工,适用于动态的,临时会变的IP上
    DNAT: 目标地址转换
    REDIRECT: 在本机做端口映射
    LOG:在/var/log/message文件中记录日志信息,然后将数据包传给下一条规则,只做记录,不做其它任何操作,仍然让下一条规则去匹配
     
    IPTABLES命令参数说明:
    #iptables
    -t 指定要操作的表【raw,mangle,nat,filter -- 如果没有使用-t选项指定表,默认为filter表】
    -L 列出规则
    --line-number 可以查看的时候显示序号【--line (centos中可缩写)】
    -n 不对IP地址进行名称反解,直接显示IP地址【anywhere,0.0.0.0/0】
    -v 显示更详细的信息【报文个数,对应匹配的报文大小总和,等】
    -x 显示精确匹配到计数值
    -A 表示在需要添加的规则表中进行添加
    -I [=大写的 i ] 表示表需要添加的规则表中进行插入到指定的位置,默认为开始【-I INPUT 2 指定位置】
    -D 删除规则
    -R 修改规则【必须明确指定规则对应原本的匹配条件,建议-D先删除,再来添加】
    -s 报文的源地址
    -d 报文的目标地址
    -p 协议类型
    -p tcp --dport 22】--dport 报文的目的端口
    -p tcp --sport 22】--sport 报文的源端口
    -p tcp -m multiport --dports 25,110,143,80】使用multiport指定多个端口
    -i 指定网卡接口
    -m 指定的扩展模块
    -N 创建自定义链
    iptables -t filter -N IN_WEB
     
    添加规则
    【iptables -F INPUT清空filter表INPUT链中的规则.】
    屏蔽某个IP【拒绝192.168.1.11上所有的报文访问当前机器,可省略-t filter
    iptables -t filter -I INPUT -s 192.168.1.11 -j DROP
    【-I为插入规则,-s为IP,-j DROP为屏蔽动作】
    iptables -t filter -I INPUT 2 -s 192.168.1.11 -j DROP
    删除规则
    查看规则【根据需要来查看,以下为查看filter表中的INPUT链中的规则】
    iptables --line -vnL INPUT
    删除上面查看出来的第三条规则【删除filter表中的INPUT链中的第三条规则】
    iptables -t filter -D INPUT 3
    根据具体的匹配条件与动作来删除规则【需要知道添加的规则,可以使用iptables -nvL进行查看】
    iptables -D INPUT -s 192.168.1.11 -j DROP
    保存防火墙规则,如果你误操作了,并且没有保存,那么重启防火墙将会恢复到配置文件中的模样
    service iptables save
    iptables-save > /etc/sysconfig/iptables【iptables-save是将当前的规则以保存后的格式输入到屏幕上,再利用重定向保存到配置文件中】
    Centos 6系列会保存在 /etc/sysconfig/iptables 文件中
    重新载入规则【重载规则,现有的规则会被覆盖】
    iptables-restore < /etc/sysconfig/iptables
     
    参数-s格式【-d也可以参考下面格式】
    单IP
    -s 192.168.1.11
    多IP
    -s 192.168.1.11,192,168.4.2
    指定 IP段
    -s 10.6.0.0/16
    取反【不满足源IP为192.168.1.11的报文进行INPUT链默认操作,并不表示拒绝*注意,与默认规则有关】
    ! -s 192.168.1.11
    iptables -t filter -A INPUT ! -s 192.168.1.11 -j ACCEPT
     
    -p格式【不使用-p的时候表示所有协议】
    Centos 6
    tcp,udp,udplite,icmp,esp,ah,sctp
    Centos 7
    tcp,udp,udplite,icmp,icmpv6,esp,ah,sctp,mh
    指定端口
    -p tcp --dport 22】--dport 报文的目的端口
    -p tcp --sport 22】--sport 报文的源端口
    取反
    -p tcp ! --dport 22 【表示目标端口不是22端口则会被匹配到】
    取一个范围
    -p tcp --dport 22:25【表示22到25端口之间所有的端口,22,23,24,25】
    -p tcp --dport :22 【表示0到22端口】
    -p tcp --dport 80: 【表示80到65535端口】
    【-m multiport 扩展模块只可以用于tcp协议与udp协议,即配合-p tcp或者-p udp使用,后面接的--dport变为了--dports】
    -p tcp -m multiport --dports 25,110,143,80 【表示匹配多个离散的目标端口,注意其中使用-m multiport模块】
    -p tcp -m multiport --dports 22,80:88 【可以指定连续端口范围并且可以添加离散端口号】
    【完整例】
    iptables -t filter -I INPUT -s 192.168.1.11 -p tcp -m multiport --dports 25,110,143,80 -j DROP
     
    -m格式
    -m表示指定的模块
    iptables -t filter -I INPUT -s 192.168.1.11 -p tcp -m tcp --dport 22 -j REJECT
    但是与前面-p选项对应的协议名称相同的模块,所以可以忽略【如果是-m udp不则,就不可以忽略了】
    iptables -t filter -I INPUT -s 192.168.1.11 -p tcp --dport 22 -j REJECT
     
    扩展模块
    -m multiport
    看上面的-p选项,已经说明了
     
    -m iprange】指定一段连续的IP地址范围
    -m iprange --src-range-m iprange --dst-range
    支持使用"!"取反
    屏蔽源IP地址192.168.1.100到192.168.1.200之间的来源报文
    iptables -t filter -I INPUT -m iprange --src-range 192.168.1.100-192.168.1.200 -j DROP
     
    string扩展模块】
    报文中包含对应的字符串,如果某个网页的内容是OOXX
    #curl 192.168.1.146/index.html
    OOXX
    #iptables -t filter -I INPUT -m string --algo bm --string "OOXX" -j REJECT
    --algo:指定匹配算法,可选算法:bm与kmp此选项为必须选项
    --string:用于指定需要匹配的字符串
     
    time扩展模块
    指定每天9点至18点不可以看网页<访问80与443端口>
    #iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 18:00:00 -j REJECT
    #iptables -t filter -I OUTPUT -p tcp --dport 443 -m time --timestart 09:00:00 --timestop 18:00:00 -j REJECT
    --timestart起始时间
    --timestop结束时间
    -m time --weekdays 6,7【限定周六日,可以使用数字,也可以使用Mon,Tue,Wed,Thu,Fri,Sat,Sun】
    【weekdays与timestart、timestop结合】---限定周六日的9点至18点不可以访问80端口
    #iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 18:00:00 --weekdays 6,7 -j REJECT
    --monthdays选项,可以指定每个月的哪 一天
    每个月的第4个星期5
    -m time --weekdays 5 --monthdays 22,23,24,25,26,27,28
    使用--datestart选项与--datestop选项,指定具体的日期范围
    -m time --datestart 2018-06-22 --datestop 2018-06-30
    --monthdays与--weekdays可以使用“!"取反,其它的不可以
     
    connlimit扩展模块
    限制每个IP地址同时链接到server端的链接数量,不用指定Ip,默认就是针对每个客户端IP
    限制每个Ip地址最多只能占用两个SSH连接到server端
    #iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
    ------connlimit-above 2表示限制每个IP链接数量上限为2,可以利用“!"取反
    --connlimit-mask 24限定某类网段
    结合例:<24网段最多有两个ssh客户端连接到当前服务器>
    #iptables -t filter -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 --connlimit-mask 24 -j REJECT
     
    limit扩展模块
    limit模块是对”报文到达速率“进行限制的,<限制单独时间内流入包的数量>
    例:先清除规则,避免其它的规则影响,再设置速度,再做包过滤
    #iptables -F
    #iptables -t filter -I INPUT -p icmp -m limit --limit 10/minute -j ACCEPT
    #iptables -t filter -A INPUT -p icmp -j REJECT
    --limit-burst <令牌桶的概念>,令牌桶中最多存放3个令牌,每分钟生成10个令牌(第6秒生成一个令牌)
    时间单位可以使用/second 秒 /minute 分 /hour 时 /day 天
    #iptables -t filter -I INPUT -p icmp -m limit --limit-burst 3 --limit 10/minute -j ACCEPT
    #iptables -t filter -A INPUT -p icmp -j REJECT
     
    --tcp-flags
    详解看如下朱双印老师博客的说明:
    用于匹配报文的tcp头的标志位
    例:
    #iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT
    #前面省略 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN,ACK -j REJECT
    #前面省略 --tcp-flags ALL SYN -j REJECT
    #前面省略 --tcp-flags ALL SYN,ACK -j REJECT
    --syn 用于匹配tcp新建连接的请求报文 ,相当于使用”--tcp-flags SYN,RST,ACK,FIN SYN"
    #iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --syn -j REJECT
     
    -icmp
    详细看下面链接中朱双印老师的讲解
    禁止所有icmp类型的报文进入本机<无法发送ping,也无法接收ping>
    #iptables -t filter -I INPUT -p icmp -j REJECT
    可以ping通别人,但是别人无法ping通我们
    #iptables -t filter -I INPUT -p icmp -m icmp --icmp-type 8/0 -j REJECT
    也可以使用报文描述去匹配<空格需要替换为->,效果同上面
    #iptables -t filter -I INPUT -p icmp -m icmp --icmp-type "echo-request" -j REJECT
     
    state模块
    链接报文状态
    有五种状态:
    NEW: 连接的第一包
    ESTABLISHED:NEW状态包后面的包状态理解,表示连接已建立
    RELATED:数据进程连接--数据连接<如FTP中的数据连接>
    INVALID:包没有办法被识别,或者空上包没有任何状态,可以主动屏蔽INVALID的报文
    UNTRACKED:未被追踪的报文 ,当报文的状态为Untracked时通常表示无法找到相关的连接
    ####
    如何判断报文是否是为了回应之前发出的报文,如果不是拒绝
    #iptables -t filter -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
    #iptables -t filter -I INPUT -j REJECT
    《上面这句是表示不是的报文作何处理》
     
     
    【-N 自定义链】
    创建自定义链
    #iptables -t filter -N IN_WEB
    将规则添加至自定义链中
    #iptables -t filter -I IN_WEB -s 192.168.1.123 -j REJECT
    #iptables -I IN_WEB -s 192.168.1.188 -j REJECT
    查看自定义链规则
    #iptables -t filter --line -nvL IN_WEB
    将访问本机的80端口匹配到这条规则
    #iptables -I INPUT -p tcp --dport 80 -j IN_WEB
    重命名自定义链
    #iptables -E IN_WEB WEB
    删除自定义链,要先删除引用,清除自定义链规则
    #iptables -D INPUT 1
    #iptables -t filter -F WEB
    #iptables -t filter -X WEB
     
     
    LOG动作
    将所有发往22端口的报文相关信息记录在日志中
    <如果使用此日志功能,建议尽可能的将条件匹配得精确一些>
    #iptables -I INPUT -p tcp --dport 22 -j LOG
    【修改日志路径】
    #vim /etc/rsyslog.conf
    添加如下信息:
    #kern.warning /var/log/iptables.log
    重启rsyslog服务(或者syslogd)
    #service rsyslog restart
    --log-level 日志级别:emerg, alert,crit,error,warning,notice,info,debug
    --log-prefix 可以给记录到日志的相关信息添加“标签”之类的信息,(*注意:不可超过29个字符)
    例:<将所有主动连接22端口的报文信息均记录到日志中(其中有使用到state模块,相关的看上面的这模块说明)>
    #iptables -I INPUT -p tcp --dport 22 -m state --state NEW -j LOG --log-prefix "want-in-from-port-22"
     
    网络防火墙
    添加路由,访问某网段,指定走某路由
    #route add -net 10.1.0.0/16 gw 192.168.1.146
    设置转发报文
    (临时办法有下面两种)
    #cat /proc/sys/net/ipv4/ip_forward <内容为0表示不转发>
    #echo 1>/proc/sys/net/ipv4/ip_forward
    或者如下办法:
    #sysctl -w net.ipv4.ip_forward=1
    (永久生效办法)
    #/etc/sysctl.conf (centos7为/usr/lib/sysctl.d/00-system.conf文件) 添加 net.ipv4.ip_forward=1即可
    在FORWARD链的末端添加一条默认拒绝所有转发的规则
    #iptables -A FORWARD -j REJECT
    添加一条允许10.1/16段的所有的IP均可正常的访问外部主机的web请求(注意进出均要放行)
    #iptables -I FORWARD -s 10.1.0.0/16 -p tcp --dport 80 -j ACCEPT
    上面的是访问报文的规则,下面的是响应报文的规则,但是响应的这样相对麻烦
    #iptables -I FORWARD -s 10.1.0.0/16 -p tcp --sport 80 -j ACCEPT
    可以按下面的办法,添加一条规则,将所有的响应的报文均放行,这样就不用重复的添加了<此条规则为所有的响应报文均放行,疑问的话,参考上面的state规则>
    #iptables -I FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
    如:在上面的基础上,需要再开放转发访问22端口的话。
    #iptables -I FORWARD -s 10.1.0.0/16 -p tcp --dport 22 -j ACCEPT
     
    SNAT--也称源地址转换
    内网机器设置网关为iptables机器的中转IP
    1. 内网机器网关设置<gateway>
    2. 开启服务器的转发设置<echo 1>/proc/sys/net/ipv4/ip_forward>
    <10为内网服务器网段,146为服务器的公网IP地址,就是将内网服务器访问过来的报文修改为192.168.1.146,然后再发送出去>
    #iptables -t nat -A POSTROUTING -s 10.1.0.0/16 -j SNAT --to-source 192.168.1.146
    DNAT
    先清空表数据, 146为公司的公网地址<也可以理解为服务器的公网地址>,目标端口为3389,进行目标地址转换
    将访问公网146的3389端口,会被映射到10.1.0.6的3389端口上(注意:设置之前,可能需要设置一下SNAT)
    #iptables -t nat -F
    #iptables -t nat -I PREROUTING -d 192.168.1.146 -p tcp --dport 3389 -j DNAT --to-destination 10.1.0.6:3389
    #iptables -t nat -I PREROUTING -d 192.168.1.146 -p tcp --dport 801 -j DNAT --to-destination 10.1.0.1:80
    MASQUERADE --动态IP的SNAT
    SNAT相同的动作,但是是将IP修改为eth1网卡上可用的IP地址
    #iptables -t nat -I POSTROUTING -s 10.1.0.0/16 -o eth1 -j MASQUERADE
    REDIRECT
    将本机的80端口映射到本机的8080端口上
    #iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
  • 相关阅读:
    typescript
    js-解决安卓手机软键盘弹出后,固定定位布局被顶上移问题
    vue
    js
    Object.assgin基本知识与相关深浅拷贝
    js-工具方法(持续更新)
    vue
    vue
    git
    css
  • 原文地址:https://www.cnblogs.com/drgcaosheng/p/9224458.html
Copyright © 2011-2022 走看看