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