欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

马哥 28_04 _iptables系列之nat及其过滤功能 有大用

image.png


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


image.png

image.png


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

image.png


references 引用 就是这哪个主链所调用

[root@localhost ~]# iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP


[root@localhost ~]# iptables -L -n --line-numbers

image.png


[root@localhost ~]# iptables -A clean_in  -d 192.168.1.255 -p icmp -j DROP  

[root@localhost ~]# iptables -L -n --line-numbers

image.png



[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的话),就不演示了

image.png


[root@localhost ~]# iptables -L -n -v --line-numbers    (报文还有匹配到的)

image.pngimage.png

删除自定义的链


[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

image.png


[root@localhost ~]# iptables -L -n --line-numbers -v

image.png



[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

image.png






image.png


image.png

image.png


# ifconfig

image.png


image.png

image.png

ping 网关

image.png


中间的这个联结电脑 (在本文中 就是中间电脑)


# iptables -L -n

# iptables -P INPUT ACCEPT

# iptables -P OUTPUT ACCEPT

# iptables -F  不指定链,那么会清空filter中的所有的链

image.png


image.png

image.png


windows 可以ping通联结电脑


image.png


联结电脑没有打开 ip_forward ,但是可以ping 联结电脑的

image.png

windows 可以ping通联结电脑的另一个网卡ip地址

(对linux主机来讲,ip地址是属于主机的不属于网卡)

(ping 同一台主机,无论有多少地址,无论在哪个网卡,

看起来都是同一个主机地址,都能ping通,这并不是一个转发)

(如果ping 的是主机 之外的连的另一个主机ip地址,才叫转发)

image.png



image.png


windows ping 联结电脑连的另一台主机,肯定ping不通

image.png]



打开联结电脑的 转发功能

# cat /proc/sys/net/ipv4/ip_forward

# echo 1 > /proc/sys/net/ipv4/ip_forward

image.png

要想永久有效

# vim /etc/sysctl.conf

image.png

image.png

改上面的 /etc/sysctl.conf 然后 # sysctl -p 也能让它(地址转发)生效

image.png


windows 还是不能ping通

image.png


另一台 linux 电脑

# route del -net 0.0.0.0

image.png


# route add default gw 172.16.100.7

image.png



此时在 内存windows 上 可以ping 通  另一台linux电脑

image.png


另一台 linux 电脑 上ping 一下


image.png



image.png

如果 左边网段(局域网网段)中 接中间联结电脑(直接连公网) 然后上网 到服务器 ,

必须要转换地址,否则报文发出去,却回不来,因为左边是局域网的ip,

而服务器回应的时候,如果不转换的话,就是公网上回应一个局域网的ip(私有地址),自然就找不到回应的电脑了




image.png


image.png



image.png



image.png



nat会话表 根据TCP序列号(假设序列号,事实上 udp icmp nat地址转换都能追踪的)来判断到底是响应到哪个主机上的

nat 是借助于  ip_conntrack (  ip_conntrack 是借助于ip 报文来追踪的)来追踪的


做源地址转换的时候,自动进行目标地址转换

做目标地址转换的时候,自动进行源地址转换



nat池 nat表

image.png


image.png



做源地址转换的时候,事实上也有目标地址转换,只不过目标地址转换是自动进行的


image.png


先在  另一台服务器(我们认定的外网)上装一台web 服务器

下面 弄的几步 有问题,可以不看

image.png

image.png

此时装不起来,用另一种方法来装 web 服务吧

image.png

image.png

image.png

image.png


还是安装有问题 , 把  yum 进程杀死 把rpm杀死,再重新使用rpm安装吧

image.png



image.png


image.png


上面 弄的几步 有问题,可以不看

下面是没有使用地址转换 ,只使用路由网关跳转

另一台公网的 linux


# tcpdump -i eth0 -nn -X icmp

image.png

windows ping 它

image.png


请求给linux 服务器的ip是 192.168.10.7

inux 服务器回应的ip是  192.168.10,7

image.png


windows ip 

image.png


image.png




使用源地址转换


[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.100.7


image.png


windows ping 下 172.16.100.1

image.png


在服务器  linux 上

image.png


外网ip (另一台linux主机)

image.png

image.png

image.png


image.png



没有linux与联结主机 只要在同一网段 没有网关,,,,,windows 的ping 也是可以ping通的 

image.png





抓包分析一下 (另一个linux)

image.png


windows ping 一下

image.png



这里可以看到 请求的和回应的 都是联结的linux 主机

image.png





# man iptablesimage.png



image.png



image.png



image.png


image.png



image.png



联结电脑  (window 经过 中间的联结电脑(可以上外网) 转发时 是 让它ping 不通外网的 )

[root@localhost ~]# iptables -A FORWARD -s 192.168.0.0/24 -p icmp -j REJECT

   (# iptables -D FORWARD 1 是删掉一条记录)

image.png


# ifconfig

image.png



windows 上 是 ping 不通的

image.png



(另一台作为linux 服务器)

装不上 是由于加锁了,重启下吧 恢复下快照吧

image.png

image.png


恢复快照后,它的ip地址没变

image.png


image.png

image.png

image.png



# echo hello > /var/www/html/index.html

# service httpd start

image.png


windows 现在是ping 不通的


image.png

windows 浏览器 可以访问 另一台linux服务器的web

image.png



联结电脑 (中间电脑 )  FORWARD默认策略是 ACCEPT

image.png


# iptabls -F 

# iptables -L -n

image.png


# iptables -P FORWARD DROP

image.png


windows 电脑 无法ping 无法访问 web

image.png

image.png


中间电脑

# 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 了 

image.png

windows 此时不能  ping 通 

image.png


# iptables -A FORWARD -s 192.168.10.0/24 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT


windows 此时可能ping 通了

image.png


当作服务器的 linux  下图的操作 指向了 网关为中间电脑

image.png

此时 ping 不通 

image.png




下面实现了防火墙,内网可以访关外网,而外网不能够访问内网


image.png



服务器 linux   vsftp 启动了

image.png

中间电脑 放行 21号端口 

# iptables -A FORWARD -s 192.168.10.1/24 -p tcp --dport 21 -m state --state NEW -j ACCEPT


windows 还是不能访问

image.png


#iptables -L -n 

# iptables -R FORWARD 1 -m state --state NEW ESTABLISHED,RELATED -j ACCEPT

image.png



windows 可以访问ftp 了

image.png



要使用 ESTABLISHED,RELATED (还是仅仅RELATED功能) (如果使用了 ftp(vsftp) )功能必须要内核装载  ip_nat_ftp ip_conntrack_ftp

image.png

image.png

# lsmod | grep ftp

image.png



做网络防火墙的话,所有的规则都要添加到 forward 链(规则链)上,forword链上实现规则优化比较麻烦,

因为它的方向不同,虽然都是一个链,有的是从内网到外网,有的是从外网到内网,



目标地址转换将会自动进行源地址转换

源地址转换将会自动进行目标地址转换

所以转换我们只需要操作一半,另一半由服务器自动完成

image.png




把 windows 弄成外网的 

image.png




把linux  弄成内网的

image.png


改 windows ip

image.png


windows 可以ping 通网关(中间电脑)

image.png


windows 可以ping 通网关(中间电脑) 的,内网地址

image.png




linux 服务器 已经是内网了

image.png






linux 服务器 的修改

# setup

image.png





image.png

image.png

image.png


image.png


# service network restart 重启内网的linux服务器的网络服务

image.png



把中间电脑的iptables 删掉

# iptables -t nat -F

# iptables -F (-t filter -F)

image.png


# iptables -P FORWARD ACCEPT

image.png


# iptables -t nat -L -n

# iptables -t filter -L -n

image.png



另一台 linux服务器 可以ping 通 外网 windows

image.png


外网 windows可以ping 通另一台 linux服务器  

image.png


外网 window 可以访问 内网 linux web 

image.png


外网 window 可以访问 内网 linux ftp             (为什么能访问 因为打开了路由功能)

image.png


windows 的网关去掉了 

image.png

 windows 不能访问 内网 linux 服务器    因为windows 没有网关,所以肯定不在同一网段

image.png

windows 可以 访问 172.16.100.7 (因为它们在同一个局域网)

image.png



# 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  可以访问了

image.png


修改 内网 linux  的 httpd 服务器的 index.html

image.png

image.png

外网 windows 刷新可以看到变化

image.png

# tail /var/log/httpd/access_log

image.png

image.png

image.png

对于 ftp 服务来讲 做 DNAT 非常麻烦 因为涉及到数据端口随机(大于1023)的问题(在被动模式下)


没有配置网关 所以 外网windows ping 内网ping 不通

image.png

image.png

外网 windows ping 中间电脑 可以ping通

image.png

对于 icmp 服务 没有转发的功能(DNAT不能使用 ping )

(目标地址转换必须指明只有对什么服务,什么协议,什么端口才能转发)

(源地址转换只需要指定ip就可以了)



修改linux内网httpd 服务 端口

# vim /etc/httpd/conf/httpd.conf

image.png

image.png

# service httpd restart  重启httpd服务

image.png

# netstat -tnlp 监听的是 8080

image.png


 [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

image.png


 [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

image.png


[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 外网可以访问

image.png


改内网linux httpd 服务器的 index.html

# vim /var/www/html/index.html

image.png


外网 windows 访问 可以看到变化

image.png

# iptables -L -n

image.png


# vim /var/www/html/test.html

image.png

image.png

外网 windows 能访问

image.png

image.png

image.png


[root@localhost ~]# iptables -A FORWARD -m string --algo kmp --string "h7n9" -j DROP

外网 windows 访问 内网linux 的 http 的 test.html 竟可以访问 (原来是缓存的问题)

image.png


# iptables -L -n -v




image.png


重新打开一个浏览器,或者 打开 test2.html试试

image.png


我们可以通过 FORWARD链来定义 用户请求可以经过哪些站点,哪些站点不能经过

能请求访问哪些内容,不能请求访问哪些内容



给予时间做控制

# rpm -ql iptables

image.png

没有看到关于time的模块

(红帽自带的iptables没有关于time的模块

所以我们要卸了iptables,手动编译安装新的iptables,启用新的模块就可以了

这里是1.3.5 ,最新的可能是1.4, 1.5吧,,,,,,给内核打补丁之后,内核中的netfilter

还可以基于其它协议来过滤,比如迅雷,QQ,使用的是layer server七层过滤机制,

要重新编译内核才能生效

)

image.png














































































































































普通分类: