SNAT和DNAT的区别,及route简单使用

Linux内核数据包传输过程

 

  1. 流入本机:PREROUTING INPUT用户空间进程
    • 当数据包进入网卡时数据包首先进入 PreRouting链,内核根据数据包的IP判断是否需要转送出去,
    • 如果数据包进入的是本机,数据包到达 INPUT链,经过 INPUT链 过滤,数据包被发往本地进程。
    • src:A   dest:B
  2. 流出本机: 用户空间进程OUTPUTPOSTROUTING
    • 本地进程进行响应处理后,发送响应数据包,数据包经过 OUTPUT链 过滤,到达 PostRouting链 输出
    • src:B  dest:A
  3. 转发:PREROUTINGFORWARDPOSTROUTING
    • 当数据包需要转发时,且内核允许转发,经过 PreRouting链,直接向右移动,经过 ForWard链,到达 PostRouting链 输出

1.SNAT

source network address translation 源网络地址转换,常用于多个PC机使用路由共享上网

必须在B的postrouting设置转换源地址的防火墙策略。
若在B的prerouting链上设置转换源地址的防火墙策略,此时还未检查路由表,还不知道要到达数据包中目标主机需经过本机的哪个网卡接口,即还不知道需将源地址替换为哪个公网网卡的ip

网络地址转换即:
局域网A: 172.27.241.2  
互联网C: 192.168.1.1 
防火墙B(充当路由):ech0 192.168.1.2 ech1 172.27.241.3

网关0.0.0.0表示该主机不需要经过路由就可以和169.254.0.0/16  172.27.240.0/20进行讯
如果主机想与其他网段主机通讯,需要添加路由记录,添加时可以不指定接口,主机会自动使用与网关IP同段的网卡,网关必须是主机能访问到的IP

路由器的路由表实际上也是类似的,也有本机ip所在网段的路由和到其他网段的路由,比普通路由多了转发功能,普通主机收到目标主机不是自己的数据包后会抛弃,路由器收到目标主机不是自己的数据包后会检查路由表,将数据包转发出去,也就是说普通主机的路由表只能供自己发送数据包时使用,路由器的路由表是公用的。

设置B转发:
iptables -t nat -A POSTROUTING -s 172.27.241.0/24 -j SNAT --to-source 192.168.1.3
将172.27.241.0/24网段的数据包源地址替换为192.168.1.3
A → C 发送包 
src:172.27.241.2 dest:192.168.1.1
B → 把数据包地址转换为 
src:192.168.1.3 dest:192.168.1.1
B → C 
src:192.168.1.3    dest:192.168.1.1

SNAT中,将请求数据包的源地址替换时,端口一般不替换,即A用什么端口B就用什么端口,但若产生冲突,即C、D使用同一随机端口,B可以将端口替换为其他空闲端口,否则当C或D的响应包到达时,B就不知道替换为C还是D了,端口和IP都进行修改,称为PNAT。

2.DNAT

destination network address translation,目标网络地址转换,常用于互联网放内网

必须在防火墙的prerouting上设置修改目标地址的防火墙策略
若在B的postrouting设置转换源地址的防火墙策略,请求数据包通过postrouting和路由表后,由于目标主机是本机,就会将数据包发往input,进而被发往本地进程。

网络地址转换即:
互联网A: 192.168.1.1 
局域网C: 172.27.241.2 
防火墙B(充当路由):ech0 192.168.1.2 ech1 172.27.241.3
设置B转发:
iptables -t nat -A PREROUTING -d 192.168.1.2 -j SNAT --to-source 172.27.241.1
将172.27.241.0/24网段的数据包源地址替换为192.168.1.3
A → B 发送包 
src:192.168.1.1  dest:192.168.1.2 
B →  把数据包目标地址转换为 
dest:172.27.241.1
B → C 
src:src:192.168.1.1  dest:172.27.241.1

 

route

添加路由
route add -net 192.168.0.0/24 gw 192.168.0.1
route add -host 192.168.1.1 dev 192.168.0.1

删除路由
route del -net 192.168.0.0/24 gw 192.168.0.1
add 增加路由
del 删除路由
-net 设置到某个网段的路由
-host 设置到某台主机的路由
gw 出口网关 IP地址
dev 出口网关 物理设备名
增加默认路由
route add default gw 192.168.0.1
默认路由一条就够
route -n 查看路由表

 

ip route

添加路由
ip route add 192.168.0.0/24 via 192.168.0.1
ip route add 192.168.1.1 dev 192.168.0.1
删除路由
ip route del 192.168.0.0/24 via 192.168.0.1

add 增加路由
del 删除路由
via 网关出口 IP地址
dev 网关出口 物理设备名

增加默认路由
ip route add default via 192.168.0.1 dev eth0
via 192.168.0.1 是我的默认路由器

查看路由信息
ip route

 

永久生效

让路由重启服务器后依然生效:

  1. 在/etc/rc.local里面添加:
    添加路由命令为:直接将在命令行操作的命令复制到该文件中,保存退出即可。
  2. 在/etc/sysconfig/static-routes文件里面写入:
    如果该文件不存在,则手动创建,添加内容格式为:
    参照/etc/init.d/network文件里面的shell语句: 
    # Add non interface-specific static-routes.
    if [ -f /etc/sysconfig/static-routes ]; then
         grep "^any" /etc/sysconfig/static-routes | while read ignore args ;do /sbin/route add -$args done
    fi
    格式为:
    route add -net 192.56.76.0 netmask 255.255.255.0 dev eth0
    那么,在/etc/sysconfig/static-routes文件中添加格式为:
    any -net 192.56.76.0 netmask 255.255.255.0 dev eth0

 

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注