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
实验步骤:
-
启动docker容器,开启nginx服务,将服务端的80端口映射到7799端口
$service docker start $docker run -p 7799:80 nginx
浏览器访问服务端的7799端口可以看到成功开启
-
现在切换到代理机,输入命令创建两条规则
$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
-
查看一下是否创建成功
$iptables -t nat -L
-
现在开启转发,查看ip_forward值是否为1,若不是设置值为1
$cat /proc/sys/net/ipv4/ip_forward
sysctl -w net.ipv4.ip_forward=1
-
添加规则,设置转发所有流量
iptables -t filter -I FORWARD -j ACCEPT
-
此时访问代理机的7788端口,返回了服务端7799端口的流量