NAT

2021-08-25 20:57:37 浏览数 (1)

简介

NAT 的全名是 Network Address Translation,字面上的意思是『網路位址的轉換』

NAT 原理

从 iptables 的角度看 NAT 实现的原理

  1. 先經過 NAT table 的 PREROUTING 鏈;
  2. 經由路由判斷確定這個封包是要進入本機與否,若不進入本機,則下一步;
  3. 再經過 Filter table 的 FORWARD 鏈;
  4. 通過 NAT table 的 POSTROUTING 鏈,最後傳送出去。

简言之: PREROUTING(NAT)-> FORWARD(Filter) -> POSTROUTING(NAT)

修改源ip地址的目的一般都是为了让这个包能再回到自己这里,所以在 iptables 中,SNAT是在出口,也即 POSTROUTING 链发挥作用。

修改目的ip地址的原因一般就是为了改变包发送的目的地,让包走出去,而不是留下来,所以在 iptables 中,DNAT是在入口,也即PREROUTING链中发挥作用,以便让包进入FORWARD表。

SNAT

SNAT: Source Network Address Translation,是修改网络包源ip地址的。(e.g. LAN主机通过路由器出网)

  • 常用在内网服务需要出公网的场景
image.pngimage.png

通过 iptables 配置 SNAT

IP 伪装

代码语言:txt复制
iptables -A INPUT -i $INIF -j ACCEPT
# 這一行為非必要的,主要的目的是讓內網 LAN 能夠完全的使用 NAT 伺服器資源。
# 其中 $INIF 在本例中為 eth1 介面

echo "1" > /proc/sys/net/ipv4/ip_forward
# 上頭這一行則是在讓你的 Linux 具有 router 的能力

iptables -t nat -A POSTROUTING -s $innet -o $EXTIF -j MASQUERADE
# 這一行最關鍵!就是加入 nat table 封包偽裝!本例中 $innet 是 192.168.100.0/24
# 而 $EXTIF 則是對外介面,本例中為 eth0 

指定 IP SNAT

代码语言:txt复制
iptables -t nat -A POSTROUTING -o eth0 -j SNAT 
         --to-source 192.168.1.100

指定一个 IP 段

代码语言:txt复制
iptables -t nat -A POSTROUTING -o eth0 -j SNAT 
         --to-source 192.168.1.210-192.168.1.220

DNAT

DNAT: Destination Network Address Translation, 是修改网络包目的ip地址的。(e.g. 常见的负载均衡 NAT )

DNAT is commonly used to publish a service located in a private network on a publicly accessible IP address.

  • 常用在公网请求转内网服务的场景
image.pngimage.png

通过 iptables 配置 SNAT

代码语言:txt复制
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT 
      --to 172.31.0.23:80

port 重定向

代码语言:txt复制
-j REDIRECT --to-ports <port number>
# 這個也挺常見的,基本上,就是進行本機上面 port 的轉換就是了!
# 不過,特別留意的是,這個動作僅能夠在 nat table 的 PREROUTING 以及
# OUTPUT 鏈上面實行而已喔!

範例:將要求與 80 連線的封包轉遞到 8080 這個 port
[root@www ~]# iptables -t nat -A PREROUTING -p tcp  --dport 80 
> -j REDIRECT --to-ports 8080
# 這玩意最容易在你使用了非正規的 port 來進行某些 well known 的協定,
# 例如使用 8080 這個 port 來啟動 WWW ,但是別人都以 port 80 來連線,
# 所以,你就可以使用上面的方式來將對方對你主機的連線傳遞到 8080 囉!

优劣

使用 NAT 技术有什么优点?

  • 收敛出口 ip
  • 打通内外网,内网服务提供给公网访问

一些不容忽视的问题

  • 网络包都需要经过 NAT ,流量大的时候 NAT 将成为瓶颈
  • 当错误出现时,由于 NAT 转换 ip 的特点,对排查问题带来一定的困难

参考

  1. https://en.wikipedia.org/wiki/Network_address_translation
  2. https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/4/html/security_guide/s1-firewall-ipt-fwd
  3. http://linux.vbird.org/linux_server/0250simple_firewall.php#nat
  4. https://www.karlrupp.net/en/computer/nat_tutorial
  5. https://segmentfault.com/q/1010000002389520
  6. https://www.voidking.com/dev-linux-snat/
  7. https://blog.csdn.net/chengqiuming/article/details/78602169
  8. https://blog.csdn.net/chengqiuming/article/details/78602169

0 人点赞