linux防火墙

1.netfilter中五个钩子函数和报文流向

 

 三种报文流向

流入本机:PREROUTING-->INPUT-->用户空间进程

流出本机:用户空间进程-->OUTPUT-->POSTROUTING

转发:PREROUTING --> FORWARD --> POSTROUTING

五个内置链chain:

INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING

五个表table:filter、nat、mangle、raw、security

filter:过滤规则表,根据预定义的规则过滤符合条件的数据包,默认表

nat:network address translation 地址转换规则表

优先级由高到低的顺序为:

security -->raw-->mangle-->nat-->filter

2.iptables

iptables 规则组成

规则rule:根据规则的匹配条件尝试匹配报文,对匹配成功的报文根据规则定义的处理动作作出处理, 规则在链接上的次序即为其检查时的生效次序

匹配条件:默认为与条件,同时满足

基本匹配:IP,端口,TCP的Flags(SYN,ACK等)

处理动作:称为target,跳转目标

·内建处理动作:ACCEPT,DROP,REJECT,SNAT,DNAT,

·自定义处理动作:自定义chain,利用分类管理复杂情形

规则要添加在链上,才生效;

添加在自定义链上不会自动生效

白名单:只有指定的特定主机可以访问,其它全拒绝 

iptables -P INPUT DROP 注意要事先加上规则否则xshell连接不上

黑名单:只有指定的特定主机拒绝访问,其它全允许,默认方式

 

iptables规则添加时考量点

要实现哪种功能:判断添加在哪张表上

报文流经的路径:判断添加在哪个链上

报文的流向:判断源和目的

匹配规则:业务需要

环境准备

Centos7,8

systemctl stop firewalld.service
systemctl disable firewalld. service
#或者
systemctl disable --now firewalld. service

 3.iptables 用法说明

iptables -vnL --line-numbers :n是数字化显示,v显示的更详细,L列出规则,--line-numbers编号

案例

iptables -t filter -A INPUT -s 192.168.0.1 -j DROP
   -t选择表 filter为默认表 -A追加,后面选择链 -s源地址 -j动作 DROP直接抛弃
iptables -A INPUT -s 10.0.0.4 -j DROP
双方都访问不了了

iptables -F 清空规则

 添加回环网卡

iptables -A INPUT -i lo -j ACCEPT

-I:insert, 插入,要指明插入至的规则编号,默认为第一条

iptables -I INPUT 2 -s 10.0.0.1 -j ACCEPT

-D:delete,删除   (1) 指明规则序号   (2) 指明规则本身

iptables -D INPUT 2

-R:replace,替换指定链上的指定规则编号

iptables -R INPUT 2 -s 10.0.0.100 -j ACCEPT

[!] -p, --protocol protocol:指定协议,可使用数字如0(all) protocol: tcp, udp, icmp, icmpv6

iptables -I INPUT 2  !-s 10.0.0.6  -p icmp -j ACCEPT
!取反,除了10.0.0.6协议是icmp的都接受

4.iptables扩展匹配条件

 隐式扩展

iptables 在使用-p选项指明了特定的协议时,无需再用-m选项指明扩展模块的扩展机制,不需要手动加 载扩展模块

显式扩展及相关模块

显示扩展即必须使用-m选项指明要调用的扩展模块名称,需要手动加载扩展模块

tcp协议的扩展选项

 

iptables -I INPUT 2 -s 10.0.0.100 -p tcp --dport 80 -j REJECT 
拒绝100访问tcp模块

[!] --syn:用于匹配第一次握手, 相当于:--tcp-flags SYN,ACK,FIN,RST SYN

udp 协议的扩展选项

[!] --source-port, --sport port[:port]:匹配报文的源端口或端口范围
[!] --destination-port,--dport port[:port]:匹配报文的目标端口或端口范围

icmp 协议的扩展选项

iptables -I INPUT 5 -s 10.0.0.100 -p icmp --icmp-type 8 -j REJECT 
拒绝100的请求报文8,我可以访问100,100不能访问我

[!] --icmp-type {type[/code]|typename}

type/code

0/0   echo-reply icmp应答

8/0   echo-request icmp请求

multiport扩展

以离散方式定义多端口匹配,最多指定15个端口

iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp -m
multiport --dports 20:22,80 -j ACCEPT
可以指定多端口

string扩展

对报文中的应用层数据做字符串模式匹配检测

iptables -A OUTPUT -p tcp --sport 80 -m string --algo bm --from 62  --string  
"google" -j REJECT
如果相应报文里带谷歌就不能访问

state扩展

state 扩展模块,可以根据”连接追踪机制“去检查连接的状态,较耗资源

状态类型

NEW:新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次 发出的请求ESTABLISHED:NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信 状态RELATED:新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关系

INVALID:无效的连接,如flag标记不正确

UNTRACKED:未进行追踪的连接,如:raw表中关闭追踪

[16:35:14 root@aiyoubucuo ~]$sysctl -a |grep nf_conntrack_max
net.netfilter.nf_conntrack_max = 65536
net.nf_conntrack_max = 65536

vim /etc/sysctl.conf

net.netfilter.nf_conntrack_max = 655360
net.nf_conntrack_max = 655360
防止连接数超大

范例

不允许10.0.0.7访问本机,但本机可以访问10.0.0.7

iptables -I INPUT 3 -m state --state ESTABLISHED,RELATED -j ACCEPT

5.iptables规则保存

使用iptables命令定义的规则,手动删除之前,其生效期限为kernel存活期限

centos7,8

iptables-save > /root/iptables
iptables-restore < /root/iptables
开机自动写入
在 vim /etc/rc.local
写入
iptables-restore < /root/iptables
chmod +x /etc/rc.local

6 网络防火墙

SNAT

基于nat表的target,适用于固定的公网

 

[19:52:10 root@firewall ~]$vim /etc/sysctl.conf
[19:58:15 root@firewall ~]$sysctl -p
net.ipv4.ip_forward = 1
[22:08:28 root@firewall ~]$iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j MASQUERADE
10.0.0.0/24网段都可以利用公网地址访问外网,MASQUERADE动态地址静态地址可以使用

[23:39:29 root@server1 ~]$ping 192.168.0.6
PING 192.168.0.6 (192.168.0.6) 56(84) bytes of data.
64 bytes from 192.168.0.6: icmp_seq=1 ttl=63 time=1.78 ms

内网可以ping通外网

[23:38:28 root@initer ~]$ping 10.0.0.4
connect: Network is unreachable

外网ping不通内网

[23:40:45 root@server1 ~]$ssh 192.168.0.6
The authenticity of host '192.168.0.6 (192.168.0.6)' can't be established.
ECDSA key fingerprint is SHA256:iRsmzlIhWlf23RrhyPvDkg9SRnj5/azjYFENU+0ZkFg.
ECDSA key fingerprint is MD5:57:50:82:8c:f1:b7:85:5a:f7:2c:04:87:b4:42:98:15.
Are you sure you want to continue connecting (yes/no)?

10.0.0.5ssh外网

[23:46:16 root@initer ~]$ss -nt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.0.6:22  192.168.0.8:50576
ESTAB 0 36 192.168.0.6:22 192.168.0.1:53511

看到的请求是192.168.0.8

 DNAT

DNAT:nat表的target,适用于端口映射,即可重定向到本机,也可以支持重定向至不同主机的不同端 口,但不支持多目标,即不支持负载均衡功能

[root@firewall ~]#iptables -t nat -A PREROUTING -d 192.168.0.8 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.5:80

[23:54:35 root@initer ~]$curl 192.168.0.8
server1 in lan

访问公网地址,自动跳转到10.0.0.5:80端口

 

7.REDIRECT 转发

REDIRECT,是NAT表的 target,通过改变目标IP和端口,将接受的包转发至同一个主机的不同端口, 可用于PREROUTING OUTPUT链

iptables -t nat -A PREROUTING -d 10.0.0.5 -p tcp --dport 80 -j REDIRECT --
to-ports 8080
在本机的防火墙修改,将80的访问自动转到本机的8080

 

posted @ 2021-01-23 12:45  哎呦不错~~  阅读(88)  评论(0编辑  收藏  举报