Linux的防火墙是内核中的netfilter模块在起作用
iptables优先级最高,是内核级别的,firewalld 防火墙策略优先级次之
主要参考自https://blog.csdn.net/Liang_GaRy/article/details/127383878
centos7安装
yum install iptables
yum install iptables-services
参数
-A 在指定链的末尾添加(append)一条新的规则
-D 删除(delete)指定链中的某一条规则,可以按规则序号和内容删除
-I 在指定链中插入(insert)一条新的规则,默认在第一行添加
-R 修改、替换(replace)指定链中的某一条规则,可以按规则序号和内容替换
-L 列出(list)指定链中所有的规则进行查看
-E 重命名用户定义的链,不改变链本身
-F 清空(flush)
-N 新建(new-chain)一条用户自己定义的规则链
-X 删除指定表中用户自定义的规则链(delete-chain)
-P 设置指定链的默认策略(policy),通常结合sport和dport使用
-Z 将所有表的所有链的字节和数据包计数器清零
-n 使用数字形式(numeric)显示输出结果
-v 查看规则表详细信息(verbose)的信息
-V 查看版本(version)
-h 获取帮助(help)
-m: module_name
-t<表>:指定要操纵的表;filter、nat、mangle、raw,不指定默认使用的是filter表
匹配条件parameter:
-p:指定要匹配的数据包协议类型;tcp udp ICMP 等
-s:指定要匹配的数据包源ip地址;
-j<目标>:指定要跳转的目标;
-d:<匹配目的地址>–>可以是 IP、 网段、域名,也可以空
-sport:源端口
–sport 1000 匹配源端口是1000的数据包
–sport 1000:1005 匹配源端口是1000-1005的数据包
–sport 1000: 匹配源端口从1000开始的流量
–sport :1005 匹配源端口从1005端口结束的流量
-dport:目的端口
–dport 80 匹配目的端口是 80 的数据包
–dport 6000:8000 匹配目的端口是 6000-8000 的数据包(含6000、8000)
–dport :3000 匹配目的端口是 3000 以下的数据包(含 3000)
–dport 1000: 匹配目的端口是 1000 以上的数据包(含 1000)
注意:–sport 和 --dport 必须配合 -p 参数使用
-i<网络接口>:指定数据包进入本机的网络接口;
-o<网络接口>:指定数据包要离开本机所使用的网络接口。
按照模块来匹配
按包状态匹配 (state)
按来源 MAC 匹配(mac)
按包速率匹配 (limit)
多端口匹配 (multiport)
按照包袱状态匹配(state)
-m state --state 状态
#iptables -A INPUT -m state --state PELATED,ESTABLISHED -j ACCEPT
状态:NEW、RELATED、ESTABLISHED、INVALID
NEW:有别于 tcp 的 syn ;如果我们发送一个流的初始化包,状态就会在OUTPUT链 里被设置为NEW,当我们收到回应的包时,状态就会在PREROUTING链里被设置为ESTABLISHED。如果第一个包不是本地产生的,那就会在PREROUTING链里被设置为NEW状 态。
ESTABLISHED:连接态
RELATED:衍生态,与 conntrack 关联(FTP)
INVALID:不能被识别属于哪个连接或没有任何状态
四个状态的讲解:
NEW NEW说明这个包是我们看到的第一个包。意思就是,这是conntrack模块看到的某个连接第一个包,它即将被匹配了。比如,我们看到一个SYN 包,是我们所留意的连接的第一个包,就要匹配它。第一个包也可能不是SYN包,但它仍会被认为是NEW状态。这样做有时会导致一些问题,但对某些情况是有非常大的帮助的。例如,在 我们想恢复某条从其他的防火墙丢失的连接时,或者某个连接已经超时,但实际上并未关闭时。
ESTABLISHED ESTABLISHED已经注意到两个方向上 的数据传输,而且会继续匹配这个连接的包。处于ESTABLISHED状态的连接是非常容易理解的。只要发送并接到应答,连接就是ESTABLISHED的了。一个连接要从NEW变 为ESTABLISHED,只需要接到应答包即可,不管这个包是发往防火墙的,还是要由防 火墙转发的。ICMP的错误和重定向等信息包也被看作是ESTABLISHED,只要它们是我 们所发出的信息的应答。
RELATED RELATED是个比较麻烦的状态。当一 个连接和某个已处于ESTABLISHED状态的连接有关系时,就被认为是RELATED的了。换句话说,一个连接要想是RELATED的,首先要有一个ESTABLISHED的连接。这个ESTABLISHED连接再产生一个主连接之外的连接,这 个新的连接就是RELATED的了,当然前提是conntrack模块要能理解RELATED。ftp是个很好的例子,FTP-data 连接就是和FTP-control有RELATED的。还有其他的例子,比如,通过IRC的DCC连接。有了这个状态,ICMP应答、FTP传输、DCC等才能穿过防火墙正常工作。注意,大部分还有一些UDP协议都依赖这个机制。这些协议是很复杂的,它们把连接信息放在数据包里,并且要求这些信息能被正确理解。
INVALID INVALID说明数据包不能被识别属于 哪个连接或没有任何状态。有几个原因可以产生这种情况,比如,内存溢出,收到不知属于哪个连接的ICMP 错误信息。一般地,我们DROP这个状态的任何东西。
按来源MAC匹配(mac)
-m mac –mac-source MAC
匹配某个MAC地址
iptables -A FORWARD -m mac --mac-source xxxxxxxx -j DROP
#阻断某个来自某MAC地址的数据包,通过本机
注意:
报文经过路由后,数据包中原有的 mac 信息会被替换,所以在路由后的 iptables 中使用 mac 模块是没有意义的;
按照包的速率来匹配(limit)
-m limit –limit 匹配速率【–burst 缓冲数量】
用一定速率去匹配数据包
iptables -A FORWARD -d 192.168.75.131 -m limit --limit 50/s -j ACCEPT
注意:
limit 英语上看是限制的意思,但实际上只是按一定速率去匹配而已,50/s表示1秒中转发50个数据包,要想限制的话后面要再跟一条 DROP
多端口匹配(multiport)
-m multiport < –sports| -dports|–ports> 端口1【端口2…端口n】
一次性匹配多个端口,可以区分源端口、目的端口或者不指定端口
iptables -A INPUT -p tcp -m multiport --dports 192.168.75.131 -j ACCEPT
注意:
如果使用-m multiport参数的话一定要和-p指定协议使用
iptables命令选项输入顺序
iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作
不知道表名时,默认为filter表
五表:
filter表:负责过滤功能,确认是否放行该数据包;内核模块:iptables_filter
nat表:网络地址转换功能,修改数据包中的源、目标IP或端口;内核模块iptables_nat
mangle表:拆解报文、做出修改,并重新封装,为数据包设置标记;iptable_mangle
raw表:确认是否对该数据包进行状态追踪,关闭nat表上启动的连接追踪机制;iptable_raw
security表:是否定义强制访问控制规则(MAC)。
规则表的优先级:raw->mangle->nat->filter
五链,规则链名包括:
INPUT链:处理输入数据包。
OUTPUT链:处理输出数据包。
PORWARD链:处理转发数据包。
PREROUTING链:用于目标地址转换(DNAT)。
POSTOUTING链:用于源地址转换(SNAT)。
动作:
accept:接收数据包。
DROP:丢弃数据包。
reject:拒绝
REDIRECT:重定向、映射、透明代理。
SNAT:源地址转换。
DNAT:目标地址转换。
MASQUERADE:IP伪装(NAT),用于ADSL。
LOG:日志记录。
语法示例
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT #允许本地回环接口(即运行本机访问本机)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #允许已建立的或相关连的通行
iptables -A OUTPUT -j ACCEPT #允许所有本机向外的访问
iptables -A INPUT -p tcp --dport 22 -j ACCEPT #允许访问22端口
iptables -I INPUT 2 -p tcp --dport 22 -j DROP
iptables -A INPUT -p tcp --dport 80 -j ACCEPT #允许访问80端口
iptables -A INPUT -s 192.168.0.3 -p tcp --dport 22 -j ACCEPT #允许192.168.0.3访问22端口
iptables -A INPUT -m set --match-set china src -p tcp -m tcp -j ACCEPT
iptables -A INPUT -m set --match-set china src -p udp -m udp -j ACCEPT
iptables -I INPUT -m set --match-set china src -j ACCEPT
iptables -A INPUT -j reject #禁止其他未允许的规则访问
iptables -A FORWARD -j REJECT #禁止其他未允许的规则访问
iptables -I INPUT -s 123.45.6.7 -j DROP #屏蔽单个IP的命令
iptables -I INPUT -s 123.0.0.0/8 -j DROP #封整个段即从123.0.0.1到
iptables -I INPUT -s 192.168.10.1 -p icmp -j REJECT# 拒绝 指定ip 指定协议 ,立即生效
iptables -I INPUT -s 192.168.10.1 -p tcp --dport 22 -j REJECT # 拒绝 指定ip 指定端口号 ,立即生效
iptables -I INPUT -s 192.168.0.0/24 -p tcp --dport 1000:1010 -j REJECT ## 拒绝 指定网段 指定端口范围 ,立即生效
iptables -A INPUT -j DROP #加到最后一条,拒绝所有
iptables -F 清除预设表filter中的所有规则链的规则 #-F 仅仅是清空链中规则,并不影响 -P 设置的默认规则
iptables -X 清除预设表filter中使用者自定链中的规则
iptables -Z 把所有链的包及字节的计数器清空
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 20022 -j ACCEPT
iptables -m tcp:表示使用TCP模块的扩展功能(tcp扩展模块提供了 --dport, --tcp-flags, --sync等功能)
保存设置
不保存的话,重启会丢失
iptables-save
service iptables save
#iptables-save > iptables_bckp
#iptables-restore < iptables_bckp
规则保存位置 /etc/sysconfig/iptables
cp /etc/sysconfig/iptables /etc/sysconfig/iptables.bak
#手动备份
iptables查看所有规则
因此,要完整展示netfilter规则,您需要
iptables -vL -t filter
iptables -vL -t nat
iptables -vL -t mangle
iptables -vL -t raw
iptables -vL -t security
设置默认策略
-P 设置指定链的默认策略
默认是允许,设置默认拒绝策略,!!!注意设置后会立即丢失远程连接
iptables -P INPUT DROP
设置默认允许策略
iptables -P INPUT ACCEPT
开启iptables,网络明显变慢ssh变慢
iptables -I INPUT -p udp --sport 53 -j ACCEPT
iptables -I INPUT -p tcp --sport 53 -j ACCEPT
或修改/etc/ssh/sshd_config,把UseDNS yes,改为UseDNS no