1》各种传输方式到最后都会转化为能够通过网络发送的数据格式:
1>文本格式;
2>二进制格式;
2》TCP三次握手连接,四次断开,连接时客户端是主动打开,服务器是被动 打开,处于监听状态;
TCP有限状态机:
3》防火墙:可能是硬件,也可能是软件;
规则:匹配标准和处理方法(除了制定的规则,还应有一种默认规则,默认规则一般处于关闭状态);
匹配标准: IP:SIP,DIP
UDP:SPORT,DPORT
ICMP:icmp-type =SYN=1,ACK=0,FIN=0,RST=0 第一次连接
TCP:SPROT,DPORT====== =SYN=1,ACK=1,FIN=0,RST=0 第二次连接
= SYN=0,ACK=1,RST=0,FIN=0 第三次连接
防火墙用于数据报文过滤,Linux中的防火墙处于内核之中的TCP/IP模块中;
4》文件/proc/sys/net/ipv4/ip_forward 中可以开启本机转发功能;
钩子函数(hook function):TCP/IP协议栈上的一个补充;
1>prerouting 路由决策之前====》用于目标IP地址转换
2>input 进入本机
3>output 从本机出来
4>forward 转发
5>postrouting 路由决策之后====》用于源IP地址转换
四表五链:
filter表(过滤):
input
output
forward
nat表(地址转换):
prerouting
postrouting
output
mangle表(拆开,修改,封装):
prerouting
input
forward
output
postrouting
raw表(不作修改,原始格式):
prerouting
output
************1>可以使用自定义链,但只有在被调用的时候才能发挥作用,而且如果没有自定义链中的任何规则匹配,还应该有返回机制,用户可以删除自定义的空链, 默认链无法删除;
2>每个规则都有两个内置的计数器,一个用来记录被匹配的报文的个数,一个记录被匹配的报文的大小之和;
5》规则:匹配标准和处理方法;===========》用rpm ql iptables 命令可以查看是否按照了iptables模块
语法:
iptables [-t table] command chain [num] 匹配标准 -j 处理方法
通用匹配:
-s; --src 指定原地址
-d; --dst 指定目标地址
-p {tcp,udp,icmp} 指定协议
-i , interface 指定数据报文流入的网卡
-o , interface 指定数据报文流出的网卡
****-i一般用于PREROUTING,INPUT,RORWARD这三条链;
-o一般用于POSTROUTING,OUTPUT,FORWARD这三条链;
-j: TARGET(动作)
ACCEPT 接受通过
DROP 丢弃
REJECT 拒绝
eg: iptables -t filter -A INPUT -s 172.16.0.0/16 -j DROP
i ptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.7 -j DROP
匹配标准:
通用匹配:自身能够完成的检查;
扩展匹配:依赖于扩展模块才能完成的检查;
扩展匹配:
隐含扩展:不用特别指明由哪个模块来进行的扩展,因为此时使用了-p {tcp,udp,icmp};
显示扩展:必须指明由哪个模块进行的扩展,在iptables中使用-m选项来完成此项功能;
******/lib/iptables文件下有许多扩展匹配所依赖的扩展模块;
5》相关命令:
1>管理规则的命令:
-A:附加一条规则,添加在链的尾部;
-I CHAIN [num] :插入一条规则,插入为对应链上的第num条,不加num则默认为第一条;
-D CHAIN [num] : 删除指定链中的第num条规则;
-R CHAIN [num] : 替换指定链上的规则
2>管理链的命令:
-F [CHAIN]: 清空指定规则链,如果省略CHAIN,则可以实现删除对应表中的所有链;
-P CHAIN : 设定 指定链的默认策略;
-N :自定义一个新的空链;
-X:删除一个自定义的空链;
-Z:置零指定链中所有规则的计数器;
-E:重命名自定义的链;
3>查看类的命令:
-L : 显示指定表中的规则;
-n : 以数字格式显示主机地址和端口号;
-x: 显示精确值,不进行估算;
-v:显示详细信息;
--line-numbers: 显示规则号码;
4>动作(target)参数:
ACCPT: 接受通过
DROP: 丢弃
REJECT: 拒绝
DNAT: 目标地址转换
SNAT: 源地址转换
REDIRECT: 重定向/端口重定向
MASQUERADE: 地址伪装(源地址转换)
LOG: 日志
MARK: 打上标志
5>扩展匹配:
隐含扩展:
-p tcp
--sport port /port-port 源端口,也可以使用连续的端口号
--dport 目的端口
--tcp-flags 标志位
--tcp-flags mak comp
--tcp-flags SYN,FIN,ACK,RST SYN TCP的第一次连接握手
****mask:只检查此列表中指定的标志位,是逗号分隔的标志位列表;
comp:此列表中出现的标志位必须为1,此列表中没出现,mask中出现的必须为0;
-p icmp
--icmp-type
0 回送应答
8 回送请求
-p udp
--sport
--dsport
eg: 自己可以ping 别人规则:
iptables -A OUTPUT -s 172.16.100.7 -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -d 172.16.100.7 -p icmp --icmp-type 0 -j ACCEPT
eg: 本机IP为172.16.100.7,开放本机的sshd服务; 22/tcp
iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.7 -p tcp --dport 22 -j ACCEPT
iptables -t fileter -A OUTPUT -s 172.16.100.7 -d 172.16.0.0/16 -p tcp --sport 22 -j ACCEPT
6》iptables不是服务,但有服务脚本,服务脚本的主要作用在于管理保存的规则;
lsmod |grep iptables 命令可以查看相关的iptables的模块
iptables的相关模块可以装载及移除:
iptables_nat,iptables_filter,iptables_mangle,iptables_raw,ip_conntrack
指定默认规则,除了上述的sshd服务外其他的都不允许访问:
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
将WEB服务可以访问的规则放在第一条示例:
iptables -I INPUT -d 172.16.100.7 -p tcp --dport 80 -j ACCEPT
iptables -I OUTPUT -s 172.16.100.7 -p tcp --sport 80 -j ACCEPT
允许自己能够ping通自己的规则定义示例:
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -i lo -j ACCEPT
iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -o lo -j ACCEPT
7》ip_conntrack: 连接追踪模块:
/proc/net/ip_conntrack 这个内核文件保存着当前系统上其他主机与当前主机建立的连接关系,也可以用iptstate命令来查看这些连接关系;
iptstate -t 可以显示当前连接的每种连接的个数;
service iptables stop可以移除iptables加载的所有相关内核模块,移除之后,/proc/net/ip_conntrack文件就不存在了;
modprobe ip_conntrack 可以手动装载ip_conntrack模块,装载之后那个文件就有了;
cat /proc/sys/net/ipv4/ip_conntrack_max 文件来定义/proc/net/ip_conntrack 文件最大可以保存多少个连接记录;
modprobe -r nfnetlink 移除模块nfnetlink;
8》显式扩展:
-m EXTESTINN --spe-opt
state:状态扩展,结合ip_conntrack追踪会话的状态;
NEW: 新连接的请求
ESTABLISHED: 已建立的连接
INVALID: 非法连接
RELATED: 相关联的
-m state --state NEW,EXTABLISHED, - j ACCEPT
****定义好规则之后可以用命令service iptables save 来保存在/etc/sysconfig/iptables 中,这样重启后规则也不会失效;iptables
- save >/etc/sysconfig/iptables.2017.2 可以将文件保存在特定的文件中;iptables -restore </etc/sysconfig/iptables.2017.2可以使这些规则生效;
示例:
server: 172.16.100.7 开放sshd,httpd服务,设置好追踪连接;
iptables -A INPUT -d 192.168.1.106 -p tcp --dport 22 -m state --state NEW,ESTABLISHED, -j ACCETP
iptables -A OUTPUT -s 192.168.1.106 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP
WEB服务也一样,只需改端口就好;
iptstate 命令可以查看连接状态;
sysctl -w net.ipv4.ip_conntrack_max=65536 命令修改保存连接记录的最大值,但只能临时有效;
cat /proc/sys/net/ipv4/ip_conntrack_max 命令来查看连接记录的最大值;
在文件/etc/sysctl.conf 文件中修改相关值可以永久有效;
在目录/proc/sys/net/ipv4/netfilter 下有很多关于各种连接的超时设置的文件;
示例:放行别人ping自己
iptables -A INPUT -d 172.16.100.7 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -jACCEPT
iptables -A OUTPUT -s 172.16.100.7 -p icmp --icmp-type 0 -m state --state ESTABLISHED -j ACCEPT
iptables -L -n --line-numbers 可以显示规则的行号
*********高效规则制定:可以将相关规则合为一条,任意协议任意IP保持连接的都可以出去;
iptables -I OUTPUT -s 172.16.100.6 -m state --state ESTABLISHED -j ACCEPT
FTP服务:基于本机的MYSQL认证登录;
iptables -A INPUT -d 172.16.100.6 -p tcp --dport 21 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INTPUT -d 172.16.100.7 -p tcp -m state --state RELATED -j ACCEPT
修改OUTPUT链的第一条规则:
iptables -R OUTPUT 1 -s 172.16.100.7 -m state --state ESTABLISHED,RELATED -j ACCEPT
*****在制定关于ftp规则之前首先要装载ip_conntrack_ftp 和ip_nat_ftp模块;
在文件/etc/sysconfig/iptables-config 中编辑IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp"
===================最终高效规则:
9》multiport :离散的多端口匹配扩展
--source-ports
--destination-ports
--ports
-m multiport --destination-port 21,22,80 -j ACCEPT
iptables -I INPUT 2 -d 172.16.100.7 -p tcp -m multination --destination-ports 21,22,80 -m state --state NEW -j ACCEPT
在所有的规则中可以使用英文字符!来表示条件取反:
-s ! 172.16.100.7
-m iprange : 指定范围内的IP地址;
--src-range
--dst-range
iptables -A INPUT -p tcp -m iprange --src-range 172.16.100.3-172.16.100.100 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
*****也可以加!取反,取这个范围之外的IP地址;
-m connlimit:连接数限制
! --connlimit-above n 连接数上限 n (允许<n人访问)
每个用户允许连接数为两个以内:
iptables -A INPUT -d 172.16.100.7 -p tcp --dprot 80 -m connlimit ! --connlimit-above 2 -j ACCEPT
-m limit : 流量控制
--limit RATE (速率) 每个时间段允许连接多少个
--limit-burst number 允许一下子涌来多少个
eg: 对ping进行设置:
iptables -A INPUT -d 172.16.100.7 -p icmp --icmp-type 8 -m limit --limit 5/minute --limit-burst 6 -j ACCEPT
iptables -A OUTPUT -s 172.16.100.7 -p icmp --icmp-type 0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-m string 对一些特定的字符串进行限制(网页中的内容)
--algo {bm|kmp}
--string “STRING”
iptables -I OUTPUT -s 172.16.100.7 -m string --alge kmp --string “h7ng” -j REJECT
10》-j LOG 记录日志,如果链中有ACCEPT,DROP,REJECT等动作,要将LOG放在第一条;
--log-prefix 存放日志前缀
iptables -A INPUT -d 172.16.100.7 -p icmp --icmp-type 8 -j LOG --log-prefix “firewall log foricmp--”
用命令tail /var/log/messages 来查看相关日志
11》自定义规则链:
iptables -N 链名
iptables -N clean_in
在自定义规则链下添加规则:
iptables -I INPUT -j clean_in 刚进来就调用自定义的链
iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP
iptables -A clean_in -d 172.16.100.7 -p icmp -j DROP
iptables -A clean_in -p tcp ! --syn -m state --state NEW -j DROP
iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP
iptables -A clean_in -p tcp --tcp-lags ALL NONE -j DROP
iptables -A clean_in -d 172.16.100.7 -j RETURN 返回主链
12》利用iptables的recent模块来抵御DOS攻击:
SSH:远程连接
iptables -I INPUT 2 -d 172.16.100.7 -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP
iptables -I INPUT 3 -d 172.16.100.7 -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -I INPUT 4 -d 172.16.100.7 -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 ---name SSH -j DROP
1>利用connlimit模块将单IP的并发设置为3;(会误杀使用NAT上网的用户,可以根据实际情况增大该值)
2>利用recent和state模块限制单IP在300s内只能与本机建立2个新连接,被限制五分钟后即可恢复访问;
第二句是记录访问tcp 22号端口的新连接,记录名称为SSH,--set 记录数据包的来源IP,如果IP 已经存 在将更新已经存在的条目;
第三句是指SSH记录中的IP,300s内发起超过3次连接则拒绝此IP的连接;
--updat 是指每次建立连接都更新列表
--seconds 必须与--rcheck 或者--update 同时使用
--hitcount 必须与--rcheck 或者 --upddate 同时使用
3>iptables的记录:/proc/net/ipt_recent/SSH,也可以使用下面的命令来记录日志;
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name SSH --seconds 300 --hitcount 3 -j LOG --log-prefix “SSH Attack”
13》NAT: 网络地址转换
DNAT: 目标地址转换
SNAT: 源地址转换 (POSTROUTING,OUTPUT)
****在文件/proc/sys/net/ipv4/ip_forward:1中开启路由转发功能,这种方式暂时有效;
在文件/etc/sysctl.conf中修改net.ipv4.ip_forward=1永久有效;
-j SNAT
--to-source IP
--to-source IP-IP 可以指向多个IP,动态IP地址池
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.100.7
=====ADSL:123.2.3.2
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 123.2.3.2
=====禁止本机与外网进行ping但不禁止其他通信:
iptables -A FORWARD -s 192.168.10.0/24 -p icmp -j REJECT
=====只允许内网主机访问外网,ping 外网,不允许外网的访问内网,ping 内网
iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 192.168.10.0/24 -p tcp --dport 80 -m state --state NEW -j ACCEPT
iptables -A FORWARD -s 192.168.10.0/24 -p icmp --icmp-typpe 8 -m state --state NEW -j ACCEPT
======放行外网的FTP服务需要使用RELATED状态:
iptables -A FORWARD -s 192.168.10.0/24 -p tcp --dport 21 -m state --state NEW -j ACCEPT
iptables -I FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
要记得开启:ip_nat_ftp 和ip_conntrack_ftp两个模块;在文件/etc/sysconfig/iptables-config中添加;
DNAT:外网访问内网;
iptables -t nat -A PREROUTING -d 172.16.100.7 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.22
PNAT: 端口转换
iptables -t nat -R PREROUTING -d 172.16.100.7 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.22:8080
拒绝对内网中的网站包含特定字符的访问:
iptables -A FORWARD -m string --algo kmp --string “h7ng” -j DROP
====丢弃发送至192.168.1.1的所有数据以及分片数据:
iptables -A OUTPUT -f -d 192.168.1.1 -j DROP
====记录192.168.0.1至192.168.0.22地址段内所有的主机发送给路由要求转发的数据包,并允许转发这些数据包
iptables -A FORWARD -m iprange --src-range 192.168.0.1-192.168.0.22 -p tcp --dport 80 -j LOG
iptables -A FORWAR -m iprange --src-range 192.168.0.1-192.168.0.22 -p tcp --dport 80 -j ACCEPT
14》防火墙备份与还原
相关命令:
iptables-save >/etc/sysconfig/iptables
iptables-save >firewall.bak
iptables-restore <firewall.bak
15》iptables之layer7(针对服务进行的七层过滤)
1> 内核编译:
2.6----------》3.0
单内核:模块化(文件系统;驱动;安全相关功能)
配置:.config(/proc/cpuinfo,lspci,lsusb,hal-device)
make menuconfig
make gconfig
make kconfig
make config
编译:make
只编译部分源码:
make SUBDIR-arch
make drivers/net/pcnet32.ko
make dir
可以将编译结果转存到其他地方:
make O=/path/to/somewhere
安装内核模块:
make modules_install
安装内核:
make install
2>layer7
netfilter:rules
iptables: 语法正确