udp-proxy
iptablesとかで書くと、戻りのルーティングテーブルがフォワード戻りが固定になったりして、かかえてる課題には対応できない。
お手軽にUDPの中継をできるものがないかなと思ったら、nodeであったよ。
https://www.npmjs.com/package/udp-proxy
https://github.com/gildean/node-udp-proxy
とりあえず、DNSを中継させてみる。
コードは、サンプルの通り。今回はv4のみでいい。モジュールはv6にも対応している。
var proxy = require('udp-proxy'), options = { address: '8.8.8.8', //google dns port: 53, ipv6: false, localaddress: '0.0.0.0', localport: 53, localipv6: false, proxyaddress: '0.0.0.0', timeOutTime: 10000 }; var server = proxy.createServer(options); server.on('listening', function (details) { console.log('udp-proxy-server ready on ' + details.server.family + ' ' + details.server.address + ':' + details.server.port); console.log('traffic is forwarded to ' + details.target.family + ' ' + details.target.address + ':' + details.target.port); }); server.on('bound', function (details) { console.log('proxy is bound to ' + details.route.address + ':' + details.route.port); console.log('peer is bound to ' + details.peer.address + ':' + details.peer.port); }); server.on('message', function (message, sender) { console.log('message from ' + sender.address + ':' + sender.port); }); server.on('proxyMsg', function (message, sender) { console.log('answer from ' + sender.address + ':' + sender.port); }); server.on('proxyClose', function (peer) { console.log('disconnecting socket from ' + peer.address); }); server.on('proxyError', function (err) { console.log('ProxyError! ' + err); }); server.on('error', function (err) { console.log('Error! ' + err); });
起動する。
# node udp_proxy.js
digでproxyを起動したマシンに接続してみる。このマシンではDNSレゾルバは動いていない。
$ dig @xxx.xxx.xxx.xxx www.google.com ; <<>> DiG 9.8.5-P1 <<>> @xxx.xxx.xxx.xxx www.google.com ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 61556 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;www.google.com. IN A ;; ANSWER SECTION: www.google.com. 299 IN A 216.58.197.196 ;; Query time: 101 msec ;; SERVER: xxx.xxx.xxx.xxx#53(xxx.xxx.xxx.xxx) ;; WHEN: Tue Aug 23 15:28:06 JST 2016 ;; MSG SIZE rcvd: 48
ちゃんと引けている。
ログはこんな感じ。
# node udp_proxy.js DNS - IPv4 to IPv6 proxy }>=<{ by: ok 2012 udp-proxy-server ready on IPv4 0.0.0.0:53 traffic is forwarded to IPv4 8.8.8.8:53 proxy is bound to 0.0.0.0:56541 peer is bound to yyy.yyy.yyy.yyy:34850 message from yyy.yyy.yyy.yyy:34850 answer from 8.8.8.8:53 disconnecting socket from yyy.yyy.yyy.yyy