Iptables流量转发实验

Iptables流量转发实验

Iptables简介

Iptables其实不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的“安全框架”中,这个“安全框架”才是真正的防火墙,这个框架的名字叫Netfilter

Netfilter才是防火墙真正的安全框架(framework),netfilter位于内核空间。

Iptables其实是一个命令行工具,位于用户空间,我们用这个工具操作真正的框架。

所以说,虽然我们使用service iptables start启动iptables"服务",但是其实准确的来说,iptables并没有一个守护进程,所以并不能算是真正意义上的服务,而应该算是内核提供的功能。

iptables的结构:iptables -> Tables -> Chains -> Rules。 简单地讲,tables由chains组成,而chains又由rules组成。
Tables包括Filter, NAT, Mangle, Raw四种表。
Chains包括Input, Output, Forward, Prerouting, Postrouting五种链。
rules指定所检查包的特征和目标。如果包不匹配,将送往该链中下一条规则检查;如果匹配,那么下一条规则由目标值确定。该目标值可以是用户定义的链名,或是某个专用值,如ACCEPT[通过],DROP[删除], QUEUE[排队],或者 RETURN[返回]。

命令选项

-t:指定要操纵的表;
-A:向规则链中添加条目;
-D:从规则链中删除条目;
-i:向规则链中插入条目;
-R:替换规则链中的条目;
-L:显示规则链中已有的条目;
-F:清楚规则链中已有的条目;
-Z:清空规则链中的数据包计算器和字节计数器;
-N:创建新的用户自定义规则链;
-P:定义规则链中的默认目标;
-h:显示帮助信息;
-p:指定要匹配的数据包协议类型;
-d:指定目的ip
--dport:指定目标端口
-s:指定要匹配的数据包源ip地址;
-j:指定要跳转的目标;
-i:指定数据包进入本机的网络接口;
-o:指定数据包要离开本机所使用的网络接口。

参考文章:

https://blog.csdn.net/u011537073/article/details/82685586
http://www.zsythink.net/archives/1199

实验描述:

将服务端的nginx服务流量,通过iptables创建规则转发到另一台主机的端口上,这样就将服务端隐藏了起来,访问代理机的流量实际上来自于本机。

实验环境:

服务端:kali2019 ip:192.168.245.129

代理机:kali2018 ip:192.168.245.139

实验步骤:

  1. 启动docker容器,开启nginx服务,将服务端的80端口映射到7799端口

    $service docker start
    $docker run -p 7799:80 nginx
    

    浏览器访问服务端的7799端口可以看到成功开启

  2. 现在切换到代理机,输入命令创建两条规则

    $iptables -t nat -A PREROUTING -p tcp --dport 7788 -j DNAT --to 192.168.245.129:7799
    $iptables -t nat -A POSTROUTING -p tcp -d 192.168.245.129 --dport 7799 -j SNAT --to 192.168.245.139
    
  3. 查看一下是否创建成功

    $iptables -t nat -L
    

  4. 现在开启转发,查看ip_forward值是否为1,若不是设置值为1

    $cat /proc/sys/net/ipv4/ip_forward
    

    sysctl -w net.ipv4.ip_forward=1
    

  5. 添加规则,设置转发所有流量

    iptables -t filter -I FORWARD -j ACCEPT
    
  6. 此时访问代理机的7788端口,返回了服务端7799端口的流量

posted @ 2020-06-17 13:38  yoyodan  阅读(3033)  评论(0编辑  收藏  举报