简介
NAT 的全名是 Network Address Translation,字面上的意思是『網路位址的轉換』
NAT 原理
从 iptables 的角度看 NAT 实现的原理
- 先經過 NAT table 的 PREROUTING 鏈;
- 經由路由判斷確定這個封包是要進入本機與否,若不進入本機,則下一步;
- 再經過 Filter table 的 FORWARD 鏈;
- 通過 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主机通过路由器出网)
- 常用在内网服务需要出公网的场景
通过 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.
- 常用在公网请求转内网服务的场景
通过 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 的特点,对排查问题带来一定的困难
参考
- https://en.wikipedia.org/wiki/Network_address_translation
- https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/4/html/security_guide/s1-firewall-ipt-fwd
- http://linux.vbird.org/linux_server/0250simple_firewall.php#nat
- https://www.karlrupp.net/en/computer/nat_tutorial
- https://segmentfault.com/q/1010000002389520
- https://www.voidking.com/dev-linux-snat/
- https://blog.csdn.net/chengqiuming/article/details/78602169
- https://blog.csdn.net/chengqiuming/article/details/78602169