标签:iptables
iptables总结:
netfilter:有5个钩子函数
1、prerouting 路由前
2、input 输入队列
3、forward 转发队列
4、output 输出队列
5、postrouting 路由后
iptables功能有4个表:
1、filter表
2、mangle表
3、nat表
4、raw表
iptables有5个内置链分别对应与netfilter5个钩子函数:
但是在iptables里要大写:
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
其中,可自定义链,但只有在内置链调用自定义链时,自定义上的规则才生效;
表和链的对应关系:
filter表对应:INPUT, FORWARD, OUTPUT链
mangle表对应:PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING链
nat表对应:PREROUTING, OUTPUT, POSTROUTING,INPUT链
raw表对应:PREROUTING, OUTPUT链
iptables命令的语法格式:
iptables [-t table] {-A|-C|-D} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target
iptables [-t table] -E old-chain-name new-chain-name
rule-specification = [matches...] [target]
match = -m matchname [per-match-options]
target = -j targetname [per-target-options]
精简语法格式:
iptables [-t table] SUBCOMMAND chain [matches..] [target]
-t tables:指明表,默认为filter表, 包括raw, mangle, nat表等;
SUBCOMMAND子命令
链管理:
iptables -N CHAIN-NAME 新增一条自定义链;
iptables -X CHAIN-NAME 删除自定义的空链,先清除规则,才能删除链;
iptables -E CHAIN-NAME CHAIN-NEW-NAME 重命名自定义链,但要求是未被引用的链;
iptables -P {PREROUTING | INPUT | FORWARD | OUTPUT | POSTROUTING} {DROP| ACCEPT | REJECT} 设置链的默认策略;
规则管理:
-A:追加规则,默认追加在最后一个;
-I:插入规则,默认插入为第一个;
-D:删除规则,两种格式:指定规则或指定规则的序列号;
(1)rule specification
(2)rule number
-R:替换指定的规则;
-F:清空规则表;
-Z:给iptables计数器置0;
iptables的每条规则,都有两个计数器:
(1)有本规则匹配到的所有的packets;
(2)由本规则匹配到的所有packets大小之和;
-S:列出指定表上的规则,默认为所有表的规则,类似于iptables-save,可用于保存规则;
保存规则:
centos 6:两种方式
]# service iptables save
或:]# iptables-save > /etc/sysconfig/iptables
]# iptables-save > /PATH/TO/SOME_RELE_FILE
保存任意位置,但是系统不会自动加载;会把文件中原有规则覆盖;
Centos 7:一种方式
]# iptables -S > /PATH/TO/SOME_RELE_FILE
或:]# iptables-save > /PATH/TO/SOME_RELE_FILE
重载预存的规则:]# iptables-restore < /PATH/TO/SOME_RELE_FILE
centos 6专用方式:]# service iptables restart
会自动从/etc/sysconfig/iptables文件中重载规则;
自动生效规则文件中的规则:2种方式
(1)把iptables命令放在脚本文件中,让脚本文件开机自动运行
把iptables命令放在/usr/bin/iptables.sh
在/etc/rc.d/rc.local写明:/usr/bin/iptables.sh
(2)用规则文件保存规则,开机自动重载命令;
在/etc/rc.d/rc.local写明:iptables-restore < /PATH/TO/SOME_RELE_FILE
规则查看:
-L:列出规则;
-n:以数字格式显示地址和端口;
-v:显示详细信息;支持-vv,-vvv更详细信息;
-x:显示精确值;
--line-numbers:显示链上的规则的编号;
组合使用:-nvL,但L要写在后面;
匹配条件:matches
基本匹配:netfilter自带的匹配机制;
扩展匹配:分为隐式扩展匹配和显式扩展匹配;
基本匹配:
[!] -s, --source address[/mask][,...]:指明原地址(范围)匹配;叹号表示取反;
[!] -d, --destination address[/mask][,...]:目标地址匹配;
[!] -i, --in-interface name:限制报文流入的接口,只能用于PREROUTING,INPUT,FORWARD链上;用于前半段;
[!] -o, --out-interface name:限制报文流出的接口,只能用于OUTPUT,FORWARD,POSTROUTING链上;用于后半段;
[!] -p{tcp|udp|icmp}:限制协议;
扩展匹配:
隐式扩展:无需使用-m指定扩展模块
[!] -p {tcp|upd|icmp}:限制协议;每个协议都有专用的扩展条件;
tcp:隐含指明了-m tcp,有如下专用选项:
[!] --source-port,--sport port[:port]:匹配报文中的tcp首部的源端口,可以是端口范围;
: port表示为从0开始到指定的端口;
port :表示为从指定端口开始到最大端口;
[!] --destination-port,--dport port[:port]:匹配报文中的tcp首部的目标端口,可以是端口范围;
[!] --tcp-flags mask comp:检查报文中mask指明的tcp标志位,而要这些标准位comp中必须为1;
例如:
--tcp-flags syn,fin,ack,rst syn 表示检查tcp第一次握手中的4个标志位,syn必须为1,其它3个必须为0;
--tcp-flags syn,fin,ack,rst ack,fin 表示检查tcp四次断开中,请求断开的报文,4个标志位,ack,fin必须为1,其它2个必须为0;
[!] --syn:相当于--tcp-flags syn,fin,ack,rst syn;tcp三次握手的第一次;
udp:隐含指明了-m udp,有如下专用选项:
[!] --source-port,--sport port[:port]:匹配报文中的udp首部的源端口,可以是端口范围;
[!] --destination-port,--dport port[:port]:匹配报文中的udp首部的目标端口,可以是端口范围;
icmp:隐含指明了-m icmp,有如下专用选项:
[!] --icmp-type {type[/code]|typename}
type/code:
0/0: echo reply 回显应答
8/0: echo request 表示ping请求
处理动作:target,每个target有自己的选项
-j targetname [per-target-optons]
targetname目标包含:
ACCEPT,DROP,REJECT:接收,丢弃、拒绝;
RETURN:返回调用者;
REDIRECT:端口重定向;
LOG:开启内核关于匹配到的报文日志记录规则;
MARK:防火墙标记;
DNAT:目标地址转换;
SNAT:原地址转换;
MASQERADE:地址伪装;
LOG:开启内核关于匹配到的报文日志记录规则;
--log-level level 设定日志级别,可用日志级别:emerg, alert, crit, error, warning, notice, info,debug
--log-prefix prefix 日志行前缀,最长29个字母;说明对应的日志信息,是由谁产生的;
--log-ip-options 记录在tcp或ip报文首部中有可变长的可选项信息;
REDIRECT:端口重定向,只能用在nat表上的prerouting,output链上,只有在入栈报文请求刚到达时,才有用,在其它场景都没有意义;能实现指明的端口完成映射;
--to-ports port 映射的指定端口;
端口转换:
REDIRECT能专门实现端口转换机制,而DNAT完成目标端口转换,响应报文时能自动进行源端口转换;
DNAT:修改ip报文中的目标IP地址;仅用在PREROUTING和OUTPUT链上;
使用场景:让本地网络中的服务器使用统一的地址向外提供服务,但隐藏了自己的真实地址,还可实现负载均衡;即转换服务器端地址,把本地私网主机放在互联网上当服务器;
目标地址转换: 外网用户访问本地内网中向外提供服务的主机时,本地网关会进行目标地址转换,把目标地址改为内网的服务器地址,内网服务器响应外网用户时,在本地网关上完成源地址转换,只不过响应报文中不需要用户参与,根据追踪会话表自动完成源地址转换;
--to-destination [ipaddr[-ipaddr]][:port[-port]] 指明目标地址、目标端口,也可是范围;
SNAT:修改ip报文中的源IP地址;只能用在POSTROUTING和INPUT链上;
使用场景:让本地网络中的主机可使用统一地址与外部通信,从而实现地址伪装;即转换客户端地址,一般代理本地私网主机到互联网;
原地址转换:本地内网用户访问外网服务器时,在本地网关上进行原地址转换,把内网用户请求报文中原地址转换为网关的公网地址与外界通信,外网服务器响应内网用户时,进行目标地址转换,只不过响应报文中不需要用户参与,网关根据追踪会话表自动完成目标地址转换,转发给内网用户;
--to-source [ipaddr[-paddr]] 指明原地址、源端口(但源端口一般为随机端口),可指定地址范围;
--random 随机分配端口;
注意:
centos6系统上,nat表只包含3个链:OUTPUT、PREROUTING、POSTROUTING;
而在centos7系统上,nat表包含4个链:INPUT、OUTPUT、PREROUTING、POSTROUTING;
MASQUERADE:地址伪装,仅用在POSTROUTING链上;
使用场景:只用于动态拨号获取ip地址场景中,替换(就无需使用)snat;事实上静态地址时,一样可以使用;
匹配条件:
显示扩展:明确指定扩展,使用-m指明扩展模块;
multiport:多端口匹配,以离散方式定义多端口匹配,最多可以指定15个端口;
[!] --source-ports,--sports-port[,port|,port:port]...
[!] --destination-ports,--dports-port[,port|,port:port]...
[!] --ports port[,port|,port:port]...
iprange:指明一段连续的ip地址范围作为原地址或目标地址匹配;
[!] --src-range from[-to]:原地址范围;
[!] --dst-range from[-to]:目标地址范围;
string:对报文中的应用层数据做字符串匹配检测;对内核版本要大于2.6.14
--algo {bm|kmp}:算法
[!] --string pattern:给定要检查的字符串模式;
[!] --hex-string pattern:给定要检查的字符串模式,十六进制;
time:根据收到报文的时间/日期与指定的时间/日期范围进行匹配;
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:起始日期时间;
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:结束日期时间;
--timestart hh:mm[:ss]:起始时间;
--timestop hh:mm[:ss]:结束时间;
[!] --monthdays day[,day...]:匹配一个月中的哪些天;
[!] --weekdays day[,day...]:匹配一个周中的哪些天;
connlimit:根据每客户端做并发连接数限制,即每客户端最多发起的连接数量;
--connlimit-upto n:连接数量小于等于n,则匹配;
--connlimit-abvoe n:连接数量大于n则匹配;
limit:基于令牌桶算法对报文的速率进行匹配;
--limit rate[/second|/minute|/hour|/day] 设置客户端每秒、分钟、小时、天发送的数据包速率;
--limit-burst number 设置一次突发的大小;默认为5;
state:是conntrack的子集,用于实现对报文的状态做连接追踪;
[!] --state state,状态有如下5种:
INVALID:无法识别的连接;
ESTABLISHED:连接追踪模板当中存在的记录的连接;
NEW:连接追踪模板当中不存在的连接请求;
RELATED:相关联的连接;
UNTRACKED:未追踪的连接;
注意:手动追踪related状态,要安装nf_conntrack_ftp模块;
已经追踪到的并记录下来的连接存放在:/proc/net/nf_conntrack
连接追踪功能所能够记录最大连接数量(可调整):/proc/sys/net/nf_conntrack_max
当模板满载时,后续的新连接有可能会超时,解决办法:
(1)加大nf_conntrack_max的值;
(2)降低nf_conntrack条目的超时时长;不同协议的连接追踪时长定义在:/proc/sys/net/netfilter/有很多timeout文件中定义;
mangle表:会在后面lvs内容中做详细介绍;
raw表:使用不多,不做介绍;
iptables示例:
]# iptables -nL 查看防火墙设置;默认查看filter表在3个链上INPUT,FORWARD,OUTPUT的规则设置;其中policy ACCEPT叫默认策略;
]# iptables -t nat -nL 查看nat表,可出现在4个链上PREROUTING,INPUT,OUTPUT,POSTROUTING;注意:在centos6系统上,nat表不能在INPUT上;
]# iptables -t mangle -nL 查看mangle表
]# iptables -t raw -nL 查看raw表
]# iptables -N mychain 创建自定义链,链名称为mychain;
]# iptables -E mychain inchain 重命名自定义链为inchain;
]# iptables -X mychain 删除空链;注意,此链上如果有规则,要先清空后,才能删除;
]# iptables -t filter -P FORWARD DROP 设定FORWARD默认策略为丢弃,-t filter可省略;
]# iptables -P INPUT DROP 设置INPUT默认策略;
]# iptables -P OUTPUT DROP 设置OUTPUT默认策略;
]# iptables -nL INPUT 查看指定某个链上的规则;
]# iptables -nvL 查看详细信息;
]# iptables -nvxL 查看详细信息,且显示单位为字节;
]# iptables -nvxL --line-number 显示规则编号;
]# iptables -nvvxL --line-number 显示更详细信息;
]# iptables -nvvvxL --line-number 显示更多更详细信息;
]# iptables -S 显示添加的规则命令;
]# iptables -S INPUT 显示在input链上添加的规则命令;
]# iptables -F 清空规则;
设置仅172.18.11.112能连接本机;
]# iptables -A INPUT -s 172.18.11.112 -d 172.18.11.114 -j ACCEPT 设置入栈放行;
]# iptables -A OUTPUT -d 172.18.11.112 -s 172.18.11.114 -j ACCEPT 设置出栈放行;
此时,只有172.18.11.112能ping同本地主机;
设置处理除了172.18.11.112不能连接本机,其它主机均可连接;
]# iptables -A INPUT ! -s 172.18.11.112 -d 172.18.11.114 -j ACCEPT
]# iptables -A OUTPUT ! -d 172.18.11.112 -s 172.18.11.114 -j ACCEPT
此时,只有172.18.11.112不能连接本地主机;
设置仅允许172.18网段的tcp连接本机
]# iptables -A INPUT -s 172.18.0.0/16 -d 172.18.11.114 -p tcp -j ACCEPT
]# iptables -A INPUT -s 172.18.0.0/16 -d 172.18.11.114 -p tcp -j ACCEPT
此时,在172.18.11.111主机不能ping通本机,但可以ssl本机;
放行本地主机ssh服务,任意主机可远程登录本机;
]# iptables -A INPUT -s 0/0 -d 172.18.11.114 -p tcp --dport 22 -j ACCEPT 入栈规则,-s 0/0可省略默认为所有地址;
]# iptables -A OUTPUT -s 172.18.11.114 -d 0/0 -p tcp --sport 22 -j ACCEPT 出栈规则;
]# iptables -P INPUT DROP 默认策略设为禁止访问;所有服务禁止访问本机;
浏览器不能访问172.18.11.114网页
开放本机80端口
]# iptables -A INPUT -d 172.18.11.114 -p tcp --dport 80 -j ACCEPT 入栈规则;
]# iptables -A OUTPUT -s 172.18.11.114 -p tcp --sport 80 -j ACCEPT 出栈规则;
浏览器可访问172.18.11.114网页;
允许自己png别人,禁止别人ping自己:
]# iptables -A OUTPUT -s 172.18.11.114 -d 0/0 -p icmp --icmp-type 8 -j ACCEPT 出栈设置
]# iptables -A INPUT -s 0/0 -d 172.18.11.114 -p icmp --icmp-type 0 -j ACCEPT 入栈设置
开放别人可ping自己:
]# iptables -A INPUT -d 172.18.11.114 -p icmp --icmp-type 8 -j ACCEPT 入栈设置
]# iptables -A OUTPUT -s 172.18.11.114 -p icmp --icmp-type 0 -j ACCEPT 出栈设置
]# iptables -D INPUT 2 删入栈的22端口规则;
]# iptables -D OUTPUT 2 删出栈的22端口规则;
允许172.18网段访问,本机的telnet,ssh,web服务
]# iptables -F 清空规则,默认均为拒绝访问
]# iptables -A INPUT -s 172.18.0.0/16 -d 172.18.11.114 -p tcp -m multiport --dports 22,23,80 -m state --state NEW,ESTABLISHED -j ACCEPT
]# iptables -A OUTPUT -d 172.18.0.0/16 -s 172.18.11.114 -p tcp -m multiport --sports 22,23,80 -m state --state ESTABLISHED -j ACCEPT
开放ping请求,让别人能ping进来
]# iptables -A INPUT -d 172.18.11.114 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT
]# iptables -A OUTPUT -s 172.18.11.114 -p icmp --icmp-type 0 -m state --state ESTABLISHED -j ACCEPT
合并规则尽量写为一条
]# iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
]# iptables -A INPUT -d 172.18.11.114 -p tcp -m multiport --dports 22,23,80 -m state --state NEW -j ACCEPT
]# iptables -A INPUT -d 172.18.11.114 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT
]# iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
放行被动的ftp服务
]# modprobe nf_conntrack_ftp 手动装载模块
]# iptables -A INPUT -d 172.18.11.114 -p tcp --dport 21 -m state --state NEW -j ACCEPT
]# iptables -R INPUT 1 -d 172.18.11.114 -m state --state ESTABLISHED,RELATED -j ACCEPT
保存规则
]# iptables -S
]# iptables-save > /etc/sysconfig/iptables.v1
]# cat /etc/sysconfig/iptables.v1
加载文件预存的规则
]# iptables-restore < /etc/sysconfig/iptables.v1
]# tcpdump -i eno16777736 -nn icpm 抓icmp的ping包
打开防火墙的核心转发
]# echo 1 > /proc/sys/net/ipv4/ip_forward
在防火墙主机只添加一条放进来外网ping包的规则;
]# iptables -A FORWARD -s 0/0 -d 10.0.1.0/24 -p icmp --icmp-type 0 -j ACCEPT
使用基于状态追踪设定规则时,如果只允许内网ping出去,就可把之前设定的两条规则合并;
]# iptables -F
]# iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT
]# iptables -A FORWARD -s 10.0.1.0/24 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT
当外网主机为web、vsftp服务器时,要允许内网主机访问外网的服务器;
在防火墙主机设置规则:
]# iptables -F
]# iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT
]# iptables -A FORWARD -s 10.0.1.0/24 -p tcp --dport 80 -m state --state NEW -j ACCEPT 仅放行出去的请求;
]# iptables -A FORWARD -s 10.0.1.0/24 -p tcp --dport 21 -m state --state NEW -j ACCEP 此时,放行的是vsftp的命令连接,响应通过上面的ESTABLISHED也没问题,但数据连接在被动模式下,没有放行只有在related状态放行才行;数据连接只有第一次请求是related的,而且要识别related而不是new要先装载iptables的模块,即ftp连接追踪的模块;
装载iptables的追踪ftp的连接追踪模块
]# modprobe nf_conntrack_ftp
在被动模式下,服务器发请求,第一次请求为related的,所以是从外网到内网的为related;
替换第一条规则:
]# iptables -I FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
添加日志前缀:
]# iptables -I FORWARD 2 -s 10.0.1.0/24 -p tcp -m multiport --dports 80,22,23,21 -m state --state NEW -j LOG --log-prefix "new connctions: "
]# iptables -F
]# iptables -N web 创建自定义链
]# iptables -vnL
]# iptables -A web -s 10.0.1.0/24 -p tcp --dport 80 -j ACCEPT 添加web链规则,允许本地主机访问web服务;
]# iptables -I web 1 -m string --algo kmp --string "old" -j REJECT 插入第1条web链,包含了old字符串的页面禁止访问;
只要状态是ESTABLISHED应放行;
]# iptables -I web 2 -p tcp -m state --state ESTABLISHED -j ACCEPT 插入web链第2条,放行状态是ESTABLISHED;
再放行ssh服务:
]# iptables -A FORWARD -s 10.0.1.0/24 -p tcp --dport 22 -m state --state NEW -j ACCEPT 由内而外放行请求的报文,虽然没有放行响应的报文,但是在web自定义链上的规则已经放行了;
显式指明返回调用者:
]# iptables -A web -j RETURN 表示web链匹配不到就返回调用者;
在web服务器上添加规则:端口映射(地址转换-->端口转换)
]# iptables -t nat -A PREROUTING -d 172.18.11.114 -p tcp --dport 80 -j REDIRECT --to-ports 80
]# iptables -t nat -D PREROUTING 1
]# iptables -t nat -A PREROUTING -d 172.18.11.114 -p tcp --dport 80 -j REDIRECT --to-ports 8080
为内网用户访问外网在防火墙设置SNAT:
]# iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -j SNAT --to-source 172.18.11.114
如果防火墙有多个外网地址可设为地址范围;如下:
]# iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -j SNAT --to-source 172.18.11.114-172.18.11.117
要禁止内网用户访问ssh服务,22端口:
在网关防火墙设置规则:
]# iptables -t filter -A FORWARD -s 10.0.1.0/24 -p tcp --dport 22 -j REJECT
如果内网1.22为向外提供服务,外网11.111为客户端要访问1.22:
在网关防火墙设置规则:
先确保网关防火墙没有监听80端口;但可向外宣称提供80服务,实际是由内网1.22提供服务;
]# ss -tnl
]# iptables -t nat -F POSTROUTING 指明清除nat表上的postrouting链上的规则;
]# iptables -t nat -A PREROUTING -s 0/0 -d 172.18.11.114 -p tcp --dport 80 -j DNAT --to-destination 10.0.1.22
表示只有目标地址11.114、目标端口为80时,转换目标地址为10.0.1.22目的端口没改
内网主机提供的服务端口跟网关防火墙声称的提供服务的端口不一样时:做端口映射
]# iptables -t nat -F
]# iptables -t nat -A PREROUTING -s 0/0 -d 172.18.11.114 -p tcp --dport 80 -j DNAT --to-destination 10.0.1.22:8090
抓包tcp协议的8090端口
]# tcpdump -i eth0 -nn tcp port 8090
]# iptables -t nat -A PREROUTING -s 0/0 -d 172.18.11.114 -p tcp --dport 22 -j DNAT --to-destination 10.0.1.22
此时,在外网主机11.111上访问网关防火墙11.114的ssh服务,被转给了内网10.22主机;
]# iptables -t nat -A PREROUTING -s 0/0 -d 172.18.11.114 -p tcp --dport 0 -j DNAT --to-destination 10.0.1.22
此时,把目的端口设为0,外网11.111再访问11.114的web服务或ssh服务都被拒绝;在特殊场景中不会是此效果,例如,用到负载均衡器的lvs场景时,会把11.114上的所有端口,统统转到内网主机服务器上;
标签:iptables
原文地址:http://linsj.blog.51cto.com/5440766/1769563