iptables防火墙与端口转发

admin 2022年12月19日12:31:53评论22 views字数 3708阅读12分21秒阅读模式

iptables 的结构:iptables -> Tables -> Chains -> Rules



规则、表和链

规则就是我们设置的那些个过滤的条件,一般规则是:如果数据包头满足这样的条件就这样处理数据包。规则指定了源地址、目的地址、传输协议(TCPUDPICMP)等,当数据包与规则匹配的时候,iptables 就根据定义的方法处理这些数据包,如:放行 accept、拒绝 reject、丢弃 drop 等

链就是数据包传播的路径,每一条链中有一条或多条规则,数据包到达一条链时,iptables 就会从该链中的第一条规则开始检查,如果满足规则就根据这个规则定义的方法处理数据包,否则继续检查下一条规则,如果数据包不符合链中任何一条规则,iptables 就根据这条链预先定义的默认策略处理数据包

默认有四个表 filter、NAT、Mangle、Raw

iptables防火墙与端口转发

(1)一个数据包进入网卡时,它首先进入 PREROUTING 链,内核根据数据包目的 IP 判断是否需要转发出去

(2) 如果数据包就是进入本机的,它就会沿着图向下移动,到达 INPUT 链。数据包到了 INPUT 链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经过 OUTPUT 链,然后到达POSTROUTING 链输出

(3)如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过 FORWARD 链,然后到达 POSTROUTING 链输出




使用方法


iptables -F 删除所有规则

iptables -L -v -n  查看规则,其中还有个 -t 表示看哪个表,不指定默认是 filter

iptables防火墙与端口转发







设置防火墙






在虚拟机使用 python 启动一个 http 的服务器,监听在 80 端口,正常情况下是可以访问的

iptables防火墙与端口转发

使用以下命令设置一个丢弃从 80 端口进来的流量规则,其中-t filter 是指定 filter 表,-A 表示添加,INPUT 是添加的链,-j DROP 表示丢弃,-p 表示协议(TCPUDPICMP...),--dport 表示端口

 iptables -t filter -A INPUT -j DROP -p tcp --dport 80

这时候再访问就不行了

iptables防火墙与端口转发


使用以下命令删除规则 -D 表示删除,INPUT 表示删除的链,1 表示链上第一条规则(如果不知道是第几条,使用 iptables -L --line-numbers)

 iptables -t filter -D INPUT 1

iptables防火墙与端口转发


当然也可以指定某个 IP 不能访问 80 端口:

iptables -t filter -A INPUT -s 192.168.127.128 -j DROP -p tcp --dport 80

iptables防火墙与端口转发


指定某个 IP 能访问,其他 IP 不能访问

iptables -t filter -A INPUT -s 192.168.127.128 -j ACCEPT -p tcp --dport 80iptables -t filter -A INPUT -j DROP -p tcp --dport 80

因为匹配顺序是从上往下的,所以如果这个顺序反过来就先匹配到了全都 DROP,直接就给丢弃了,哪怕是 192.168.127.128 也不行

iptables防火墙与端口转发


有的时候使用 iptables -L -n 看的不全,比如如果看到有一条

ACCEPT     all  --  0.0.0.0/0        0.0.0.0/0

结果怎么都访问不到,可能是你有个参数没看到,使用 iptables -L -nv 看的仔细一点会发现,in 上有个 lo 表示本地回环,所以白搭

 pkts bytes target     prot opt in     out     source               destination            28  4801 ACCEPT     all  --  lo      *       0.0.0.0/0            0.0.0.0/0


比如下面这个场景

iptables -t filter -I INPUT -s 192.168.127.128 -j ACCEPT -p tcp --dport 80iptables -t filter -A INPUT -i lo -j ACCEPT -p alliptables -t filter -A INPUT -j REJECT --reject-with icmp-net-unreachable

这种情况下第一条说的是 192.168.127.128 能访问到我们的 80 端口,第二条表示本地回环的随便访问,第三条表示其他主机一律回应 icmp-net-unreachable


此时查看 iptables 效果如下:

root@research:~# iptables -L -vnChain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target     prot opt in     out     source               destination            11  1281 ACCEPT     tcp  --  *      *       192.168.127.128      0.0.0.0/0            tcp dpt:80    0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0               0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-net-unreachable----------------------------------------------------------------------------------------------------------------root@research:~# iptables -L -nChain INPUT (policy ACCEPT)target     prot opt source               destination         ACCEPT     tcp  --  192.168.127.128      0.0.0.0/0            tcp dpt:80ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-net-unreachable







端口转发






网络情况如下,我们的电脑是 PC,可以访问 A 设备,但是访问不到 B 设备

iptables防火墙与端口转发


在 A 设备上使用 iptables 进行流量的转发,使得 PC 可以通过 A 设备登录到 B 设备的 SSH

这里转发的时候要使用 nat 这个表,PREROUTING 链是流量首先进入的链,经过这个链的处理再干别的,所以我么在这条链上新建了一个规则,把去 192.168.127.170 的 6666 端口的流量修改目的地址为 192.168.47.131:22

iptables -t nat -A PREROUTING -d 192.168.127.170 -p tcp --dport 6666 -j DNAT --to-destination 192.168.47.131:22

然后通过 nat 表 POSTROUTING 链把去往 192.168.47.131:22 的源地址改为 192.168.47.129

iptables -t nat -A POSTROUTING -d 192.168.47.131 -p tcp --dport 22 -j SNAT --to-source 192.168.47.129

上面两条规则实际上就是把流量包里面的源地址和目的地址全都改了,这样来看就成了 192.168.47.129 在和 192.168.47.131 通信了


另外我们把流量包都给改了,数据包出了 PREROUTING 链之后是根据目标地址选择去向的,如果是本机地址那就进入 INPUT 链,如果是其他地址就进入 FORWARD 链,因为我们改了目标地址,所以会进入到 FORWARD 链,而这个链默认会拒绝所有的地址,所以我们得加上一个 192.168.47.131 的 ACCEPT

iptables -I FORWARD 1 -d 192.168.47.131 -p tcp --dport 22 -j ACCEPTiptables -I FORWARD 2 -s 192.168.47.131 -p tcp --sport 22 -j ACCEPT

iptables防火墙与端口转发

再试一下,换台电脑,win7,IP 是 192.168.47.130 ,尝试通过端口转发,使用 192.168.127.170 连一下远程桌面

iptables -t nat -A PREROUTING -d 192.168.127.170 -p tcp --dport 9999 -j DNAT --to-destination 192.168.47.130:3389iptables -t nat -A POSTROUTING -d 192.168.47.130 -p tcp --dport 3389 -j SNAT --to-source 192.168.47.129iptables -I FORWARD 1 -d 192.168.47.130 -p tcp --dport 3389 -j ACCEPTiptables -I FORWARD 2 -s 192.168.47.130 -p tcp --sport 3389 -j ACCEPT

iptables防火墙与端口转发

参考:

https://www.cnblogs.com/Dicky-Zhang/p/5904429.htmlhttps://wooyun.js.org/drops/Iptables%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B.htmlhttps://macdfree.cc/post/iptables%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91/

原文始发于微信公众号(陈冠男的游戏人生):iptables防火墙与端口转发

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年12月19日12:31:53
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   iptables防火墙与端口转发https://cn-sec.com/archives/1470985.html

发表评论

匿名网友 填写信息