Redsocks と Dante は、UDP を含むすべてのトラフィックを SOCKS5 プロキシにリダイレクトします。

Redsocks と Dante は、UDP を含むすべてのトラフィックを SOCKS5 プロキシにリダイレクトします。

Linux (mint/ubuntu) クライアントを設定して、Redoscks を使用して、すべての TCP および UDP 接続を、Dante を実行する SOCKS5 プロキシ サーバーに単一ポートで渡し、エンタープライズ プロキシを通過させたいと思っています。これまでのところ、自宅で HTTP/HTTPS をリダイレクトすることに成功しており (つまり、間に制限のあるエンタープライズ プロキシがない)、テストでは UDP で部分的に成功しているようです。TCP と UDP の完全なリダイレクトを確実にして、ntp などのすべてのサービスを実行できるようにしたいと考えています。DNS 要求のリダイレクトも有効です。

dante 設定ファイルは次の通りで、基本的なユーザー認証を使用して、udp アソシエーションを許可するように設定されています。

# /etc/danted.conf
logoutput: syslog
user.privileged: root
user.unprivileged: nobody

internal: veth0  port=1080
external: veth0

socksmethod: username
clientmethod: none

# Rules

client pass {
        from: 0.0.0.0/0 to: 0.0.0.0/0
        log: error connect disconnect
}
client block {
        from: 0.0.0.0/0 to: 0.0.0.0/0
        log: connect error
}
socks pass {
        from: 0.0.0.0/0 to: 0.0.0.0/0
        command: bind connect udpassociate
        log: error connect disconnect
        socksmethod: username
}
socks block {
        from: 0.0.0.0/0 to: 0.0.0.0/0
        log: connect error
}
socks pass {
       from: 0.0.0.0/0 to: 0.0.0.0/0
       command: bindreply udpreply
       log: error # connect disconnect iooperation
}

清潔さのために、私はテンプレートからインスピレーションを得ているので、クライアントブロックそしてソックスブロックルール。コメントアウトしても何も変わらないようです。また、なぜ元に戻すのかわかりません。socksmethod:ユーザー名グローバルに定義されている場合は、socks パス ルールでコメントアウトしても効果はありません。

クライアントでは、redsocks 構成ファイルは次のようになります。

base {
    log_debug = off;
    log_info = on;
    log = "syslog:daemon";
    daemon = on;
    user = redsocks;
    group = redsocks;
    redirector = iptables;
}

redsocks {
    local_ip = 127.0.0.1;
    local_port = 12345;

    ip = myproxyserverIP;
    port = 1080;
    type = socks5;
    login = myproxyuser;
    password = myproxypassword;
}

redudp {
    local_ip = 127.0.0.1;
    local_port = 12345;

    ip = myproxyserverip;
    port = 1080;
    login = myproxyuser;
    password = myproxypassword;

    dest_ip = 8.8.8.8;
    dest_port = 53;

    udp_timeout = 30;
    udp_timeout_stream = 180;
}

dnstc {
    // fake and really dumb DNS server that returns "truncated answer" to
    // every query via UDP, RFC-compliant resolver should repeat same query
    // via TCP in this case.
    local_ip = 127.0.0.1;
    local_port = 5300;
}

次に、iptables を使用して、TCP と UDP の両方で 80 と 443 を redsocks にリダイレクトします。また、iperf テスト サーバー用に UDP 5002 を追加します。

*nat
:PREROUTING ACCEPT [26:3850]
:INPUT ACCEPT [2:178]
:OUTPUT ACCEPT [8:3456]
:POSTROUTING ACCEPT [10:6452]
:REDSOCKS - [0:0]
-A PREROUTING -p tcp -m tcp --dport 443 -j REDSOCKS
-A PREROUTING -p tcp -m tcp --dport 80 -j REDSOCKS
-A PREROUTING -p udp -m udp --dport 443 -j REDSOCKS
-A PREROUTING -p udp -m udp --dport 80 -j REDSOCKS
-A PREROUTING -p udp -m udp --dport 5002 -j REDSOCKS
-A OUTPUT -p tcp -m tcp --dport 443 -j REDSOCKS
-A OUTPUT -p tcp -m tcp --dport 80 -j REDSOCKS
-A OUTPUT -p udp -m udp --dport 443 -j REDSOCKS
-A OUTPUT -p udp -m udp --dport 80 -j REDSOCKS
-A OUTPUT -p udp -m udp --dport 5002 -j REDSOCKS
-A REDSOCKS -d 0.0.0.0/8 -j RETURN
-A REDSOCKS -d 10.0.0.0/8 -j RETURN
-A REDSOCKS -d 127.0.0.0/8 -j RETURN
-A REDSOCKS -d 169.254.0.0/16 -j RETURN
-A REDSOCKS -d 172.16.0.0/12 -j RETURN
-A REDSOCKS -d 192.168.0.0/16 -j RETURN
-A REDSOCKS -d 224.0.0.0/4 -j RETURN
-A REDSOCKS -d 240.0.0.0/4 -j RETURN
-A REDSOCKS -p tcp -j REDIRECT --to-ports 12345
-A REDSOCKS -p udp -j REDIRECT --to-ports 12345
COMMIT

*filter
:INPUT ACCEPT [4510:4209873]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [6689:7022488]
COMMIT

それ以降は、うまく機能しているようです。インターネットを閲覧することはできますが、

curl ifconfig.co

プロキシサーバーのアドレスを取得します。

UDP接続をテストしようとすると、

iperf -c speedtest.serverius.net -u -p 5002

アクティブなUDP接続(ステートレスではあるが)を確認してみる

ss -u -pa

プロキシ サーバーへの UDP 接続があるようですが、ポート 1080 ではなく、ポート 48066 と 48610 で報告されています。また、serverius テスト サーバーへの直接接続も確認されています。ポートは rfe と表示されています。誰かこのことを説明してくれませんか?

もう少し乱暴に、iptables にすべてのトラフィックをルーティングするように指示すると、何も機能しなくなり、何にも接続できなくなります。何か非常に間違ったことをしているに違いありません。

*nat
:PREROUTING ACCEPT [26:3850]
:INPUT ACCEPT [2:178]
:OUTPUT ACCEPT [8:3456]
:POSTROUTING ACCEPT [10:6452]
:REDSOCKS - [0:0]
-A PREROUTING -p tcp -m tcp -j REDSOCKS
-A PREROUTING -p udp -m udp -j REDSOCKS
-A OUTPUT -p tcp -m tcp -j REDSOCKS
-A OUTPUT -p udp -m udp -j REDSOCKS
-A REDSOCKS -d 0.0.0.0/8 -j RETURN
-A REDSOCKS -d 10.0.0.0/8 -j RETURN
-A REDSOCKS -d 127.0.0.0/8 -j RETURN
-A REDSOCKS -d 169.254.0.0/16 -j RETURN
-A REDSOCKS -d 172.16.0.0/12 -j RETURN
-A REDSOCKS -d 192.168.0.0/16 -j RETURN
-A REDSOCKS -d 224.0.0.0/4 -j RETURN
-A REDSOCKS -d 240.0.0.0/4 -j RETURN
-A REDSOCKS -p tcp -j REDIRECT --to-ports 12345
-A REDSOCKS -p udp -j REDIRECT --to-ports 12345
COMMIT

*filter
:INPUT ACCEPT [4510:4209873]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [6689:7022488]
COMMIT

あなたの助けが本当にありがたいです。私の脳は溶けそうです。ありがとう、ニコラス

答え1

ダンテの設定では、すべての接続をブロックしていると思います。

client block {
    from: 0.0.0.0/0 to: 0.0.0.0/0
    log: connect error
}

関連情報