种心收默

iptables命令提取总结,包含扩展模块<取自朱双印博客>

以下内容只是一些命令相关的,以朱双印博客中的iptables的教程提取出来的。纯粹只是命令的总结,如果需要看理论的知识,建议去看朱老师的博客,目前还没有看到写得比这个好的了。
<http://www.zsythink.net/archives/category/%e8%bf%90%e7%bb%b4%e7%9b%b8%e5%85%b3/%e9%98%b2%e7%81%ab%e5%a2%99/>
看完朱老师的博客,理论上面是理解过了,但是一些命令的东西总是要返回去找,所以自已就提取了下一些命令,写成下面的这篇了。
 
 
报文流向
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
详解看如下朱双印老师博客的说明:
http://www.zsythink.net/archives/1578
用于匹配报文的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
详细看下面链接中朱双印老师的讲解
http://www.zsythink.net/archives/1588
禁止所有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

posted on 2018-06-25 15:24  samcao  阅读(2600)  评论(0编辑  收藏  举报

导航