iptables 实现数据转发

现有两台机器,一台windows机器,IP配置如下:

以太网适配器 本地连接:

   连接特定的 DNS 后缀 . . . . . . . :
   本地链接 IPv6 地址. . . . . . . . : fe80::f424:643c:e471:eb24%12
   IPv4 地址 . . . . . . . . . . . . : 192.168.3.20
   子网掩码  . . . . . . . . . . . . : 255.255.255.0
   默认网关. . . . . . . . . . . . . : 192.168.3.1

ubuntu机器配有双网卡,配置如下

wang@wang:~$ ifconfig
enp0s25   Link encap:以太网  
          inet 地址:192.168.3.10  广播:192.168.3.255  掩码:255.255.255.0

wlp3s0    Link encap:以太网   
          inet 地址:192.168.1.4  广播:192.168.1.255  掩码:255.255.255.0

一、实现端口转发

两台机器通过网线直连,网段为192.168.3.0/24,需要实现从windows机器访问ubuntu的8080端口,ubuntu将请求发送到124.133.246.14:6893,此端口为nginx服务端口。

从windows机器用ssh远程到ubuntu机器,ping公网地址,发现网络不通,查看ubuntu的路由配置

wang@wang:~$ route -n
内核 IP 路由表
目标            网关            子网掩码        标志  跃点   引用  使用 接口
0.0.0.0         192.168.3.1     0.0.0.0         UG    100    0        0 enp0s25
0.0.0.0         192.168.1.1     0.0.0.0         UG    600    0        0 wlp3s0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 enp0s25
192.168.1.0     0.0.0.0         255.255.255.0   U     600    0        0 wlp3s0
192.168.3.0     0.0.0.0         255.255.255.0   U     100    0        0 enp0s25

从上面可以看到,有两条网关配置,上面一条优先级较高,请求默认发送到了192.168.3.1网关,现将第一条网关删除,执行
sudo route del -net 0.0.0.0 netmask 0.0.0.0 gw 192.168.3.1
再查看路由配置

wang@wang:~$ route -n
内核 IP 路由表
目标            网关            子网掩码        标志  跃点   引用  使用 接口
0.0.0.0         192.168.1.1     0.0.0.0         UG    600    0        0 wlp3s0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 enp0s25
192.168.1.0     0.0.0.0         255.255.255.0   U     600    0        0 wlp3s0
192.168.3.0     0.0.0.0         255.255.255.0   U     100    0        0 enp0s25

此时可以正常ping公网地址。

需要补充一下,Ubuntu机器有两个网卡,enp0s25为内网网络网卡,通过此网卡与windows机器通信;wlp3s0为wifi网卡,所有访问公网的数据都经过此网卡。
iptables 实现数据转发_第1张图片

端口转发通过iptables的nat表实现,添加目标地址转换命令如下:

sudo iptables -t nat -A PREROUTING -p tcp -m tcp --dport 8080 -j DNAT --to-destination 124.133.246.14:6893
解读:
	PREROUTING 链在数据进入enp0s25时先到达PREROUTING链
	 -p tcp -m tcp	协议为tcp
	 --dport 8080	目标端口
	 --to-destination 124.133.246.14:6893 将目标地址改为124.133.246.14:6893
从windows机器访问http://192.168.3.10:8080,经过PREROUTING链前:
	源地址端口    :192.168.3.20:X
	目标地址端口:192.168.3.10:8080
经过PREROUTING后:
	源地址端口    :192.168.3.20:X
	目标地址端口:124.133.246.14:6893
192.168.1.1为默认网关,此时数据将被发送到wlp3s0网卡

如果此时通过windows机器访问http://192.168.3.10:8080,数据可以通过wifi网卡将数据发送到目标地址,但数据返回到wifi网络的时候,wifi网段是192.168.1.0/24,此时目标地址是192.168.3.20,找不到目标地址,数据将被丢弃。
此处可以通过此命令进行验证:

sudo tcpdump -i wlp3s0 -nn -X tcp port 6893

返回数据能正常到达windows机器,需添加源地址转换

sudo iptables -t nat -A POSTROUTING -s 192.168.3.0/24 -d 124.133.246.14 -p tcp -m tcp --dport 6893 -j SNAT --to-source 192.168.1.4
解读:
	POSTROUTING 链在数据离开wlp3s0时到达POSTROUTING 链
	 -p tcp -m tcp	协议为tcp
	 --dport 6893	目标端口
	 --to-source 192.168.1.4 将源地址转换为192.168.1.4
数据经过POSTROUTING 链前:
	源地址端口    :192.168.3.20:X
	目标地址端口:124.133.246.14:6893
经过POSTROUTING后:
	源地址端口    :192.168.1.4:X
	目标地址端口:124.133.246.14:6893

通过windows访问http://192.168.3.10:8080,显示结果如下:iptables 实现数据转发_第2张图片

二、windows通过linux实现上网功能

要实现windows机器通过ubuntu机器,实现上网功能,在ubuntu上添加一条指令

sudo iptables -t nat -A POSTROUTING -s 192.168.3.0/24 -j SNAT --to-source 192.168.1.4

解读:
windows数据通过3.10到达linux机器,再通过1.4发到互联网上。执行上述指令后,发到互联网上的数据包,源地址改为1.4。这样数据返回时能正常到达linux机器,并转发到windows机器上。

你可能感兴趣的:(linux,iptables)