您的位置:首页 > 运维架构 > Linux

Linux防火墙详解(二)

2017-12-03 17:31 393 查看
一、iptables命令基本语法
二、iptables语法进阶
三、iptables显示扩展
四、iptables简单案例
五、iptables之forward
六、iptables之NAT
一、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]    //执行的动作
-t:指定表
-A:append,追加,默认最后
-I:插入,默认插入为第一条
-C:check,检查该条目是否存在
-D:delete:删除,
1.rule specification
2.rule number
-R:replace替换,和-D用法类似,但是必须指定rule lumber

-S:显示命令行的命令格式,类似于iptables-save,-S输出结果然后重定向到配置那文件中
iptables-restor 恢复配置
-F:flush,清空规则
-L:list 查看
-n:numeric,以数字格式显示地址和端口
-v:verbose,显示详细信息
-vv:更详细
-x:exactily,显示计算器的精确值,而不是换算后的结果
--line-numbers:显示行号
iptables -nvL //L应该写到右边,放在前面不能用
-Z:zero,置0
iptables的每条规则都有两个计数器
1.由本规则匹配到的所有的packets
2.由本规则匹配到的所有的bytes之和
-P:policy,设置链的默认策略
ACCEPT:接受
DROP:丢弃
REJECT:拒绝
-E:rename,重命名自定义的未被引用(引用计数为0)的链
iptables -E testchain mychain //重命名空链
-N:new 新增一条自定义链
-X:删除自定义链空链
CentOS7:
systemctl stop firewalld.service
systemctl disable firewlld.service

允许ssh登录:默认为DROP
iptables -A INPUT -s 192.168.4.0/24 -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -d 192.168.4.0/24 -p tcp -m tcp --sport 22 -j ACCEPT

操作:设置filter的所有表默认DROP
CentOS7,删除默认自定义链:for i in `iptables -L -n | grep "Chain" | cut -n -d' ' -f2 | tail -17`; do iptables -X $i;done
iptables -t filter -P INPUT DROP

注:写规则的时候,需要同时考虑到INPUT和OUTPUT接口

二、iptables语法进阶
1.iptables/netfilter表和链
表[按优先级]:raw-->mangle-->nat-->filter
链: PREROUTING-->INPUT-->OUTPUT--->POSTROUTING
PREROUTING-->FORWARD--->POSTROUTING
raw:PREROUTING,OUTPUT
mangle:PREROUTING,POSTROUTING,INPUT,OUTPUT,FORWARD
nat:PREROUTING,OUTPUT,POSTROUTING
filter:INPUT,OUTPUT,FORWARD

iptables [-t table] SUBCOMMAND chain [matches...] [target]
2.iptables/netfilter匹配和动作
匹配条件:
基本匹配:netfilter自带的匹配机制
[!]-s,--source address/prefix[,..]; 原地址匹配,!表示不被匹配
[!]-d,--destination,目标地址匹配
[!]-i,--in-interface name,限制数据流入的接口,只能用于PREROUTING,INPUT,FORWARD
[!]-o,--out-interface name,限制报文流出的接口,只能用于OUTPUT,FORWARD,POSTROUTING
[!]-p,传输层协议,{tcp,udp,icmp}
tcp扩展:
扩展匹配:经由扩展模块引入的匹配机制,-m matchname //man iptables-extension查看所有的扩展
隐式扩展:可以不用-m选项加载相应模块,前提是使用-p,选项匹配何种协议
显示扩展:必须-m选项专门加载相应模块
隐式扩展:
[!]-p,--protocol PROTOCOL
协议:tcp,udp,icmp,icmpv6,esp,ah,sctp,mh,all
tcp:隐含指明了-m tcp

[!] --source-port,--sport port[:port] //匹配报文中的tcp首部地址,可以使端口范围,10:1024,10,:1024,1024://冒号在前:0到该端口,冒号在后:该端口到最大端口
[!] --destination-port,--dport port[:port]
[!] --tcp-flags mask comp//tcp标志位,检查报文中的tcp标志位,检查报文中comp指明的tcp标志位,要求comp必须为1
--tcp-flags syn,fin,ack,rst syn //检查四个,但是syn必须为1,其他必须为0,这是第一次握手
[!] --syn //tcp第一次握手,相当于-tcp-flags syn,fin,ack,rst syn
[!] --tcp-option number
udp:隐式扩展//tftp,named有用到
-sport
-dport
icmp:
[!] --icmp-type {type[/code]|typename}
请求的是8,回应的是0
type/code;
0/0 :echo reply ,ping回答
8/0 ;echo request ,ping请求
别人ping me:入:8,出:0
me ping别人:出:8,入:0

处理动作:
-j targetname
RETURN:返回调用的链
REDIRECT:端口重定向
LOG:日志
MARK:防火墙标记
DNAT:目标地址转换
SNAT:源地址转换
MASQUERADE:地址伪装

三、iptables显示扩展:
1.multiport:多端口匹配,以离散方式定义多端口匹配,可以指定多个离散端口

[!] --source-ports,--sports port[,port|,port:port]...
[!] --destination-ports,--dports port[,port|,port:port]...
[!] --ports port[,port|,port:port]... //同时匹配,s和d
iptables -I INPUT -s 0/0 -d 192.168.4.118 -p tcp -m multiport --dports 22,80 -j ACCEPT
iptables -I INPUT -s 192.168.4.118 -d 0/0  -p tcp -m multiport --sports 22,80 -j ACCEPT
2.iprange:指明一段连续的IP地址范围

[!] --src-range from[-to]
[!] --dst-range from[-to]
iptables -A INPUT -d 192.168.4.118 -p tcp --dport 23 -m iprange --src-range  192.168.4.1-192.168.4.120 -j ACCEPT
3.string:

--algo {bm|kmp} //对于子串匹配是基于某种算法进行的,需要指定算法
--from offset    //报文的偏移位置
--to offset            //
[!] --string pattern    //给定要检查的字符串模式
[!] --hex-string pattern //16进制编码的子串
//匹配到的子串
iptables -I OUTPUT -s 192.168.4.118  -d 0/0 -p tcp --sport 80 -m string --algo bm --string "h7n9" -j REJECT
4.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...],1-31
[!] --weekdays day[,day...],Mon,Tue,Thu,Web,Fri,SAT,Sun
iptables -R INPUT 4 -d 192.168.4.118 -p tcp --dport 23 -m iprange -src-range 192.168.4.1-192.168.4.120 -m time --timestart 09:00 --timestop 18:00 -j ACCEPT
5.connlimit:限制单个ip对s的连接数,即每个客户端的并发数量

--connlimit-above n //下限,最低多少个,小于等于
--connlimit-upto n //上限大于n,就采取某种动作
iptables -A INPUT -s 0/0 -d 192.168.4.118 -p tcp --dport 23 -m connlimit --connlimit-upto 2 -j ACCEPT
//最多只允许两个用户登录
iptables -R OUTPUT 4 -s 192.168.4.118 -d 0/0 -p tcp --sport 23 -j ACCEPT
6.limit //基于令牌桶算法,对报文的速率做匹配

--limit rate[/second|/minute|/hour|/day] //0
--limit-burst number //同一时刻最多多少个请求,默认为5,并发个数,最多保持个数

iptables -A INPUT -d 192.168.4.118 -p icmp --icmp-type 8 -m limit --limit 10/minute --limit-burst 3 -j ACCEPT
iptables -A OUTPUT -s 192.168.4.118 -p icmp --icmp-type 0 -j ACCEPT
7.state //实现连接追踪的,对报文的状态做连接追踪

[!] --state state    //INVALID, ESTABLISHED,NEW,RELATED,UNTRACKED.
//记录了源地址基于什么协议访问了哪个目标地址,以及sport和dport
//记录经过我,后者我处理过的进程


NEW:连接追踪模板中不存在的连接请求
ESTABLISHED:连接追踪模板中存在记录的模板
RELATED:例如ftp命令连接和数据连接,
INVALID:无法识别的连接,例如ACK,FIN,RST都是1
UNTRACKED:未追踪的连接,没有记录到模板中,在raw.PREROUTING可以设定
//链接追踪,在负载均衡器上,建议关闭,因为会大大降低性能
/proc/net/nf_contrack :链接追踪到的信息查看
链接追踪功能能够追踪到的,最大连接数
/proc/sys/net/nf_conntrack_max,最终到3w多,建议调大
sysctl -w net.nf_conntrack_max=300000 //追踪不到,可能会丢弃,所以建议放大
//echo VALUE 也可以,但都是临时生效

contrack所能够追踪的链接数量的最大值,取决于/proc/sys/net/nf_conntrack_max的设定,超时之后会被删除;已经追踪到的并记录的位于/proc/net/nf_conntrack中
超时的链接将会被删除;当模板满载时,后续的新连接有可能会超时,解决方法
1.加大nf_contrack_max的值
2.降低nf_conntrack条目的超时时长
不同协议的连接追踪时长,定义在/proc/sys/net/netfilter/
链接追踪的作用:

-A INPUT -s 192.168.4.0/24 -p tcp -m multiport --dports 22,23,80 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -s 192.168.4.118/32 -p tcp -m multiport --sports 22,23,80 -m state --state ESTABLISHED -j ACCEP

-A OUTPUT -s 192.168.4.118/32 -p icmp -m icmp --icmp-type 0 -m state --state ESTABLISHED -j ACCEPT
-A INPUT -d 192.168.4.118/32 -p icmp -m icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT
//越可能匹配到的规则,应该写到前面,快速处理
//规则的检查次序:规则在链上的次序即为检查时的生效次序,因此,其优化使用有一定法则;
1.同类规则(访问同一应用),匹配范围小的放前面,用于特殊处理;
2.不同类的规则(访问不同应用),匹配范围大的放前面
3.应该讲哪些可以用一条规则描述的多个规则合并为一.
4.设置默认策略

四、iptables简单案例
建立链接:
1.tcp包头的[Sequence number],C发送给s的X, SYN=1,ACK=0,FIN=0,RST=0 //FIN:断开标志,RST:重置
2.s回复{X+1}作为确认号,并发送自己产生的随机数Y SYN=1,ACK=1,FIN=0,RST=0
3.c确认报文,发送[X+1],并发送确认号[Y+1] SYN=0,ACK=1,FIN=0,RST=0 //同步已经完成
//建立两条虚链路,每条都是单向的
断开链接:
1.c请求断开,c进入FIN_WAIT1, SYN=0,ACK=1,FIN=1,RST=0
2.s确定断开,C进入FIN_WAIT2,s进入TIME_WAIT SYN=0,ACK=1,FIN=0,RST=0
3.s发送剩下的数据包,s进入LAST_ACK, SYN=0,ACK=1,FIN=1,RST=0
4.客户端发送确认,并断开 SYN=0,ACK=1,FIN=0,RST=0

yum instal httpd,vsftpd,nfs,mairadb//测试之用
允许ssh,解决所有
iptables -A INPUT -s 0/0 -d 192.168.4.118 -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -s 192.168.4.118 -d 0/0 -p tcp --sport 22 -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP
放行80
iptables -A INPUT -s 0/0 -d 192.168.4.118 -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -s 192.168.4.118 -p tcp --sport 80 -j ACCEPT
放行named
自己做服务端:53/tcp,出去的53/udp
自己做客户端:自己找根的时候,访问对方的53/tcp,接受对方53端口的通知,但是自己使用的端口却不知到
953: tcp/udp 是rndc使用的端口
区域传送使用:tcp/53
域名解析:udp/53
iptables -A OUTPUT -s 127.0.0.1/32 -d 127.0.0.1/32 -p tcp -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT //放行自己sport :udp/53出去请求别人
iptables -A INPUT -p udp --sport 53 -j ACCEPT //别人响应自己的
cat /etc/resolv.conf
nameserver 192.168.4.118 //自己的ip地址
iptables -A INPUT -p udp --dport 53 -j ACCEPT //别人请求我的
iptables -A OUTPUT -p udp --sport 53 -j ACCEPT //我回应别人的
小结:
1.用的都是udp:53号端口
INPUT: 入和出接口都使用
INPUT: sport:udp:53
OUTPUT: dport:upd:53
2*2=4两个两个交互
A---B[二级NS]---s[一级]
B请求S的时候:dport==udp:53
S回应的时候:sport=udp:53
A请求B的时候:dport=53
B回应A的时候:sport=53

放行samba服务
INPUT和OUTPUT默认策略为DROP,使用iptables放行本机的samba服务

smb: 139,445/tcp
nmb: 137,138/udp
iptables -A INPUT -p tcp -m multiport --dports 139,445 -j ACCEPT
iptables -A OUTPUT -p tcp -m multiport --sports 139,445 -j ACCEPT

允许自己ping别人,但是不允许别人ping自己


请求是8,回应是0
iptables -A OUTPUT -s 192.168.4.118 -d 0/0 -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -s 0/0 -d 192.168.4.118 -p icmp --icmp-type 0 -j ACCEPT

允许别人ping:
iptables -A INPUT -d 192.168.4.118 -p icmp --icmp-type 8 -j ACCEPT
iptables -A OUTPUT -s 192.168.4.118 -p icmp --icmp-type 0 -j ACCEPT

telnet:非工作时间不让访问
iptables -R INPUT 4 -d 192.168.4.118 -p tcp --dport 23 -m iprange -src-range 192.168.4.1-192.168.4.120 -m time --timestart 09:00 --timestop 18:00 -j ACCEPT
iptables -R INPUT 4 -d 192.168.4.118 -p tcp --dport 23 -m iprange -src-range 192.168.4.1-192.168.4.120 -m time --timestart 09:00 --timestop 18:00 -m --weekdays 1,2,3,4,5 -j ACCEPT
放行vsftpd
21:命令端口
20:主动数据连接
//ftp要想使用related状态,必须装载nf_conntrack_ftp
modrpoeb nf_conntrack_max
lsmod | grep ftp

iptables -A INPUT -d 192.168.4.118/32 -p tcp -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.4.118/32 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
注:入接口和出口的RELATED都得开启,而且入接口21/tcp的NEW必须打开,

或则:
INPUT: dport 21,NEW,ESTABLISHED
OUTPUT: sport 21,ESTABLISHED //命令连接

INTPUT:tcp RELATED,ESTABLISHED //数据连接
OUTPUT:tcp ESTABLISHED
1.加载nf_contrack_ftp模块
modrproe nf_conntrack_ftp
2.放行命令连接
iptables -A INPUT -d 192.168.4.118 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.3.118 -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT //这条可以不写,后一条OUTPUT已经包括该条
3.放行数据连接
iptables -A INPUT -d 192.168.4.118 -p tcp -m state --state RELATED -j ACCEPT
iptables -A OUTPUT -s 192.168.3.118 -p tcp -m state --state ESTABLISHED -j ACCEPT

规则的有效期限:
iptables命令添加的规则,手动删除之前,其生效期限为kernel的生命周期
保存
CentOS6: service iptables save
iptables-save > /etc/sysconfit/iptables
CentOS7:
iptables -S > /path/to/some_rule_file
iptables-save > /path/to/some_rule_file
重载:
iptables-restore < /path/to/some_rule_file
CentOS6:
service iptables resart //会自动读取重载规则
自动生效规则文件中的规则
1.把iptables命令放在脚本文件中,让脚本文件开机自动运行
/etc/rc.d/rc.local
2.用规则文件保存规则,开机自动重载命令
/etc/rc.d/rc.local
iptables-restore < /path/to/some_rule_file

问题:开机装载某模块

cd /etc/sysconfig/modules/
vim bridge.modules
#/bin/sh
/sbin/modinfo -F filename bridge > /dev/null 2>&1  //-F显示模块路径名
if [ $? -eq 0 ]; then
/sbin/modprobe bridge
fi
chmod 755 bridge.modules   //这一步至关重要
reboot
lsmod |grep bridge

modinfo //会显示出所有模块信息
-F 指定要显示的字段
注意:CentOS7:使用firewalld-cmd

五、iptables之forward
实验拓扑
inet--- GW ----Internet
GW的内网卡和inet的网卡类型:应该一样,例如都是host-only或者使用vmnet2,
//此处自定义网络(仅主机模式):添加虚拟网络
GW的外网卡为bridge模式

注:GW的inet作为网关,不需要指定自己的网关
建议:自己设置内网,vmware虚拟机的反应速度比较慢,网卡配置不能及时生效
172.16.1.22-->172.16.1.1/192.168.4.118[外网]---->192.168.4.107 //外网
Inet:ping 192.168.4.118 //能够ping同,因为linux的ip地址是内核的不是网卡的
192.168.4.107:有路由到达172.16.1.0网段

tcpdump -i eth0 icmp
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -P FORWARD DROP //
问题1:假如inet ping不通GW的外网ip
GW没有到inet的路由,添加一条既可
建议在inet上添加默认路由指向GW
问题2:echo 1 > /proc/sys/net/ipv4/ip_forward
inet仍热ping不通外网
因为,inet虽然能够出去,但是别人不知道怎么回来
需要在目标主机上,添加回来的路由
或者NAT
例如:在107上windows,这样inet就能ping同107
route add 172.16.1.0 mask 255.255.255.0 192.168.4.118

实验1:内网能够ping通外网,但是外网不能ping通内网
1.echo 1 > /proc/sys/net/ipv4/ip_forward
2.inet 172.16.1.22,外网:192.168.4.107
iptables -P FORWARD DROP
iptables -A FORWARD -s 172.16.1.0/24 -d 0/0 -p icmp --icmp-type 8 -j ACCEPT
iptables -A FORWARD -s 0/0 -d 172.16.1.0/24 -p icmp --icmp-type 0 -j ACCEPT
tcpdump -i eth0 -nn icmp
或者:
iptables -F
iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT //会直接放行icmp-type 0的回应
iptables -A FORWARD -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT
问题4:
httpd和vsftpd服务正在运行 //
iptables -P FORWARD DROP //INPUT和OUTPUT都是ACCEPT,但是该实验不经过INPUT和OUTPUT

放心web:内网访问外网
iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT
iptables -A  FORWARD -s 172.16.1.0/24 -p tcp --dport 80 -m state NEW -j ACCEPT
放行ftp:访问外网的ftp
iptables -A  FORWARD -s 172.16.1.0/24 -p tcp --dport 21 -m state NEW -j ACCEPT
modprobe nf_contrack_ftp
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT //这样能够访问外部的ftp,对方的数据链接也可以
假如需要自动载入的话,需要写入命令:/etc/rc.local
iptables-restore < /etc/sysconfig/iptables-config

注:ip_forward,只能帮你发出去,回来的时候,路由需要手动指定
若想回来的路由也被识别,那就得需要使用nat

处理动作:
ACCEPT/DROP/REJECT
LOG
RETURN //自定义链返回
REDIRECT
SNAT
DNAT
MASQUERADE

LOG://先做日志,然后再做ACCEPT,或者DROP,REJECT操作
--log-level level //emerg,alert,crit,error,warning,notice,info,debug.
--log-prefix prefix //最多29个字符
--log-tcp-sequence //
--log-tcp-options //tcp头部
--log-ip-options //ip头部
--log-uid //user id

iptables -I FORWARD 1 -p tcp -m multiport --dports 22,21,80,23 -m state --state NEW -j LOG --log-prefix "New connections"
//默认LOG级别为4
tail /var/log/messages
RETURN:自定义链的返回

iptables -N web
iptables -A web -s 172.16.1.0/24 -p tcp --dport 80 -j ACCEPT
iptables -I web -m string --algo kmp --string "old" -j REJECT
iptables -A web -j RETURN //这个可加,可不加,默认会有return
//有时需要提前返回的话,需要手动指定
iptables -A FORWARD -p tcp --dport 80 -j web
REDIRECT:端口重定向://只在nat table的PREROUTING,OUTPUT有效
--to-ports port[-port]
--random

默认只有管理员使用大于1024的端口
只对目标端口做修改
GW:httpd 使用8888/tcp
iptables -t nat -A PREROUTING -d 192.168.4.118 -p tcp --dport 80 -j REDIRECT --to-ports 8888

六、iptables之NAT
NAT:network address translation
iptables -t nat -F
iptables -t filter -F
iptables -P FORWARD ACCEPT
NAT表也有三个链:
PREROUTING:
POSTROUTING:
OUTPUT:

tail /var/log/httpd/acces_log //正常的模型先,外网请求httpd,用户是外网的地址

SNAT:source nat
修改IP报文中的源ip,目标ip不动
//GW开启链接追踪功能,根据链接状态信息,区分不同的inet ip
//让本地网络中的主机可使用同一地址与外部主机通信,从而实现地址伪装
请求:修改源ip,如何修改由管理员定义
响应:修改目标ip,由nat自动根据会话表中追踪机制实现响应修改.
用途:主要用于内网用户访问外网
DNAT:destination nat
修改IP报文中的目标IP//源ip不变,一直是外部的
用途:外网请求内网主机[服务],让本地网络中服务器使用同一的地址向外提供服务,但隐藏了自己的真实地址;
请求:外部主机发起,修改其目标地址,由管理员定义
响应:修改源地址,但由nat自动根据会话表中的追踪机制实现对应修改
PNAT:port NAT
REDIRECT就是一种port nat,但是,只能重新定向端口,而不能指定为其他ip
DNAT可以实现,即修该目标地址,同时修改目标端口

问题:REDIRECT,能不能定向到内网的非网关ip
不能:因为REDIRECT只有--to-ports,也就是说只能重定向目标端口,不能重新定向目标ip

GW的数据包流向:PREROUTING--->FORWARD-->POSTROUTING
SNAT:应该在POSTROUTING链上做
DNAT:应该在PREROUTINT链上做

SNAT:只能用在nat表的{POSTROUTING,INPUT}chain上
--to-source ipaddr-ipaddr[:port[-port]] //源地址可以有多个,也可以指定端口
--random 端口映射将成为随机
--persistent

iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 192.168.4.118
tcpdump -i eth0 -nn icmp
//假如是pppoe拨号上网的话,地址会经常发生改变,因此需要写脚本定时更新
MASQUERADE,只能用在nat的POSTROUTING,自动获取外网Ip地址
--to-ports port[-port]
--random
MASQUERADE:需要不停的去判断哪个外网地址可用,会浪费很多资源的
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j MASQUERADE
DNAT:只能用在nat (PREROUTING,OUTPUT)
GW的80端口是关闭的,inet:172.16.1.22:80是开启的
--to-destination [ipaddr[-ipaddr]][:port[-port]]
iptables -t nat -A PREROUTING -s 0/0 -d 192.168.4.118 -p tcp --dport 80 -j DNAT --to-destination 172.16.1.22

端口映射:

iptables -t nat -A PREROUTING -s 0/0 -d 192.168.4.118 -p tcp --dport 80 -j DNAT --to-destination 172.16.1.22:8888 //可以指定为其他inet的地址和端口
iptables -t nat -A PREROUTING -s 0/0 -d 192.168.4.118 -p tcp --dport 22 -j DNAT --to-destination 172.16.1.22 //及时GW和inet的22同时打开,也被定向为inet:22

recent:模块,对于本机的某个服务的访问速录做限制
防止对22号端口做字典攻击//一定程度上有效

(1)#iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP
(2)#iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH //设置新的ssh链接名字为SSH
(3)#iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --update --seconds  300 --hitcount 3 --name SSH -j DROP
connlimit:限制单个ip对s的链接
1.利用connlimit模块将单IP的并发设置为3;会误杀使用NAT上网的用户,可以根据实际情况增大该值;
2.利用recent和state模块限制单IP在300s内只能与本机建立3个新连接。被限制一分钟后即可恢复访问。
3.第一句是记录访问tcp 22端口的新连接,记录名称为SSH
--set 记录数据包的来源IP,如果IP已经存在将更新已经存在的条目
4.第三句是指SSH记录中的IP,300s内发起超过3次连接则拒绝此IP的连接。
--update 是指每次建立连接都更新列表;
--seconds必须与--update同时使用
--hitcount必须与--update同时使用
5.可以使用下面的这句记录日志:
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name SSH --second 300 --hitcount 3 -j LOG --log-prefix "SSH Attack"

第三方模块:
layer7:识别大多数常见的应用层协议,例如http,qq等协议
1.内核打补丁
2.iptables打补丁

小结:
iptables:
四表:filter,nat,manle,raw
五链:PREROUTING,INPUT,OUTPUT,FORWARD,POSTROUTING
iptables命令
表:-N,-X,-P,-E
链:-A,-I,-R,-D,-F,-Z
查看:-L,-S
-L:-n,-x,-v,--line-number
保存规则:iptables-save,iptables-restore
匹配条件:
基本匹配:-s,-d,-i,-o1
扩展匹配:
隐式扩展:
-p{tcp|udp|icmp|sctp|udplite|...}
-p tcp:
--sport,--dport,--tcp-flag,--syn
-p udp:
--sport,--dport
-p icmp:
--icmp-type //8请求,0响应
显示扩展:
1.state:--state //net_conntrack
NEW,ESTABLISHED,RELATED,INVALID,UNTRACKED
2.iprange: --src-range,--dst-range
3.string:--algo {bm|kmp},--string ,-hex-string
4.multiport: --sports,--dports,--ports
5.limit:--limit,--limit-burst //速率限制
6.connlimit:--connlimit-upto,--connlimit-above//一般不同时使用,单ip访问限制
7.time:--datestart,--datestop,--timestart,--timestop,--mothdays,--weekdays
处理动作:
ACCEPT,DROP,REJECT,LOG,RETURN,REDIRECT,SNAT,DNAT,MASQUERADE
推荐博客:http://blog.csdn.net/ruixj/article/details/4268814
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  iptables netfilter Linux