iptables的DNAT和SNAT

一、概述:
1、 SNAT, DNAT, MASQUERADE都是NAT
2、MASQUERADE是SNAT的一个特例
3、SNAT是指在数据包从网卡发送出去的时候,把数据包中的源地址部分替换为指定的IP,这样,接收方就认为数据包的来源是被替换的那个IP的主机
4、MASQUERADE是用发送数据的网卡上的IP来替换源IP,因此,对于那些IP不固定的场合,比如拨号网络或者通过dhcp分配IP的情况下,就得用MASQUERADE
5、DNAT,就是指数据包从网卡发送出去的时候,修改数据包中的目的IP,表现为如果你想访问A,可是因为网关做了DNAT,把所有访问A的数据包的目的IP全部修改为B,那么,你实际上访问的是B
6、因为,路由是按照目的地址来选择的,因此,DNAT是在PREROUTING链上来进行的,而SNAT是在数据包发送出去的时候才进行,因此是在POSTROUTING链上进行的
二、实例
要求:
1、现在只有一个IP(10.144.235.10)可以上internet,希望局域网中的三台机器通过SNAT均可上网。
2、通过访问10.144.235.10的8088端口可转发到computer1的80端口

这里写图片描述
3、网络配置信息:
防火墙:
eth0:10.144.235.10/24 gw:10.144.235.1 dns:8.8.8.8 (可以上internet)
eth1:192.168.80.1/24
computer1:
eth1:192.168.80.10/24 gw:192.168.80.1 dns:8.8.8.8
computer2:
eth1:192.168.80.20/24 gw:192.168.80.1 dns:8.8.8.8
computer3:
eth1:192.168.80.30/24 gw:192.168.80.1 dns:8.8.8.8
4、在防火墙上操作
载入相关模块

# modprobe ip_tables
# modprobe

将/etc/sysctl.conf下面参数改为1

net.ipv4.ip_forward = 1

执行以下命令来启用 sysctl.conf参数

# sysctl -p /etc/sysctl.conf

清除原有防火墙规则

# iptables -F

重启防火墙

service iptables restart

做snat转发

# iptables -t nat -A POSTROUTING -s  192.168.80.0/24 -j SNAT --to-source 10.144.235.10

如果eth0的IP为dhcp获取,IP不固可使用下面转发规则

# iptables-t nat -A POSTROUTING -s 192.168.80.0/24 -o eth0 -j MASQUERADE

使用DNAT转发computer1的80端口到10.144.235.10的8088端口

# iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 8088 -j DNAT --to-destination 192.168.80.10:80
发布了236 篇原创文章 · 获赞 121 · 访问量 83万+
展开阅读全文

用iptables做SNAT遇到问题...

09-20

iptables 咋又遇到问题了... 我在10.10.80.12/24这个机器上做SNAT, 给一个小网段10.8.0.0/16提供出口服务. 这么配的: -t nat -A POSTROUTING -s 10.8.0.0/16 ! -d 10.8.0.0/16 -j SNAT --to-source 10.10.80.12 然后在在10.8.0.6上面ping 180.97.33.108: ``` 20:58:20.103451 IP 10.8.0.6 > 180.97.33.108: ICMP echo request, id 22332, seq 1, length 64 20:58:20.103524 IP 10.10.80.12 > 180.97.33.108: ICMP echo request, id 22332, seq 1, length 64 20:58:20.103531 IP 10.10.80.12 > 180.97.33.108: ICMP echo request, id 22332, seq 1, length 64 20:58:20.104900 IP 180.97.33.108 > 10.10.80.12: ICMP echo reply, id 22332, seq 1, length 64 20:58:20.104968 IP 180.97.33.108 > 10.10.80.12: ICMP echo reply, id 22332, seq 1, length 64 ``` 能看到request报文是正常的, 而reply报文的目标地址没有换回来.(10.10.80.12地址配在一个网桥上, 抓包用-i any, 所以会抓到重复包, 没问题) reply报文收到了, 但是用conntrack -L能看到这个连接处于UNREPLIED状态. icmp 1 16 src=10.8.0.6 dst=180.97.33.108 type=8 code=0 id=22332 [UNREPLIED] src=180.97.33.108 dst=10.10.80.12 type=0 code=0 id=22332 mark=0 use=2 然后在iptables各个chain里面加了日志, 日志是这样的: ``` raw-PREROUTING IN=brq78e460d0-36 OUT= PHYSIN=enp3s0f0 MAC=0c:c4:7a:2a:75:1a:00:e0:0f:8e:95:64:08:00 SRC=180.97.33.108 DST=10.10.80.12 LEN=84 TOS=0x00 PREC=0x00 TTL=56 ID=29612 DF PROTO=ICMP TYPE=0 CODE=0 ID=22193 SEQ=1 mangle-PREROUTING IN=brq78e460d0-36 OUT= PHYSIN=enp3s0f0 MAC=0c:c4:7a:2a:75:1a:00:e0:0f:8e:95:64:08:00 SRC=180.97.33.108 DST=10.10.80.12 LEN=84 TOS=0x00 PREC=0x00 TTL=56 ID=29612 DF PROTO=ICMP TYPE=0 CODE=0 ID=22193 SEQ=1 mangle-INPUT IN=brq78e460d0-36 OUT= PHYSIN=enp3s0f0 MAC=0c:c4:7a:2a:75:1a:00:e0:0f:8e:95:64:08:00 SRC=180.97.33.108 DST=10.10.80.12 LEN=84 TOS=0x00 PREC=0x00 TTL=56 ID=29612 DF PROTO=ICMP TYPE=0 CODE=0 ID=22193 SEQ=1 filter-INPUT IN=brq78e460d0-36 OUT= PHYSIN=enp3s0f0 MAC=0c:c4:7a:2a:75:1a:00:e0:0f:8e:95:64:08:00 SRC=180.97.33.108 DST=10.10.80.12 LEN=84 TOS=0x00 PREC=0x00 TTL=56 ID=29612 DF PROTO=ICMP TYPE=0 CODE=0 ID=22193 SEQ=1 ``` 按我的理解, 应该走到mangle-PREROUTING之后, 就应该把地址换回去, 再FORWARD而日志显示竟然是INPUT. 奇怪吧 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 程序猿惹谁了 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览