iptables udp 转发
package main import ( "fmt" "net" ) func main() { // 创建连接 socket, err := net.DialUDP("udp4", nil, &net.UDPAddr{ IP: net.IPv4(10, 16, 0, 194), Port: 27001, }) if err != nil { fmt.Println("连接失败!", err) return } defer socket.Close() // 发送数据 senddata := []byte("hello server789ss2!") _, err = socket.Write(senddata) if err != nil { fmt.Println("发送数据失败!", err) return } // 接收数据 data := make([]byte, 4096) read, remoteAddr, err := socket.ReadFromUDP(data) if err != nil { fmt.Println("读取数据失败!", err) return } fmt.Println(read, remoteAddr) fmt.Printf("%s\n", data) }
package main import ( "fmt" "net" ) func main() { // 创建监听 socket, err := net.ListenUDP("udp4", &net.UDPAddr{ IP: net.IPv4(0, 0, 0, 0), Port: 48000, }) if err != nil { fmt.Println("监听失败!", err) return } defer socket.Close() for { // 读取数据 data := make([]byte, 4096) read, remoteAddr, err := socket.ReadFromUDP(data) if err != nil { fmt.Println("读取数据失败!", err) continue } fmt.Println(read, remoteAddr) fmt.Printf("%s\n\n", data) // 发送数据 senddata := []byte("hello client!") _, err = socket.WriteToUDP(senddata, remoteAddr) if err != nil { return } } }
---------------------
原文: https://www.cnblogs.com/lixinliang/p/13217890.html
需求:
java 服务: 10.16.0.186:7000 (udp 端口)
配置的转发机器: 外网ip(1.2.3.4) 内网ip(10.16.0.95) udp端口: 27001
iptables 开启转发功能:
echo 1 >/proc/sys/net/ipv4/ip_forward
sysctl -p
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -A PREROUTING -p udp -m udp --dport 27001 -j DNAT --to-destination 10.16.0.186:7000
iptables -t nat -A POSTROUTING -d 10.16.0.186 -p udp -m udp --dport 7000 -j SNAT --to-source 10.16.0.95
用 tcpdump udp port 27001 -n 抓包发现:
10.16.0.186 会将数据包返回至 10.16.0.95
10.16.0.95 会将数据包返回至 客户端
数据包之间有交互就是对的