欢迎各位兄弟 发布技术文章
这里的技术是共享的
Denial of Service
利用iptables的 recent (最近)模块来抵御DOS攻击
当然抵御的能力是有限的,只能在一定范围内有效果
下面的SSH是模板名称(
用户请求ssh服务都把它记录下来,把每一条服务,每一个ip地址,
可以理解为一个内存空间)
我们给一个内存空间起名叫SSH,并且设定了有这个模板的存在,
而后我们会不停的更新这个模板,一旦有用户第二次请求了,马上更新这个模板,
--seconds 300 表示1)在300秒之内(5分钟)更新加1吧
2)如果超过了 --hitcount(上限是多少) ,我们拒绝 300秒(5分钟)
下面是NEW 是由 连接追踪模块来实现的(ip_conntrack模块) ,并不意味着在写下面的iptables代码之前的打开的putty窗口就不是NEW了,
因为只要ip_conntrack曾经记录过的,都是NEW
NAT: Network Address Translation 网络地址转换
DNAT:(D destination)目标地址转换 (destination network address transfer)
SNAT:(S source)源地址转换 (POSTROUTING上做源地址转换 ,也可以 OUTPUT上做)(对于网关来讲只在POSTROUTING上做源地址转换)
事实上两个地址都转换
-j SNAT
--to-source : 转换哪一个地址作为源地址的,明确指定源地址是什么
-j MASQUERADE : (MASQUERADE 伪装;假扮;乔装;冒充;掩饰)能够自动查找能上互联网的地址,而且将这个地址作为源地址来转换(相当于 -j SNAT 并指定某一个地址的,只有外网地址是动态获取的时候,才使用 -j MASQUERADE,否则不要使用-j MASQUERADE,因为-j MASQUERADE的效率比SNAR低很多)
ADSL: 123.2.3.2 只有一个外网,局域网内的所有的电脑此时都可以上网
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT -to-source 123.2.3.2
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o ppp0 -j SNAT -to-source 123.2.3.2 (-o ppp0 就是拔号网络的网卡,只有送往互联网的时候,才会从 ppp0这个网卡流出,ppp0 就是ADSL的虚拟的拔号网络所对应的网卡,(如果有多块网卡就是ppp0,ppp1,ppp2 ?),当然可以不用限定 -o 的,当然限定的越精确越好)
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT -to-source 123.2.3.2-123.2.3.5 (转换的地址可以是这四个中的任意一个)
192.168.0.223 --> 192.168.0.254 --> www.magedu.com
-j DNAT
--to-destination IP[:port]
现在不支持 DNAT到多个地址去了,早先是支持的--to-destination IP[:port]-IP[:port],实现负载均衡
现在负载均衡的功能专门用lvs来实现,此处 --to-destination 只能使用一个地址
PNAT: Port NAT port 地址转换 端口映射
新建一个自定义链 -N (-E重命名自定义链)
[root@localhost ~]# iptables -N clean_in
[root@localhost ~]# iptables -L -n
references 引用 就是这哪个主链所调用
[root@localhost ~]# iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP
[root@localhost ~]# iptables -L -n --line-numbers
[root@localhost ~]# iptables -A clean_in -d 192.168.1.255 -p icmp -j DROP
[root@localhost ~]# iptables -L -n --line-numbers
[root@localhost ~]# iptables -A clean_in -p tcp ! --syn -m state --state NEW -j DROP
[root@localhost ~]# iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP
[root@localhost ~]# iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP
返回主链
[root@localhost ~]# iptables -A clean_in -d 192.168.1.15 -j RETURN
先跳转到clean_in 这个链 (此时 clean_id 的 references 引用就是1了)
[root@localhost ~]# iptables -I INPUT -j clean_in
ping 一下广播地址,它找一台在线的主机来响应,但是没有到达我们的服务器
(我们的服务器收不到,也就不会有新的报文)
通过nc 或其它工具来实现伪造报文(tcp六个标识位全部为1的话),就不演示了
[root@localhost ~]# iptables -L -n -v --line-numbers (报文还有匹配到的)
删除自定义的链
[root@localhost ~]# iptables -X clean_in
iptables: Too many links
要想删除自定义的链
1)自定义的链必须是空链
2)自定义的链必须没有引用指向它
把 recent 的功能 放在 INPUT 的 clean_in 链引用之后吧
( 这里 -m connlimit 与 -m recent 结合起来用,作用才更理想,因为 -m recent 指的是几分钟之内不超过几个连接,再过几个钟还可以有新连接的,总连数会大于 --hitcount 的 ,--hitcount 3 时,最近最多只能两个连接,不是3个)
[root@localhost ~]# iptables -I INPUT 2 -d 192.168.1.15 -p tcp --dport 22 -m connlimit --connlimit-above 3 -j REJECT (单个连接超过3个就拒绝)
[root@localhost ~]# iptables -I INPUT 3 -d 192.168.1.15 -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
[root@localhost ~]# iptables -I INPUT 4 -d 192.168.1.15 -p tcp --dport 22 -m state --state NEW -m recent --update --name SSH --seconds 300 --hitcount 3 -j DROP
[root@localhost ~]# iptables -L -n --line-numbers
[root@localhost ~]# iptables -L -n --line-numbers -v
[root@localhost ~]# iptables -R INPUT 2 -d 192.168.1.15 -p tcp --dport 22 -m connlimit --connlimit-above 6 -j REJECT (把这个放在第2行,每次都要检查的话,可能效率,性能会低下很多)
路由跳转(不是网络地址转发),从一个网络中上报文转发至另一个网络中,需要开启ip_forward,
/proc/sys/net/ipv4/ip_forward 默认为0,应该置为1,如果置为1,这台电脑就变成了路由器,
不仅仅可以是两个网卡,也可以是一个网卡的两个地址
前提是左边电脑的网关必须指向 10.2 右边电脑的网关必须指向100.1
# ifconfig
ping 网关
中间的这个联结电脑 (在本文中 就是中间电脑)
# iptables -L -n
# iptables -P INPUT ACCEPT
# iptables -P OUTPUT ACCEPT
# iptables -F 不指定链,那么会清空filter中的所有的链
windows 可以ping通联结电脑
联结电脑没有打开 ip_forward ,但是可以ping 联结电脑的
windows 可以ping通联结电脑的另一个网卡ip地址
(对linux主机来讲,ip地址是属于主机的不属于网卡)
(ping 同一台主机,无论有多少地址,无论在哪个网卡,
看起来都是同一个主机地址,都能ping通,这并不是一个转发)
(如果ping 的是主机 之外的连的另一个主机ip地址,才叫转发)
windows ping 联结电脑连的另一台主机,肯定ping不通
]
打开联结电脑的 转发功能
# cat /proc/sys/net/ipv4/ip_forward
# echo 1 > /proc/sys/net/ipv4/ip_forward
要想永久有效
# vim /etc/sysctl.conf
改上面的 /etc/sysctl.conf 然后 # sysctl -p 也能让它(地址转发)生效
windows 还是不能ping通
另一台 linux 电脑
# route del -net 0.0.0.0
# route add default gw 172.16.100.7
此时在 内存windows 上 可以ping 通 另一台linux电脑
另一台 linux 电脑 上ping 一下
如果 左边网段(局域网网段)中 接中间联结电脑(直接连公网) 然后上网 到服务器 ,
必须要转换地址,否则报文发出去,却回不来,因为左边是局域网的ip,
而服务器回应的时候,如果不转换的话,就是公网上回应一个局域网的ip(私有地址),自然就找不到回应的电脑了
nat会话表 根据TCP序列号(假设序列号,事实上 udp icmp nat地址转换都能追踪的)来判断到底是响应到哪个主机上的
nat 是借助于 ip_conntrack ( ip_conntrack 是借助于ip 报文来追踪的)来追踪的
做源地址转换的时候,自动进行目标地址转换
做目标地址转换的时候,自动进行源地址转换
nat池 nat表
做源地址转换的时候,事实上也有目标地址转换,只不过目标地址转换是自动进行的
先在 另一台服务器(我们认定的外网)上装一台web 服务器
下面 弄的几步 有问题,可以不看
此时装不起来,用另一种方法来装 web 服务吧
还是安装有问题 , 把 yum 进程杀死 把rpm杀死,再重新使用rpm安装吧
上面 弄的几步 有问题,可以不看
下面是没有使用地址转换 ,只使用路由网关跳转
另一台公网的 linux
# tcpdump -i eth0 -nn -X icmp
windows ping 它
请求给linux 服务器的ip是 192.168.10.7
inux 服务器回应的ip是 192.168.10,7
windows ip
使用源地址转换
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.100.7
windows ping 下 172.16.100.1
在服务器 linux 上
外网ip (另一台linux主机)
没有linux与联结主机 只要在同一网段 没有网关,,,,,windows 的ping 也是可以ping通的
抓包分析一下 (另一个linux)
windows ping 一下
这里可以看到 请求的和回应的 都是联结的linux 主机
# man iptables
联结电脑 (window 经过 中间的联结电脑(可以上外网) 转发时 是 让它ping 不通外网的 )
[root@localhost ~]# iptables -A FORWARD -s 192.168.0.0/24 -p icmp -j REJECT
(# iptables -D FORWARD 1 是删掉一条记录)
# ifconfig
windows 上 是 ping 不通的
(另一台作为linux 服务器)
装不上 是由于加锁了,重启下吧 恢复下快照吧
恢复快照后,它的ip地址没变
# echo hello > /var/www/html/index.html
# service httpd start
windows 现在是ping 不通的
windows 浏览器 可以访问 另一台linux服务器的web
联结电脑 (中间电脑 ) FORWARD默认策略是 ACCEPT
# iptabls -F
# iptables -L -n
# iptables -P FORWARD DROP
windows 电脑 无法ping 无法访问 web
中间电脑
# iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT
# iptables -A FORWARD -s 192.168.10.1/24 -p tcp --dport 80 -m state --state NEW -j ACCEPT
windows 可以 访问另一台 linux 的 web 了
windows 此时不能 ping 通
# iptables -A FORWARD -s 192.168.10.0/24 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT
windows 此时可能ping 通了
当作服务器的 linux 下图的操作 指向了 网关为中间电脑
此时 ping 不通
下面实现了防火墙,内网可以访关外网,而外网不能够访问内网
服务器 linux vsftp 启动了
中间电脑 放行 21号端口
# iptables -A FORWARD -s 192.168.10.1/24 -p tcp --dport 21 -m state --state NEW -j ACCEPT
windows 还是不能访问
#iptables -L -n
# iptables -R FORWARD 1 -m state --state NEW ESTABLISHED,RELATED -j ACCEPT
windows 可以访问ftp 了
要使用 ESTABLISHED,RELATED (还是仅仅RELATED功能) (如果使用了 ftp(vsftp) )功能必须要内核装载 ip_nat_ftp ip_conntrack_ftp
# lsmod | grep ftp
做网络防火墙的话,所有的规则都要添加到 forward 链(规则链)上,forword链上实现规则优化比较麻烦,
因为它的方向不同,虽然都是一个链,有的是从内网到外网,有的是从外网到内网,
目标地址转换将会自动进行源地址转换
源地址转换将会自动进行目标地址转换
所以转换我们只需要操作一半,另一半由服务器自动完成
把 windows 弄成外网的
把linux 弄成内网的
改 windows ip
windows 可以ping 通网关(中间电脑)
windows 可以ping 通网关(中间电脑) 的,内网地址
linux 服务器 已经是内网了
linux 服务器 的修改
# setup
# service network restart 重启内网的linux服务器的网络服务
把中间电脑的iptables 删掉
# iptables -t nat -F
# iptables -F (-t filter -F)
# iptables -P FORWARD ACCEPT
# iptables -t nat -L -n
# iptables -t filter -L -n
另一台 linux服务器 可以ping 通 外网 windows
外网 windows可以ping 通另一台 linux服务器
外网 window 可以访问 内网 linux web
外网 window 可以访问 内网 linux ftp (为什么能访问 因为打开了路由功能)
windows 的网关去掉了
windows 不能访问 内网 linux 服务器 因为windows 没有网关,所以肯定不在同一网段
windows 可以 访问 172.16.100.7 (因为它们在同一个局域网)
# service httpd stop 服务关闭
# chkconfig httpd off 不让http启动
# service vsftpd stop 服务关闭
# chkconfig vsftpd off 不让vsftpd 启动
在中间电脑上
[root@localhost ~]# iptables -t nat -A PREROUTING -d 172.16.100.7 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.22
外网 window 可以访问了
修改 内网 linux 的 httpd 服务器的 index.html
外网 windows 刷新可以看到变化
# tail /var/log/httpd/access_log
对于 ftp 服务来讲 做 DNAT 非常麻烦 因为涉及到数据端口随机(大于1023)的问题(在被动模式下)
没有配置网关 所以 外网windows ping 内网ping 不通
外网 windows ping 中间电脑 可以ping通
对于 icmp 服务 没有转发的功能(DNAT不能使用 ping )
(目标地址转换必须指明只有对什么服务,什么协议,什么端口才能转发)
(源地址转换只需要指定ip就可以了)
修改linux内网httpd 服务 端口
# vim /etc/httpd/conf/httpd.conf
# service httpd restart 重启httpd服务
# netstat -tnlp 监听的是 8080
[root@localhost ~]# iptables -t nat -R PREROUTING 1 -d 172.16.100.7 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.22
# iptables -t nat -L -n
[root@localhost ~]# iptables -t nat -R PREROUTING 1 -d 172.16.100.7 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.22:8080
# iptables -t nat -L -n
[root@localhost ~]# iptables -t nat -L PREROUTING -n
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- 0.0.0.0/0 172.16.100.7 tcp dpt:80 to:192.168.10.22:8080
[root@localhost ~]#
[root@localhost ~]# iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- 0.0.0.0/0 172.16.100.7 tcp dpt:80 to:192.168.10.22:8080
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@localhost ~]#
window 外网可以访问
改内网linux httpd 服务器的 index.html
# vim /var/www/html/index.html
外网 windows 访问 可以看到变化
# iptables -L -n
# vim /var/www/html/test.html
外网 windows 能访问
[root@localhost ~]# iptables -A FORWARD -m string --algo kmp --string "h7n9" -j DROP
# iptables -L -n -v
重新打开一个浏览器,或者 打开 test2.html试试
我们可以通过 FORWARD链来定义 用户请求可以经过哪些站点,哪些站点不能经过
能请求访问哪些内容,不能请求访问哪些内容
给予时间做控制
# rpm -ql iptables
没有看到关于time的模块
(红帽自带的iptables没有关于time的模块
所以我们要卸了iptables,手动编译安装新的iptables,启用新的模块就可以了
这里是1.3.5 ,最新的可能是1.4, 1.5吧,,,,,,给内核打补丁之后,内核中的netfilter
还可以基于其它协议来过滤,比如迅雷,QQ,使用的是layer server七层过滤机制,
要重新编译内核才能生效
)