MySQL, Oracle, Linux, 软件架构及大数据技术知识分享平台

网站首页 > linux / 正文

Linux 共享网络连接

2024-11-26 15:22 huorong linux 4 ℃ 0 评论

需求


假设某内网环境下,服务器 S 可以访问外网,而客户端 C 无外网访问权限,但能够访问到服务器 S,则客户端 C 可以通过服务器 S 访问网络(S 作为网关),本文中服务器 S 为 Linux 系统。


实现


主要有以下要点


  • 客户端 C 能访问服务器 S
  • 服务器 S 启用数据包转发
  • 服务器 S 配置 NAT 规则
  • 客户端 C 配置服务器 S 为自己的网关地址


服务器 S 配置


启用数据包转发


出于安全考虑,Linux 系统默认是禁止数据包转发的,为了实现网络连接共享,需要更改一个内核参数以启用数据包转发。


echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p


检查 sysctl net.ipv4.ip_forward 命令输出是否为 1。


配置 NAT 规则


需要通过 iptables 命令配置防火墙的 filter 及 nat 两个规则表以实现网络共享所需要的 NAT 配置。


1)在 filter 规则表的 FORWARD 链表中允许数据包通过


如果 FORWARD 链表默认策略为 DROP,可以将其修改为 ACCEPT 或者在规则中明确地放行需要放行的数据包。


# 将 FORWARD 链表默认策略设置为 ACCEPT(需要确保链表中不存在拒绝所有数据包的规则,否则还是需要明确放行指定的数据包)
iptables -P FORWARD ACCEPT

# 或者在 FORWARD 链表插入放行规则
iptables -I FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT


配置的规则以数据包能在该服务器上通过 FORWARD 链表为准。


2)在 nat 规则表中启用 IP 伪装功能


获取连接外网的网络接口名称(即下文中 dev 后的字符串 eth0)


# ip route get 8.8.8.8
8.8.8.8 via 192.168.18.1 dev eth0 src 192.168.18.235
    cache


为所有发送到 eth0 接口的数据包提供 IP 伪装


# 以下命令中 eth0 为网络接口名称,根据实际情况更改
iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE


或者可以具体到为某个网段或某个 IP 提供 IP 伪装


iptables -t nat -I POSTROUTING -s 192.168.18.0/24 -j MASQUERADE
iptables -t nat -I POSTROUTING -s 192.168.18.108 -j MASQUERADE


客户端 C 配置


将网关修改为服务器 S 的 IP 地址即可。


问题排查


如果以上配置无法达到预期目的,一般是 iptables 规则配置不正确。条件允许的情况下可以先清空规则后使用下面的命令配置 NAT 规则查看是否能正常运行。


操作之前可以先备份 iptables 规则( iptables-save > iptables.save),定位到问题后恢复备份的规则( iptables-restore < iptables.save)。


iptables -F
iptables -F -t nat
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE # eth0 更改为正确网卡接口名称


也可以通过 tcpdump 抓包分析,以下命令是一种排查思路:


tcpdump -nn -i eth0 host x.x.x.x and icmp


  • 以上命令在服务器 S 执行, -i eth0 指定网卡接口,注意根据自己的情况修改,x.x.x.x 为客户端 C 的 IP 地址
  • 如果 ICMP 包不能到达服务端,则本身客户端与服务端无法通讯,或防火墙 INPUT 链表限制访问。
  • 如果 ICMP 包可以到达服务端,但无服务端到客户端的回应数据包,则可能是 FORWARD 链表限制访问。

Tags:linux查看网络连接

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言