Linux中iptables基础命令
查看连接追踪功能所能够容纳的最大连接数量:
--to-ports port[-port]:映射到某个端口上
## 此命令是把80的端口映射在8080上,虽然访问的是80,但正真提供服务的是8080
使用场景:让本地网络中的吴福气使用统一的地址想外提供服务,但隐藏了自己的真实地址
[root@linuxidc ~]# iptables -A INPUT -d 0/0 -s 10.0.1.2 -p tcp --sport 80 -j ACCEPT请求:有外网主机发情,修改其目标地址,由管理员定义
CentOS 7.0关闭默认防火墙启用iptables防火墙
[root@linuxidc ~]iptables -t nat -A POSTROUTING -s 0/0 -d 172.18.42.201 -j MASQUERADE网络防火墙:工作范围是整个网络;网络防火墙中还可以包含主机防火墙
4表:filter、mangle、nat、raw
此时: syn必须为1
-E:重命名于未被引用的自定义链(引用计数为0,即references为0)查看某表上的规则:
基本匹配:netfilter自带的匹配机制
由本机转发报文:报文流入-->prerouting-->forward-->postrouting-->postrouting
[root@linuxidc ~]# iptables -A INPUT -s 0/0 -d 10.0.1.2 -p tcp --dport 80 --tcp-flags SYN,ACK,FIN,RST SYN -j ACCEPT
[!] --state state
(6)limit扩展:基于收发报文的速率做匹配;
缺点:如果连接模板超载,当有一个新的请求时,web网页会显示连接超时;同时conntrack所能够连接数量的最大值取决于/proc/sysnet/nf_conntrack_max的设定;已经追踪到的记录并记录在/prco/net/nf_conntrack文件中,但当模板满载时,后续的新连接可能会被超时,而连接超时的时长将会被删除;解决的办法有两个
[!] --dst-range from[-to]:目标IP地址;
INVALID:无法识别的连接(一般不会放行)
[root@linuxidc ~]#/sbin/sysctl -p ##修改之后立即生效
iptables [-t table] -R chain rulenum rule-specification
--limit-burst number
--timestart hh:mm[:ss]:起始时间
[!] --source-ports,--sports port[,port|,port:port]...:指定多个源端口;
处理动作:基本处理动作、扩展处理动作、自定义处理动作
iptables [-t table] -D chain rulenum
扩展匹配:经由扩展模块引入的匹配机制;-m matchname
iptables [-t table] -I chain [rulenum] rule-specification
(4)不同类的规则,匹配范围大的放在前面
--log-prefix prefix:说明报文的日志信息是由谁产生的
RELATED:相关联的连接;如ftp协议中的数据连接与命令连接之间的关系;
主动:raw:在限定的时间范围内,关闭在nat表上的启用的连接追踪机制;对应的链为:output、prerouting
-X:删除一条自定义链(删除时要确保链下没有规则)
[!] --tcp-flags mask comp:检查报文中mask指明的tcp标志位,而要这些标志位comp必须为1
(5)connlimit扩展:根据每客户端IP做并发连接数数量匹配;即每客户端最大可同时发起的连接数量
[root@linuxidc ~]#iptables -A INPUT -d 172.18.42.200 -p tcp -dport 80 -m iprange --src-range 172.18.42.1-172.18.42.100 -j ACCEPT
[!] -p{tcp|udp|icmp}:限制协议;指明用哪一种协议
kmp:Knuth-Pratt-Morris
软件防火墙:iptables
当源地址为动态获取的地址时,MASQUERADE会自动判断要转换为的地址
[!] --destination-port,--dport port [:port]:匹配报文中的tcp首部的目标端口;可以是端口范围
udp:
[root@linuxidc ~]#iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
(1)multiport扩展:以离散方式定义多端口匹配;最多指定15个端口;
(2)REDIRECT:端口重定向(之后在报文流入本机前才有用:prerouting)
iptables [-t table] -E old-chain-name new-chain-name
mangle:主要功能是拆解报文、做出修改、重新封装;对应的链为:prerouting、input、output、forward、postrouting[root@linuxidc ~]#iptables -A OUTPUT -s 172.18.42.200 -d 172.18.0.0/16 -p tcp -j ACCEPT[!] --src-range from[-to]:源IP地址;
-N:新增一条自定义链
匹配条件:基本匹配、扩展匹配
--algo {bm|kmp}:字符串匹配检测算法;
[root@linuxidc ~]#iptables -A OUTPUT -s 172.18.42.200 -p tcp --sport 21 -m state --state NEW -j ACCEPT
iptables的相关命令:
[root@linuxidc ~]#iptables -A INPUT -s 0/0 -d 172.18.42.200 -p tcp -dport 80 -m limit --limit 20/second --limit-burst 5 -j ACCEPT连接模板:占用内存空间中的一段空间(内核空间)iptables [-t table] {-A|-C|-D} chain rule-specification
iptables [-t table] -S [chain [rulenum]]
修改IP报文中的源IP地址隐式扩展: --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:结束日期时间
[root@linuxidc ~]#iptables -A OUTPUT -s 172.18.42.200 -d 0/0 -p tcp -m multiport --sports 80,22 -A ACCEPT--to-destination [ipaddr[-ipaddr]] [:port[-port]]
(6)设置默认策略(2)报文流经的位置;判断添加至那个链上
实现对链管理:管理一整条链
##真正提供服务的是172.18.42.202的8080端口(1)LOG:匹配报文中的日志功能
修改IP报文中的目标IP
实现对规则管理:管理链上的某条规则
[!]--monthdays day[,day...]:匹配1-12月中的某些天
-D:删除某条规则
iptables的规则:根据规则匹配条件尝试匹配检查报文,对成功匹配的报文做出相应的处理
[root@linuxidc ~]#modprobe nf_conntrack_ftp ##内核加载nf_conntarck_ftp模块
-v:显示详细信息
[root@linuxidc ~]# vim /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_close_wait
注意:报文是由本机处理,但是是否转发是由路由来决定的;在报文流入本机之后,路由1会判断报文的目标地址是否为本机,如果是,则流入input;如果不是,则流入forwrad,在报文离开本机之前路由2会判断报文经由那个接口送往下一个网关(下一跳),同时在转发之前,要确保转发功能是开启的;1表示开启,0表示关闭:
[root@linuxidc ~]# vim /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_fin_wait
0/8:表示请求
-n:以数字格式显示地址个端口
更多iptables相关教程见以下内容:
主机防火墙:工作范围是单个主机[!] --hex-string pattern:要检测的字符串模式(16进制格式);--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:起始日期时间
tcp:隐含指明了“-m tcp",有专用选项:
nat:主要功能是网络地址转换;对应的链为:prerouting、postrouting、output
[!] -i, --in-interface name:限制报文流入的接口(只能用于prerouting、input、forward这三个链)
[root@linuxidc ~]iptables -A FORWARD -s 0/0 -d172.18.42.200 -p tcp -m multiport --dports 80,21,23,22 -m state -state NEW -j LOG --log-prefix "(linuxidc's log)"
[root@linuxidc ~]#iptables -A INPUT -s 0/0 -d 172.18.42.200 -p tcp -m multiport --dports 80,22 -j ACCEPT
保存编写好的规则并开机启动
[!] -d, --destination address[/mask][,...]:目标地址匹配
[!] --string pattern:要检测的字符串模式;
[root@linuxidc ~]#iptables -A INPUT -s 0/0 -d 172.18.42.200 -p icmp --icmp-type 8 -j ACCEPT
[root@linuxidc ~]#iptables -A OUTPUT -s 172.18.42.200 -d 0/0 -p icmp --icmp-type 0 -j ACCEPT
##请求80端口的是172.18.42.202主机,但正在请求的却是172.18.42.200主机[root@linuxidc ~]iptables -t nat -A PREROUTING -d 172.18.42.200 -p tcp 80 -j REDIRECT --to-ports 172.18.42.201:8080
组成部分:匹配条件、处理动作
filter:主要功能是过滤;对应的链为:input、output、forward
[!] -s, --source address[/mask][,...]:原地址匹配(!s是取反)
(5)将那些可由一条规则描述的多个规则合并为一个
[root@linuxidc ~]#iptables -A INPUT -s 172.18.0.0/18 -d 172.18.42.200 -p tcp -j ACCEPT
响应:修改目标IP,由nat自动根据会话表中追踪机制实现相应的修改
rule-specification = [matches...] [ -j target]
[root@linuxidc ~]iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT
硬件防火墙:NetScreen、CheckPoint
--kerneltz:使用内核上的时区,而非默认的UTC;
[!] --icmp-type {type[/code][typename]
使用场景:本地网络中的主机可使用统一地址与外部主机通信,从而实现地址伪装
-x:显示计数器的精确值
[root@linuxidc ~]#iptables -A OUTPUT -s 172.18.42.200 -d 0/0 -p tcp -sport 80 -m state --state NEW -j ACCEPT(1)加大nf_conntrack_max的值
--limit rate[/second|/minute|/hour|/day]
隐式扩展:无需指明,可以不适用-m选项专门加载响应模块;前提要使用-p选项可匹配何种协议
同一链上的不同表的应用优先级:raw、mangle、nat、filter
echo Num > /proc/sys/net/nf_conntrack_max
(4)DNAT(远程主机请求本地服务器):目标地址转换;发生在prerouting
[root@linuxidc ~]#chkconfig iptables on ##设置为当前规则可开机启动