Linux学习--iptables
Posted 丢爸
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux学习--iptables相关的知识,希望对你有一定的参考价值。
防火墙
工作在主机或网络的边缘,对于进出的数据报文进行检查,监控,根据事先建立好的规则,进行检查,一旦符合标准,就按照制定的规则进行处理的一套机制。
规则(匹配标准和处理办法)
iptables [-t TABLE] COMMAND CHAIN [num] 匹配标准 -j 处理方法
匹配标准:
IP:源IP,目标IP
TCP:源Port,目标Port
UDP:源Port,目标Port
ICMP:icmp类型
通用匹配:
-s|--src:指定源地址
-d|--dst:指定目标地址
-p {tcp|udp|icmp}:指定协议
-i INTERFACE:指定数据报文流入的接口,一般用在PREROUTING,INPUT,FORWARD
-o INTERFACE:指出数据报文流出的接口,一般用在OUTPUT,POSTROUTING,FORWARD
-j TARGET【ACCEPT|DROP|REJECT】:
扩展匹配:
隐含扩展:不用特别指明由哪个模块进行的扩展,因为使用-p {tcp|udp|icmp}
-p tcp
--sport PORT[-PORT]:源端口
--dport PORT[-PORT]:目标端口
--tcp-flags mask comp:只检查mask指定的标志位,是逗号分隔的标志位列表:comp:此列表中出现的标记位必须为1,comp中没出现,而mask中出现的,必须为0
--tcp-flags SYN,FIN,ACK,RST SYN,ACK
--syn:匹配三次握手中的第一次
-p icmp
--icmp-type
0:echo-reply
8:echo-re
-p udp
--sport
--dport
显式扩展:必须指明由哪个模块进行扩展,在iptables中使用-m选项可完成此功能, 可以使用额外的匹配机制
-m EXTENSION --spe-opt:
state:状态扩展
结合ip_conntrack追踪会话的状态
NEW:发起的新连接请求
ESTABLISH:已建立的连接
INVALID:非法连接报文
RELATED:相关联的
-m state --state NEW -j ACCEPT NEW状态的放行
-m state --state NEW ,ESTABLISH -j ACCEPT NEW和ESTABLISH状态的都放行
multiport:离散的多端口匹配扩展
--source-ports
--destination-ports
--ports
-m multiport --destination-ports 21,22,80
iprange:指定地址范围
--src-range ip-ip 源地址区域
--dst-range ip-ip 目标地址区域
connlimit:连接数限制,指定同一个IP地址同时能发起的连接数
! --connlimit-above 【n】:连接数上限
limit
--limit RATE :速率
--limit-burst 7 :上限
string
--algo {bm|kmp}
--string "STRING"
条件取反:!
-s ! 192.168.88.135
-j LOG
--log-prefix "string"
命令:
管理规则:
-A:附加一条规则,添加在链的尾部
-I[--insert] CHAIN [num]:插入一条规则,插入为对应CHAIN上的第num条
-D[--delete] CHAIN [num]:删除指定链中的第num条规则
-R[--replace] CHAIN [num]:替换指定的规则
管理链 :
-F CHAIN:flush,清空指定规则链,如省略CHAIN,则可以实现删除对应表中的所有链
-P CHAIN:设定指定链的默认策略
-N:自定义一个新空链
-X:删除一个自定义的空链
-Z:置零链中所有规则的计数器
-E:重命名自定义的链
查看类:
-L:显示指定表中的所有规则
-n:以数字格式显示主机地址和端口号
-v:显示详细信息
-x:显示计数器的精确值
--line-numbers:显示规则号码
动作(Target):
ACCEPT:放行
DROP:丢弃
REJECT:拒绝
DNAT:目标地址转换
SNAT:源地址转换
REDIRECT:端口重定向
MASQUERADE:地址伪装
LOG:日志
MARK:打标记
默认规则:
开放:堵
关闭:通
规则链:
PREROUTING
INPUT
OUTPUT
FORWARD
POSTROUTING
filter(过滤):表
INPUT
OUTPUT
FORWARD
[root@mail ~]# iptables -t filter -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
nat(地址转换):表
PREROUTING
OUTPUT
POSTROUTING
[root@mail ~]# iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
mangle(拆开、修改、封装):表
PREROUTING
INPUT
OUTPUT
FORWARD
POSTROUTING
[root@mail ~]# iptables -t mangle -L -n
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
raw():表
PREROUTING
OUTPUT
[root@mail ~]# iptables -t raw -L -n
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
优先级顺序
PREROUTING:raw–>mangle–>nat
INPUT:mangle–>filter
FORWARD:mangle–>filter
OUTPUT:raw–>mangle–>nat–>filter
POSTROUTING:mangle–>nat
操作事例
注:需先写好规则,再修改默认的匹配规则,预防把自己挡在规则外面,添加规则时必须有进有出
[root@mail ~]# iptables -t filter -A INPUT -s 192.168.88.1 -d 192.168.88.135 -p tcp --dport 22 -j ACCEPT
[root@mail ~]# iptables -t filter -A OUTPUT -s 192.168.88.135 -d 192.168.88.1 -p tcp --sport 22 -j ACCEP
#修改默认匹配规则
[root@mail ~]# iptables -P INPUT DROP
[root@mail ~]# iptables -P OUTPUT DROP
[root@mail ~]# iptables -P FORWARD DROP
[root@mail ~]# service iptables status
Table: filter
Chain INPUT (**policy DROP**)
num target prot opt source destination
1 ACCEPT tcp -- 192.168.88.1 192.168.88.135 tcp dpt:22
Chain FORWARD (**policy DROP**)
num target prot opt source destination
Chain OUTPUT (**policy DROP**)
num target prot opt source destination
1 ACCEPT tcp -- 192.168.88.135 192.168.88.1 tcp spt:22
#---------删除INPUT链中第3条规则
[root@mail htdocs]# iptables -L -n -v
Chain INPUT (policy DROP 4 packets, 240 bytes)
pkts bytes target prot opt in out source destination
2237 180K ACCEPT tcp -- * * 192.168.88.1 192.168.88.135 tcp dpt:22
143 16615 ACCEPT tcp -- * * 192.168.88.0/24 192.168.88.135 tcp dpt:80
0 0 ACCEPT tcp -- * * 192.168.88.135 192.168.88.0/24 tcp spt:80
... ...
#执行删除操作
[root@mail htdocs]# iptables -D INPUT 3
#删除后结果如下
[root@mail htdocs]# iptables -L -n -v
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
2319 186K ACCEPT tcp -- * * 192.168.88.1 192.168.88.135 tcp dpt:22
143 16615 ACCEPT tcp -- * * 192.168.88.0/24 192.168.88.135 tcp dpt:80
#---------删除INPUT链中第3条规则
#---------添加本地回环地址的ping功能
[root@mail htdocs]# iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -i lo -j ACCEPT
[root@mail htdocs]# iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -o lo -j ACCEPT
[root@mail htdocs]# iptables -L -n -v
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
2742 218K ACCEPT tcp -- * * 192.168.88.1 192.168.88.135 tcp dpt:22
143 16615 ACCEPT tcp -- * * 192.168.88.0/24 192.168.88.135 tcp dpt:80
0 0 ACCEPT all -- lo * 127.0.0.1 127.0.0.1
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
1767 224K ACCEPT tcp -- * * 192.168.88.135 192.168.88.1 tcp spt:22
167 527K ACCEPT tcp -- * * 192.168.88.135 192.168.88.0/24 tcp spt:80
0 0 ACCEPT all -- * lo 127.0.0.1 127.0.0.1
#---------添加本地回环地址的ping功能
#---------打开ping别人的功能,ping别人时,出去的时候icmp-type为8,进来的时候icmp-type为0
[root@mail htdocs]# iptables -A OUTPUT -s 192.168.88.135 -p icmp --icmp-type 8 -j ACCEPT
[root@mail htdocs]# iptables -A INPUT -d 192.168.88.135 -p icmp --icmp-type 0 -j ACCEPT
#---------打开ping别人的功能
#---------打开被别人ping的功能,被别人ping时,进来的时候icmp-type为8,出去的时候icmp-type为0
[root@mail htdocs]# iptables -A INPUT -d 192.168.88.135 -p icmp --icmp-type 8 -j ACCEPT
[root@mail htdocs]# iptables -A OUTPUT -s 192.168.88.135 -p icmp --icmp-type 0 -j ACCEPT
#---------打开被别人ping的功能
#---------保存iptables规则
[root@mail ~]# service iptables save
或
[root@mail ~]# iptables-save > /etc/sysconfig/iptables
#恢复iptables规则
[root@mail ~]# iptables-restore < /etc/sysconfig/iptables
#---------保存iptables规则
#---------state功能
#查看nf_conntrack的状态信息
[root@mail ~]# cat /proc/net/nf_conntrack
ipv4 2 tcp 6 431999 ESTABLISHED src=192.168.88.1 dst=192.168.88.135 sport=50313 dport=22 src=192.168.88.135 dst=192.168.88.1 sport=22 dport=50313 [ASSURED] mark=0 secmark=0 use=2
ipv4 2 tcp 6 299 ESTABLISHED src=192.168.88.135 dst=192.168.88.1 sport=22 dport=49835 src=192.168.88.1 dst=192.168.88.135 sport=49835 dport=22 [ASSURED] mark=0 secmark=0 use=2
#配置信息
[root@mail ~]# ls /proc/sys/net/netfilter
nf_conntrack_acct nf_conntrack_log_invalid nf_conntrack_tcp_timeout_last_ack
nf_conntrack_buckets nf_conntrack_max nf_conntrack_tcp_timeout_max_retrans
nf_conntrack_checksum nf_conntrack_tcp_be_liberal nf_conntrack_tcp_timeout_syn_recv
nf_conntrack_count nf_conntrack_tcp_loose nf_conntrack_tcp_timeout_syn_sent
nf_conntrack_events nf_conntrack_tcp_max_retrans nf_conntrack_tcp_timeout_time_wait
nf_conntrack_events_retry_timeout nf_conntrack_tcp_timeout_close nf_conntrack_tcp_timeout_unacknowledged
nf_conntrack_expect_max nf_conntrack_tcp_timeout_close_wait nf_conntrack_udp_timeout
nf_conntrack_generic_timeout nf_conntrack_tcp_timeout_established nf_conntrack_udp_timeout_stream
nf_conntrack_icmp_timeout nf_conntrack_tcp_timeout_fin_wait nf_log
[root@mail ~]# cat /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established
432000
[root@mail ~]# cat /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_close
10
[root@mail ~]# cat /proc/sys/net/netfilter/nf_conntrack_max
65536
#添加别人能ping自己的防火墙规则
[root@mail netfilter]# iptables -A INPUT -d 192.168.88.135 -p icmp --icmp-type echo-request -m state --state NEW,ESTABLISHED -j ACCEPT
[root@mail netfilter]# iptables -A OUTPUT -s 192.168.88.135 -p icmp --icmp-type echo-reply -m state --state ESTABLISHED -j ACCEPT
#只检查连接状态为ESTABLISHED,不检查端口
[root@mail netfilter]# iptables -I OUTPUT -s 192.168.88.135 -m state --state ESTABLISHED -j ACCEPT
[root@mail netfilter]# iptables -L -n
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 192.168.88.135 tcp dpt:22 state NEW,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 192.168.88.135 icmp type 8 state NEW,ESTABLISHED
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy DROP)
target prot opt source destination
ACCEPT all -- 192.168.88.135 0.0.0.0/0 state ESTABLISHED
#----------------放行ftp连接
[root@mail netfilter]# iptables -I INPUT -d 192.168.88.135 -p tcp --dport 21 -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@mail netfilter]# iptables -R OUTPUT 1 -s 192.168.88.135 -m state --state ESTABLISHED,RELATED -j ACCEPT
#----------------放行ftp连接
#----------------多端口匹配
#---将所有INPUT状态为ESTABLISHED的连接放行
[root@mail netfilter]# iptables -I INPUT -d 192.168.88.135 -m state --state ESTABLISHED -j ACCEPT
#---放行多端口
[root@mail netfilter]# iptables -I INPUT 2 -d 192.168.88.135 -p tcp -m state --state NEW -m multiport --destination-ports 21,22,80 -j ACCEPT
#----------------多端口匹配
#----------------对访问速率进行设定,接收每分钟3个连接
[root@mail vsftpd]# iptables -I INPUT -d 192.168.88.135 -p tcp --dport 22 -m limit --limit 3/minute --limit-burst 3 -j ACCEPT
[root@mail ~]# iptables -R INPUT 3 -d 192.168.88.135 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -m limit --limit 1/second -j ACCEPT
#----------------对访问速率进行设定
#----------------过滤字符串(过滤包含字符串edison的全部拒绝)
[root@mail edison.com]# iptables -I INPUT -d 192.168.88.135 -m string --algo kmp --string "edison" -j REJECT
#----------------过滤字符串
#----------------记录日志,日志会导致磁盘IO,
[root@mail edison.com]# iptables -I INPUT 3 -p icmp --icmp-type 8 -j LOG --log-prefix "---???firewall???---"
#----------------记录日志
#------------------利用iptables的recent模块来抵御DOS攻击
[root@mail edison.com]# iptables -I INPUT 1 -d 192.168.88.135 -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP
[root@mail edison.com]# iptables -I INPUT 2 -d 192.168.88.135 -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
[root@mail edison.com]# iptables -I INPUT 2 -d 192.168.88.135 -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP
#------------------利用iptables的recent模块来抵御DOS攻击
以上是关于Linux学习--iptables的主要内容,如果未能解决你的问题,请参考以下文章
Linux学习笔记(三十三)iptables备份firewalld
Linux学习笔记(三十二)iptables filter表案例 iptables nat表应用