现有两台机器,一台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的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,显示结果如下:
要实现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机器上。