NAT(Network Address Translation)译为网络地址转换。一般路由器在转发咱们的数据包时,仅仅会将源MAC地址换成本身的MAC地址,可是NAT技术能够修改数据包的源地址、目的地址以及源端口、目的端口等信息。linux
NAT技术最多见的应用就是经过修改源IP地址实现内网多主机使用一个公网地址接入互联网。NAT技术一般用于端口和流量的转发、重定向,实现如端口映射、跨网络访问、流量代理等功能。bash
iptables [-t TABLE] COMMAND CHAIN [num] 匹配条件 -j 处理动做
要使用iptables的NAT功能,咱们首先须要启用网卡的IP转发功能服务器
echo 1 > /proc/sys/net/ipv4/ip_forward
若是想要永久生效,咱们要编辑/etc/sysctl.conf
文件,设置net.ipv4.ip_forward = 1
,而后用sysctl -p
命令使配置文件生效。网络
咱们使用-t nat
参数指明使用nat表,由于iptables默认使用filter表。
nat表同filter表同样有三条缺省的"链"(chains):ssh
POSTROUTING:定义进行源地址转换规则,重写数据包的源IP地址 PREROUTING:定义进行目的地址转换的规则,能够把外部访问重定向到其余主机上 OUTPUT:定义对本地产生的数据包的目的转换规则。
咱们要利用iptables进行NAT转换时,使用的动做主要为SNAT、DNAT和REDIRECT:tcp
SNAT:源地址转换 DNAT:目的地址转换 REDIRECT:端口重定向
(1)规则操做学习
-A:在链的尾部添加一条规则 -D CHAIN [num]: 删除指定链中的第num条规则 -I CHAIN [num]:在指定链内第num条位置插入一条规则 -R CHAIN [num]: 替换链内指定位置的一条规则
(2)源/目的IP地址优化
-s:指定源地址 --dst:指定目的地址
(3)网络接口.net
-i:入站接口。对于`PREROUTING`链,只能用-i指定进来的网络接口 -o:出站接口。对于POSTROUTING和OUTPUT,只能用-o指定出去的网络接口
(4)动做代理
ACCEPT:放行 DROP:丢弃 REJECT:拒绝 MASQUERADE:地址假装 LOG:日志 MARK:标记
1.源NAT(SNAT)
更改全部来自192.168.1.0/24的数据包的源IP地址为123.4.5.100
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to 123.4.5.100
2.目的NAT(DNAT)
更改全部来自192.168.1.0/24的数据包的目的ip地址为123.4.5.100
iptables -t nat -A PREROUTING -s 192.168.1.0/24 -i eth1 -j DNAT --to 123.4.5.100
3.IP映射实例
假设有这样的状况:A、B单位给自内网中部分用户要求创建本身的Web服务器对外发布信息。咱们能够在防火墙的外部网卡上绑定多个合法公网IP地址,而后经过ip映射使发给其中某一个IP地址的包转发至内部某一用户的Web服务器上,并将该内部Web服务器的响应包假装成该公网IP发出的包。
节点 | 内网IP | 公网IP |
---|---|---|
A单位Web服务器 | 192.168.1.100 | 123.4.5.100 |
B单位Web服务器 | 192.168.1.200 | 123.4.5.200 |
linux防火墙 | 192.168.1.1(eth1) | 123.4.5.1(eth0) |
在进行NAT以前,咱们须要先将分配给A、B单位的公网ip绑定到防火墙的外网接口:
ifconfig eth0 add 123.4.5.100 netmask 255.255.255.0 ifconfig eth0 add 123.4.5.200 netmask 255.255.255.0
对防火墙接收到的目的ip为123.4.5.100和123.4.5.200的全部数据包进行目的NAT(DNAT):
iptables -A PREROUTING -i eth0 -d 123.4.5.100 -j DNAT --to 192.168.1.100 iptables -A PREROUTING -i eth0 -d 123.4.5.200 -j DNAT --to 192.168.1.200
其次,对防火墙接收到的源ip地址为192.168.1.100和192.168.1.200的数据包进行源NAT(SNAT):
iptables -A POSTROUTING -o eth0 -s 192.168.1.100 -j SNAT --to 123.4.5.100 iptables -A POSTROUTING -o eth0 -s 192.168.1.200 -j SNAT --to 123.4.5.200
这样,全部目的ip为123.4.5.100和123.4.5.200的数据包都将分别被转发给192.168.1.100和192.168.1.200;
而全部来自192.168.1.100和192.168.1.200的数据包都将分别被假装成由123.4.5.100和123.4.5.200,从而也就实现了ip映射。
iptables -t nat -A PREROUTING -d 公网ip -p tcp --dport 公网端口 -j DNAT --to 内网ip:内网服务端口 iptables -t nat -A POSTROUTING -d 内网ip -p tcp --dport 内网服务端口 -j SNAT --to-source 网关外网IP
节点 | 内网IP(eth0) | 公网IP(eth1) |
---|---|---|
网关 | 10.0.0.1 | 123.4.5.100 |
内网主机 | 10.0.0.20 |
例:把内网ssh服务映射到外网。iptables规则配置以下:
iptables -t nat -A PREROUTING -d 123.4.5.100 -p tcp --dport 2222 -j DNAT --to-destination 10.0.0.20:22 iptables -t nat -A POSTROUTING -d 10.0.0.20 -p tcp --dport 22 -j SNAT --to-source 123.4.5.100
把访问公网123.4.5.100:2222的数据包转发到了内网10.0.0.20:22
把发往本机80端口的数据重定向到8080端口
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
把访问123.4.5.100:8080的数据包转发到123.4.5.200:80
iptables -t nat -A PREROUTING -d 123.4.5.100 -p tcp --dport 8080 -j DNAT --to-destination 123.4.5.200:80
多网卡问题:iptables学习笔记:端口转发命令优化