====== Sudo rtorrent for netfilter match ====== {{tag>rtorrent debian networking netfilter iptables}} I use **rtorrent** as a torrent downloader. The application runs on a server in a screen virtual tty. My only problem with this great tools is that it's difficult to identify the flows created by the torrent protocol to match them with netfilter/iptables. I then choose to launch rtorrent under its own user, using **sudo** from my own user account, and then use the **netfilter xt_owner** module to match the connections based on the userid that owns the socket. ===== Set sudo ===== I want user //julien// to be allowed to launch command **rtorrent** under user //rtorrent//. By default, this is forbidden and only root can launch a command like //su rtorrent -c 'rtorrent'//. So, to allow //julien// to do this, we add the following line in **/etc/sudoers** (make sure you have sudo package installed). julien ALL=(rtorrent) NOPASSWD: /usr/bin/rtorrent Explanation: * **julien** is the user the rule apply to * **ALL** means this command is available on ALL computers (not only localhost) * **(rtorrent)** is the user the following command will be run as * **NOPASSWD** means //julien// will not be asked any password to launch this command * **/usr/bin/rtorrent** is the command itself ===== Change the permission ===== This is **rtorrent** configuration (I'm not going to describe this here). Just make sure that the user //rtorrent// has access to the rtorrent folder, and its subfolders. # chown rtorrent /data/rtorrent -R ===== Launch rtorrent ===== Now, as user //julien// logged on the system, launch the following: julien@localhost:/$ cd /data/rtorrent julien@localhost:/data/rtorrent$ screen -S rtorrent [[[ NEW SCREEN CREATED ]]] julien@localhost:/data/rtorrent$ sudo -u rtorrent /usr/bin/rtorrent [[[ EXIT SCREEN USING ctrl-a + ctrl-d ]]] Check processes list : julien@localhost:/$ ps -edf|grep rtorrent julien 7987 1 0 Oct12 ? 00:00:14 SCREEN -S rtorrent rtorrent 24288 7988 13 11:06 pts/3 00:00:01 /usr/bin/rtorrent As you see, rtorrent is launched under its own user. ===== Netfilter configuration ===== The **xt_owner** module of netfilter will allow us to check every connection that is owned by user //rtorrent//. We will then mark these connections using connmark. # iptables -t mangle -o eth0 -A OUTPUT -p tcp --tcp-flags SYN SYN -m owner \ --uid-owner 1014 -j CONNMARK --set-mark 123 # iptables -t mangle -A OUTPUT -j CONNMARK --restore-mark In the first rule, we match every tcp packet that has the SYN flag set (thus, we match SYN and SYN/ACK packets) and that is owned by uid 1014 (which is rtorrent's uid, check /etc/passwd). The packets that match this rule have their **mark** field (in sk_buff) set at 123. In the second rule, we restore the mark applied to one packet to all the packets of a connection. Thus, all the connections that have their SYN or SYN/ACK packets marked by the previous rule will receive the 123 mark. To control that this rule is applied, do a **grep** in **/proc/net/ip_conntrak** as follow : # grep 'mark=123' /proc/net/ip_conntrack You can then use this mark to shape traffic, like with tc for example.